スポンサーサイト

--.--.-- *--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

3.19対応作業開始

2011.01.17 *Mon
3.19対応作業を開始しました。
平日に少しずつ進めていく予定です。
3.17用開発は多分もう行いません。

以下は対応作業メモ。

更新完了


1.公式3.19パッチ導入 (済)

2.この状態で3.19用DLLのビルドができることを確認する。 (済)

このサイトを参考にビルドする。

・・・つもりだったが、どうにも素のソースコードだとビルドが通らない。
どうやらまずいC++コードになっているようで、今のコンパイラでは弾かれるらしい。

for(int i=0 ; i<10 ; i++){
//処理
}
int temp = i;


と言うようなコードが散見される。
先に非公式パッチを充てて、それからビルドすることに。


3.非公式パッチver1.6の導入 (済)

ファイルはここから取得した。


4.日本語対応のため一部ファイルを手動修正 (済)

日本語対応のためにサイバーフロントの行った修正を非公式パッチに移植する。
移植が必要なファイルはCvGameTextMgr.cpp

この時点でビルドを行うと、C4996警告が山のように出る。
これは古い文字列操作関数を利用すると出るもので、ひとまず無視設定にしておく。

非公式パッチでも先述のまずいコードはそのままらしく、手動で修正する。


これでとりあえずビルドは通るように。
ただ、これで作成されたDLLでゲームを起動しようとすると起動中に落ちる。
どうにもXMLの初期化中に落ちている?

手抜きをしてVS2008でそのままプロジェクトを読み込んでいたのが原因だった模様。

上記サイトにあるようにmakefileを使うやり方で上手く行った。
ただ、3.17用のmakefileを流用したので、いくつか足りないファイルを追記する必要があった。

とりあえず作成したDLLで起動することを確認。


・・・と思っていたらマップ生成?の辺りで強制終了がかかる。原因不明。
とりあえず非公式パッチを当てていない状態に戻して、その状態で試してみる。

・・・でもやっぱり落ちた。
出来上がったDLLが正規のものよりもファイルサイズが小さく、何か見落としている模様。

検証の結果、CvDllTranslator.cppというファイルがmakefileから抜けていることが判明。
これを追加したら上手いこといった。

上手いこといったので非公式パッチの適用を試みる。
こうやってソースのVerをいじくり回すときはSVNとかのVer管理ツールがあると本当に便利。
仕事で使い方を覚えたけれど、開発者の方にはオススメです。

非公式パッチの適用、起動、動作まで確認。
これでようやく叙事詩コードの移植に入れる。


5.3.17用叙事詩のコードを3.19用ソースコードに移植(DLL) (済)

約100箇所程度修正箇所があるのでそれを順番に手作業で移植する。
修正箇所は全部マークしてあるから単純作業だとはいえ、それでも大変。

↓修正箇所一覧
20110121_1.jpg


DLLのフルビルドには15分くらいかかるのも困りもの。

とりあえず移植は終わってDLLも作成されたものの、このDLLで起動しようとするとフォントの初期化中に落ちる。・・・なぜフォントで・・・?

基本的にヘッダの編集や関数の追加、一部関数の動作修正くらいなので、それらのせいで初期化中に落ちると言うのは考えにくい。各クラスの初期化処理に追加した処理は、追加したメンバ変数の初期化くらいのはず・・・。

唯一の心当たりは、ペディアに東方ユニットのページを追加するために一部列挙型の内容を変更している箇所があること。他の列挙型の変更は後ろに追加する形で行っているが、ここだけは真ん中に挟む形での追加となっている。今はDLLだけでの起動実験中なのでペディアの東方ユニットページのコードが存在しないため、これが原因で初期化に失敗しているのだろうか・・・?


試しにコメントアウトしてやってみたところ、起動(初期化)に成功した。やはりこれが原因だったようだ。

が、ゲームを始めようとするとまた落ちた。
多分、pythonファイルの移植を行っていないのが原因だと思われるので、今度は先にそっちを行うことにする。


6.XMLの記述を移植 (済)

3.17のデータから派生した3.19のデータと、
3.19のデータから派生した非公式パッチのデータと、
3.17のデータから派生した東方叙事詩のデータ。

これらの変更差分を見ながら、3.19の非公式パッチデータをベースに叙事詩のデータを移植する。
単純にコピペではすまないところが多く、全ファイル調べたところ少なくとも以下のファイルはそれぞれを見比べながら手動でデータの移植を行っていくしかない。

Art/CIV4ArtDefine_Unit
Building/CIV4BuildingInfos.xml
GameInfo/CIV4Handicapinfo.xml
GlobalDefines.xml
Text/CIV4GameText_BTS.xml
Text/CIV4GAMEText_Events_BTS.xml
Units/CIV4PromotionInfos.xml
Units/CIV4UnitInfos.xml
Units/CIV4UnitClassInfos.xml

・・・言うまでもなく、ものすごく面倒な作業(・ω・`)


7.Pythonの記述を移植 (済)

続いてPythonもXMLと同様に差分を移植する。
XMLよりはファイル数も少なく、非公式パッチとかぶる部分も無いので思ったよりはあっさり終了


8.動作確認 (済)

Pythonを全部移植しており、DLLの列挙型のコメントアウトしたところも元に戻す必要があるためコメントアウトを外してDLLを作成する。
この状態で動作テストをするわけだけれど…

いわゆるビックバンテスト

一回で上手く行くわけがないと思いつつ、起動してみる。


・・・

起動、初期化成功!
ペディアもきちんと表示されてる!

これはいけるか!?と思ったけれど、やっぱりゲームを始めようとすると落ちた。

さて、これはどこが原因だろうかな・・・


問題発生時は問題の切り分け、原因の追究が第一。
MODのフォルダからいったん全部のファイルを取り出し、XML→Python→DLLの順にフォルダを追加する。それぞれで起動、動作を確認して、どこが原因でゲーム開始時に落ちるのかを突き止める作戦。

XML追加では問題なく起動、動作する。
さらにPython追加では、ペディア関係でエラーが出るものの、起動、動作まで行く。

となれば問題なのはやはりDLLということになる。
でも、更新箇所を洗ってもそれらしいところが中々出てこない、どうしたものか…



いったん叙事詩のコードを全て外し、少しずつ叙事詩のコードを足して行ってどこで落ちるようになるかを探してみる。
どうしても関連性のあるコードが多く「少しずつ」というのが難しいが、コードを足す→ビルドして確認→足す→以下ループを3時間ほど繰り返してみた。

・・・結果、ペディアの東方ユニットの項目用に作成した関数が原因らしいと判明。
この関数を使用しないようにすると、きちんと動作する。


うーん、この関数を使ってるのはペディアだけのはずなんだけどなぁ。
そのペディアはちゃんと動作するのに、ゲームを開始しようとすると落ちるというのはどういうことなんだろう…


あれ? 使用するようにしたのにちゃんと動く???



・・・どこも変更してないのに、なぜか動くようになった・・・。

こういう、「よくわからないけど、動いた」っていう状態は、いつか「よくわからないけれど、動かなくなった」っていう状況になるから怖い。



・・・色々考えてみたけれど、結局のところ叙事詩のコード移植は成功していて、単にビルドするときにクリーンビルドをしなかったのが原因っぽい。

なんともしまらない終わり方ですが、一応対応は完了です。



スポンサーサイト
COMMENT (0)  TRACKBACK (0) 

COMMENT

Comment Form


秘密にする
 

TRACKBACK

TrackBack List


Copyright © フリップフロップ All Rights Reserved.
テンプレート配布者:サリイ (素材:ふるるか) ・・・ 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。