게임을 순수하게 즐길 수 있다면...나름대로 좋은 일이지.
아, 순수하게 즐긴다는 것은...사람마다 다른 의미가 되니까, 너무 깊게 파지는 말자. 지금은 에디트 같은 것 없이...라고 받아들이고.

언제부터 게임을 순수하게 즐기지 못하게 되었는지는 모르겠는데...
게임을 하면서 생기는 불만 사항에 대해, 나라면 이렇게 했을 텐데...라는 바램을, 손가락만 쪽쪽 빨고 있던 시절을 벗어나게 되면서부터...일까?
뭐 뜯어보는 것이 불가능한 게임이라면 포기할 터인데, 어찌 게임 취향이 다 고치기가 비교적 용이한 게임에만 가 있는 우연이라도 겹친 것인지...
아직까지는 고치지 못한 게임이 없는 듯. 전지전능한 수준으로 떡주무르듯 하는 게 아니라, 일부라도 고치는 것 말이야.
사실 로봇대전;하면서 모자란 자금 때문에 현 소지금을 고치던 때부터 에디트병에서 못벗어난 듯 한데,
단순히 세이브파일 혹은 램상주데이터의 교란 수준을 넘어서서, 클라이언트에 대한 도전(즉, 해킹...)을 시작한 것은, 역시 문명류 게임이었다.

다행히 MOD라는 개념이 요즘은 아주 일상화 되어서, 마음에 안들면 고치세요~라는 분위기가 만연하여, 아예 고치기 쉽도록 데이터 일부를 노출해 주는 덕분에 더더욱...
개조일람도 심하게 뭔가를 해체해서 작업해야 하는 경우는 없었잖아? 다 노출된 XML/python 파일들을 고치는 거지.
특별한 프로그램이 있어야 한다고?
흠...뭐 여기서 그간 나열했던 작업만 봐도 대충 짐작 가능하겠지만,
모든 작업은 죄다 메모장(윈도우 기본인)으로 하고 있다. 뭐 다른 프로그램을 구해 쓰긴 하는데, 메모장의 연장 선상에 있는 것들(notepad+류의)을 쓰는 것 뿐이라서...
게다가 그런 프로그램들은 죄다 특정 조건에서 전부 무거워 지더군. 쓸데없는 기능 따위, 필요 없는데 말이야...
애당초 코더 입장에서 메모장 이상의 기능은...별 의미가 없어서 말이야. 프로그래머라면 모를까...

구태여 사례에 대해 직접 적는 이유는...바로 코딩을 하라는 의미에서이지. 프로그래밍이 아니라.
코드를 직접 치는 경우...당연히 오타의 위험성(발전된 프로그램들을 쓰면 이런 것들을 어느 정도 막아주기도 하지만)에 심각하게 노출되지.
그런데 직접 안치고, 어딘가에서 복사+붙이기를 하면...변수명 같은 것에만 약간 신경을 쓰면, 오타 같은 것은 안난단 말이야. 문법 오류도 어지간하면 피할 수 있고.
그래서 특정 명령이나 함수를 사용하라...이런 방식보다, 그냥 다짜고짜 예시를 하는 거지.

잡설이 길었군. 오늘의 내용은...가이드로 제시했던 사회제도 변경에 대한 보완책의 예시랄까?
그중에서도 특히, 약육강식의 인해전술에 대한 대항책...

일단, 시리즈 21번째 글의 도시에 공짜 전문가를 추가하는 방안이 있네. 문화도가 아니라, 다른 조건으로도 같은 효과만 나면 되니까.
농장 경제가 본편과 달리 맹위를 떨치는 것은, 아무래도 높은 인구수를 바탕으로, 그 인구가 다양한 방면의 전문가(혹은 몰아주기)로 전환되기 때문인 탓이 크지.
게다가 길드제 따위와 연합하면...상황에 따라...
도시에 공짜 전문가를 추가하는 것은, 좋은 방법이 될 수는 있지만 탄력성이 떨어진다는 문제가 있다.
추가된 공짜 전문가는 다른 전문가로 전환이 불가능하거든. 특히나 음유시인은 잉여가 되기 쉽잖아?
아 물론...매번 주문을 사용해서, 특정 전문가의 인구를 조절할 수 있지. 늘리든 줄이든...
다만, 추가가 가능한데 왜 줄여? 라는 욕심이 생기더라...라는 문제가 있지. 어차피 공짜였잖아...

따라서, 그것에 대한 개선책으로 나올 수 있는 것은...변환 가능한 공짜 전문가를 제공하는 것이지.
그래서 원하는 대로 상황에 맞게 전문가들의 구성을 바꿀 수 있다면...약육강식에 대해 효과적으로 대응할 수 있지 않겠어?

간만에 다소 길게 가보자. 뭐 내용은 별로 없으니 안심해도 되겠지만. 말줄임표로 줄일걸 그랬나...그래도 붉은 색은 잘 봐.
일단, CIV4BuildingInfos.xml 파일을 열고, 적당한 곳에(보통 끝에 넣는게 좋지만) 이대로...

        <BuildingInfo>
            <BuildingClass>BUILDINGCLASS_DEMONIC_CITIZENS</BuildingClass>
            <Type>BUILDING_DEMONIC_CITIZENS2</Type>
            <SpecialBuildingType>NONE</SpecialBuildingType>
            <Description>TXT_KEY_BUILDING_DEMONIC_CITIZENS</Description>
            <Civilopedia>TXT_KEY_BUILDING_PLACEHOLDER_PEDIA</Civilopedia>
            <Strategy></Strategy>
            <Help>TXT_KEY_BUILDING_DEMONIC_CITIZENS_HELP</Help>
            <Advisor>ADVISOR_GROWTH</Advisor>
            <ArtDefineTag>ART_DEF_BUILDING_DEMONIC_CITIZENS</ArtDefineTag>
            <MovieDefineTag>NONE</MovieDefineTag>
            <HolyCity>NONE</HolyCity>
            <ReligionType>NONE</ReligionType>
            <StateReligion>NONE</StateReligion>
            <bStateReligion>0</bStateReligion>
            <PrereqReligion>NONE</PrereqReligion>
            <PrereqCorporation>NONE</PrereqCorporation>
            <FoundsCorporation>NONE</FoundsCorporation>
            <GlobalReligionCommerce>NONE</GlobalReligionCommerce>
            <GlobalCorporationCommerce>NONE</GlobalCorporationCommerce>
            <VictoryPrereq>NONE</VictoryPrereq>
            <FreeStartEra>NONE</FreeStartEra>
            <MaxStartEra>NONE</MaxStartEra>
            <ObsoleteTech>NONE</ObsoleteTech>
            <PrereqTech>NONE</PrereqTech>
            <TechTypes>
            </TechTypes>
            <Bonus>NONE</Bonus>
            <PrereqBonuses>
            </PrereqBonuses>
            <ProductionTraits>
            </ProductionTraits>
            <HappinessTraits>
            </HappinessTraits>
            <NoBonus>NONE</NoBonus>
            <PowerBonus>NONE</PowerBonus>
            <FreeBonus>NONE</FreeBonus>
            <iNumFreeBonuses>0</iNumFreeBonuses>
            <FreeBuilding>NONE</FreeBuilding>
            <FreePromotion>NONE</FreePromotion>
            <CivicOption>NONE</CivicOption>
            <GreatPeopleUnitClass>NONE</GreatPeopleUnitClass>
            <iGreatPeopleRateChange>0</iGreatPeopleRateChange>
            <iHurryAngerModifier>0</iHurryAngerModifier>
            <bBorderObstacle>0</bBorderObstacle>
            <bTeamShare>0</bTeamShare>
            <bWater>0</bWater>
            <bRiver>0</bRiver>
            <bPower>0</bPower>
            <bDirtyPower>0</bDirtyPower>
            <bAreaCleanPower>0</bAreaCleanPower>
            <DiploVoteType>NONE</DiploVoteType>
            <bForceTeamVoteEligible>0</bForceTeamVoteEligible>
            <bCapital>0</bCapital>
            <bGovernmentCenter>0</bGovernmentCenter>
            <bGoldenAge>0</bGoldenAge>
            <bAllowsNukes>0</bAllowsNukes>
            <bMapCentering>0</bMapCentering>
            <bNoUnhappiness>0</bNoUnhappiness>
            <bNoUnhealthyPopulation>0</bNoUnhealthyPopulation>
            <bBuildingOnlyHealthy>0</bBuildingOnlyHealthy>
            <bNeverCapture>1</bNeverCapture>
            <bNukeImmune>0</bNukeImmune>
            <bPrereqReligion>0</bPrereqReligion>
            <bCenterInCity>0</bCenterInCity>
            <iAIWeight>0</iAIWeight>
            <iCost>-1</iCost>
            <iHurryCostModifier>0</iHurryCostModifier>
            <iAdvancedStartCost>-1</iAdvancedStartCost>
            <iAdvancedStartCostIncrease>0</iAdvancedStartCostIncrease>
            <iMinAreaSize>-1</iMinAreaSize>
            <iConquestProb>0</iConquestProb>
            <iCitiesPrereq>0</iCitiesPrereq>
            <iTeamsPrereq>0</iTeamsPrereq>
            <iLevelPrereq>0</iLevelPrereq>
            <iMinLatitude>0</iMinLatitude>
            <iMaxLatitude>90</iMaxLatitude>
            <iGreatPeopleRateModifier>0</iGreatPeopleRateModifier>
            <iGreatGeneralRateModifier>0</iGreatGeneralRateModifier>
            <iDomesticGreatGeneralRateModifier>0</iDomesticGreatGeneralRateModifier>
            <iGlobalGreatPeopleRateModifier>0</iGlobalGreatPeopleRateModifier>
            <iAnarchyModifier>0</iAnarchyModifier>
            <iGoldenAgeModifier>0</iGoldenAgeModifier>
            <iGlobalHurryModifier>0</iGlobalHurryModifier>
            <iExperience>0</iExperience>
            <iGlobalExperience>0</iGlobalExperience>
            <iFoodKept>0</iFoodKept>
            <iAirlift>0</iAirlift>
            <iAirModifier>0</iAirModifier>
            <iAirUnitCapacity>0</iAirUnitCapacity>
            <iNukeModifier>0</iNukeModifier>
            <iNukeExplosionRand>0</iNukeExplosionRand>
            <iFreeSpecialist>0</iFreeSpecialist>
            <iAreaFreeSpecialist>0</iAreaFreeSpecialist>
            <iGlobalFreeSpecialist>0</iGlobalFreeSpecialist>
            <iMaintenanceModifier>0</iMaintenanceModifier>
            <iWarWearinessModifier>0</iWarWearinessModifier>
            <iGlobalWarWearinessModifier>0</iGlobalWarWearinessModifier>
            <iEnemyWarWearinessModifier>0</iEnemyWarWearinessModifier>
            <iHealRateChange>0</iHealRateChange>
            <iHealth>0</iHealth>
            <iAreaHealth>0</iAreaHealth>
            <iGlobalHealth>0</iGlobalHealth>
            <iHappiness>0</iHappiness>
            <iAreaHappiness>0</iAreaHappiness>
            <iGlobalHappiness>0</iGlobalHappiness>
            <iStateReligionHappiness>0</iStateReligionHappiness>
            <iWorkerSpeedModifier>0</iWorkerSpeedModifier>
            <iMilitaryProductionModifier>0</iMilitaryProductionModifier>
            <iSpaceProductionModifier>0</iSpaceProductionModifier>
            <iGlobalSpaceProductionModifier>0</iGlobalSpaceProductionModifier>
            <iTradeRoutes>0</iTradeRoutes>
            <iCoastalTradeRoutes>0</iCoastalTradeRoutes>
            <iGlobalTradeRoutes>0</iGlobalTradeRoutes>
            <iTradeRouteModifier>0</iTradeRouteModifier>
            <iForeignTradeRouteModifier>0</iForeignTradeRouteModifier>
            <iGlobalPopulationChange>0</iGlobalPopulationChange>
            <iFreeTechs>0</iFreeTechs>
            <iDefense>0</iDefense>
            <iBombardDefense>0</iBombardDefense>
            <iAllCityDefense>0</iAllCityDefense>
            <iEspionageDefense>0</iEspionageDefense>
            <iAsset>2</iAsset>
            <iPower>1</iPower>
            <fVisibilityPriority>1</fVisibilityPriority>
            <SeaPlotYieldChanges>
            </SeaPlotYieldChanges>
            <RiverPlotYieldChanges>
            </RiverPlotYieldChanges>
            <GlobalSeaPlotYieldChanges>
            </GlobalSeaPlotYieldChanges>
            <YieldChanges>
            </YieldChanges>
            <YieldModifiers>
            </YieldModifiers>
            <CommerceChanges>
            </CommerceChanges>
            <ObsoleteSafeCommerceChanges>
            </ObsoleteSafeCommerceChanges>
            <CommerceChangeDoubleTimes>
            </CommerceChangeDoubleTimes>
            <CommerceModifiers>
            </CommerceModifiers>
            <GlobalCommerceModifiers>
            </GlobalCommerceModifiers>
            <SpecialistExtraCommerces>
            </SpecialistExtraCommerces>
            <StateReligionCommerces>
            </StateReligionCommerces>
            <CommerceHappinesses>
            </CommerceHappinesses>
            <ReligionChanges>
            </ReligionChanges>
            <SpecialistCounts>
            </SpecialistCounts>
            <FreeSpecialistCounts>
            </FreeSpecialistCounts>
            <CommerceFlexibles>
            </CommerceFlexibles>
            <CommerceChangeOriginalOwners>
            </CommerceChangeOriginalOwners>
            <ConstructSound></ConstructSound>
            <BonusHealthChanges>
            </BonusHealthChanges>
            <BonusHappinessChanges>
            </BonusHappinessChanges>
            <BonusProductionModifiers>
            </BonusProductionModifiers>
            <UnitCombatFreeExperiences>
            </UnitCombatFreeExperiences>
            <DomainFreeExperiences>
            </DomainFreeExperiences>
            <DomainProductionModifiers>
            </DomainProductionModifiers>
            <BuildingHappinessChanges>
            </BuildingHappinessChanges>
            <PrereqBuildingClasses>
            </PrereqBuildingClasses>
            <BuildingClassNeededs>
            </BuildingClassNeededs>
            <SpecialistYieldChanges>
            </SpecialistYieldChanges>
            <BonusYieldModifiers>
            </BonusYieldModifiers>
            <ImprovementFreeSpecialists>
                 <ImprovementFreeSpecialist>
                    <ImprovementType>IMPROVEMENT_TOWN</ImprovementType>
                    <iFreeSpecialistCount>1</iFreeSpecialistCount>
                </ImprovementFreeSpecialist>
                <ImprovementFreeSpecialist>
                    <ImprovementType>IMPROVEMENT_ENCLAVE</ImprovementType>
                    <iFreeSpecialistCount>2</iFreeSpecialistCount>
                </ImprovementFreeSpecialist>
           </ImprovementFreeSpecialists>
            <Flavors>
                <Flavor>
                    <FlavorType>FLAVOR_GROWTH</FlavorType>
                    <iFlavor>10</iFlavor>
                </Flavor>
            </Flavors>
            <HotKey></HotKey>
            <bAltDown>0</bAltDown>
            <bShiftDown>0</bShiftDown>
            <bCtrlDown>0</bCtrlDown>
            <bGraphicalOnly>1</bGraphicalOnly>
            <iHotKeyPriority>0</iHotKeyPriority>
            <bApplyFreePromotionOnMove>0</bApplyFreePromotionOnMove>
            <bEquipment>0</bEquipment>
            <bHideUnits>0</bHideUnits>
            <bNoCivicAnger>0</bNoCivicAnger>
            <bRequiresCaster>0</bRequiresCaster>
            <bSeeInvisible>0</bSeeInvisible>
            <bUnhappyProduction>0</bUnhappyProduction>
            <iCrime>0</iCrime>
            <iFreePromotionPick>0</iFreePromotionPick>
            <iGlobalResistEnemyModify>0</iGlobalResistEnemyModify>
            <iGlobalResistModify>0</iGlobalResistModify>
            <iModifyGlobalCounter>0</iModifyGlobalCounter>
            <iPlotRadius>0</iPlotRadius>
            <iResistMagic>0</iResistMagic>
            <FreeBonus2>NONE</FreeBonus2>
            <FreeBonus3>NONE</FreeBonus3>
            <PrereqCiv></PrereqCiv>
            <PrereqTrait>NONE</PrereqTrait>
            <RemovePromotion>NONE</RemovePromotion>
            <SpecialistCommerceChanges>
            </SpecialistCommerceChanges>
        </BuildingInfo>

원칙적으로는 죄다 빨간색으로 해야 하는데(추가하는 거니까) 뭘 기준으로 고쳐야 하는지 구분이 명확해야 해서...
예시는 인페르날의 전용 건물(?)인 악마의 시민을 가지고, 대체 건물을 만든 것이다. 당연히 원래의 사악한 능력은 제거하고...
도시 영역 내의 소도시당 전문가 1명, 엔클레이브당 전문가 2명을 주도록 만든 것이지.(거기서 시민이 일하고 있을 필요는 없다)
아, 꼭 농장의 대항마는 무조건 오두막 계열이어야 하나요...라고 생각한다면, 원하는 대로 바꿔줘라. TOWN대신 MINE을 쓴다거나 하면 되니까...밑에는 지우고.
이렇게 고칠 경우...지금 추가한 건물이 존재하는 도시는, 도시 영역내에 20개의 소도시를 가지고 있다면, 20명의 공짜 전문가를 얻게 된다.
인구가 20명 늘어나는 것보다 더 좋은 점이라면...이 공짜 전문가는 식량소모도 없고, 불만과 오염을 야기하지도 않는다는 것이지.

헌데, 남은 문제는 저걸 어떻게 추가하느냐...하는 것이잖아.
물론 주문으로 추가할 수도 있으나, 심각하게 남발하게 될 것이고...직접 짓게 하는 것은? 당연히 안되고. 주변에 농장이 있으면 못짓게 막아? 그것도 영--;
애당초 약육강식이 어쩌구 저쩌구 해놓고는, 카자드 식으로 특정 진영에게만 줄 수도 없으니...
역시 사회제도 채택에 따라 달라지게 해야 한다. 그게 골고루 혜택을 보는 길이기도 하고.

다만 사회제도 선택만으로 건물을 지었다 부쉈다 할 수는 없으므로...할 수 없이 이 단계에서는 파이썬의 힘을 빌려야겠지...
열어야 할 것은? CvEventManager.py인데, 사실 CustomFunctions.py까지 열어서 작업하는 것이 정석이지만 그냥 이벤트매니저 하나만 열어보자.
대충 써놔도 원본과 끼워넣을 내용은 구분이 되지? 항상 색표기를 하잖아...자 어디쯤에서 작업하느냐 잘 보도록...

if pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_CULTURAL_VALUES')) == gc.getInfoTypeForString('CIVIC_CRUSADE'):
cf.doCrusade(iPlayer)

iBuilding = gc.getInfoTypeForString('BUILDING_DEMONIC_CITIZENS2')
if pPlayer.getNumCities() > 0:
  if pPlayer.getCivics(gc.getInfoTypeForString('CIVICOPTION_CULTURAL_VALUES')) == gc.getInfoTypeForString('CIVIC_SOCIAL_ORDER'):
bBuilding = 1
else:
bBuilding = 0
for pyCity in PyPlayer(iPlayer).getCityList():
pCity = pyCity.GetCy()
pCity.setNumRealBuilding(iBuilding, bBuilding)

if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_KHAZAD'):
cf.doTurnKhazad(iPlayer)

이렇게 하면...공공 질서를 채택한 동안은, 아까 추가한 건물이 도시마다 공짜로 지어지겠지. 물론 해제하면 다시 없어지고...
공공 질서 말고 다른 제도로 하는 것도 역시 가능하겠지. 다만 바꿀때는 앞쪽...옵션쪽도 같이 바꾸도록. 뭐 같은 문화적 가치 탭 안에 있는 것에서 바꾼다면 모를까.
이 방식의 문제는, 턴랙이 추가된다는 거지^^; 뭐 어지간한 경우 조절이 가능한 주문보다, 조절이 불가능한 이런 방식이 나쁜 점은...역시 턴랙이야. 매번 조건 따지고 있으니...
 
죠니 사사키가 작성한 글입니다.
,