Showing Posts From

밸런스를

Excel 함수만으로 밸런스를 본다는 것

Excel 함수만으로 밸런스를 본다는 것

밸런스 기획자의 주무기 출근했다. 엑셀을 켰다. 프로그래머는 Visual Studio를 켠다. 아티스트는 Photoshop을 켠다. 나는 Excel을 켠다. 2013년부터 쓴 파일이다. 용량이 15MB다. 시트가 47개다. "게임 기획자는 엑셀만 잘 다루면 된다"는 말이 있다. 반은 맞고 반은 틀렸다. 엑셀을 잘 다루면 기획자 절반은 한 것이다. 나머지 절반은 그 엑셀로 만든 밸런스가 게임에서 제대로 작동하게 만드는 거다. 오늘도 밸런스 시트를 연다. 전투 시뮬레이터다. VLOOKUP과 IF문으로 떡칠된 지옥이다. 이게 내 직업이다.VLOOKUP이 인생의 전부인 날들 신입 때 선배가 말했다. "VLOOKUP 모르면 밸런스 기획 못 한다." 진짜였다. 캐릭터 스탯 시트가 있다. HP, 공격력, 방어력, 치명타율. 200개 캐릭터의 레벨별 수치가 여기 있다. 이걸 전투 시뮬레이터로 불러와야 한다. =VLOOKUP(A2, 캐릭터스탯!$A$2:$F$5000, 3, FALSE)이게 공격력이다. 숫자 하나 틀리면 밸런스가 무너진다. FALSE를 TRUE로 바꾸면 근삿값을 찾는다. 절대 안 된다. 정확한 값만. 시트가 47개인 이유다. 캐릭터 스탯, 무기 스탯, 스킬 데이터, 버프 효과, 적 스탯, 던전 난이도, 보상 테이블. 다 연결돼 있다. A 캐릭터의 공격력을 올리면 B 던전의 난이도가 변한다. C 무기의 가치가 떨어진다. D 캐릭터가 쓸모없어진다. VLOOKUP으로 다 연결했기 때문이다. 한 칸만 잘못 건드려도 게임이 망가진다. 그래서 시트 보호를 걸어뒀다. 비밀번호는 내 생일이다.IF문 지옥의 전투 시뮬레이터 전투 시뮬레이터를 만들었다. 3년 전이다. 시뮬레이터는 간단하다. 캐릭터 A와 적 B가 싸운다. 누가 이기는지 계산한다. 몇 턴 만에 이기는지 본다. 이게 밸런스의 기준이다. 문제는 변수다. 게임은 단순하지 않다.치명타가 터지면? 데미지 1.5배 버프를 받으면? 공격력 20% 증가 스킬을 쓰면? 3턴 쿨타임 적이 방어 태세면? 데미지 50% 감소 HP가 30% 이하면? 광폭화 버프IF문이 시작된다. =IF(치명타율>RAND(), 데미지*1.5, 데미지)이게 1턴이다. 치명타 계산이다. RAND()는 0~1 사이 랜덤값이다. 치명타율 30%면 30% 확률로 1.5배 데미지가 나간다. 여기에 버프를 추가한다. =IF(버프중, IF(치명타율>RAND(), 데미지*1.2*1.5, 데미지*1.2), IF(치명타율>RAND(), 데미지*1.5, 데미지))IF 안에 IF가 들어간다. 이게 시작이다. 스킬 쿨타임을 추가한다. 적의 패턴을 추가한다. 광폭화를 추가한다. IF문이 5단 중첩된다. 수식 바를 보면 눈이 아프다. =IF(AND(턴수>3, 스킬쿨=0), IF(적HP<최대HP*0.3, IF(버프중, 스킬데미지*1.2*1.5*2, 스킬데미지*1.5*2), IF(버프중, 스킬데미지*1.2, 스킬데미지)), IF(버프중, IF(치명타율>RAND(), 기본데미지*1.2*1.5, 기본데미지*1.2), IF(치명타율>RAND(), 기본데미지*1.5, 기본데미지)))이게 1턴 데미지 계산이다. 전투는 10턴이다. 이 수식이 10개 반복된다. 시트가 느려진다. F9를 누르면 3초 걸린다. 재계산하는 거다. 컴퓨터가 버벅인다. RAM이 8GB다. 부족하다. 그래도 작동한다. 캐릭터 A가 적 B를 7턴 만에 잡는다. 예상과 같다. 밸런스가 맞다.시뮬 돌려볼게요 회의 시간이다. PD가 말한다. "신규 보스 난이도 어때요?" "시뮬 돌려볼게요." 입버릇이다. 일주일에 50번은 말한다. 시뮬레이터를 켠다. 신규 보스 스탯을 입력한다. HP 500000, 공격력 1200, 방어력 800. 패턴은 3개다. 광역기, 단일기, 버프 해제. 평균 유저 캐릭터를 넣는다. 레벨 60, 공격력 800, 방어력 400. 장비는 평균 등급. 스킬은 표준 빌드. F9를 누른다. 재계산된다. 결과가 나온다. 12턴 만에 보스를 잡는다. PD가 묻는다. "적당해요?" "애매합니다. 10턴이 목표였거든요." "그럼 보스 HP를 줄일까요?" "안 됩니다. HP를 줄이면 고인물 유저가 3턴 만에 잡습니다." 고인물 시뮬도 있다. 레벨 80, 최상급 장비, 최적 빌드. 이 유저들은 6턴 만에 보스를 잡는다. HP를 20% 줄이면 4턴이 된다. 너무 쉽다. "그럼 보스 공격력을 올릴까요?" "그것도 애매합니다. 공격력을 올리면 평균 유저가 14턴에 죽습니다." 체력이 0이 되는 턴이다. 시뮬레이터가 계산해준다. 공격력 1200에서 1400으로 올리면 평균 유저는 12턴째에 죽는다. 보스를 못 잡는다. "그럼 어떻게 하죠?" "보스 패턴을 바꿔야 합니다. 광역기 데미지는 줄이고 빈도를 늘리는 거죠. 평균 유저는 비슷하고 고인물 유저는 조금 더 어려워집니다." 시뮬을 다시 돌린다. 광역기 데미지를 30% 줄인다. 3턴마다 쓰던 걸 2턴마다 쓰게 한다. 계산한다.평균 유저: 11턴 클리어 고인물 유저: 5턴 클리어"이 정도면 괜찮습니다." PD가 고개를 끄덕인다. "좋아요, 이걸로 가죠." 30분 회의가 끝난다. 시뮬이 없었으면 2시간 걸렸다. 숫자 하나가 게임을 바꾼다 런칭 1주일 전이었다. QA에서 연락이 왔다. "10스테이지가 너무 어렵습니다. 못 깨겠어요." 황당했다. 시뮬에서는 문제없었다. 평균 9턴 클리어. 적당한 난이도였다. 빌드를 받아서 직접 해봤다. 진짜 어렵다. 15턴이 지나도 보스가 안 죽는다. 내가 죽는다. 뭐가 문제지. 시뮬레이터를 다시 봤다. 수치를 확인했다. 틀린 게 없다. 보스 HP 300000, 공격력 900, 방어력 600. 맞다. 게임 데이터를 열었다. JSON 파일이다. 보스 스탯을 확인했다. "boss_10": { "hp": 300000, "attack": 900, "defense": 6000 }방어력이 6000이다. 오타였다. 600이어야 하는데 0을 하나 더 붙였다. 누가 했는지 모른다. 아마 나다. 방어력 6000이면 유저 공격이 안 들어간다. 데미지 계산식이 이렇다. 최종데미지 = 기본데미지 * (1000 / (1000 + 적방어력))방어력 600이면 데미지가 62%다. 방어력 6000이면 14%다. 4배 차이다. 시뮬레이터를 고쳤다. 방어력 6000을 입력했다. F9를 눌렀다. 클리어 불가. 33턴째 유저 사망. 맞다. 못 깬다. 프로그래머한테 연락했다. "10스테이지 보스 방어력 600으로 수정해주세요." 급하게 패치했다. 다음 날 빌드에 반영됐다. 숫자 하나가 게임을 망칠 뻔했다. 0 하나 때문에. 엑셀은 거짓말을 안 한다 점심시간이다. 후배가 묻는다. "선배, 밸런스 어떻게 잡아요?" "시뮬 돌려." "시뮬이 정확해요?" "게임보다 정확해." 농담 아니다. 게임은 버그가 있다. 데미지가 안 들어갈 때가 있다. 스킬이 안 나갈 때가 있다. 엑셀은 그런 거 없다. 입력한 대로 계산한다. 물론 한계는 있다. 유저의 컨트롤은 못 본다. 회피 타이밍, 스킬 사용 순서, 포지셔닝. 이건 변수가 너무 많다. 그래서 시뮬은 "평균"을 본다. 평균 유저가 평균 장비로 평균 컨트롤을 했을 때. 이게 기준이다. 고인물은 따로 본다. 최상급 장비, 최적 빌드, 완벽한 컨트롤. 이게 상한선이다. 하한선도 본다. 최저 장비, 엉망 빌드, 못하는 컨트롤. 이 유저도 클리어할 수 있어야 한다. 어렵게라도. 세 가지 케이스를 다 시뮬로 돌린다. 평균 10턴, 상한선 5턴, 하한선 20턴. 이 범위 안에 들어오면 밸런스가 맞다. 범위 밖이면 수정한다. 보스 HP를 조정한다. 공격력을 바꾼다. 패턴을 수정한다. 다시 시뮬을 돌린다. 범위 안에 들어올 때까지. 이게 밸런스 기획이다. 노가다다. 엑셀 노가다. 유저는 엑셀을 모른다 게임이 출시됐다. 커뮤니티를 봤다. "20스테이지 밸런스 개똥이네요. 못 깨겠어요." 받았다. 시뮬을 켰다. 20스테이지 보스를 넣었다. 평균 유저 캐릭터를 넣었다. 돌렸다. 12턴 클리어. "못 깰 리가 없는데." 영상을 찾아봤다. 유저가 올린 플레이 영상. 봤다. 캐릭터 레벨이 50이다. 평균은 60이다. 장비가 2등급 낮다. 스킬 빌드가 엉망이다. 방어 스킬을 안 쓴다. 광역기를 정면으로 맞는다. 이러면 못 깬다. 당연하다. 댓글을 달까 고민했다. "장비를 올리세요. 레벨을 올리세요. 스킬을 잘 쓰세요." 안 달았다. 댓글 창이 지옥일 게 뻔하다. 대신 데이터를 봤다. 20스테이지 클리어율. 68%다. 나쁘지 않다. 30% 유저는 못 깬다. 어려운 편이다. 평균 시도 횟수. 3.2회. 세 번 정도 도전하면 깬다. 적당하다. "밸런스는 맞는데." 유저는 엑셀을 모른다. 시뮬을 모른다. 내가 72시간 동안 IF문을 짜면서 만든 밸런스를 모른다. 그냥 "어렵다"고 말한다. "밸런스 똥겜"이라고 말한다. 괜찮다. 데이터가 말해준다. 68% 클리어율. 이게 진실이다. 엑셀 시뮬의 한계 시뮬이 완벽하진 않다. 작년에 신규 캐릭터를 냈다. 스킬이 특이했다. "적 HP 비율만큼 데미지 증가". HP가 100%면 데미지 2배, 50%면 1.5배, 10%면 1.1배. 시뮬을 짰다. 복잡했다. 턴마다 적 HP를 확인하고 데미지를 계산한다. =기본데미지 * (1 + 적HP/최대HP)돌렸다. 평균 8턴 클리어. 괜찮다. 다른 캐릭터랑 비슷하다. 출시했다. 망했다. 이 캐릭터가 너무 강했다. 고인물 유저들이 모든 컨텐츠를 쓸어버렸다. 3턴 클리어, 2턴 클리어. 시뮬에서는 5턴이었는데. 뭐가 문제였을까. 스킬 연계를 고려 못 했다. 이 캐릭터는 다른 캐릭터랑 조합하면 더 강해진다. A 캐릭터가 적 HP를 99%로 만든다. 그 상태에서 신규 캐릭터가 스킬을 쓴다. 데미지가 2배 가까이 나온다. 시뮬은 단일 전투만 본다. 파티 조합은 안 본다. 변수가 너무 많아서. 캐릭터가 200개다. 조합은 200 * 199 * 198 * 197. 계산 불가능하다. 결국 긴급 패치했다. "적 HP 비율만큼 데미지 증가, 최대 50%". 상한선을 뒀다. 유저들이 욕했다. "너프 먹였다"고. 맞다. 너프 먹였다. 시뮬의 한계다. 모든 걸 볼 순 없다. 그래도 엑셀이다 6시다. 퇴근까지 2시간 남았다. 내일 회의 자료를 만든다. 신규 던전 밸런스 기획서. 40페이지 PPT. 근거는 다 시뮬이다.1스테이지: 평균 5턴 클리어 (시뮬 결과 첨부) 2스테이지: 평균 7턴 클리어 (시뮬 결과 첨부) 보스 스테이지: 평균 12턴 클리어 (시뮬 결과 첨부)PD가 물으면 대답할 수 있다. "시뮬 돌려봤습니다." 숫자가 있다. 근거가 있다. 엑셀이 없었으면 어떻게 했을까. 감으로? "이 정도면 적당할 것 같은데요?" 안 된다. 게임은 감으로 만드는 게 아니다. 물론 재미는 감이다. 숫자로 재미를 만들 순 없다. 하지만 밸런스는 숫자다. 숫자로 만든다. VLOOKUP으로 데이터를 불러온다. IF문으로 전투를 계산한다. RAND()로 확률을 구현한다. 이게 내 무기다. 프로그래머는 코드를 짠다. 아티스트는 그림을 그린다. 나는 엑셀을 친다. 손목이 아프다. 마우스를 너무 많이 썼다. 내일은 트랙볼을 사야겠다. F9를 누른다. 시뮬이 돌아간다. 3초 기다린다. 결과가 나온다. 평균 11턴 클리어. 괜찮다. 목표는 10~12턴이었다. 밸런스 맞다. 저장한다. Ctrl+S. 15.2MB 파일이 저장된다. 3년 된 파일이다. 시트 47개. IF문 수천 개. VLOOKUP 수만 개. 이게 내 인생이다.엑셀 함수만으로도 게임은 만들어진다. 아니, 밸런스는.