ゲーム開始時にポップアップメッセージを出す簡単なMODの作成を通じて、Pythonを使ったMODの作り方を理解しよう、という記事です。
Civilization Bts 3.13 日本語版を使用。
XMLのみのMOD作成の知識は前提とします。MOD/作成情報/はじめてのMOD作りを参照。
Pythonについては、他プログラミング言語の経験者であればPython チュートリアルを斜め読みすればなんとなく雰囲気はつかめると思います。なんとなくでOK。初めての人はがんばって。
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
ゲームで使われるPythonのファイルは以下の場所にあります。
XMLの編集と同様に、MODフォルダに配置したPythonファイルで上記場所の同名のファイルを置き換えるのがMOD作りの基本です。
まずMODのフォルダを作りましょう。MOD名はHelloPythonとします。My Documents\My Games\Beyond the Sword(J)\MODS\HelloPython を作成。作ったフォルダの中に以下のフォルダも作成します。
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 を見て原因を調べてください。
ログファイルに書き出すだけではさみしいので、ゲーム画面にポップアップさせてみましょう。
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>こんにちは、Python!</Japanese> </TEXT> </Civ4GameText>
この2ファイルを編集してMODをロード。
以上です。お疲れ様でした。
今回作ったMODをダウンロード