지표를 계산하기위해 전처리한 내용들을 간단하게 요약해보려고 합니다.
! 앞서 말했던 것처럼 유저가 상대방을 공격했을때 LogPlayerAttack
로그가 남게됩니다. 그리고 상대방을 맞췄을 때, LogPlayerTakeDamage
라는 로그가 남게 되고 공격한 사람의 weapon 정보 그리고 어떤 부위를 맞췄는지, 어느 좌표에서 맞췄는지 attacker 과 victim 의 입장에서 남게 됩니다.
또한 데미지를 왜 입었는지에 대한 정보는damageTypeCategory
에 남겨지고 있으며
저의 경우, 총기에 대한 반동지표를 만들어야 하기 때문에 Damage_Gun
인 경우만 가져와야합니다.
제가 필요한 로그만 한마디로 요약하면 오로지, 총으로 데미지를 입은 경우 입니다.
damage_gun_df = df[
((df['_T'] == 'LogPlayerAttack') & (kill_df['attackType'] == 'Weapon') & (kill_df['weapon.itemId'] != 'Item_Weapon_Apple_C') & (kill_df['weapon.itemId'].notna())) |
((kill_df['_T'] == 'LogPlayerTakeDamage') & (kill_df['damageTypeCategory'] == 'Damage_Gun')) |
((kill_df['_T'] == 'LogPlayerKillV2') & (kill_df['killerDamageInfo.damageTypeCategory'] == 'Damage_Gun')) |
((kill_df['_T'] == 'LogPlayerMakeGroggy') & (kill_df['damageTypeCategory'] == 'Damage_Gun')) # monster_bear
]
# 참고로 `Item_Weapon_Apple_C` 의 경우, 로비에서 다른 플레이어들과 대기하는 동안 던질 수 있는 투척무기입니다 ㅋㅋ(대기하는 동안부터 로그가 남기 때문에 제외)
하지만 보시다시피.. 까다로운 부분들이 꽤 있었습니다. LogPlayerAttack
인 경우
weapon.itemId
에 무기정보가 있었고 LogPlayerTakeDamage
인 경우 damageCauserName
에 무기정보가 있습니다. 게다가 해당 무기들의 표현하는 값들도 다릅니다. ( WeapVector_C == Item_Weapon_Vector_C )
그래서 아래와 같이 모든 weapon 이름을 똑같이 매핑하고, 어떤 종류의 총인지 (AR인지, SR인지 등) 작업이 필요했습니다. (chatGPT 굳..) 자세한 내용은 생략하겠습니다.
또한 수집한 데이터에서 distance
라는 컬럼이 있긴 하지만 유저가 kill을 할 때만 기록 되고 있었습니다. LogPlayerTakeDamage
인 경우에는 서로의 좌표만 나와있었기 때문에 따로 계산이 필요합니다 ㅎㅎ. 좌표의 차이는 from scipy.spatial.distance import euclidean
를 이용하여 쉽게 구할 수 있습니다.
맞춘 부위에 대한 정보입니다. 해당 값들을 column으로 뽑아주고 유저가 hit 했다면 어느 부위를 맞췄는지 하나의 행으로 표현했습니다. (dummies 변수로 전환)
당연하지만 멀리 있는 적보다 가까이 있는 적을 맞추는게 쉽습니다. 특히 SR(스나이퍼)이 아닌 AR같이 근접전 총들의 성능을 평가하기 위해서 거리별(특히 근접전/중장거리)로 카테고리를 나눠서 확인하는 것이 꼭 필요할 것 입니다.
먼저 공식적인 배그의 격자점을 참고해보면 노란색 격자의 길이가 1km이며 그 안의 흰색 사각형 격자기준 100m에 해당합니다.
LogPlayerTakeDamage
로그에서 발생한 거리들을 구하고 간단하게 확인해 보았는데, 역시나 100m 미만의 거리에서 총격전이 많이 일어납니다. 배그를 몇번 해보았고 플레이하는 영상을 많이 봐온 저로서는 일단 10m 미만을 근접전으로 보고 10m단위로 카테고리를 만들기로 했습니다!
요약
또한, 총이 발사되는 시간은 매우 짧고 한발 한발 로그가 ms단위로 남겨져 있기 때문에 데이터를 10초단위로 세션을 나누고 집계했습니다. 먼저
LogPlayerAttack
를 통해 유저가 총을 사용한 shot table과LogPlayerTakeDamage
를 통해 유저가 해당 시간에 같은 총으로 hit을 했는지에 관한 table을 만들어서 합쳐주었습니다.
이유와 한계점..
이렇게 한 이유는 거리별로 집계하기 위함입니다. 난사 자체가 근접 거리에서만 유용한 교전 방식이기 때문에 거리지표가 꼭 필요합니다. 하지만 유저가 shot을 했지만 맞추지 못한 경우, 이 유저가 어느 방향, 어떤 적을 향해 쐈는지 distance를 구하기 어렵다는 한계점이 있습니다.
그래서 ms 단위로 남겨진 로그를 10초 단위로 세션을 만들고
" 같은 세션에 shot과 hit 로그가 발생 했다면 같은 거리의 적을 쐇을 것이다." 라는 가정하에 집계 했습니다 ㅎㅎ (같은 적이라는 최소한의 조건을 10초 단위로 본것입니다.)가령,
11:13:50
시간 대에 10발을 shot 했지만 4발만 맞춘경우 나머지 6발도 같은 거리에 있는 적을 맞췄다고 보는 것이죠.
11:15:00
시간대의 경우 shot을 했지만 전부 빗나갔으므로 거리를 구할 수 없습니다.)현재 35경기정도 되는 매우 부족한 표본이기 때문에 아무래도 무기별로 편차가 심한 편이었습니다ㅎㅎ.. 그래서 아래의 제약을 걸고 총기별 정확도를 계산해 보았습니다!
한세션에 적어도 10발 이상 연속으로 shot + 거리별로 100발 이상은 사용된 총기 입니다!
무기와 거리별로 집계한 테이블은 대략 아래와 같은 형태인데요! ratio
가 거리별 정확도를 계산한 컬럼입니다.
오랜만에 Streamlit를 꺼내 러프하게 시각화해 보았습니다..ㅎㅎ
GunGenre
(무기장르) 와 GunName
(무기이름) 별로 거리별 정확도를 확인할 수 있도록 구성했는데요. 일단 AR을 기준으로 현재 데이터에서 사용로그가 많은 3개의 총기를 간단하게 확인해 보겠습니다.
QBZ 의 경우 AR중에서 가장 탄속이 빨라 중장거리에서 정확도가 꽤높은 총으로 알고 있었는데 실제 거리별로 시각화 했을 때, 다른총에 비해 중장거리에서 상대적으로 높은 정확도를 갖고 있어서 놀라웠습니다.
반면에, 화력은 강력하지만 반동이 심한
AUG
의 경우 3% 정도 차이가 납니다.
이번에는 유저가 어떤 무기를 n초 동안 n번 사용해서 어떤 부위를 맞췄는지 , 각 부위들을 좌표화하여 거리를 구해 탄이 튀었는지 간접적으로 확인할 수 있는 반동점수를 계산하려고 합니다.
이전에 세션을 10초 단위로 끊었지만, 이번에는 순간적인 총기 반동을 보기 위해 1초단위로 보는것이 맞다고 생각했습니다.
유저를 맞췄을 시에 남겨지는 디테일한 부위의 값은 총 6개입니다. "머리, 몸통, 팔, 복부, 다리" (그리고 맵 내에서 생성되는 몬스터 를 맞춘 경우 NonSpecific 으로 남게 됩니다.)
하지만 맞춘 부위의 좌표를 알 수는 없고 말 그대로 damageTypeCategory
컬럼의 값안에 문자로 나타나는데요. 각 부위별로 좌표를 정의해주고 해당 값들을 차이를 통해 총기별 반동을 유추할 수 있지 않을까? 생각이 들었습니다 ㅎㅎ (이전에 damageTypeCategory
컬럼의 값들을 dummy 한 이유입니다!)
hit_locations = {
'HeadShot': [(40, 75, 240, 280)],
'TorsoShot':[(30, 90, 175, 240)] ,
'ArmShot': [(0,30,230,140),(90,120,230,140)],
'PelvisShot': [(30,90,150,175)],
'LegShot': [(30,90,10, 150)],
}
가령, 아래와 같이 7발중 6발을 맞춘 경우, 부위별로 정의된 영역에 각 좌표가 랜덤으로 생성되게 했습니다. (빗나간 경우(miss) 위 영역 이외의 곳에 랜덤으로 좌표가 생성됩니다.)
같은 부위에 많이 적중했다면 당연히 초탄과의 나머지 탄들의 거리차이가 작을 것입니다. 물론, 현재 분석에서는 총기 부착물과 개인의 실력을 고려하지는 않았다는.. 한계점이 있습니다. (ㅎㅎ나중에 부착물까지 고려해 보려고 합니다.)
이렇게 생성된 hit좌표들의 차이를 구해서 recoil
이라는 반동 지표를 만들어 보았습니다.😀 당연히 값이 적을 수 록 반동 제어가 괜찮은 편이라고 유추할 수 있습니다.
요약
역시 난사 자체가 근접 거리에서만 유용한 교전 방식이기 때문에 거리제한을 두었습니다.
- 50 미만의 거리에서 1초동안 3발이상 사용한 경우의 데이터 기준으로 집계하였습니다.
- 부위별로 좌표를 정의하여 탄과의 거리차이를 구하고 총기별로 평균을 구해 반동을 계산했습니다.
- 100발 이상 사용된 총기의 기준으로 집계하였습니다.
- 부위별로 랜덤으로 좌표가 생성되므로 한계점이 있습니다.
(AR 기준) 극적인 차이를 위해 최소 최대값을 10~90값으로 정규화해서 간단하게 시각화 해보았는데요!
- 역시 SS보급무기인 그로자와 파마스의 경우 굉장히 좋은 집탄율을 보여주고 있었습니다.
- 기본적으로 드랍되는 총기들 중에서는 근소한 차이지만
HK416
가 상대적으로 좋은 집탄율을 보여주고 있습니다.M16
의 경우 역시 예상대로 가장 반동이 높네요 ㅎㅎ.. 해당총의 경우 연사가 없으므로 단발이나 점사로 광클해야 하고, 화면 흔들림이 큰 총중 하나로 알 고 있습니다.
일단 이번 포스팅에는 전처리 내용과 간단하게 EDA를 해보았는데요🫡 하면서 뭔가 정리가 안되는 느낌이라 진행된 부분까지만 중간정리를 남겨 보았습니다. 추가적으로 발로란트에서 사용한 '시간내 멀티킬' 지표와 부착물을 고려해서 다시 분석해보면 재밌겠군요!!
(대시보드 또한 완성해보려고 합니다 ㅎㅎ)