かの有名なネクロノミコンだそうです。こんなの見てるとわくわくが止まりませんね。
ちょっと前にネタ言語を作るというのが流行ったり流行らなかったりしましたが、今回デザインパターンのひとつであるインタプリタパターン(Interpreter Pattern)の練習も兼ねてクトゥルフ言語を作成してcocos2d-xのCCLabelTTFのアニメーションを操るということをしてみました。またクトゥルフ神話っぽく声が聞こえるようにもしましたよ。
クトゥルフ神話って?
まずはクトゥルフ神話を知らない方に、その概要をちょろっと説明しておきます。
一時期ニャル子さん出現で有名になりましたが、元はというと今からおよそ100年前に活躍したりしなかったりしたH・P・ラブクラフトという作家が「魚の目が怖い、タコはもっと怖い」という理由で作り出した壮大な神話となります。H・Pはヒットポイントの略ですね。
ニャル子さんに限らず日本ではクトゥルフ神話に影響を受けてる作品が多く、一説ではウルトラマンやデジモンなんかも影響を受けてると言われてます(本当かは不明)。あとこれはぼくの見解ですが、サザエさんも案外クトゥルフ神話に少なからず影響を受けているのではないでしょうか(不死身だったりお魚咥えた猫を裸足で追いかけたり)。
もちろん好き嫌いは分かれると思うのであまりオススメするということはしませんが、一般教養としてラブクラフト全集2巻の「チャールズ・ウォードの奇怪な事件」と3巻の「戸口にあらわれたもの」は読んで知っておいた方がいいんじゃないかと思いますね。
なんといってもラブクラフトの最大の魅力というと、「魚の目が怖い」から始まった話がものすごく壮大となって神話レベルになったというところにあります。彼は(当時あまり人気なかったことから)あまり長編は書いておらず、ほとんどが短編か中編にとどまっているのですが、それぞれの舞台の地下といいますか、もうひとつ上の次元に常にダゴンやらクトゥルフやらの影が一貫して存在していてさながらバルザックの(以下略)
インタプリタパターンって?
こちらをご参照下さい。
クトゥルフ言語のソースを大公開
それでは、先に今回のクトゥルフ言語のソースを公開します。
このソースでは「CCLabelTTFに文字を登録し、4回転させた後大きくし、戻す」という処理を行っています。
フングルイムグルウナフ!クトゥルフ!フォマルハウト・ンガア・グア!ナフルタグン!イア!クトゥグア! クトゥルフ・フタグン!ニャルラトホテップ・ツガー!シャメッシュ!シャメッシュ! ルル・イエー・ウガ=ナグル・フタグン! イア!イア! ハスタア! ハスタア! クトゥルフ! イア! イア!イア!イア! イア・ル・リェー!クトゥルフ・フタグン! アブホース! イア!イア! チャウグナル・ファウグン! フタグン! 千匹の仔を孕みし森の黒山羊よ! イア!イア! クトゥルフ! ニャル・シュタン! ニャル・シュタン! イア・ル・リェー!クトゥルフ・フタグン! イア! イア! フタグン! 山羊よ!森の山羊よ!我が生け贄を受取り給え! イア!イア! ハスタア! イア! イア! ハスタア! クトゥルフ! アブホース! イア・ル・リェー!クトゥルフ・フタグン! ニャル・ガシャンナ! ニャル・シュタン! 山羊よ! イア!イア! イグ! イグ! イア・ル・リェー!クトゥルフ・フタグン! イタカ! ハスタア! アイ!アイ! フタグン! ルル・イエー・ウガ=ナグル・フタグン! イア!イア! ニャル・シュタン! ニャル・ガシャンナ! ニャル・シュタン! チャウグナル・ファウグン! シャメッシュ!シャメッシュ! クトゥルフ! イタカ! イア・ル・リェー!クトゥルフ・フタグン! イタカ! イア! フタグン! ウザ・イエイ!ウザ・イエイ! イア!イア! クトゥルフ! ハスタア! アブホース! チャウグナル・ファウグン! イア!イア! イグ! イタカ! ハスタア! フタグン! ニャルラトホテップ・ツガー!シャメッシュ!シャメッシュ! イア!イア! シャメッシュ!シャメッシュ! ハスタア! イグ! ニャル・シュタン! イア・ル・リェー!クトゥルフ・フタグン! イグ! フタグン! 暗黒のファラオよ! イア!イア! クトゥルフ! イア! ハスタア! イア・ル・リェー!クトゥルフ・フタグン! イグ! クトゥルフ! ハスタア! フタグン! クトゥルフ!フォマルハウト・ンガア・グア!ナフルタグン! イア!イア! クトゥルフ! イア! イア! イア!イア! ニャル・シュタン! フタグン! フングルイ!ムグルウナフ! イア!イア! ハスタア! イア! イア! クトゥルフ! アブホース! イア・ル・リェー!クトゥルフ・フタグン! チャウグナル・ファウグン! イア!イア! イグ! フタグン! ニャルラトホテップ・ツガー!クトゥルフ・フタグン! イア!イア! シャメッシュ!シャメッシュ! クトゥルフ! イグ! イタカ! ハスタア! フタグン! ヤイ・ングナガ!ヨグ・ソトホース!ヘエ=ルゲブ! イア!イア! ハスタア! ニャル・シュタン! ニャル・シュタン! ニャル・ガシャンナ! ニャル・ガシャンナ! イア! イア! ハスタア! アブホース! シャメッシュ!シャメッシュ! ハスタア! フタグン! 汝視界のヴェールを払い除け、彼方の実在を見せる者よ・・・ イア!イア! クトゥルフ! ハスタア! ニャル・シュタン! フタグン! ウザ・イエイ!ウザ・イエイ!イカア・ハ・ブホウイイ!ラアン=テゴス!クトゥルフ・フタグン! ヤイ・ングナガ!ヨグ・ソトホース!ヘエ=ルゲブ!ファイ・サロドグ・ウアフ! イア!イア! ニャル・シュタン! ニャル・シュタン! ニャル・ガシャンナ! ニャル・ガシャンナ! フタグン! ティビ・マグヌム・イノミナンドゥム・シグナ!ステラルム!イグラルム!エブファニフォルミス! イア!イア! ハスタア! フタグン! オグトロド・アイ・フ!ゲブル=エエヘ!ヨグ・ソトト・ンガーング!アイイ・ズロー! イア!イア! クトゥルフ! イタカ! ハスタア! フタグン! ヘイ・アア=シャンタ・ナイグ! イア!イア! イア! ハスタア! フタグン! イア!イア! シャメッシュ!シャメッシュ! クトゥルフ! イア! イタカ! フタグン! イア!イア!クトゥルフ=フタグン! クトゥルフ・ダイクン! ネブロッド・ヅイン!ネブロッド・ヅイン! イア!イア! イグ! フタグン! イア!イア!ハスタア!ハスタア・クフアヤク=ブルグトム・ブグトラグルン!ブルグトム! イア!イア! ニャル・シュタン! フタグン! イア!イア! シャメッシュ!シャメッシュ! フタグン! イア!イア!クトゥルフ=フタグン! アザトース! シュブ・ニグラス! イア!イア! イグ! フタグン! イア!イア!ハスタア!ハスタア・クフアヤク=ブルグトム・ブグトラグルン!ブルグトム! イア!イア! ニャル・シュタン! フタグン! イア!イア! ハスタア! フタグン! イア!イア!クトゥルフ=フタグン! ヨグ・ソトース! イア!イア!ハスタア!ハスタア・クフアヤク=ブルグトム・ブグトラグルン!ブルグトム! イア!イア! イタカ! フタグン! イア!イア! シャメッシュ!シャメッシュ! チャウグナル・ファウグン! フタグン! イア!イア!クトゥルフ=フタグン! イアール・ムナール!ウガ=ナグル・トナロロ・ヨナラナーク・シラーリー! フングルイムグルウナフ!クトゥルフ!ルル・イエー・ウガ=ナグル・フタグン!
クトゥルフ言語の構文
クトゥルフ神話にはそれぞれ特徴的な呪文があるので、それらを引用して作りました。
【参考サイト】
クトゥルフ神話に関係する呪文一覧
宣言
クトゥルフ言語では、最初に以下の宣言をしなければなりません。
フングルイムグルウナフ!クトゥルフ!フォマルハウト・ンガア・グア!ナフルタグン!イア!クトゥグア!
また、最後は以下の宣言で終わらせなければなりません。
フングルイムグルウナフ!クトゥルフ!ルル・イエー・ウガ=ナグル・フタグン!
デミリタ
クトゥルフ言語では、半角スペースまたは改行、タブで単語を区切ります。
数値の扱い
以下の言葉で挟んだ言葉は数値として計算されます。
「イア!イア!」〜「フタグン!」
- 宣言時の初期値は1で、次の数値を加算していく。
- イグ! 1
- 以下省略
詳しくは(興味ある人は)こちらをご覧下さい。
そして、これがそのソースを実行した動画です。
一応、このように声も聞こえています。
お約束ですよね。
クトゥルフ言語を作ってみて
というかインタプリタパターンを作ってみてわかったのは、非常に楽しいということでした。全てががっちりと組み合わさって再起的に処理が行われていくのはとても壮快ですね。
c++でのインタプリタパターンってあまりネットに載ってないし、条件分岐のコマンドは見つからなかったから自己流で作ったのでちょっと自信ないですが、応用すればサーバーからアプリにソースを落として実行させる・どんどんストーリーを追加していくようなアプリも作れますね。
インタプリタパターンの実装
最後にインタプリタパターンの実装方法を軽くメモっておきます。
インタプリタパターンの場合「プログラム」「コマンドリスト」「コマンド」の3つのクラスを作り、またコマンドも「繰り返しコマンド」「条件分岐コマンド」「処理コマンド」に分け、それぞれ同じインターフェイスを持たせて再起的に行っていくようです。
また、Contextクラスを作成し、その中に全ての情報を持たせて持ち回らせます。
(ググったらたくさんUML図が出てくるからそれも参考にした方がいいかも)
というわけで、以下のようなクラス(インターフェイス)を作成しました。
- Node ── 全てのコマンドのインターフェイス
- Context── 全ての情報を持つクラス
- ProgramNode── 最初のコマンドを開始するクラス
- CommandListNode ── コマンドのリストを実行するクラス
- CommandNode ── 条件分岐、繰り返し処理、通常処理を判断して実行するクラス
- PrimitiveCommandNode── 命令文を処理するクラス(コマンド)
- RepeatCommandNode── 繰り返し処理を行うクラス
- ConditionalCommandNode──条件分岐を行うクラス
- NumberCommandNode── 数値処理を行う専用クラス
処理の流れを簡単に説明すると、最初ProgramNodeが発動し、そこからCommandListNode、CommandNode、それぞれのCommandが呼ばれる、という感じです。RepeatCommandNode、ConditionalCommandNodeでは、またCommandListNodeを呼び出し、イア!イア!クトゥルフ=フタグン!と言われるまで再起的にコマンドを読んでいきます。
ソースコードに関しては、書くと長くなりすぎるのでGitHubに公開してみました。
GitHub:cocos2d-xでインタプリタパターン(クトゥルフ言語)
※ちなみに、デザインパターンは結城浩著「増補改訂版Java言語で学ぶデザインパターン入門」をだいぶ参考にしました。
H・P・ラヴクラフトはハワード・フィリップス・ラヴクラフトなんだがヒットポイント云々はネタですか?
はい、ネタですw ただなんでそんなわかりづらいネタを書いたのか今にしてみると全く謎ですね。。。
ちなみにラブクラフト全集からクトゥルフ神話の世界を知りました(個人的にはチャールズ・ウォードの奇怪な事件が一番好きです)