허허...이게 대체 얼마만인지...


부활했으면 좋겠지만, 임시로 적는 것이다.

게다가 내용도 반이상 재탕...


개조일람 3번 글을 재활용 하는 것인데, 당연히 거기에 추가하고 조금 더 정리를 하는 수준이다.


일단 목적은...


자칫 지루해 질 수 있는 중반 이후의 난이도를 올리고,

지옥의 악마들을 좀 더 많이 등장시켜, 극적인 쾌감도 추구한다. 하는 김에 시나리오적인 발전도...



사실 본 포스팅 자체는, FfH2계 최고의 작가인 물의열쇠님에의 헌정이 계기가 되었다고 할까^^;


재미있는 소설을 보면서, 뭔가 아쉬움을 느꼈거나 하는 사람들은...팬픽이라고 하지? 그런걸 쓴다고 하더군. 뭐 이바닥에서 쉽게 통하는 얘기라면, 동인지라고 하면 되겠네. 다들 그런 생각 하잖아? 나라면 여기서 이런 식으로 쓰겠다거나...

물론 주제 파악을 해야지. 사실 상상의 나래를 펼치는 수준으로...까놓고 말해 뇌내망상으로 끝내고 여전히 작품을 읽는데 주력하게 되지. 아 뭐 행동으로 옮길 수 있는 사람은, 내가 보이겐 엄연히 능력자인거야. 장잉정신의 폭발이 아니라!

다만 작품이 끝나면...끝에 대해서는 어떤 방식으로든 아쉬움이 남잖아. 좀더 내용을 끌고 나갔으면 한다던가, 누구(캐릭터)의 나중(최후?)은 이런 식이 더 어울린다던가...


이런 기분을 실제로 옮기는 작업이 되겠군...

왜냐면...이게 잘 구현이 되면, 열쇠님의 연재에 반영이 된단 말이야~ 으흐흐^^;

아 물론 지금도 충분히 훌륭한 내용이지만...작가에게 좀더 개연성 있는 게임 진행이 되도록 도움을 주는 행위라구!



자 잡설은 여기까지...모두에게 도움이 될 수 있도록 정리해 보자.


위에서 목적을 써뒀으니...방향을 정하면,


조건부 : ①최초로 등장한 인페르날 문명이 멸망하거나, ②히보림(영웅 유닛)이 처음으로 다운될 때,

구현부 : ③인페르날 진영의 숨겨진 여섯 지도자를 추가로 등장시키고, ④하는 김에, 이런 일이 생겼다고 메시지창으로 잘 보이게 만드는 것이다.


이중, ②+③의 내용은 이미 예전에 썼다는 소리지.

①도 조건만 추가하는 것에 불과하니까...이번 포스팅은 ④의 내용을 얼마나 제대로 만드느냐에 달려있는 셈인가? 근데, 완벽히 일치하지는 않지만, ④의 내용을 만드는데 있어서 메시지 내용을 바꾸는 것 뿐이라서, 역시 이것도 했던 소리가 된단 말씀이야? 바로 이거지. 그래도 그건 내용이 좀 날로 먹는 셈이긴 했는데...야튼 변화는 그게 제일 심하겠어.


자 그러니까 순서에 안맞지만, ④부터 만들어 보겠다.


CvEventManager.py 파일을 열고, def onSetPlayerAlive(self, argsList): 구문으로.

보이는 것은, 기본 지도자들을 알파벳 순서대로 망했어요~가 됐을 때 단말마를 남기도록 한거다.

거기 맨끝에...붉은색 부분을 추가하자.


if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_VARN'):

cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_MALAKIM",()),'art/interface/popups/Varn.dds')

if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_JUDECCA'):

cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_JUDECCA",()),'art/interface/popups/Judecca.dds')

if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_SALLOS'):
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_SALLOS",()),'art/interface/popups/Sallos.dds')
if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_OUZZA'):
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_OUZZA",()),'art/interface/popups/Ouzza.dds')
if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_MERESIN'):
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_MERESIN",()),'art/interface/popups/Meresin.dds')
if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_STATIUS'):
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_STATIUS",()),'art/interface/popups/Statius.dds')
if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_LETHE'):
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_LETHE",()),'art/interface/popups/Lethe.dds')

아니 뭐...이미 해둔 사람이 있을 지도 모르겠군. 인페르날의 시나리오 전용 지도자들에게 단말마를 주는거야.

귀찮으면 공통 메시지(히보림이 쓰는거)를 남길 수도 있겠으나, 이러면 각자 다른 대사를 하게 할 수 있으니까...

여기서 문제가 되는 것은, DDS파일이야. 메시지창에 메시지만 남는게 아니라 얼굴도 같이 보이려면 저것이 필수인데...

내장되어 있기를 바라고 있어; 무책임한가? 근데 시나리오를 안해봤지만...저거 얼굴 정도는 나올거 같은데 말이야.


CIV4GameText_FFH2.xml 파일을 열고, 맨 끝으로,

뭐 원한다면 맨 끝이 아니라 이 비슷한 것들이 모여있는 근처에 추가할 수도 있겠지.


    <TEXT>

        <Tag>TXT_KEY_POPUP_DEFEATED_JUDECCA</Tag>

        <English>"So I am banished from the earth. I will await you in hell, worm. Hahahahahaha!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"사라져야겠군. 지옥에서 기다리고 있으마, 버러지. 하하하하하하!"</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_DEFEATED_SALLOS</Tag>

        <English>"So I am banished from the earth. I will await you in hell, worm. Hahahahahaha!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"사라져야겠군. 지옥에서 기다리고 있으마, 버러지. 하하하하하하!"</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_DEFEATED_OUZZA</Tag>

        <English>"So I am banished from the earth. I will await you in hell, worm. Hahahahahaha!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"사라져야겠군. 지옥에서 기다리고 있으마, 버러지. 하하하하하하!"</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_DEFEATED_MERESIN</Tag>

        <English>"So I am banished from the earth. I will await you in hell, worm. Hahahahahaha!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"사라져야겠군. 지옥에서 기다리고 있으마, 버러지. 하하하하하하!"</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_DEFEATED_STATIUS</Tag>

        <English>"So I am banished from the earth. I will await you in hell, worm. Hahahahahaha!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"사라져야겠군. 지옥에서 기다리고 있으마, 버러지. 하하하하하하!"</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_DEFEATED_LETHE</Tag>

        <English>"So I am banished from the earth. I will await you in hell, worm. Hahahahahaha!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"사라져야겠군. 지옥에서 기다리고 있으마, 버러지. 하하하하하하!"</Korean>

    </TEXT>

</Civ4GameText>

대사가 똑같다고? 그야 인페르날 대사를 복붙 해온거니까 그렇지...알아서 얼굴에 걸맞은 내용으로 바꿔줘. 나머지는 히보림이랑 똑같은 소릴 해도 되겠지만, 적어도 레테 정도는 여성스럽게 바꿔주는게 좋을 듯 싶군.

그런데...이거 원래 예정에 없던거잖아!?

자...예정대로 할 일, ④의 내용은 이거다! 역시 위에처럼 각 지도자마다 해야 하니까...빼먹지 말고 추가해 주도록. 전부 없는 것은 대사 상상력을 발휘하기 힘들어서 생략한거 뿐이야!


    <TEXT>

        <Tag>TXT_KEY_POPUP_ENTERED_JUDECCA_1</Tag>

        <English>"Foolable Hyborem!"</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"히보림 이 바보자식!"</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_ENTERED_SALLOS_1</Tag>

        <English>"Kalra said she already has known."</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"내딸은 알고 있었다던데."</Korean>

    </TEXT>

    <TEXT>

        <Tag>TXT_KEY_POPUP_ENTERED_OUZZA_1</Tag>

        <English>"I said to you about that to satiety, too."</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"나도 지겹게 말했잖아."</Korean>

    </TEXT>


    <TEXT>

        <Tag>TXT_KEY_POPUP_ENTERED_JUDECCA_2</Tag>

        <English>"Hyborem is a disgrace to the hell."</English>

        <L1 /><L2 /><L3 /><L4 />

<Korean>"히보림 그놈은 지옥의 수치야."</Korean>

    </TEXT>


아씨 상상력 부족...으음 뭐 시나리오는 내가 안쓰니깐 뭐^^;

뒤에 1이 붙은 것은 히보림의 세력이 남아있을 때 하는 말(그러니까 증원으로 오면서)이고,

2가 붙은 것은 히보림 세력이 멸망할 경우 뒤늦게 등장하면서 하는 말이다. 그러므로...

1번의 경우는 히보림의 대사도 하나쯤 주는게 좋겠지. '닥쳐, 실수였을 뿐이야!' 정도면 되려나...(변명은 넣으려면, 태그명을 TXT_KEY_POPUP_EXCUSE_HYBOREM로 만들 것)


본격적인 작업은 이제부터!

자 일단 ②, ③ 요 둘은 하나로 묶여있는데, 거기에 추가해야 할 대사는 1번쪽이지. 히보림이 한번 다운됐을 때(히보림은 두번 죽여야 타도되니까) 해야 할 작업...

할일? 위에서 만든 대사가 나가게 해주는 것!

어쩔 수 없이 지난번 내용의 복붙이 있어야 하겠군...뭐 그래도 이름 붙이는 부분이나, 전투 유닛의 숫자를 크게 늘리는 차이는 있지만.

그러니까 CvSpellInterface.py에서 def postCombatHyborem(pCaster, pOpponent): 항목으로 가야겠지?


else:

listInfernalLeader = ['JUDECCA', 'SALLOS', 'OUZZA', 'MERESIN', 'STATIUS', 'LETHE']

listInfernalLeaderName = ['Judecca', 'Duke Sallos', 'Ouzza', 'Meresin', 'Statius the Redeemer', 'Lethe, Queen of Sorrow']

for szLeader in listInfernalLeader:

iInfernal = cf.getOpenPlayer()

iLeader = gc.getInfoTypeForString('LEADER_' + szLeader)

pBestPlot = -1

iBestPlot = -1

for i in range(CyMap().numPlots()):

pPlot = CyMap().plotByIndex(i)

iPlot = -1

if pPlot.isWater() == False and pPlot.isImpassable() == False:

if pPlot.isCity() == False and pPlot.getNumUnits() == 0:

iPlot = CyGame().getSorenRandNum(500, "6 Devils")

iPlot += (pPlot.area().getNumTiles() * 2)

iPlot += (pPlot.area().getNumUnownedTiles() * 10)

if pPlot.isOwned() == False:

iPlot += 500

if pPlot.getOwner() == iPlayer:

iPlot += 200

if iPlot > iBestPlot:

iBestPlot = iPlot

pBestPlot = pPlot

if (iInfernal != -1 and pBestPlot != -1):

CyGame().addPlayerAdvanced(iInfernal, pPlayer.getTeam(), iLeader, gc.getInfoTypeForString('CIVILIZATION_INFERNAL'))

pInfernal = gc.getPlayer(iInfernal)

iX = pBestPlot.getX()

iY = pBestPlot.getY()

iEidolon = gc.getInfoTypeForString('UNIT_EIDOLON')

iManes = gc.getInfoTypeForString('UNIT_MANES')

iLongbowman = gc.getInfoTypeForString('UNIT_LONGBOWMAN')

iChampion = gc.getInfoTypeForString('UNIT_CHAMPION')

iSettler = gc.getInfoTypeForString('UNIT_SETTLER')

iWorker = gc.getInfoTypeForString('UNIT_WORKER')

newUnit1 = pInfernal.initUnit(iEidolon, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)

newUnit1.setHasPromotion(gc.getInfoTypeForString('PROMOTION_STRONG'), true)

newUnit1.setHasPromotion(gc.getInfoTypeForString('PROMOTION_HERO'), true)

newUnit1.setName(listInfernalLeaderName[listInfernalLeader.index(szLeader)])

for i in range(5):

newUnit2 = pInfernal.initUnit(iLongbowman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)

newUnit2.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)

newUnit3 = pInfernal.initUnit(iChampion, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)

newUnit3.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)

for i in range(3):

newUnit4 = pInfernal.initUnit(iManes, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)

newUnit4 = pInfernal.initUnit(iSettler, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)

newUnit5.setHasPromotion(gc.getInfoTypeForString('PROMOTION_STARTING_SETTLER'), true)

newUnit5.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)

newUnit6 = pInfernal.initUnit(iWorker, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)

newUnit6.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)

cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_JUDECCA_1",()),'art/interface/popups/Judecca.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_SALLOS_1",()),'art/interface/popups/Sallos.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_OUZZA_1",()),'art/interface/popups/Ouzza.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_MERESIN_1",()),'art/interface/popups/Meresin.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_STATIUS_1",()),'art/interface/popups/Statius.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_LETHE_1",()),'art/interface/popups/Lethe.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_EXCUSE_HYBOREM",()),'art/interface/popups/Hyborem.dds')

보스;;에게 이름을 붙여주고, 추가로 강한 승급과 영웅 승급을 부여...

전투유닛인 투사와 장궁병을 각 다섯마리씩 주고(2마리씩 더 준셈),

한마디씩 하는거...마지막에 히보림도 변명 한마디 하고...


남은 것은 ①뿐이지. 인페르날 세력이 쓸려 나갔을 때...

주의해야 할 것은, 최초의 인페르날이 털려 나갈때만 동작해야 한다는 것이지. 추가하는 세력도 인페르날이잖아?

이걸 신경쓰지 않으면...인페르날들;;이 멸망할 때마다 이짓이 반복되잖아...

뜯어볼 파일도 다른데...바로 단말마를 지를때 본 파일 있잖아?


CvEventManager.py 파일을 열고, def onSetPlayerAlive(self, argsList): 구문으로 다시 가자.

뭘 할 것인지 짐작이 가지? 인페르날이 단말마를 지르는 부분에 추가하면 되는거야.(히보림의 단말마와 요나스 엔다인의 단말마 사이)

뭐 위에 것과는 아주 약간의 차이가 나. 구체적으로는...

 맨 위의 else:문이 필요 없고, _1을 _2로 바꾸고, 히보림의 변명도 필요없고(이미 단말마를 질렀잖아...), 쫄딱 망했으니 애들 병력도 조금 더주고.

다만 그놈의 탭이 헷갈릴 터이니 주의해야지?

그러니 별로 다를 것도 없는 내용을...한번 더 써야지...


if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_HYBOREM'):

cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_INFERNAL",()),'art/interface/popups/Hyborem.dds')

listInfernalLeader = ['JUDECCA', 'SALLOS', 'OUZZA', 'MERESIN', 'STATIUS', 'LETHE']

listInfernalLeaderName = ['Judecca', 'Duke Sallos', 'Ouzza', 'Meresin', 'Statius the Redeemer', 'Lethe, Queen of Sorrow']
for szLeader in listInfernalLeader:
iInfernal = cf.getOpenPlayer()
iLeader = gc.getInfoTypeForString('LEADER_' + szLeader)
pBestPlot = -1
iBestPlot = -1
for i in range(CyMap().numPlots()):
pPlot = CyMap().plotByIndex(i)
iPlot = -1
if pPlot.isWater() == False and pPlot.isImpassable() == False:
if pPlot.isCity() == False and pPlot.getNumUnits() == 0:
iPlot = CyGame().getSorenRandNum(500, "6 Devils")
iPlot += (pPlot.area().getNumTiles() * 2)
iPlot += (pPlot.area().getNumUnownedTiles() * 10)
if pPlot.isOwned() == False:
iPlot += 500
if pPlot.getOwner() == iPlayer:
iPlot += 200
if iPlot > iBestPlot:
iBestPlot = iPlot
pBestPlot = pPlot
if (iInfernal != -1 and pBestPlot != -1):
CyGame().addPlayerAdvanced(iInfernal, pPlayer.getTeam(), iLeader, gc.getInfoTypeForString('CIVILIZATION_INFERNAL'))
pInfernal = gc.getPlayer(iInfernal)
iX = pBestPlot.getX()
iY = pBestPlot.getY()
iEidolon = gc.getInfoTypeForString('UNIT_EIDOLON')
iManes = gc.getInfoTypeForString('UNIT_MANES')
iLongbowman = gc.getInfoTypeForString('UNIT_LONGBOWMAN')
iChampion = gc.getInfoTypeForString('UNIT_CHAMPION')
iSettler = gc.getInfoTypeForString('UNIT_SETTLER')
iWorker = gc.getInfoTypeForString('UNIT_WORKER')
newUnit1 = pInfernal.initUnit(iEidolon, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
newUnit1.setHasPromotion(gc.getInfoTypeForString('PROMOTION_STRONG'), true)
newUnit1.setHasPromotion(gc.getInfoTypeForString('PROMOTION_HERO'), true)
newUnit1.setName(listInfernalLeaderName[listInfernalLeader.index(szLeader)])
for i in range(10):
newUnit2 = pInfernal.initUnit(iLongbowman, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
newUnit2.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)
newUnit3 = pInfernal.initUnit(iChampion, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
newUnit3.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)
for i in range(3):
newUnit4 = pInfernal.initUnit(iManes, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
newUnit4 = pInfernal.initUnit(iSettler, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
newUnit5.setHasPromotion(gc.getInfoTypeForString('PROMOTION_STARTING_SETTLER'), true)
newUnit5.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)
newUnit6 = pInfernal.initUnit(iWorker, iX, iY, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
newUnit6.setHasPromotion(gc.getInfoTypeForString('PROMOTION_DEMON'), true)
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_JUDECCA_2",()),'art/interface/popups/Judecca.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_SALLOS_2",()),'art/interface/popups/Sallos.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_OUZZA_2",()),'art/interface/popups/Ouzza.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_MERESIN_2",()),'art/interface/popups/Meresin.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_STATIUS_2",()),'art/interface/popups/Statius.dds')
cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_ENTERED_LETHE_2",()),'art/interface/popups/Lethe.dds')

if pPlayer.getLeaderType() == gc.getInfoTypeForString('LEADER_JONAS'):

cf.addPopup(CyTranslator().getText("TXT_KEY_POPUP_DEFEATED_CLAN_OF_EMBERS",()),'art/interface/popups/Jonus.dds')


음 정말 길군...노파심에서 하는 말인데, 똑같아 보이지만 분명히 다르다고 미리 주의를 줬다!

사실 똑같이 겹치는 부분은, 따로 함수를 만들어서 불러오면 더 편하게 할 수도 있지만...

그러려면 파일을 하나 더 써야 하거든. CustomFunctions.py까지 불러와야 한단 말야. 그게 싫어서...두개 쓰는 것도 머리아플 텐데 뭘.



솔직히 오늘 한 부분에서 죄다 복붙 하면 되잖아? 자잘한 수정은 그 뒤에...

아, 물론 텍스트xml파일은 반드시 완성해 줘야겠지. 그건 다 안썼으니깐...


간만에 쓰니 힘드네...내용도 재탕하는 거면서 쓸데없이 길기는 참...;;

죠니 사사키가 작성한 글입니다.
,