LittleBigPlanet 2の論理回路 (1)

 最近のゲームプレイは、ラストストーリーが途中ですが、LittleBigPlanet 2 (LBP2)も楽しんでいます。ストーリーのプレイもそこそこに、クリエイトの中でも、LBP2で加わったロジックの応用について少しずつ遊んでいます。

 LBP1のクリエイトでもマグネットキーや物理を使った論理回路の作成を楽しめましたが、LBP2では、「ロジック」を使うことで直接的に論理回路を作成できるようになりました。

 LBP2では、2値(デジタル)の論理回路だけではなく、バッテリーやシーケンサーなどで明示的に多値(-100%〜100%の1%刻み。アナログ)を扱えるようになりました。
 1本の配線上には、デジタルとアナログと呼べる信号が乗っていることが、各挙動からわかります。

 ゲーム中には「音声」「動画」「その場で操作」により、とても丁寧なクリエイトのチュートリアルが用意されています。それでも、デジタルとアナログのようなロジックの挙動の詳細までの明確な説明はなされていません。

 これは、LBP2のロジックをプログラミング言語C#)の表現を用いて説明してみようという試みです。

※LBP2内の実験結果によるので、誤解を含んだり、アップデートの影響を受けたりする恐れはあります。

信号

 ここでは、デジタルとアナログの信号を、それぞれDとAと呼ぶことにします。

 プログラミング言語C#」の表現を用いて、Dはbool値で表現し、trueをオン、falseをオフとします。Aはint値で表現し(sbyteで充分ですが簡単のため)、-100〜+100(単位は%)とします。

 1本の配線上の信号は、次のSignal構造体のように表現できます。配線には色もありますが、素子の色指定を引き継ぐだけのようですので、Signalには含めないものとします。

    // 信号(デジタルとアナログを含む)
    struct Signal {
        // false(オフ), true(オン)。信号の表示上の明暗はこの値で決定される。Dがfalse(オフ/暗いとき)でも、Aが0とは限らない。
        public bool D;
        public int A; // -100 〜 +100 [%]

        // DがオフかつAが0%のことを「Signal.Zero」と呼ぶことにする。
        public static readonly Signal Zero = new Signal(false, 0);
        // DがオンかつAが100%のことを「Signal.One」と呼ぶことにする。
        public static readonly Signal One = new Signal(true, 100);

        public Signal(bool d, int a) {
            D = d;
            A = a;
        }
        // 引数notがtrueのとき、出力Dは、入力Dの否定で、Aの符号は消える。
        // falseのとき、値は変化せず、Aの符号も保存される。
        public void InvertIf(bool not) {
            if (not) {
                D = !D;
                A = 100 - Math.Abs(A);
            }
        }
    }

「アウトプットを逆転」

 上記、InvertIfメソッドは、「アウトプットを逆転」でよく使われる挙動を示したものです(すべてではありません)。「アウトプットを逆転:はい」のとき、信号を「逆転」し、「アウトプットを逆転:いいえ」のときは、もとのままとします。

 「はい」(not引数をtrue)の場合、Dは、オンとオフを逆にします。Aは、100%から「Aの絶対値」を引いたものになります。

100%→0%
0%→100%
50%→50%
-100%→0%
-50%→50%

 このように、出力Dは、一般の論理回路の「NOTゲート」の通りですが、出力Aには注意が必要です。

回路「input→NOTゲート→NOTゲート→output」

 この出力(output)は、入力(input)のAを絶対値に変えたものになります。よって、この2重否定の回路は、何もしないときと等価ではなく、LBP2ではAの絶対値をとる回路(Dはもとのまま)の例となっています。