[store_unit]でユニットをカスタムする。その1 | Wesnoth アドオンキャンペーン制作中

Wesnoth アドオンキャンペーン制作中

フリーソフトWesnothのアドオンキャンペーンを作って公開したい!ハードルは高いので本当に完成するかはわからない。

場合によってはシナリオの途中でユニットのデータを変更する必要が出てくる事があります。

例えば新しい武器を与えたり、HPを増やしたりなどストーリーの都合に合わせてユニットデータを編集する場合に代表的な方法が2つあります。

[object]タグを使う方法と[store_unit]タグを使う方法で、この2つにはそれぞれ長所と短所があります。

 

まず[object]ですが、このタグは比較的にハンドリングが簡単な事と変更内容に期間を設けられるなど細かい設定ができるのが長所です。

[object]で変更されたユニットのデータには変更内容を記録した[object]という変数が付加されます。これは[object]を使用するたびに新たに付加されるので、

頻繁にユニットデータを変更する場合はユニットデータのサイズが大きくなる傾向にあります。

 

対して[store_unit]の場合は、データの変更箇所を正確に指定する必要があるため少々扱い難い部分があります。

その代わりデータに[object]が付け加えられる事が無いため、頻繁にユニットデータを変更する場合には有効な方法と言えます。

 

さらに注意するべき点として、この2つの方法は混在させないほうが良いという事です。

[object]で変更されたユニットは[object]の有効期間が終わる等で[object]が削除される場面になると、大元のユニットファイルからユニットデータを再構築するようです。

このとき、[store_unit]によって変更されたデータは失われてしまいます。つまりユニットデータを操作する場合はどちらかの方法で統一したほうが無難という事です。

 

[object]によるユニットデータの操作については本家wikiのリファレンスに詳しく説明されていますので、ここでは[store_unit]について考えてみます。

 

[store_unit]というタグはいくつかのイベントと組み合わせてユニットデータを操作する事ができます。

基本的な使い方は、例えばこんな感じ。

----------------------------------------------------------------

    イベント1:フィルターに合致したユニットを変数として複製する。(temp_unitという変数が作られます)

    [store_unit]

        [filter]

            id = unit_id

        [/filter]

        variable = temp_unit

    [/store_unit]

    

    イベント2:変数を操作して、データに変更を加える。

    [set_variable]

        name=temp_unit.vision

        add=6

    [/set_variable]

    とか

    [set_variables]

        name = temp_unit.resistance

        mode = merge

        [value]

            add_to_arcane = -10

            add_to_blade = -10

            add_to_cold = -10

            add_to_fire = -10

            add_to_impact = -10

            add_to_pierce = -10

        [/value]

    [/set_variables]

    とか

    [clear_variable]

        name = temp_unit.attack[1]

    [/clear_variable]

    

    イベント3:変更した変数を元のユニットに反映させる。

    [unstore_unit]

        variable = temp_unit

    [/unstore_unit]

    

    イベント4:ユニットに反映後、不要になった変数を削除する。

    [clear_variable]

        name = temp_unit

    [/clear_variable]

----------------------------------------------------------------

 

要はユニットの複製を作り、それを編集してオリジナルのユニットと置き換えるという操作をします。

上記のイベントの流れで、1・3・4番はほぼお約束の手順となり、2番の部分が操作するユニットデータに応じて変化します。

 

現在、私が制作途中のアドオン「Castle_of_evil_spirit」では[store_unit]を使用したユニットの変更が頻繁に行われます。

登場するユニットも、そのイベントが発生するのを前提にユニットファイルを作成しています。