建造物やその他様々なものに特殊な特徴を付けるときに良く使うCvEventManager.py、
(Assets>Python>CvEventManager.py)
使える場面のコード(と呼んで良いのか?)一覧が
http://modiki.civfanatics.com/index.php/CvEventManager
ここにあったので出来る範囲で和訳してみた、補足できるところがあったら修整願います
def _init_() | self | Initializes variables in file |
def handleEvent() | self, argsList | Event Manager entry point |
def beginEvent() | self, context, argsList=-1 | Begins an event |
def applyEvent() | self, argsList (context, playerID, netUserData, popupReturn) | Applies the effects of an event |
def reportEvent() | self, entry, context, argsList | Records an event to Events.log |
def onKdbEvent() | self, argsList (eventType, key, mx, my, px, py) | Handles the pressing of a key |
def onModNetMessage() | self, argsList (iData1, iData2, iData3, iData4, iData5) | Called whenever CyMessageControl().sendModNetMessage is called |
def onInit() | self, argsList | Called whenever Civilization starts up |
def onUpdate() | self, argsList (fDeltaTime) | Called every frame |
def onWindowActivation() | self, argsList (bActive) | Called when the game window activates or deactivates |
def onUnInit() | self, argsList | Called before Civ shuts down |
def onPreSave() | self, argsList | ゲームをセーブする前に・・ |
def onSaveGame() | self, argsList | Returns the name of the save game |
def onLoadGame() | self, argsList | ゲームのロード中に・・ |
def onGameStart() | self, argsList | ゲーム開始時に・・ |
def onGameEnd() | self, argsList | ゲーム終了時に・・ |
def onBeginGameTurn() | self, argsList (iGameTurn) | ゲームの全体のターンが始まる時 |
def onEndGameTurn() | self, argsList (iGameTurn) | ゲームの全体のターンが終わる時 |
def onBeginPlayerTurn() | self, argsList (iGameTurn, iPlayer) | 各指導者のターンが回ってきたとき |
def onEndPlayerTurn() | self, argsList (iGameTurn, iPlayer) | 各指導者のターンが終わるとき |
def onEndTurnReady() | self, argsList (iGameTurn) | Called when the turn is ready to end |
def onFirstContact() | self, argsList (iTeamX, iHasMetTeamY) | 他文明と遭遇時 |
def onCombatResult() | self, argsList (iWinner, iLoser) | 戦闘が終了した時 |
def onCombatLogCalc() | self, argsList (genericArgs) | Not sure |
def onCombatLogHit() | self, argsList (genericArgs) | Not sure |
def onImprovementBuilt() | self, argsList (iImprovement, iX, iY) | 地形改善を建てた時 |
def onImprovementDestroyed() | self, argsList (iImprovement, iOwner, iX, iY) | 地形改善が破壊された時 |
def onRouteBuilt() | self, argsList (iRoute, iX, iY) | 道が作られたとき |
def onPlotRevealed() | self, argsList (pPlot, iTeam) | Called when a plot is revealed to a team |
def onPlotFeatureRemoved() | self, argsList (pPlot, iFeatureType, pCity) | 地形上のモノ(森林やジャングル)が取り除かれた時 |
def onPlotPicked() | self, argsList (pPlot) | Called when a plot is picked |
def onNukeExplosion() | self, argsList (pPlot, pNukeUnit) | 核兵器or原発が爆発した時 |
def onGotoPlotSet() | self, argsList (pPlot, iPlayer) | Not sure |
def onBuildingBuilt() | self, argsList (pCity, iBuildingType) | 建造物が建てられた時 |
def onProjectBuilt() | self, argsList (pCity, iProjectType) | プロジェクト完成時 |
def onSelectionGroupPushMission() | self, argsList (eOwner, eMission, iNumUnits, listUnitIDs) | Called when a mission is pushed for a unit or group of units |
def onUnitMove() | self, argsList (pPlot, pUnit, pOldPlot) | ユニットが移動する時 |
def onUnitSetXY() | self, argsList (pPlot, pUnit) | 1ユニットのcoordsが手動でセットされる時 |
def onUnitCreated() | self, argsList (unit) | ユニット完成時 |
def onUnitBuilt() | self, argsList (city, unit, player) | 都市でユニット完成時 |
def onUnitKilled() | self, argsList (unit, iAttacker) | ユニットが他のユニットに倒された時 |
def onUnitLost() | self, argsList (unit) | ユニット死亡時 |
def onUnitPromoted() | self, argsList (pUnit, iPromotion) | ユニットが昇進を獲得した時 |
def onUnitSelected() | self, argsList (unit) | ユニットを選択した時 |
def onUnitRename() | self, argsList (unit) | ユニットの改名をした時 |
def onUnitPillage() | self, argsList(pUnit, iImprovement, iRoute, iOwner) | ユニットが地形改善や道路を略奪した時 |
def onUnitSpreadReligionAttempt() | self, argsList(pUnit, iReligion, bSuccess) | ユニットが都市へ宗教を布教しようとした時 |
def onUnitGifted() | self, argsList(pUnit, iGiftingPlayer, pPlotLocation) | プレイヤーが他の指導者へユニットを譲渡した時 |
def onUnitBuildImprovement() | self, argsList(pUnit, iBuild, bFinished) | ユニットが地形改善を作り始めた時 |
def onGoodyReceived() | self, argsList(iPlayer, pPlot, pUnit, iGoodyType) | ユニットがお菓子の小屋に乗った時 |
def onGreatPersonBorn() | self, argsList(pUnit, iPlayer, pCity) | 偉人が誕生した時 |
def onTechAcquired() | self, argsList(iTechType, iTeam, iPlayer, bAnnounce) | テクノロジーの研究が完成した時 |
def onTechSelected() | self, argsList(iTechType, iPlayer) | 研究するテクノロジーを選択した時 |
def onReligionFounded() | self, argsList(iReligion, iFounder) | 宗教を創始した時 |
def onReligionSpread() | self, argsList(iReligion, iOwner, pSpreadCity) | 宗教を都市へ広めた時 |
def onReligionRemove() | self, argsList(iReligion, iOwner, pRemoveCity) | 宗教が都市から取り除かれる時 |
def onCorporationFounded() | self, argsList(iCorporation, iFounder) | 企業が設立された時 |
def onCorporatationSpread() | self, argsList(iCorporation, iOwner, pSpreadCity) | 企業を都市へ広めた時 |
def onCorporationRemove() | self, argsList(iCorporation, iOwner, pRemoveCity) | 企業が都市から除去された時 |
def onGoldenAge() | self, argsList(iPlayer) | 黄金期が発動した時 |
def onEndGoldenAge() | self, argsList(iPlayer) | 黄金期が終了した時 |
def onChangeWar() | self, argsList(bIsWar, iTeam, iRivalTeam) | 戦争状態に突入した時 |
def onChat() | self, argsList(chatMessage) | チャットのメッセージが送られる時 |
def onSetPlayerAlive() | self, argsList(iPlayerID, bNewValue) | Called when a player's status is set to "alive" |
def onPlayerChangeStateReligion | self, argsList(iPlayer, iNewReligion, iOldReligion) | 国教変更時 |
def onPlayerGoldTrade | self, argsList(iFromPlayer, iToPlayer, iGoldAmount) | 他の指導者とゴールドの取引をする時 |
def onCityBuilt | self, argsList(city) | 都市を建てた時 |
def onCityRazed | self, argsList(city, iPlayer) | 都市を破壊した時 |
def onCityAcquired | self, argsList(iPreviousOwner, iNewOwner, pCity, bConquest, bTrade) | 他文明の都市を任意の手段で得た時 |
def onCityAcquiredAndKept | self, argsList(iOwner, pCity) | 他文明の都市を得て、それを維持する時 |
def onCityLost | self, argsList(city, player) | 都市を失った時 |
def onCultureExpansion | self, argsList(pCity, iPlayer) | 都市の文化が拡大する時 |
def onCityGrowth | self, argsList(pCity, iPlayer) | 都市が成長した時 |
def onCityDoTurn | self, argsList(pCity, iPlayer) | 毎ターン全都市で |
def onCityBuildingUnit | self, argsList(pCity, iUnitType) | 都市がユニットを作り始める時 |
def onCityBuildingBuilding | self, argsList(pCity, iBuildingType) | 都市が建物を建造し始める時 |
def onCityRename | self, argsList(pCity) | 都市の名前を変えた時 |
def onCityHurry | self, argsList(pCity, iHurryType) | 都市が緊急生産する時 |
def onVictory | self, argsList(iTeam, iVictory) | チームがゲームに勝つ時 |
def onVassalState | self, argsList(iMaster, iVassal, bVassal) | チームが属国になるか、独立を獲得する時 |
def onGameUpdate | self, argsList(genericArgs[turnSlice]) | Called on every "game turn slice" |
def onMouseEvent | self, argsList(eventType, mx, my, px, py, interfaceConsumed, screens) | Not sure |
def _eventEventCityNameBegin | self, city, bRename | 都市をnameするかrenameするためにポップ・アップを作成します。 |
def _eventEventCityNameApply | self, playerID, userData(iCityID, bRename), popupReturn | 都市改名時 |
def _eventEditCityBegin | self, argsList(px, py) | Begins the editing of a city in Worldbuilder |
def _eventEditCityApply | self, playerID, userData, popupReturn | The edit city event in Worldbuilder |
def _eventPlaceObjectBegin | self, argsList | Begins the place object function in Worldbuilder |
def _eventPlaceObjectApply | self, playerID, userData, popupReturn | The place object event in Worldbuilder |
def _eventAwardTechsAndGoldBegin | self, argsList | An event that お金か技術か |
def _eventAwardTechsAndGoldApply | self, playerId, netUserData, popupReturn | An event that お金か技術か |
def _eventShowWonderBegin | self, argsList | 遺産ムービ流れたあと |
def _eventShowWonderApply | self, playerID, netUserData, popupReturn) | 遺産ムービ流れたあと |
def _eventEditUnitNameBegin | self, argsList(pUnit) | Creates a popup to rename a unit |
def _eventEditUnitNameApply | self, playerID, userData, popupReturn | The event to let you rename a unit |
def _eventWBAllPlotsPopupBegin | self, argsList | An event that reveals all plots in Worldbuilder |
def _eventWBAllPlotsPopupApply | self, playerID, userData, popupReturn | An event that reveals all plots in Worldbuilder |
def _eventWBLandmarkPopupBegin | self, argsList | Creates a popup to label a plot with a landmark tag |
def _eventWBLandmarkPopupApply | self, playerID, userData, popupReturn | Labels a plot with a landmark tag |
def _eventWBScriptPopupBegin | self, argsList | Not sure |
def _eventWBScriptPopupApply | self, playerID, userData, popupReturn | Not sure |
def _eventWBStartYearPopupBegin | self, argsList | Not sure |
def _eventWBStartYearPopupApply | self, playerID, userData, popupReturn | Not sure |
例えばLNTFでは契約の箱という遺産があるが、その特殊な効果は
・全文明と一瞬で出会う
・全文明と友好+2
である。
これはXMLの編集では出来ない効果だ。
この効果を作る場合は一覧の中にあった
「def onBuildingBuilt」
の下に
## 全文明と友好+2 ##
if iBuildingType == gc.getInfoTypeForString("BUILDING_ARK"): Owner = pCity.getOwner() for i in xrange(gc.getMAX_CIV_PLAYERS()): if i==Owner:continue pPlayer = gc.getPlayer(i) pPlayer.AI_setAttitudeExtra(Owner,2)
## 全文明と一瞬で出会う ##
if iBuildingType == gc.getInfoTypeForString( 'BUILDING_ARK' ): pPlayer = gc.getPlayer(pCity.plot().getOwner())~ iTeam = pPlayer.getTeam() pTeam = gc.getTeam(iTeam) for iPlayer in range(gc.getMAX_PLAYERS()): ppPlayer = gc.getPlayer(iPlayer) if (ppPlayer.isAlive()): pTID2 = ppPlayer.getTeam() if iTeam != pTID2:~ pTeam.meet(ppPlayer.getTeam(), True)
この文を加えればよい、
よって元からあるものに加えるとなると、
def onBuildingBuilt(self, argsList): 'Building Completed' pCity, iBuildingType = argsList game = gc.getGame()
●●ここに上記LNTFの2文を追加●●
if (not self.__LOG_BUILDING): return~ CvUtil.pyPrint('%s was finished by Player %d Civilization %s' %(PyInfo.BuildingInfo(iBuildingType).getDescription(), pCity.getOwner(),
ifのところに追加すればよい。
ここで細かく各行の列を解説してみよう。
解説は##の以下に続けます。
## 全文明と友好+2 ##
if iBuildingType == gc.getInfoTypeForString("BUILDING_ARK"): ##iBuildingTypeがBUILDING_ARKと一致している必要がある条件文である。 ##つまり今回、契約の箱というものが”BUILDING_ARK”とCIV4BuildingInfos.xmlで定義されている必要がある。
[TAB]Owner = pCity.getOwner() ##「def onBuildingBuilt」で定義されている”pCity”を利用し該当都市のOwner情報を取得しその情報を”Owner”に格納している。 ##”Owner”は後に続く条件文で使用する。
[TAB]for i in xrange(gc.getMAX_CIV_PLAYERS()): ##ここで全文明の検索を実行している。 ##DLLで定義されている「MAX_CIV_PLAYERS」の数だけ繰り返す。以下はその繰り返しの内容となる。
[TAB][TAB]if i==Owner:continue ##continue文は条件が一致していれば次のループにジャンプする文です。 ##ここの場合、”i”が前述ので検索してきた参加文明を表しますので、”Owner”つまり自分以外の場合次の処理に進むということになります。
[TAB][TAB]pPlayer = gc.getPlayer(i) [TAB][TAB]pPlayer.AI_setAttitudeExtra(Owner,2) ##以上の条件分にすべて一致していればようやくやりたい処理の記述が見えます。 ##最後は参加文明の情報”i”から該当指導者を”pPlayer”と定義し ##「setAttitudeExtra」で”Owner”と”pPlayer”との感情、ゲーム上では「過去の経緯から~」を+2としています。
## 全文明と一瞬で出会う ##
if iBuildingType == gc.getInfoTypeForString( 'BUILDING_ARK' ): ##”iBuildingType”がBUILDING_ARK'(契約の箱)だったときに次の処理に進みます。
[TAB]pPlayer = gc.getPlayer(pCity.plot().getOwner())~ [TAB]iTeam = pPlayer.getTeam() [TAB]pTeam = gc.getTeam(iTeam) ##ここでは処理に工夫が見られます。 ##CIV4で他国と出会う処理は「CyTeam」で扱われます。感情の処理は「CyPlayer」で扱われていました。 ##その為”pCity”から取り出した指導者情報の”pPlayer”から「getTeam()」を利用し”pTeam”とチーム情報を定義しています。
[TAB]for iPlayer in range(gc.getMAX_PLAYERS()): ##全指導者検索です。
[TAB][TAB]ppPlayer = gc.getPlayer(iPlayer) [TAB][TAB]if (ppPlayer.isAlive()): ##すでに滅亡した文明を対象としないため「isAlive()」で生存確認しています。
[TAB][TAB][TAB]pTID2 = ppPlayer.getTeam() [TAB][TAB][TAB]if iTeam != pTID2: ##ここでは最後の処理に進む前に”iTeam”=自分のチームと”pTID2”=対象のチームが違うことを条件としています。
[TAB][TAB][TAB][TAB]pTeam.meet(ppPlayer.getTeam(), True) ##ここまで来てようやく実行文です。 ##「void meet (TeamType eTeam, bool bNewDiplo)」を利用し”pTeam”つまり自分のチームと”ppPlayer.getTeam()”相手のチームを引き合わせています。
##[ご参考] ##さらに最後に「void declareWar (TeamType eTeam, bool bNewDiplo)」を使い ##"pTeam.declareWar(ppPlayer.getTeam(),True,WarPlanTypes.WARPLAN_LIMITED)" ##という一文を追加すれば、”強制的に戦争状態にする”なんてことも可能です。 ##XMLより自由にカスタマイズできるのがpythonの魅力です。
更なるいい例題がMODスレにあったので記載
MODスレ vo31の>>75氏のレス
75 : 名無しさんの野望 [sage] 2012/06/15(金) 03:17:26.17 ID :iR3h7suY
特定のユニットのみを指定して昇進を与える方法はPythonしかやりかたしらないな。 ユニットタイプで指定する方法もXMLで出来るけどこれは実はPythonでも出来る。 というか俺はXMLみたいな膨大なテキスト量のファイル弄るよりPythonの方が楽だからそっちで書いちゃってるな。
具体的なPythonの方法だけど例えば組織志向で開拓者に機動力の昇進を与えたい場合は
if gc.getPlayer(unit.getOwner()).hasTrait(gc.getInfoTypeForString('TRAIT_ORGANIZED')): if gc.getInfoTypeForString('UNITCLASS_SETTLER') == unit.getUnitType(): unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_MOBILITY'),True)
こんな感じに構文で指定してあげればおk。
if gc.getPlayer(unit.getOwner()).hasTrait(gc.getInfoTypeForString('○○')):で、プレイヤーの志向に○○志向があればと条件立てて if gc.getInfoTypeForString('○○') == unit.getUnitType():で、○○のユニット名を各ユニットごとに取得して合っている条件立てて unit.setHasPromotion(gc.getInfoTypeForString('○○'),True)で、そのユニットに○○の昇進を取得(True)させる。
ユニットタイプで昇進(白兵ユニットに戦闘1を)つける場合は
if unit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_MELEE') and unit.getUnitCombatType(): unit.setHasPromotion(gc.getInfoTypeForString('PROMOTION_COMBAT1'),True)
CvEventManager.pyのdef onUnitCreated(self, argsList):の場所に書けば多分動くはず・・・。 出来なかったり間違ってたらごめんね
最新の10件を表示しています。 コメントページを参照