시리즈 검증된 잡다한 공개 실험들


적이 아군을 공격할 때의 대미지가 방어력에 따라 어떻게 바뀌는지 실험을 하던 도중 방어력에 의한 것 말고도, 캐릭터의 레벨과 적의 레벨 차에 따라서 대미지가 다르다는 사실을 알게 되었음.


그런데 방어력을 일정하게 유지하면서, 캐릭터의 레벨만 변화시키기는 사실상 불가능에 가까움.

따라서 받은 대미지를 방어력 계수로 나눈 정규화된 대미지를 이용해야함

방어력 계수는 저번 실험에서 증명했으니 따로 설명 안하겠음


가장 실험이 빠르고 쉬운 메인 스테이지 3-1 저격병한테 

레벨이 다른 캐릭터들로 쳐 맞아가면서 실험했고

불확도를 줄이기 위해 캐릭당 5번 맞아서 평균냈음.



내가 캐릭터 레벨이 죄다 저렙 아니면 씹고렙이고 추가 데이터를 위해서는 어떤 캐릭터를 조금씩 레벨업 시키면서 실험해야하는데 

당연히 재화 아까우니 저렙 중 가장 쓸만한 캐릭터...


ㅁ?ㄹ안씨를 실험체로 삼았음.


이런 제보도 있었기 때문에 렙차 5이하 구간에서는 조금 신경 쓰면서 레벨업 간격 조절했음



이제 좀 유의미한 데이터를 얻었고

레벨차이가 5이하로 날 경우 레벨 보정 계수는 상수이며,

캐릭터 레벨이 적 레벨보다 5이하일 경우 선형,

캐릭터 레벨이 적 레벨보다 5이상일 경우 비선형이었음

확실히, 개발자 입장에서 캐릭터 레벨 제한(현재 80)을 더 높이는 경우를 위해서 비선형이 가장 적합함.

그리고 경험상 저것은 1차식으로 이루어진 유리함수일 확률이 높음





그래프를 이렇게 분리시켜서 피팅하였으나(엑셀 자체 기능) 비선형 그래프를 유리함수로 피팅을 할 수가 없었음.

인터넷을 뒤져봐도 유리함수로 피팅하는 사이트나 프로그램은 없는 것 같아서 고민 좀 했음


일단 선형과 상수형일 때라도 계수를 구하긴 해야 하니

선형일 때 y=26.17x + 394.95 로 피팅됐는데 (x값은 적LV - 아군LV)

저건 당연히 레벨 보정 계수라고 볼 수 없는 값임. 공격력이라던가 버프라던가 그런 값들이 다 곱해져있는 값임.

일단 26.17로 우변을 나눠보면 x + 15.05 가 되고 15.05라는 값은 뭔가 이상해 보이니

그냥 깔끔하게 x + 15 로 맞춰주면

이렇게 이론값을 구했는데 정규화 대미지의 첫째항 대비 변화량 실험값을 아~까 전에 올렸었고

방금 구한 레벨 보정 계수 이론값을 이용해 변화량 이론값을 구하고, 오차율을 비교해보면 잘 들어맞는 것을 알 수 있음.




그리고 아까 통합 그래프에서 화살표 친 값은 적LV - 캐릭터LV = 5 일 때 인데,

선형 그래프와 상수형 그래프가 서로 만나는 지점으로 보이기 때문에
x + 15 에서 x = 5를 대입하면 20이 나오고

이것이 곧 상수형 그래프의 상수값임.


잘 들어맞는 것을 볼 수 있음.


근데 여기서, 설마 개발자들이 레벨 보정 계수라는 걸 이렇게 안이쁘게 했을까?

나라면, 저 상수를 1로 맞춰놓지 않았을까? 싶어서 20으로 나눠줬음

즉 선형 구간에서의 레벨 보정 계수는 (x + 15) / 20 으로 생각하겠다는 소리임


이제 문제의 비선형 구간을 살펴보면 저게 일차식으로 이루어진 유리함수라고 생각한다면

이런 형태일 거임.

y = b / (x - a) + c 꼴로 가정하면 (x는 아까도 설명한 레벨차이, y는 정규화된 대미지)

a는 양수고, b는 음수, c는 양수일 것으로 예상됨.


피팅 도구 중 유리함수로 바꾸는 도구가 없어서 변수를 치환하기로 결정했음.

(x - a)^-1 = z 로 치환하고

y = bz + c 꼴의 선형 그래프가 가능하다면 우리가 처음에 가정했던 y = b / (x - a) + c 가 옳다는 뜻이고

그 경우 엑셀의 피팅도 가능해짐.


문제는 보정 인자 a를 수치해석적으로 구해서 y가 z에 대한 선형성을 만족하도록 해야함.

하지만 나는 노가다 장인이였죠?


아까 선형 레벨 보정 계수에서도 나온 15라는 숫자. 여기서도 아주 안성맞춤으로 보였음

a = 15가 맞는 것으로 보임



y = -10481z + 0.3763 이 나왔고

b = -10481, c = 0.3763 이라는 것도 알았음.


따라서 y = -10481 / (x - 15) + 0.3763


-10481 / (x - 15) + 0.3763 에 적절한 값을 곱해준다면 오차율이 0%에 근접해질 거임.

왜냐? 아까도 말했듯 y는 레벨 보정 계수가 아니라, 레벨 보정 계수와 공격력, 각종 버프들의 곱이니까.




곱할 값을 M이라고 놓고, 

화살표 표시한 저 값은 적LV - 캐릭터LV = -5 일 때이고

저 값도 아까처럼 비선형 그래프와 상수형 그래프가 만나는 지점으로 보임.

따라서 x에 -5를 대입했을 때 우리가 아까 정한 레벨 보정 계수 = 1 이라는 값이 나와야 함

(-10481 / (-5 - 15) + 0.3763) x M = 1

M = 0.0019068....


아무튼 비선형 구간에서의 레벨 보정 계수는 - 19.98 / (x - 15) + 0.0007174 가 나옴.

확실히 오차율이 만족할 정도로 줄었지만 값이 너무 더럽잖음?

레벨 보정 계수 = - 20 / (x - 15) 로 놓으면


그럴싸해졌음

일단 지금까지의 연산과정을 정리하면 레벨 보정 계수는 다음과 같은 값일 것으로 보임


레벨 보정 계수 = (적 레벨 - 아군 레벨 + 15) / 20     ( 5 ≤ 적 레벨 - 아군 레벨 )

레벨 보정 계수 = 1                                            ( |적 레벨 - 아군 레벨≤ 5 )

레벨 보정 계수 = - 20 / (적 레벨 - 아군 레벨 - 15)    ( 적 레벨 - 아군 레벨 ≤ -5 )



찜찜한 부분이 있는데, 바로 15라는 숫자.

사실 실험에 사용한 적의 레벨이 15이었는데 이게 과연 우연일까? (적:배낭X 라이터)

적의 레벨을 변화시켜 추가 실험을 하였음.


어차피 보정 계수의 형태는 대충 파악했으니까 실험 데이터의 불확도가 커도 상관은 없는데, 가장 중요한 첫째항만 5번 맞고 평균 구했고 나머지는 그냥 후딱후딱 끝내게 한번 맞고 끝냄. 

이번에는 메인스테이지 HCL1-1 (하드) (적:배낭O 라이터로 실험했고 적의 레벨은 20임)


오차율이 아주 개 난리가 났음

아까 구한 공식에 있는 15라는 숫자는 아무래도 적 레벨이었나보다. 15를 20으로 바꿔보면

여전히 이상함.

그런데 아까 나온 15 말고도, 20이라는 숫자도 참 이상하다는 생각이 듦. 이게 사실 (적 레벨 + 5) 아니었을까?

근데 그것도 아니었고 결국 레벨 20짜리 적에 대해서 정밀 실험을 또 하여 계수를 다시 구해보기로 했음

이번엔 그냥 귀찮아도 부계정 켜서 어차피 버리는 계정 재화 낭비 하면서 실험함


??? ㅅㅂ 구간이 달라졌음. 아까는 레벨 차이가 -5~5일 때 상수였는데 이번엔 0~10일 때 상수임

x축에 대해 평행이동한다 생각하면 레벨 보정 계수는 그때 그때 쉽게 구할 수는 있음

이 경우


레벨 보정 계수 = (적 레벨 - 아군 레벨 + 10) / 20     ( 10 ≤ 적 레벨 - 아군 레벨 )

레벨 보정 계수 = 1                                            ( 0 ≤ 적 레벨 - 아군 레벨 ≤ 10 )

레벨 보정 계수 = - 20 / (적 레벨 - 아군 레벨 - 20)    ( 적 레벨 - 아군 레벨 ≤ 0 )



이번에는 메인스테이지 HCL1-3 (적:배낭O 라이터로 실험했고 적의 레벨은 23임)


더 이상 구간이 변하지 않고, 레벨 보정 계수 또한 변하지 않았음.

뭔가 이상해서 혹시나 적의 종류와 관련이 있을까? 라는 생각이 들었음.



이번에는 메인스테이지 HCL3-1 (적:배낭X 라이터로 실험했고 적의 레벨은 28임)

ㅅㅂ 이번에도 구간이 이상하게 바뀜.

이번에는


레벨 보정 계수 = (적 레벨 - 아군 레벨 + 12) / 20     ( 8 ≤ 적 레벨 - 아군 레벨 )

레벨 보정 계수 = 1                                            ( -2 ≤ 적 레벨 - 아군 레벨 ≤ 8 )

레벨 보정 계수 = - 20 / (적 레벨 - 아군 레벨 - 18)    ( 적 레벨 - 아군 레벨 ≤ -2 )


그래도 일단 상수형태를 띄는 구간의 길이는 항상 10인 것 같음.

실험양을 줄이기 위해서 제발 그래야만 한다 가정한 후, 저 그래프는 x축 방향으로 평행이동을 한다 생각했음.

그리고 그 평행이동을 얼만큼 하느냐는 스테이지마다 다 달랐음.

레벨 보정 계수가 상수 형태를 띄는 구간이 원래 -5 적 레벨 - 아군 레벨 ≤ 5 이었다고 할때,

x축에 대해 d값만큼 평행이동한다 하면 스테이지의 종류별 d 값은 다음과 같았음.


이 실험 결과표를 보면 알 수 있듯, 메인 일반 4-2와 메인 하드 1-1을 비교해보면 적의 레벨과 종류가 같음에도 불구하고 평행이동값이 다름. 따라서 적의 레벨과 종류는 평행이동과 관련이 없어 보임.

즉, 오직 스테이지의 종류와 관련이 있는 것으로 보임.

d값이 클수록 저레벨 캐릭터가 받는 대미지를 상대적으로 적게 만들어줌(뉴비 친화적).

그러나 메인 하드 스테이지 후반부로 갈 수록 평행이동은 0이되며, 요튼 터널 15단계 (50레벨)의 평행이동값도 0인 것을 보면

일반적으로 평행이동은 0이라고 볼 수 있음.


레벨 보정 계수(完)


레벨 보정 계수 = (적 레벨 - 아군 레벨 - 평행이동값 + 15) / 20       ( 5 + 평행이동값 ≤ 적 레벨 - 아군 레벨 )

레벨 보정 계수 = 1                                                               ( -5 + 평행이동값  적 레벨 - 아군 레벨 ≤ 5 + 평행이동값 )

레벨 보정 계수 = - 20 / (적 레벨 - 아군 레벨 - 평행이동값 - 15)      ( 적 레벨 - 아군 레벨 ≤ -5 + 평행이동값 )


아니면 이렇게 보는 게 나을 수도 있음

적 레벨 - 아군 레벨 = ϰ , 평행이동값 = d 라 할 때


레벨 보정 계수 = (ϰ - d + 15) / 20       ( 5 + d ≤ ϰ )

레벨 보정 계수 = 1                           ( -5 + d  ϰ ≤ 5 + d )

레벨 보정 계수 = - 20 / (ϰ - d - 15)      ( ϰ ≤ -5 + d )


위에서 설명 했었지만, 다시 한번 말하는데 일반적으로 d = 0임.

d = 0일 때의 그래프의 대략적인 형태는 다음과 같음



결론: 레벨 보정 계수는 비선형 - 상수 - 선형의 형태를 구간 별로 띄며,

일반적으로 적의 레벨보다 캐릭터 레벨이 6이상 낮을 경우 보정 계수가 커져서 훨씬 아프게 맞고(선형)

반대로 적의 레벨보다 캐릭터 레벨이 6이상 크다면 보정 계수가 작아져서 덜 아프게 맞음(비선형).

일부 메인 스테이지의 경우 이와 같은 보정이 레벨차 몇부터 적용되는지 달라질 수 있음.