Python Mod チュートリアル

MOD/作成情報/Python Mod チュートリアル
Last-modified: 2009-06-02 02:22:49

MOD/作成情報/Python Mod チュートリアル †

概要 †

popup.jpg

ゲーム開始時にポップアップメッセージを出す簡単なMODの作成を通じて、Pythonを使ったMODの作り方を理解しよう、という記事です。
Civilization Bts 3.13 日本語版を使用。

必要な知識 †

XMLのみのMOD作成の知識は前提とします。MOD/作成情報/はじめてのMOD作りを参照。
Pythonについては、他プログラミング言語の経験者であればPython チュートリアルを斜め読みすればなんとなく雰囲気はつかめると思います。なんとなくでOK。初めての人はがんばって。

デバッグ用 CivilizationIV.ini 設定 †

My Documents\My Games\Beyond the Sword(J)\CivilizationIV.ini を編集してMODを開発しやすい設定にします。念のため編集前にバックアップをとっておくと吉。

[CONFIG]

; QuickStart - SinglePlayer games only!
; 即座にゲームが始まって便利
QuickStart = 1

; Set to 1 for no python exception popups
HidePythonExceptions = 0

; Python console を利用可能に
; プレイ中にShift+@ (英語キーボードではShift+~) を押すと出る。
CheatCode = chipotle

; Specify a Mod folder (Mods\Mesopotamia), '0' for none
; デフォルトでMODをロードする
Mod = MODS\(開発中のMODフォルダ)

[DEBUG]

; Create a dump file if the application crashes
GenerateCrashDumps = 1

; Enable the logging system
; My Documents\My Games\Beyond the Sword(J)\Logs に出力されます
LoggingEnabled = 1

; Enable synchronization logging
SynchLog = 1

; Overwrite old network and message logs
OverwriteLogs = 1

; Enable rand event logging
RandLog = 1

; Enable message logging
MessageLog = 1

MODフォルダ作成 †

ゲームで使われるPythonのファイルは以下の場所にあります。

XMLの編集と同様に、MODフォルダに配置したPythonファイルで上記場所の同名のファイルを置き換えるのがMOD作りの基本です。
まずMODのフォルダを作りましょう。MOD名はHelloPythonとします。My Documents\My Games\Beyond the Sword(J)\MODS\HelloPython を作成。作ったフォルダの中に以下のフォルダも作成します。

EventManager作成 †

C:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Beyond the Sword(J)\Assets\Python\CvEventManager.py をエディタで開いてみてください。ここで定義されている onKbdEvent(), onInit() などのイベントハンドラメソッドにコードを書き加えることで、好きなタイミングで独自の処理を実行させることができます。CvEventManager.py をMODフォルダにコピーして直接編集しても良いのですが、可読性・保守性向上のためCvEventManagerのサブクラスを作ってからイベントの処理を追加することにしましょう。
MODS\HelloPython\Assets\Python\HpEventManager.py を作成。接頭辞HpはHelloPythonの略です。

import CvEventManager
import CvUtil

class HpEventManager(CvEventManager.CvEventManager, object):

	def onGameStart(self, argsList):
		'Called at the start of the game'
		super(self.__class__, self).onGameStart(argsList)
		# ここから独自の処理
		CvUtil.pyPrint("Hello, Python!")

さて、CvEventManagerの代わりにHpEventManagerが呼ばれるようにしないといけません。そのために C:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Assets\Python\EntryPoints\CvEventInterface.py を置き換えます。MODS\HelloPython\Assets\Python\EntryPoints フォルダを作成して CvEventInterface.py をコピー、編集します。

import CvUtil
import CvEventManager
from CvPythonExtensions import *

# >>> HelloPython MOD
## normalEventManager = CvEventManager.CvEventManager()
import HpEventManager
normalEventManager = HpEventManager.HpEventManager()
# <<< HelloPython MOD

def getEventManager():
	return normalEventManager

def onEvent(argsList):
	'Called when a game event happens - return 1 if the event was consumed'
	return getEventManager().handleEvent(argsList)

def applyEvent(argsList):
	context, playerID, netUserData, popupReturn = argsList
	return getEventManager().applyEvent(argsList)

def beginEvent(context, argsList=-1):
	return getEventManager().beginEvent(context, argsList)

ファイルを書き換えるときは、変更箇所がわかりやすいようにコメントを工夫すると良いでしょう。 それではさっそくゲームを起動して作成したMODをロードしてみます。ゲームスタート後 My Games\Beyond the Sword(J)\Logs\PythonDbg.log を開いて

PY:Hello, Python!

という行がみつかれば成功です。エラーが起きたときは Logs\PythonErr.log を見て原因を調べてください。

ポップアップを出す &dagger;

ログファイルに書き出すだけではさみしいので、ゲーム画面にポップアップさせてみましょう。

from CvPythonExtensions import *
import CvEventManager

gc = CyGlobalContext()
localText = CyTranslator()

class HpEventManager(CvEventManager.CvEventManager, object):

	def onGameStart(self, argsList):
		'Called at the start of the game'
		super(self.__class__, self).onGameStart(argsList)
		showPopupMessage(localText.getText("TXT_KEY_HELLO_PYTHON_MESSAGE", ()))

def showPopupMessage(szMessage):
	for iPlayer in range(gc.getMAX_PLAYERS()):
		player = gc.getPlayer(iPlayer)
		if player.isAlive() and player.isHuman():
			popupInfo = CyPopupInfo()
			popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_TEXT)
			popupInfo.setText(szMessage)
			popupInfo.addPopup(iPlayer)
<?xml version="1.0" encoding="ISO-8859-1"?>
<Civ4GameText xmlns="http://www.firaxis.com">
	<TEXT>
		<Tag>TXT_KEY_HELLO_PYTHON_MESSAGE</Tag>
		<English>Hello, Python!</English>
		<French>Bonjour, Python!</French>
		<German>Hallo, Python!</German>
		<Italian>Ciao, Python!</Italian>
		<Spanish>Hola, Python!</Spanish>
		<Japanese>&#12371;&#12435;&#12395;&#12385;&#12399;&#12289;Python!</Japanese>
	</TEXT>
</Civ4GameText>

この2ファイルを編集してMODをロード。

popup.jpg

以上です。お疲れ様でした。

今回作ったMODをダウンロード

fileHelloPython.zip