건물이 지어지는 데 있어 몇몇 색다른 조건이 있는 경우도 있었지.
대표적으로 성전 선포 시기에는 군사 생산과 관련 없는 건물들...로 평가되는 상당수가 지을 수 없는 상태였단 말이야.
뭐 대다수는 XML에 조건이 다 명시되어 있고, 일부 python에 조건이 들어가 있지. 어떤 기술 연구가 종료되어야 한다던가 하는 것은 기본 사항이고, 특정 종교(국교 상태이든 단순히 도시에 전파만 되어 있으면 되든)가 필요하다거나, 유닛으로만 지어야 한다던가, 먼저 무슨 건물이 지어져 있어야 한다던가(가끔 건물이 여러채 필요한 경우도 있고), 특정 이벤트 이후(안건 통과 같은)에나 지을 수 있다던가...등등 조건이 많단 말이야.
한데 XML이야 본편에서 많이 보고, 딱 봐도 이게 뭐겠구나...싶게 단어만 알면 대충 이거 고치면 되겠지 싶게 구성되어 있으나,
python은 뭐 여태 봤듯이;; 대체 조건이 어디에 가 있을까를 뒤져야만 알 수 있게 되어있단 말이야.
이번에는 대체 어디서 그런...건물을 짓고 못짓고 하는 문제를 관리하는 가 알아보는 시간 되겠다.

건드려야 할 파일은 CvGameUtils.py인데, 역시 위치를 보나 하는 일을 보나 초 중요 파일이니 백업은 기본...음 기본 소양인가? 쓸데없는 노파심이 좀 있어서...
도시에 짓는 건물에 관여하는 함수는 두개가 있다.
def canConstruct(self,argsList): ←얘는 건물을 지을 수 있는가? 를 관장하고,
def cannotConstruct(self,argsList): ←얘는 건물을 지을 수 없는가? 를 관장하지.

전자는 무지 짧은데(실제로 적용되는 항목이 없다), 후자는 꽤나 길다--;
따라서 단락별로 나눌 필요가 좀 있겠지? 실은 너무 길어서 다 옮기기가 좀--;;;;

①if pPlayer.hasTrait(gc.getInfoTypeForString('TRAIT_AGNOSTIC')): 구문
당연히 실증적 특성을 가지고 있다면...으로 시작하므로, 밑에 오는 내용은...뻔하다. 해당 건물들을 짓지 못하게 하는 것이지.
그래서 XML로 그리고리의 금지 건물 중 종교 사원들은 아무리 거기서 지을 수 있도록 만들어 본들...실증적 특성을 떨구지 않는 한 여전히 못짓는다는 소리다.

②if pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_CULTURAL_VALUES')) == gc.getInfoTypeForString('CIVIC_CRUSADE'): 구문
성전때 소개된, 어떤 건물을 짓지 못하게 되느냐...에 대한 해답이 바로 여기에 있지.
바꿔 말해서, 배너로 성전 선포중에 꼭 짓고 싶은 건물이 있다면...여기서 해당 건물의 항목을 삭제(혹은 주석처리)하면 되겠다.

③if eBuilding == gc.getInfoTypeForString('BUILDING_SHRINE_OF_THE_CHAMPION'): 구문
영웅의 사당을 언제 지을 수 있는가...가 아니라 언제 지을 수 없는가...라는 점을 상기하도록. 구문 전체가 다 건물을 언제 지을 수 없지? 라는데서 출발하잖아.
해석을 조금 자세히 써줄까...참값을 반환한다는 얘기는 당연히 지을 수 없어? 예...라는 점 다시한번 강조한다.
iHero = cf.getHero(pPlayer) ←진영 영웅 탐색
if iHero == -1: ←진영 영웅이 없는 문명일 경우
return True ←참
if CyGame().isUnitClassMaxedOut(iHero, 0) == False: ←아직 생산된 적이 없어?
return True ←참
if pPlayer.getUnitClassCount(iHero) > 0: ←진영 영웅이 살아있어?
return True ←참
XML에서 죽도록 찾아봐야...영웅의 사당을 지을 수 있는 조건 따위가 안나오는 이유는 뭐 오직 이것 때문이지.

④if eBuilding == gc.getInfoTypeForString('BUILDING_MERCURIAN_GATE'): 구문
천사들로 갈아탈 때 귀찮게 기존 문명의 수도를 옮겨둬야 하는 이유를 설명해 주는 구문이라고 보면 되겠지.
뭐 그 외의 조건들도 달려 있긴 하지. 참이 되는 조건은 차례대로, 옵션 켰나?/장막교가 국교?/수도?/AI일 경우 성향이 악?이다.
잿빛 장막 조건을 무력화 시키면...으흐흐흐흐

⑤그 밑에 오는 조건은 참으로...--; 뭐 영문명 알고 있겠지만, 루온노탈의 제단을 다시 짓지 못하게 하는 구문이지.
첫번째 if문이 사실 시작이고(그 위는 상수 선언이라고 보면 되겠지. 코드 가독성과 재활용을 위해 상수를 미리 선언하는 것은 매우 권장되는 일이지)
그 아래 딸린 if문부터 실질적인 조건이 되는데...맨 첫 if가 성향이 악이면 못짓게 하는 것이고, 나머지는 상위 제단이 있을 때 하위 제단을 더이상 짓지 못하게 하는 역할이야.

⑥if pPlayer.isHuman() == False: 구문
사실 바로 그 다음줄이 구문 대표로 와야 한다는 생각이지만 뭐--;
AI플레이어의 경우, 성향이 악인 세력만 황혼의 예언 불가사의를 짓게 만드는 것이다. 그러니까 인간에게는 아무런 영향이 없어서 선이고 악이고 그냥 짓는다는...

⑦if eBuilding == gc.getInfoTypeForString('BUILDING_SMUGGLERS_PORT'): 구문
마지막인데, 뭐 간단하지? 밀무역 안건이 통과해야 지을 수 있게 한거야.


응용의 폭은 뭐...각 사례가 다 보여주고 있으니 더 할 말이 없군.
다만 6번 항목은 거꾸로 쓰는 것이 더 좋아. 왜인지 사족을 잠깐 달면...

존재하는 모든 플레이어가, 황혼의 예언을 지을 수 있는 연구까지는 다 했다고 하자.
인간 플레이어인 자신을 제외하고, AI가 6 있다면...AI당 한번씩은 6번의 구문을 다 거치게 돼. 성향이 뭔지 파악하는 것까지 전부.
이게 만약 누군가 황혼의 예언을 완성했다면...
여전히 6번의 구문을 거쳐. 다만 성향을 파악하는 단계까지는 가지 않지. 두번째 구문에서 걸리거든. 이미 지어졌으니 여기서 탈락.
그런데 이걸 바꿔서...AI인가 파악하는 구문과 지으려 하는 건물이 황혼의 예언인가 하는 구문의 위치를 바꿀 경우...
구문의 첫단계에서 끝이지. AI인가 아닌가 파악하는 구문으로 내려가지도 않아.
아...그게 뭐 길다고...이럴 수도 있는데, 이런게 쌓여서 턴랙이 된다구.
다만 다른 조건을 더 넣을 계획이 있었던 지는 모르겠어. 그렇다면 저런 배치를 할 수도 있겠다만....그래도 현 상태를 유지한다면 지금의 구문 순서는 상대적으로 비효율적이라는 소리야.
뭐 이것보다 훨씬 흉악한 구문들에 비하면 새발의 피인 것은 확실하네^^;
 
죠니 사사키가 작성한 글입니다.
,