Cities:SkylinesのMODのAPI

Cities:Skylinesです。
Cities:Skylinesです。

Cities:SkylinesのMOD作成について。

どんなゲームなのかはリンク先をどうぞ。街づくりゲームです。
MODが作れるようなので、「渋滞した(スタックした)車が消えた数をカウントして一定周期ごとに更新していく」というものを作ろうとしています。交通量についてはメニューから表示できますが、裏で「消えた」車を知ることができればより渋滞量が把握できるだろうかと思ったので。

***ExtensionBaseの派生クラスを作るといくつかのイベントにフックできる様子。
とりあえず、ゲームを始めたときにだけ読み込んでみようかと思ったので以下のようにしました。
これは一応動いていそうな感じです。

using ICities;
using ColossalFramework.Plugins;

namespace ExampleMod
{
public class ModLoadingExtension : LoadingExtensionBase
{
/// <summary>起動時に実行、ゲーム本編の時だけ読み込むようにする</summary>
/// <param name="mode">ゲームモード</param>
public override void OnLevelLoaded(LoadMode mode)
{
// とりあえずもとの処理を呼ぶ
base.OnLevelLoaded(mode);

// ロードしたときか新しくゲームを始めたときだけ実行
if (mode == LoadMode.LoadGame || mode == LoadMode.NewGame)
{
// F7キーで呼べるデバッグウィンドウにメッセージを出す
// MessageTypeを変えるとエラーだったり警告だったりにもできる
DebugOutputPanel.AddMessage(PluginManager.MessageType.Message, "Successfully Loaded!");
}
}

/// <summary>終了時に実行、後始末をする</summary>
public override void OnLevelUnloading()
{
// とりあえずもとの処理を呼ぶだけ
base.OnLevelUnloading();
}
}
}

<市民……?>
F7キーで開くデバッグウィンドウは結構大きめなので、チャーパー(Chirper。上に出てるTwitterのアイコンみたいな鳥)にメッセージを吐き出したいなあと思いました。
メッセージのinterfaceであるところのIChirperMessageは以下の3つを定義しないといけない様子。

  1. senderName(市民の名前?それとも、「メッセージを出そうとしている」関数やオブジェクト?)
  2. text(たぶん、しゃべらせたいメッセージの本文)
  3. senderID(このメッセージをしゃべっている市民のID?)

上2つは仮で入れましたが最後のsenderIDがよくわからず、おそらく市民個別のIDを取り出さなくてはならないのだろうと思い、取り出し方を調べました。
市民を管理しているのはCitizenManagerらしい。

Array32<Citizen> citizenArray = Singleton<CitizenManager>.instance.m_citizens;

(Singleton<T>とかあるのか……便利だな)
ただこのCitizenクラス、肝心なIDは持っていないようで、なんとなくですがこのCitizenManagerにあるm_citizenGridがIDのリストなんじゃないかなあという予想(力尽きたので今日はいったんやめましたが)

<Citizenとその関係でぱっと見えたもの>
CitizenInstanceクラス:「街中を歩く」市民を表してる?
CitizenUnitクラス:世帯っぽい。
CitizenInfoクラス:市民そのものの情報

最後まで作れるんですかねこれ……。
(とはいいつつ、まだ読みやすくて作りやすいほうなのだろうとは思うので、がんばってみたいですね)

あとはおまけ。

空港。
空港。

経路探索の関係上旅客機がこんな態勢になることも。
経路探索の関係上旅客機がこんな態勢になることも。