Civ4コールバックファンクションCvEventManager#onCityLostの動作について

for Civ4 modder?
1
ゆとり🇺🇦 @megascus

CvDllPythonEvents::reportCityAcquiredAndKeptではpOldCityという名前で引数を定義してあるけれども呼び元のCvPlayer::acquireCityではnewCityを渡してるなぁ。呼び元のほうが正しそうだからいいか。

2011-07-11 20:24:08
ゆとり🇺🇦 @megascus

CvDllPythonEvents::reportCityLostではoldCityを渡してしまっているのか。だからスレの >>305あたりみたいなことになるんだなぁ。どっちが正しいのだろう。

2011-07-11 20:39:24
denev @denev_

@megascus これは恐らく、newCityで正しい(開発者の意図に沿っている)のだと思います。これを呼び出している時点では、oldCityのオブジェクトは破棄されてしまっているからです。onCityAcquiredAndKeptの使い方を考えても、古い都市に対して何か操作を

2011-07-11 20:42:28
denev @denev_

@denev_ 加えても、どうせ消えてしまうわけですし。

2011-07-11 20:42:40
denev @denev_

@megascus onCityLostは、消去する都市(oldCity)に対して何かを行うことを想定して作られたコールバックなのかもしれません。CivGoldEmpireの抵抗志向がどういうものかはわかりませんが、「占領して維持した」ことをトリガーとするなら、

2011-07-11 20:47:35
denev @denev_

@denev_ onCityAcquiredAndKeptのほうに処理を実装するのが理に適っているかもしれません。(実際問題として、newCityのオブジェクトはonCityAcquiredAndKeptのほうでしか取得できないわけですが。) ただ、都市を失った(維持/破壊に関係

2011-07-11 20:49:40
denev @denev_

@denev_ なく、占領された)ことをトリガーにする効果を実装するなら、onCityLostに、newCityも渡すよう変更しなくてはならないですね。 (あるいは、onCityRazedと両方に同じ処理を入れる? あまりスマートではないですが‥)

2011-07-11 20:53:56
denev @denev_

@denev_ onCityAcquiredというものがあることに、今気付きました。わざわざ修正しなくても、これを使えば済みますね。 そうすると、onCityLostだけがoldCityを渡されてるわけか‥。これはややこしい。

2011-07-11 20:59:27
ゆとり🇺🇦 @megascus

@denev_ 抵抗志向は自国の都市が破壊されたら弓兵の攻撃力を1上げるという処理みたいです。で、都市のオーナーが志向を持っていたらという処理みたいですが、あれ、なんか旧実装で正しい気がする。。。。。。

2011-07-11 21:07:18
denev @denev_

@megascus 「破壊されたら」ということなら、onCityRazedに実装するのが妥当でしょうか。これなら被占領側のオーナーをcity.getPreviousOwner()で取得できるはずです。

2011-07-11 21:23:48
denev @denev_

@denev_ スレッドを読んでみましたが、onCityLostに実装するなら、getOwner()が被占領プレイヤーになりますね。(getOriginalOwner()だと、都市を建てたプレイヤーになってしまいます)

2011-07-11 21:25:26
ゆとり🇺🇦 @megascus

@denev_ ですよねぇ。。。onCityLostに実装されているように見えるのですが、なんで敵の都市を破壊しても効果が発揮されるんだろう。。。。。。不思議だ。

2011-07-11 21:28:20
denev @denev_

@megascus 今動きを追ってみましたが、占領→破壊という一回の過程で、oldCityの破壊(オブジェクトの破棄)と、newCityの破壊という、計2回のonCityLostが走るせいでした。newCity(維持が確定していない、占領側が所有する都市オブジェクト)の破壊処理で

2011-07-11 21:41:36
denev @denev_

@denev_ 件のバグが発生するはずです。どうやらonCityLostは、デバッグ情報を吐き出す以外の処理はやらないほうがよさそうですね。どんなトリガーでも、他のコールバックで実装できるはずですし。

2011-07-11 21:43:47
装甲ネギエルフやまもと @Mr_Yamamoto

@denev_ @megascus 確かにそのほうが妥当ですね。現に人口がマネスや天使に転生する処理はここですし、onCityRazedではいけない理由はないですし。参考になります。

2011-07-11 21:49:11
ゆとり🇺🇦 @megascus

そもそも占領した場合もonCityLostが動いている気がする。

2011-07-11 21:43:45
denev @denev_

@megascus ええ、動いています。onCityLostは、「都市を破壊」したときではなく、「都市オブジェクトを破棄」するときに呼び出されるものです。「都市を破壊」したときなら、onCityRazedを使うのが妥当です。

2011-07-11 21:45:41