TJ's Custom Player MOD


This MOD supports custom appearance of your player.

Tweaks
9 days ago
0.16 - 2.0
2.03K

a 備忘録:データ構造

4 years ago
(updated 4 years ago)

This is just my memorandum. Not important.
忘備録的なメモ。貴方がMOD作りに興味あれば読んでみて欲しい程度のもの。


キャラのグラフィックがゲーム内でどう保持されているか。

システムのグローバル領域にある情報はこの形。

  • data.raw["character"] : なおFactrio 0.17.34以前だと"player"だった。
    • ["character"] : なおFactrio 0.17.34以前だと"player"だった。
    • ["animations"]
      • [1] : 1=装備なし 2=鎧装備 3=モジュラーアーマー装備の3種類
      • ["armors"] : このグラを使うアーマーの名前
        • ["idle"] : 立っている状態のアニメーション設定
        • ["idle_with_gun"] : 立ったまま銃撃しているアニメーション設定
        • ["mining_with_hands"] : 素手による採掘時のアニメーション設定(もう使われていないはず)
        • ["mining_with_tool"] : ツルハシの採掘時のアニメーション設定
        • ["running_with_gun"] : 移動しながら銃撃をしているアニメーション設定
        • ["running"] : 移動時のアニメーション設定

"idle"などにおけるアニメーション設定

実際の値については:
xxx\steamapps\common\Factorio\data\base\prototypes\entity\demo-entities.luaを「"character"」で検索して出てくるあたり

  • ["idle"]
    • ["layers"] : スプライトの設定のリスト。例えば↓
    • [1] : 画像本体のスプライト設定
    • [2] : マスク画像(マルチプレイで色が変わる部位)
    • [3] : 影のスプライト

上から順に表示する仕組み(ただし影は先に表示され下敷きになる)

スプライト設定

実際の値については:
xxx\steamapps\common\Factorio\data\base\prototypes\entity\character_animations.lua 全般

  • ["filename"] : 画像ファイル名
  • ["width"] : 画像ファイルのスプライト1つ分の横幅
  • ["height"] : 画像ファイルのスプライト1つ分の縦幅
  • ["scale"] : 拡大率。0.5なら64ピクセルの絵がゲーム内で32ドットの表示サイズになる
  • ["shift"] : 表示時にずらす量。設定なしだとゲーム内での居る場所に画像の中心が合うように表示される。大抵のものは高さがあるので上にずらす必要がある。
  • ["frame_count"] : 1ループのアニメーションに使われるスプライトの枚数
  • ["direction_count"] : 方向の数指定。全4方向とか全8方向とか。プレイヤー画像の場合はほぼ固定だろうと思われる
  • ["animation_speed"] : アニメーション速度。大きいほど早い。ちなみに足音などもこれに合わせて早くなってくれる模様
  • ["apply_runtime_tint"] : 訳は不明だが、マルチプレイなどで対応する色に塗られるようになる。
  • ["draw_as_shadow"] : 影として描画。半透明として描かれ、一番下に置かれる。
  • ["hr_version"] : この下にハイレゾモード時のアニメーション設定を置く。
4 years ago
(updated 4 years ago)

バニラの定義について

バニラの実装では
まず、character_animations.luaで、character_animations.level1.idle等のスプライトを定義し、次に、demo-entities.luaで、data.raw.character.character.animationsの定義にcharacter_animations.level1.idle等を使っている。
だが、このcharacter_animations.level1.idle等はここでしか使われていない。

なので、差し替え時においてはcharacter_animations.level1.idle等を差し替える必要は特になく、data.raw.character.character.animationsを直接書き換えても問題はない。

アーマーの登録について

data.raw.character.character.animations[ ].armorsの設定は
* animations[1].armors = (設定なし)
* animations[2].armors = {"light-armor", "heavy-armor"}
* animations[3].armors = {"modular-armor", "power-armor", "power-armor-mk2"}
になっている。どのアーマーがどの画像を使うのかがこうやって定義されているため、新規のモジュラー・アーマーなどを作った場合はここに追記すれば良い。オリジナルの画像を使いたい場合は、animations["myArmor"]とかを追加する形になる。
逆に追記がなければ[1]=装備無し画像で出てくると思われる。

移動銃撃時の方向について

running_with_gunの画像は、北から東、南方向へと銃撃する画像が縦に並んでいる。西方向への銃撃時は、東方向への画像の反転が使わている。
これ以外の画像は東と西が別なのだが、この画像にのみこういう縛りがあるため、工場長は左右非対称のデザインは出来ないことになる。
これを制御する方法は私には見つけられていない。

キャラクターサイズ

別のハイレゾモードの備忘録にも書いた通り、キャラの絵の大きさと、ゲーム内のキャラの大きさは無関係。
具体的には工場長の場合、
demo-entities.luaのcharacterの定義にあるcollision_box = {{-0.2, -0.2}, {0.2, 0.2}}
がゲーム内の当たり判定の大きさであり、幅は0.4セル、1セルは32ドットなので、約12ドットの大きさとして扱われているのが分かる。

ちなみに小型電の当たり判定は0.3セルなので、小型電柱を敷きつめてもその間は0.7セル。隙間を余裕で通れるのはこのため。

そして、表示サイズはこれとは無関係。つまり、例えば200ピクセル以上の画像でも工場長として表示することは出来るが、これによって電柱の間が通れなくなる、といったことは起きない。

New response