ちょっと不格好だけど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 True return False def 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()) / 100 iGoldLow = 50 * rate iGoldMid = 200 * rate iGoldHigh = 1600 * rate iGoldNeckless = 100 * rate iGoldPlayer = 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 True if iGoldPlayer >= iGoldMid and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD2')): return True if (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD2')) and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSWORD1')) ): return True if not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR3')): if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_MARBLE')) > 0: if iGoldPlayer >= iGoldHigh: return True if iGoldPlayer >= iGoldMid and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR2')): return True if (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR2')) and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSARMOR1')) ): return True if not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD3')): if pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_GOLD')) > 0: if iGoldPlayer >= iGoldHigh: return True if iGoldPlayer >= iGoldMid and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD2')): return True if (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD2')) and not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSSHIELD1')) ): return True if (not pCaster.isHasPromotion(gc.getInfoTypeForString('PROMOTION_YSNECKLESS')) and pPlayer.getNumAvailableBonuses(gc.getInfoTypeForString('BONUS_GEMS')) > 0 and iGoldPlayer >= iGoldNeckless ): return True return False return True