PARANOIA survivor MAX (鬼) SP のラストの滝たちは、互いに鏡像変換の関係にある譜面となっている

Dance Dance Revolution *1に関する記事です。

PARANOIA survivor MAX (鬼) SP のラストには長い滝が登場します。この滝は4つの部分に分けられますが、これらの滝は全て1つ目の滝に対して下記のような鏡像変換を適用したような配置になっていることに気付きました。

  • 2つ目の滝では、←と→が互いに入れ替わり、他のポジションは固定(ただし、最後の一音だけ例外で、→が入れ替わらず→のままになっています。)
  • 3つ目の滝では、↓と↑が互いに入れ替わり、他のポジションは固定
  • 4つ目の滝では、上記の変換が両方適用される

この事実は目視では確認しづらいので、これを検証する下記のようなコードを書きました。言語はPythonです。実際、2つ目の滝の最後の音だけが入れ替わっていないことは、このコードを動かすことで初めて気付きました。

l = [
    "jhjkhlkjljhkjlhjklhjljklkjhlkjl",
    "jljklhkjhjlkjhljkhljhjkhkjlhkjl",
    "khkjhljklkhjklhkjlhklkjljkhljkl",
    "klkjlhjkhkljkhlk",
]

d_2 = {
    "h": "l",
    "j": "j",
    "k": "k",
    "l": "h",
}

d_3 = {
    "h": "h",
    "j": "k",
    "k": "j",
    "l": "l",
}

d_4 = {
    "h": "l",
    "j": "k",
    "k": "j",
    "l": "h",
}

stream_1 = l[0]
stream_2 = "".join([d_2[c] for c in l[1]])
stream_3 = "".join([d_3[c] for c in l[2]])
stream_4 = "".join([d_4[c] for c in l[3]])


assert stream_1 == stream_3
assert stream_1[:-1] == stream_2[:-1]
assert stream_1.startswith(stream_4)

print(stream_1)
print(stream_2)
print(stream_3)
print(stream_4)

なぜ二つ目の滝では最後の一音だけ→が入れ替わらず→のままになっているかという理由について、ここが←になっていた場合を考えると、3つ目の滝の冒頭の↑を右足で踏もうとした時に、すでに右足で←を踏んでしまっているため足が絡まってしまうことから、どうやらそのような事を防止するために最後の音だけ入れ替わらずにしてあるようです。

また、4つ目の滝は途中で曲が減速する部分に入り、滝が途中で終わってしまいます。この理由について、これは鏡像変換を二つ適用していることから、実は省略されている部分は難しい配置になっているため途中で切っているのではないかと予想したのですが、特にそうではありませんでした。下記のコードによって、1つ目の滝に4つ目の滝の変換を適用することで省略された残りの滝の譜面を生成し、矢印表記で表示してみたのですが、特に変わった様子はありませんでした。(下記のコードは、上記のコードの末尾にappendして使います。)

stream_4_dash = "".join([d_4[c] for c in l[0]])

def printstream (stream):
    c2arrow = {
        "h": "←",
        "j": " ↓",
        "k": "  ↑",
        "l": "   →",
    }
    print("←↓↑→")
    for c in stream:
        print(c2arrow[c])

printstream(stream_4_dash)