모카의 가마솥에 대한 설명임. 몇번 다루었으니 그게 무슨 일을 하는 지는 알거고... 기억 되새기기
내부 구조를 봐야겠지. 다소 딱딱하긴 하지만...예시가 길어서 그렇지 내용은 얼마 안된당.

대상 파일은 CustomFunctions.py / 찾을 것은 def getUnholyVersion(self, pUnit):
def getUnholyVersion(self, pUnit):
iUnit = -1
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ADEPT'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_IMP')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_MAGE')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_LICH')
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ANIMAL') or pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_BEAST'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 1:
iUnit = gc.getInfoTypeForString('UNIT_SCOUT')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_HELLHOUND')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_ASSASSIN')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_BEAST_OF_AGARES')
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ARCHER'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_ARCHER')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_LONGBOWMAN')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_CROSSBOWMAN')
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_DISCIPLE'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_THE_ASHEN_VEIL')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_PRIEST_OF_THE_VEIL')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_EIDOLON')
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_MELEE'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 1:
iUnit = gc.getInfoTypeForString('UNIT_SKELETON')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_DISEASED_CORPSE')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_CHAMPION')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_BALOR')
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_MOUNTED'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_HORSEMAN')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_CHARIOT')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_DEATH_KNIGHT')
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_RECON'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 1:
iUnit = gc.getInfoTypeForString('UNIT_SCOUT')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_HELLHOUND')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_ASSASSIN')
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_BEASTMASTER')
return iUnit

해석이야 링크를 통해 기억을 다시 새겨보면 될거고...
이대로라면 이것의 적용을 받지 못하는 유닛이 하나 있게 된다...말라킴의 전용 유닛인 라이트브링어...티어1의 신앙 유닛이거든. 목록 보면 알겠지만 대상이 없어--;
그건 곧 죽으면 땡이라는 것이지. 뭐 그럴 일은 어거지로 만들지 않으면 잘 없겠지만 말야.
함선이야 뭐 그렇다 치고, 공성 병기들도 누군가 분명 붙어있는데 살아나고 뭐고 없이 그냥 꽥. 아무래도 기계로 취급해야 하는 의무감이 든건지...

구문 자체는 뭐 응용하는데 모자람이 없긴 한데...
이대로 두면 쓸데없이 판별을 많이 하게 된다는 문제가 있지?
적어도 같은 탭을 두고 있는...그러니까 형제끼리는 장자 빼고는 if문이 아니라 elif문으로 바꿔주면 실행 속도를 향상시킬 수 있다.

가장 빠른 단계...일 마법 계열 2티어(=견습 마법사급) 유닛을 생매장;;했다고 가정해 보자. 다음과 같은 과정을 거친다.
 마법 계열인가? yes
  티어가 2인가? yes
   돌려줄 유닛값은 임프
 동물이나 괴수 계열인가? no
 궁술 계열인가? no
 신앙 계열인가? no
 백병 계열인가? no
 기마 계열인가? no
 정찰 계열인가? no
 지정된 값(임프)을 돌려준다.

과정은 이정도. 그럼 아까 말한대로, 형제들 중 장자는 그대로 if~로 시작하고, 그 외 형제는 elif~로 만든다면...
 마법 계열인가? yes
  티어가 2인가? yes
   돌려줄 유닛값은 임프
 지정된 값(임프)을 돌려준다.

짧지? 자 적당히 백병 계열 3티어(=투사급) 유닛을 생매장 해볼까?
일단 그냥 저대로 뒀을 때.
 마법 계열인가? no
 동물이나 괴수 계열인가? no
 궁술 계열인가? no
 신앙 계열인가? no
 백병 계열인가? yes
  티어가 1인가? no
  티어가 2이가? no
  티어가 3인가? yes
   돌려줄 유닛값은 투사
  티어가 4인가? no
 기마 계열인가? no
 정찰 계열인가? no
 지정된 값(투사)을 돌려준다.

다음은 elif문으로 썼을 때.
 마법 계열인가? no
 동물이나 괴수 계열인가? no
 궁술 계열인가? no
 신앙 계열인가? no
 백병 계열인가? yes
  티어가 1인가? no
  티어가 2인가? no
  티어가 3인가? yes
   돌려줄 유닛값은 투사
 지정된 값(투사)을 돌려준다.

차이가 적어지긴 했지만 후자가 더 짧은 것은 당연...
따라서 이 구문을 좀더 효과적으로 만들기 위해서는, 백병과 정찰 계열을 위쪽으로 올리는 것이 낫겠지.
아무래도 정찰 계열보다는 백병 계열이 수도(뭐 꼭 가마솥을 수도에 지으란 법은 없지만, 정찰 계열은 객사할 확률이 높고, 백병 계열은 도시 주둔군이었을 가능성이 더 높지?)에서 죽을 일(=판별할 일)이 많을 터이므로, 이왕이면 백병을 맨 먼저, 그다음 정찰을 판별하게 두는 게 좋겠지.

자 elif문을 쓰고 색 입혀볼게. 다만 순서를 바꿔온 부분은 딱히 색으로 표시 안할거니 헷갈리지 않도록...
def getUnholyVersion(self, pUnit):
iUnit = -1
if pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_MELEE'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 1:
iUnit = gc.getInfoTypeForString('UNIT_SKELETON')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_DISEASED_CORPSE')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_CHAMPION')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_BALOR')
elif pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_RECON'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 1:
iUnit = gc.getInfoTypeForString('UNIT_SCOUT')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_HELLHOUND')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_ASSASSIN')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_BEASTMASTER')
elif pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ADEPT'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_IMP')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_MAGE')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_LICH')
elif pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ANIMAL') or pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_BEAST'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 1:
iUnit = gc.getInfoTypeForString('UNIT_SCOUT')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_HELLHOUND')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_ASSASSIN')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_BEAST_OF_AGARES')
elif pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ARCHER'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_ARCHER')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_LONGBOWMAN')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_CROSSBOWMAN')
elif pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_DISCIPLE'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_DISCIPLE_THE_ASHEN_VEIL')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_PRIEST_OF_THE_VEIL')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_EIDOLON')
elif pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_MOUNTED'):
if gc.getUnitInfo(pUnit.getUnitType()).getTier() == 2:
iUnit = gc.getInfoTypeForString('UNIT_HORSEMAN')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 3:
iUnit = gc.getInfoTypeForString('UNIT_CHARIOT')
elif gc.getUnitInfo(pUnit.getUnitType()).getTier() == 4:
iUnit = gc.getInfoTypeForString('UNIT_DEATH_KNIGHT')
return iUnit
별로 다르지 않지? 하지만 이정도만 고쳐도 속도가 오르니까 감수할 만한 수고지.

그러나...이정도로 만족하긴 좀 뭐해서 말이야. 좀더 짧게 줄여야지. 그래야 고치기도 편하잖아...사실 동의어 반복이 너무 심해서 길이만 쓸데없이 길다구.
게다가...예시 빼면 대체 내용이 있긴 한겨? --; 고치는 것도 앞에 글자 두개씩만 더 달아놓았을 뿐이잖아...
여기서 멈출 수는 없지! 이제부터가 포스팅 하이라이트!(근데 직접 고치는 입장 되면 위에 것이 편할 수도--;)
자 다음과 같이 구문을 고친다. 보너스로 라이트브링어도 부활하게 해주지 뭐. 색은...입힐 필요가 있나 싶어--; 거의 전부 뜯어 고치는 수준이거든.
def getUnholyVersion(self, pUnit):
iUnit = -1
iCombat = pUnit.getUnitCombatType()
iTier = gc.getUnitInfo(pUnit.getUnitType()).getTier() - 1
listCombat = ['ADEPT', 'ANIMAL', 'BEAST', 'ARCHER', 'DISCIPLE', 'MELEE', 'MOUNTED', 'RECON']
for i in range(len(listCombat)):
listCombat[i] = gc.getInfoTypeForString('UNITCOMBAT_' + listCombat[i])
listUnit = [[-1, 'IMP', 'MAGE', 'LICH']]
listUnit += [['SCOUT', 'HELLHOUND', 'ASSASSIN', 'BEAST_OF_AGARES']]
listUnit += [['SCOUT', 'HELLHOUND', 'ASSASSIN', 'BEAST_OF_AGARES']]
listUnit += [[-1, 'ARCHER', 'LONGBOWMAN', 'CROSSBOWMAN']]
listUnit += [['LIGHTBRINGER', 'DISCIPLE_THE_ASHEN_VEIL', 'PRIEST_OF_THE_VEIL', 'EIDOLON']
listUnit += [['SKELETON', 'DISEASED_CORPSE', 'CHAMPION', 'BALOR']]
listUnit += [[-1, 'HORSEMAN', 'CHARIOT', 'DEATH_KNIGHT']]
listUnit += [['SCOUT', 'HELLHOUND', 'ASSASSIN', 'BEASTMASTER']]
if iCombat in listCombat:
iUnit = gc.getInfoTypeForString('UNIT_ + listUnit[iCombat][iTier])
return iUnit
훨씬 짧지? 어디를 고쳐야 할 지도 더 확실하고...중복 확인하는 것도 없고...
중간에 완전히 같은 줄이 한쌍 있는데, 그건 당연한거야...잘못해서 한번 더쓴거 아니야...
사실 사전을 쓰면 더 간단하겠지만, 여태까지 계속 리스트 하나만으로 해왔으니...그냥 다중 리스트로 처리해 봤어. 

실제 호출은 CvEventManager.py의 def onUnitKilled(self, argsList): 구문을 찾아가 보면 있을거야. 뭐 그냥 cf.getUnholyVersion(unit)를 막바로 찾아가는 게 더 빠르지만.
다만 거긴 정말 호출만 하는 거니까...뭐가 나올지 선택하는 것은 오늘 정리한 대로 해야지. 구지 건드릴 필요는 없어. 다른 목적이 있다면 모를까...내일? ^^;
 
죠니 사사키가 작성한 글입니다.
,