CvEventManager.pyで使える場面一覧(ちょっと解説付き)

MOD/作成情報/CvEventManager.pyで使える場面一覧(ちょっと解説付き)
Last-modified: 2013-04-19 08:43:40


建造物やその他様々なものに特殊な特徴を付けるときに良く使うCvEventManager.py、
(Assets>Python>CvEventManager.py)
使える場面のコード(と呼んで良いのか?)一覧が
http://modiki.civfanatics.com/index.php/CvEventManager 
ここにあったので出来る範囲で和訳してみた、補足できるところがあったら修整願います


def _init_()selfInitializes variables in file
def handleEvent()self, argsListEvent Manager entry point
def beginEvent()self, context, argsList=-1Begins an event
def applyEvent()self, argsList (context, playerID, netUserData, popupReturn)Applies the effects of an event
def reportEvent()self, entry, context, argsListRecords 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, argsListCalled 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, argsListCalled before Civ shuts down
def onPreSave()self, argsListゲームをセーブする前に・・
def onSaveGame()self, argsListReturns 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 onPlayerChangeStateReligionself, argsList(iPlayer, iNewReligion, iOldReligion)国教変更時
def onPlayerGoldTradeself, argsList(iFromPlayer, iToPlayer, iGoldAmount)他の指導者とゴールドの取引をする時
def onCityBuiltself, argsList(city)都市を建てた時
def onCityRazedself, argsList(city, iPlayer)都市を破壊した時
def onCityAcquiredself, argsList(iPreviousOwner, iNewOwner, pCity, bConquest, bTrade)他文明の都市を任意の手段で得た時
def onCityAcquiredAndKeptself, argsList(iOwner, pCity)他文明の都市を得て、それを維持する時
def onCityLostself, argsList(city, player)都市を失った時
def onCultureExpansionself, argsList(pCity, iPlayer)都市の文化が拡大する時
def onCityGrowthself, argsList(pCity, iPlayer)都市が成長した時
def onCityDoTurnself, argsList(pCity, iPlayer)毎ターン全都市で
def onCityBuildingUnitself, argsList(pCity, iUnitType)都市がユニットを作り始める時
def onCityBuildingBuildingself, argsList(pCity, iBuildingType)都市が建物を建造し始める時
def onCityRenameself, argsList(pCity)都市の名前を変えた時
def onCityHurryself, argsList(pCity, iHurryType)都市が緊急生産する時
def onVictoryself, argsList(iTeam, iVictory)チームがゲームに勝つ時
def onVassalStateself, argsList(iMaster, iVassal, bVassal)チームが属国になるか、独立を獲得する時
def onGameUpdateself, argsList(genericArgs[turnSlice])Called on every "game turn slice"
def onMouseEventself, argsList(eventType, mx, my, px, py, interfaceConsumed, screens)Not sure
def _eventEventCityNameBeginself, city, bRename都市をnameするかrenameするためにポップ・アップを作成します。
def _eventEventCityNameApplyself, playerID, userData(iCityID, bRename), popupReturn都市改名時
def _eventEditCityBeginself, argsList(px, py)Begins the editing of a city in Worldbuilder
def _eventEditCityApplyself, playerID, userData, popupReturnThe edit city event in Worldbuilder
def _eventPlaceObjectBeginself, argsListBegins the place object function in Worldbuilder
def _eventPlaceObjectApplyself, playerID, userData, popupReturnThe place object event in Worldbuilder
def _eventAwardTechsAndGoldBeginself, argsListAn event that お金か技術か
def _eventAwardTechsAndGoldApplyself, playerId, netUserData, popupReturnAn event that お金か技術か
def _eventShowWonderBeginself, argsList遺産ムービ流れたあと
def _eventShowWonderApplyself, playerID, netUserData, popupReturn)遺産ムービ流れたあと
def _eventEditUnitNameBeginself, argsList(pUnit)Creates a popup to rename a unit
def _eventEditUnitNameApplyself, playerID, userData, popupReturnThe event to let you rename a unit
def _eventWBAllPlotsPopupBeginself, argsListAn event that reveals all plots in Worldbuilder
def _eventWBAllPlotsPopupApplyself, playerID, userData, popupReturnAn event that reveals all plots in Worldbuilder
def _eventWBLandmarkPopupBeginself, argsListCreates a popup to label a plot with a landmark tag
def _eventWBLandmarkPopupApplyself, playerID, userData, popupReturnLabels a plot with a landmark tag
def _eventWBScriptPopupBeginself, argsListNot sure
def _eventWBScriptPopupApplyself, playerID, userData, popupReturnNot sure
def _eventWBStartYearPopupBeginself, argsListNot sure
def _eventWBStartYearPopupApplyself, playerID, userData, popupReturnNot 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件を表示しています。 コメントページを参照

  • 日本語が変? -- 2012-04-10 (火) 13:13:53
  • 翻訳ソフト使ったからね -- 2012-04-10 (火) 14:05:40
  • とりあえず分かるトコだけ日本語修正+追加しておいた。 -- 2012-04-10 (火) 18:55:18
  • 各行の列を解説を書いてみた。 -- 2012-04-10 (火) 19:29:44
  • 「使える場面一覧」→「関数がコールバックされるタイミング一覧」 の方が俺にはわかりやすいなあ -- 2012-04-10 (火) 20:22:11
お名前: