상세 컨텐츠

본문 제목

문명6 버그 분석 - 원거리 유닛 진급 '포좌', '화살 폭풍'의 버그

문명/문명6 버그

by Lucill 2025. 3. 5. 00:13

본문

 문명6은 참 잘 만든 게임이지만 파고 들다보면 버그망겜이란 말이 나올 정도로 사소한 버그들이 많다.

 버그 수정 모드를 만들면서 하나 하나 찾아보다 보니 생각보다 이런 버그들이 많았고 심지어 일부는 잘 알려지지 않은 버그들도 많았다.

 그래서 이 카테고리에서는 내가 찾은 버그들의 내용과 그 발생 원인과 이 버그를 해결한 방법까지 한 번 소개해보려고 한다.

 

 오늘은 원거리 유닛 진급과 관련된 버그 2가지를 알아보자.

 

1. <포좌> 진급 버그

 

 

 우선 원거리 유닛의 <포좌> 진급에 대해 알아보자. 아마 많은 플레이어들이 도시 공성전을 하다가 이 진급을 찍을 차례가 되면 가뭄의 단비처럼 느껴졌을 것이다. 원거리 유닛은 원거리 공격력은 강하지만 방어력은 다른 군사 유닛들보다 훨씬 약하기 때문에 '도시 공격 방어 시 전투력 상승'은 공성전에서 매우 유용한 진급이기 때문이다.

 

 그런데 정말 이 진급이 유용했을까?

 

 거두절미하고 핫시트 모드를 켜보자.

 

 

 오늘의 실험을 위해 겁도 없이 포르투갈에서 혼자 로마까지 찾아온 3진급 궁수이다.

 보다시피 분명히 '포좌' 진급이 찍혀 있다. 그럼 도시 공격을 방어할 때 전투력이 상승해야 할 것이다.

 

 

 이번엔 로마 입장에서 도시 공격으로 이 궁수를 공격할 때의 모습이다.

 

 

 ????

 전투력 상태창에서 보다시피 방어력 +10? 그딴거 없음 상태이다.

 

 그렇다면 표시만 저렇게 되는 거지 실제로는 효과가 적용될 수도 있지 않을까?

 

 

 응 아니야~

 위 스샷은 <포좌> 진급을 찍은 3진급 궁수0진급 궁수를 똑같이 한 대씩 도시 공격으로 때린 모습이다.

 보다시피 데미지 차이가 1도 없다ㅎㅎ

 

 즉, 포좌 진급은 전혀 효과가 없었다는 충격적인 사실!

 

 상당히 치명적인 버그인데도 이 버그는 잘 알려지지 않았는데, 문명 게임은 싱글 게임으로 하는 경우가 많다 보니 공격할 때 전투력 상승 여부는 체크가 가능하지만 방어할 때 전투력은 플레이어가 직접 인게임 상에서 수치로 확인하기가 어렵기 때문이다. 하지만 지금까지도 잘 알려지지 않았다는 게 상당히 충격적인 버그이다.

 

 그럼 이왕에 왜 이런 버그가 발생한 건지도 알아보자.

 

 

 이건 게임 데이터 xml 파일의 '포좌'(원문은 EMPLACEMENT) 진급에 붙어 있는 코드이다.

 아 뭐야 이 복잡한 건;; 싶겠지만 당황하지 말고 찬찬히 살펴 보자.

 (별로 궁금하지 않은 분들은 넘어가시길..)

 

 우선 ModifierId 라는 것은 게임 내에서 특정 효과를 발현시키는 명령어라고 생각하면 된다. 게임 내 모든 효과들은 이 Modifier를 사용해서 발현시킨다. 이 스샷에 찍힌 'EMPLACEMENT_DEFENSE_BONUS_VS_CITIES' 라는 Modifier 는 유닛이 <포좌> 진급을 찍으면 기능을 발휘하도록 연결되어 있다.

 ModifierType은 해당 Modifier가 어떤 종류인지를 정해주는 것으로, 여기서의 경우에는 보다시피 유닛의 전투력을 조정하는 Modifier라는 걸 알 수 있다.

 SubjectRequirementSetId는 이름이 길지만 한 마디로 이 Modifier가 실행되기 위해 필요한 '조건'들의 세트이다.

 

 그럼 이번엔 해당 Modifier가 실행되기 위해 필요한 조건들이 뭐가 있는지 살펴보자. 'EMPLACEMENT_REQUIREMENTS' 에 포함되는 조건들은 다음과 같다.

 

 이 스샷에서는 아까 봤던  'EMPLACEMENT_REQUIREMENTS' 라는 세트에 어떤 조건들이 포함되어 있는지를 확인할 수 있다. 이 세트에 포함되는 RequirementId 들은 총 3개이다.

 

 PLAYER_IS_DEFENDER_REQUIREMENTS

 OPPONENT_IS_DISTRICT

 OPPONENT_PLOT_IS_CITY_CENTER_REQUIREMENT

 

 단순히 해석해보자면 '방어할 때', '상대가 특수지구일 때', '상대가 차지한 타일이 도심부일 때' 이렇게 해석된다.

 여기까진 별 문제가 없는데? 싶겠지만.. 함정은 마지막 'OPPONENT_PLOT_IS_CITY_CENTER_REQUIREMENT' 조건에 있었다.

 

 이번엔 이 ' OPPONENT_PLOT_IS_CITY_CENTER_REQUIREMENT' 라는 조건에 대해 살펴 보자.

 

 두 스샷 중 위쪽의 스샷은 해당 조건의 Type이고, 아래 스샷은 해당 조건의 구성 요소이다.

 (이 RequirementType에 따라 실제로 해당 조건이 어떤 종류인지가 결정된다고 보면 된다.)

 문제의  'OPPONENT_PLOT_IS_CITY_CENTER_REQUIREMENT' 조건의 Type은 "DISTRICT_TYPE_MATCHES" 즉 특수지구 타입이 일치해야 한다는 것이고, 구성 요소를 보면 그 특수지구가 도심부여야 한다는 것을 알 수 있다.

 

 '아니 그게 뭐가 문젠데' 싶겠지만 문제는 이 Type에는 '상대가 이를 만족해야 한다'라는 조건이 빠져 있다는 것이다.

 즉 원래 개발진의 의도대로라면 "상대가 이 조건에서 지정한 특수지구 종류와 일치한다" 는 뜻이어야 했겠지만, 실제로 지정된 Type은 '상대가' 일치해야 한다가 아니라 단순히 '특수지구 종류가 일치해야 한다' 는 type이므로, 이 조건대로라면 이 Modifier를 가진 대상 본인이 이를 만족해야 한다.

 이 Modifier를 가지고 있는 것은 '포좌 진급을 찍은 유닛'이므로 이 조건은 포좌 진급을 찍은 유닛의 특수지구 타입이 도심부여야 한다는 조건이 되는 셈이다.

 

 

 이해를 돕기 위해 포좌 진급의 다른 조건인 'OPPONENT_IS_DISTRICT' 의 경우를 보면,

 이 조건은 이미 Type에서부터 '상대방(opponent)이 특수지구일 것' 이라는 내용임을 알 수 있다.

 

 즉 이 버그는 문제의 'OPPONENT_PLOT_IS_CITY_CENTER_REQUIREMENT ' 조건에 적절하지 않은 RequirementType을 사용하면서 생긴 버그이다. Modifier를 가지고 있는 건 유닛인데, 유닛이 도심부 특수지구와 일치해야 한다니 말이 안 되는 조건이 있으니 해당 Modifier가 실행될 리가 없는 것이다.

 

 

 이 버그는 문제의 해당 'OPPONENT_PLOT_IS_CITY_CENTER_REQUIREMENT'  조건을 삭제하고 깔끔하게 해결되었다. 

 

 

 

2. <화살 폭풍> 진급 버그

 

 

 이번에는 <화살 폭풍> 진급의 버그를 살펴보자. 위에서는 좀 복잡해서 자세하게 설명했지만 이번 버그는 간단하다.

 <화살 폭풍> 진급은 보다시피 '지상 및 해상 유닛 공격 시 원거리 전투력 보너스'를 제공하는 진급이다.

 하지만 해당 진급을 찍고 도시를 때려 보면

 

 

 

 특수지구를 때리고 있는데도 <화살 폭풍>이 적용되는 버그를 확인할 수 있다.

 이 버그 역시 Requirement의 문제로 발생한 것이다. 해당 진급의 Requirement를 살펴 보면,

 

 

 아.. 당시 코딩하던 개발자가 누군지 몰라도 그냥 지상 유닛과 해상 유닛을 각각 지정해주면 되는데 그것조차도 귀찮았나 보다. 그냥 상대가 공중 유닛만 아니면 다 적용되는 걸로 퉁쳐놨다. 어떻게 유닛이 도시나 특수지구도 때릴 수 있다는 걸 잊어먹을 수가 있을까??

 

 해당 버그는 '상대가 특수지구가 아니다' 라는 조건을 추가하여 해결되었다.

 


 

 오늘은 다시 봐도 어이가 없을 정도로 기초적인 부분에서 발생하는 버그 2가지를 살펴 봤다.

 이 글에서 소개한 버그들은 '문명6 버그 수정 모드'에서 수정되어 있다.

 

* 문명6 버그 수정 모드 (Lucill's Bug Fix)

https://steamcommunity.com/sharedfiles/filedetails/?id=3330179856

 

Steam Workshop::Lucill's Bug Fix

 

steamcommunity.com

 

 

 

 

 

관련글 더보기

댓글 영역