ちょっと不格好だけどpopupInfoの仕様上こうする他なさそう。
ただしSDKを解読したのではなく既存のコードを参考にした結果の判断なので、もしかしたらもっといい方法があるかも知れない。
SPELL_はCIV4SpellInfos.xml、req~applyはCvSpellInterface.pyに上書き。なおSPELL_はRemovePromotionsを削除しただけ。
reqには変更点がないけれどせっかくなのでセットで。enabledYsEventBuyWeapon()の簡素化した物もおまけで。
ちょっと不格好だけどpopupInfoの仕様上こうする他なさそう。
ただしSDKを解読したのではなく既存のコードを参考にした結果の判断なので、もしかしたらもっといい方法があるかも知れない。
SPELL_はCIV4SpellInfos.xml、req~applyはCvSpellInterface.pyに上書き。なおSPELL_はRemovePromotionsを削除しただけ。
reqには変更点がないけれどせっかくなのでセットで。enabledYsEventBuyWeapon()の簡素化した物もおまけで。
<SpellInfo><Type>SPELL_CCADOL</Type><Description>TXT_KEY_SPELL_CCADOL</Description><Civilopedia>TXT_KEY_SPELL_PLACEHOLDER_PEDIA</Civilopedia><Help>TXT_KEY_SPELL_CCADOL_HELP</Help><Pronunciation>TXT_KEY_SPELL_CCADOL_PRONUNCIATION</Pronunciation><PromotionPrereq1>PROMOTION_COMBAT5</PromotionPrereq1><bInCityOnly>1</bInCityOnly><bIgnoreHasCasted>1</bIgnoreHasCasted><bHasCasted>0</bHasCasted><bAbility>1</bAbility><bBuffCasterOnly>1</bBuffCasterOnly><PyResult>spellCCAdol</PyResult><PyRequirement>reqCCAdol</PyRequirement><bAllowAI>1</bAllowAI><iAIWeight>300</iAIWeight><PrereqOrUnits><UnitType>UNIT_ADOL1</UnitType><UnitType>UNIT_ADOL2</UnitType></PrereqOrUnits><bDisplayWhenDisabled>1</bDisplayWhenDisabled><Effect>EFFECT_SPELL1</Effect><Sound>AS3D_SPELL_HASTE</Sound><bGraphicalOnly>1</bGraphicalOnly><Button>Art_Kaijin/REAH/adol.dds</Button></SpellInfo>/////////////def reqCCAdol(argsList):pCaster = argsList[0]pPlot = argsList[1]eSpell = argsList[2]iexp = pCaster.getExperience()if iexp > 99:return Truereturn Falsedef spellCCAdol(argsList):pCaster = argsList[0]pBestPlot = argsList[1]eSpell = argsList[2]iPlayer = pCaster.getOwner()iCasterID = pCaster.getID()pPlayer = gc.getPlayer(iPlayer)if pPlayer.isHuman():popupInfo = CyPopupInfo()popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON)popupInfo.setText(CyTranslator().getText("TXT_KEY_POPUP_CCADOL",()))popupInfo.setData1(iPlayer)popupInfo.setData2(iCasterID)popupInfo.setPythonModule("CvSpellInterface")popupInfo.setOnClickedPythonCallback("selectCCAdol")popupInfo.addPythonButton(CyTranslator().getText("TXT_KEY_POPUP_YES", ()), "")popupInfo.addPythonButton(CyTranslator().getText("TXT_KEY_POPUP_NO", ()), "")popupInfo.addPopup(iPlayer)else:applyCCAdol(iPlayer, iCasterID)def selectCCAdol(argsList):iButton = argsList[0]iPlayer = argsList[1]iCasterID = argsList[2]if iButton == 0:applyCCAdol(iPlayer, iCasterID)def applyCCAdol(iPlayer, iCasterID):iCombat1 = gc.getInfoTypeForString('PROMOTION_COMBAT1')iCombat2 = gc.getInfoTypeForString('PROMOTION_COMBAT2')iCombat3 = gc.getInfoTypeForString('PROMOTION_COMBAT3')iCombat4 = gc.getInfoTypeForString('PROMOTION_COMBAT4')iCombat5 = gc.getInfoTypeForString('PROMOTION_COMBAT5')pPlayer = gc.getPlayer(iPlayer)pCaster = pPlayer.getUnit(iCasterID)pPlot = pCaster.plot()if pCaster.getUnitType() == gc.getInfoTypeForString('UNIT_ADOL1'):iCha = gc.getInfoTypeForString('PROMOTION_CHANNELING1')iUnit = gc.getInfoTypeForString('UNIT_ADOL2')elif pCaster.getUnitType() == gc.getInfoTypeForString('UNIT_ADOL2'):iCha = gc.getInfoTypeForString('PROMOTION_CHANNELING2')iUnit = gc.getInfoTypeForString('UNIT_ADOL3')CyInterface().addMessage(pCaster.getOwner(),True,25,CyTranslator().getText("TXT_KEY_MESSAGE_ADOL", ()),'AS2D_REVOLTEND',1,'Art_Kaijin/REAH/adol.dds',ColorTypes(8),pCaster.getX(),pCaster.getY(),True,True)if pPlot.isVisibleToWatchingHuman():CyEngine().triggerEffect(gc.getInfoTypeForString('EFFECT_PILLAR_OF_FIRE'),pPlot.getPoint())pNewUnit = pPlayer.initUnit(iUnit, pCaster.getX(), pCaster.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)pNewUnit.convert(pCaster)pNewUnit.setHasPromotion(iCha, True)pNewUnit.setHasPromotion(iCombat1, False)pNewUnit.setHasPromotion(iCombat2, False)pNewUnit.setHasPromotion(iCombat3, False)pNewUnit.setHasPromotion(iCombat4, False)pNewUnit.setHasPromotion(iCombat5, False)pNewUnit.setLevel(1)pNewUnit.setExperience(0, -1)def enabledYsEventBuyWeapon(argsList):pCaster = argsList[0]pPlot = argsList[1]eSpell = argsList[2]pPlayer = gc.getPlayer(pCaster.getOwner())rate = (100 + pPlayer.calculateInflationRate()) / 100iGoldLow = 50 * rateiGoldMid = 200 * rateiGoldHigh = 1600 * rateiGoldNeckless = 100 * rateiGoldPlayer = pPlayer.getGold()if not pCaster.isHuman():if iGoldPlayer >= iGoldLow:if not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD3')):if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_COPPER')) > 0:if iGoldPlayer >= iGoldHigh:return Trueif iGoldPlayer >= iGoldMid and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD2')):return Trueif (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD2'))and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD1')) ):return Trueif not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR3')):if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MARBLE')) > 0:if iGoldPlayer >= iGoldHigh:return Trueif iGoldPlayer >= iGoldMid and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR2')):return Trueif (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR2'))and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR1')) ):return Trueif not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD3')):if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_GOLD')) > 0:if iGoldPlayer >= iGoldHigh:return Trueif iGoldPlayer >= iGoldMid and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD2')):return Trueif (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD2'))and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD1')) ):return Trueif (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSNECKLESS'))and pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_GEMS')) > 0and iGoldPlayer >= iGoldNeckless ):return Truereturn Falsereturn True