スポンサーサイト

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

移動力をいじる

2010.03.15 *Mon
久しぶりにMOD作成技術の記事です。
今回は移動力をいじります。

興味ない人はスルーで。


<移動力の基本>

まず前提として、
ゲーム中の移動力1は、プログラム内では60ポイントに相当します。

これはAssets\XML\GlobalDefines.xmlの中で以下のように定義されています。

<Define>
<DefineName>MOVE_DENOMINATOR</DefineName>
<iDefineIntVal>60</iDefineIntVal>
</Define>

ここの数字を60→90にすると、全ユニットの移動力が1.5倍になります。
デフォルトが60というある意味中途半端な数字になっているのは、
おそらく公約数がたくさんあるという理由からなんでしょう。

実際にゲーム中に移動をする場合通常は1マスにつき60ポイントを消費するわけですが、これは下記のような条件次第で変動していきます。

道路がある → 30ポイント
道路+工学 → 20ポイント
鉄道がある → 6ポイント
などなど


<CyUnitのAPIを使う>

おそらく最もお世話になるのは以下のAPIでしょう。

int getMoves ()
void setMoves (int iNewValue)
void changeMoves (int iChange)
void finishMoves ()

ほとんどは関数名を見ただけで使い方がわかるかと思います。
finishMoves()は呼び出すとそのユニットが行動終了状態になります。

pUnit.changeMoves(60)

というような感じで使用するわけですが、指定する値はゲーム中に表記されている移動力ではなく、プログラム内で利用される値(移動力1=60ポイント)という点には注意してください。
また、上記のコードの場合、対象ユニットの移動力は減ります
増やしたい場合はマイナスの値を設定してあげる必要があります。増やす場合は通常の最大値(戦士なら1)を超えて設定することも可能ですし、ちゃんと意図通りに動作します。

あと、これらのAPIで設定した移動力というのはあくまでそのターン内でしか適用されません。次のターンには元に戻ってしまいます。
昇進を使わずに、毎ターン移動力ボーナスを与えたいというような場合は上記のAPIを上手く使う必要があるでしょうが、下記のコードでは意図どおりには動作しないので注意が必要です。

CvEventManager.py

def onBeginPlayerTurn(self, argsList):
  ~ 略 ~
  iRandMoveBonus = gc.getGame().getSorenRandNum(100,"random move bonus")
  pUnit.changeMove(-iRangeMoveBonus)

getSorenRandNum()は乱数を得るための関数で、この場合は0~99の整数が返ってきます。これで毎ターン対象ユニットにランダムな移動力がボーナスがつくかと思いきや…

つきません。

理由は簡単で、ターン毎に行われるユニットの移動力のリセット処理が行われるにonBeginPlayerTurnが呼ばれてしまうからです。こういうことをしたい場合はおそらくDLLの中にも手をつける必要があるでしょう。
ちなみに私は必要が無かったので手をつけていませんが。


<移動コストを特殊な条件で変動させる>

先ほどのAPIを使えばやりたいことの大抵はできてしまうのですが、叙事詩1.13を製作するにあたってそれではまずい子が出てきました。東方ユニットであるムラサの仕様として、「海も歩けて、なおかつ海上では移動コストが減少」ということをやろうとした場合、どうしてもDLLにも手を出さなくてはいけません。
その場合、いじるべきところはCvPlot.cpp内のmovementCost(const CvUnit* pUnit, const CvPlot* pFromPlot)関数です。

これはあるユニットが、あるマスからそのマスへ移動する際に何ポイントの移動力が必要か、という値を返す関数です。引数のpUnitでユニットが指定され、pFromPlotで移動する前のマスが指定されています。この中で、「ムラサだったら海上移動コスト減少」というのは以下のようにして実現できます。

if (pUnit->isHasPromotion((PromotionTypes)GC.getInfoTypeForString("PROMOTION_MINAMITSU"))){
  if (getPlotType() == PLOT_OCEAN){
    iRegularCost /= 3;
  }
}

iRegularCostが通常の移動コストで、それを1/3にしています。これでムラサは海上ならば3倍の速度で移動できるようになりました。
でも赤くはないですよ。


移動力に関するプログラムは他にもあるようですが、とりあえずはこれだけ覚えておけば大抵のことはできるんじゃないかと思います。


スポンサーサイト
CATEGORY : Civ4のMOD開発
COMMENT (0)  TRACKBACK (0) 

COMMENT

Comment Form


秘密にする
 

TRACKBACK

TrackBack List


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