ペーパーマインクラフトのリミックスに挑戦するシリーズが始まりました!
ペーパーマインクラフトのリミックスに挑戦する人の最後の砦
この記事に興味がある方は1度はペーパーマインクラフトの中を見たことがあるのではないでしょうか。
というかペーパーマインクラフトに出会った多くの人が感動し、「これワンチャンでリミックスしたらヤバない?」と思って中を見て、次の瞬間に絶望して「これ触っちゃダメな奴だ」とソッとブラウザを閉じたことがあるのではないでしょうか。
ひょっとしたら今まさに絶望した直後だけど、どうしても諦めきれなくてこのページに辿り着いたのかもしれません。
だとしたら、おめでとう。
ここが、こここそが、ペーパーマインクラフトのリミックスを諦めなかった人達が集まる最後の砦です!(おおげさ)
ペーパーマインクラフトの中を見ると、頭が真っ白になりますよね……。
中を見ると、まず変数が「gt_i」とか意味が分からない。いわゆる難読化された状態になっているので多くの人はこれだけで挫折します。
スプライトの数も多いですし、GeneratorとProcessorという2つのスプライトに関してはスクロールしてもスクロールしても終わりが見えない超巨大スプライトになっており絶望的です。
このリミックスのヒント記事でも、どうこれらを料理しようか悩みました。
1つ1つ丁寧に動きを伝えていったのでは、本が1冊書けるレベルのボリュームになってしまうので、単にコードレビューを一緒にしていくだけではダメだなと思いました。
リミックスのアイデアは山ほどある!!
そこで、実際にいくつかのMODやワールドを作りながら、「こういうリミックスがしたいときは○と○にテコ入れする必要があるんだな」ということが分かるような、リミックスする勘所を押さえていきたいと思います。
すでに公式マイクラに数多くのMODがあるので、やりたいアイデアが大量に浮かぶ人もいると思います。
- ネザライト系の武器も実装したい
- ネザーにブレイズが出るようにしたい
- ネザーでベッドで寝たら爆発するようにしたい
- エンドシティ実装してエンドラも登場させたい
- 青鬼を実装したい
- カートゥーンキャットを実装したい
- ワンブロックチャレンジできるワールドを作りたい
- 巨大ゾンビを実装したい
- 100日後にマグマがあふれる世界を作りたい
などなど無限にやりたいことはでてきますよね。
すでに何人ものスクラッチャーがリミックスに挑戦していて、その方法論を公開してくれている人もいます。みなさんにも「これが作りたい」という希望があると思います。その希望に近いリミックスプロジェクトを見れば、リミックスの基本作業が分かると思います。
例えば「このスプライトのブロック定義「○○」をいじるのか!」「このメッセージを受け取るようにすればいいのか!」「このスプライトのコスチュームと、リストのここにデータを入力しないといけなかったのか!」みたいな具体的なリミックス方法が分かると思います。
今回ここではペーパーマインクラフトプロジェクト全体がどう作られているのかを一緒に見ておきます。
この記事はどのリミックスにおいても重要な前提知識になるので、リミックスする際には何度も読んで全体をチェックしてください。覚える必要はありません。必要なときにチェックすればOKです。
ところでペーパーマインクラフトとは
ねんのため書いておくと、グリフパッチさんが作成した2D版のマインクラフトです。スクラッチでプレイすることができて、発表した瞬間から一気に伝説的なプロジェクトとして広く知られています。
スクラッチでマインクラフト的なゲームをプレイしたい人は、間違いなく1度はプレイすべき逸品です。
ゲームとしてのペーパーマインクラフトに興味がある方は、こちらの記事をチェックしてください。アイテムやモブ一覧、コマンド一覧などが詳細に載っています。
中を見る(全体論)
ではペーパーマインクラフトの中を見ていきましょう。
今回は全体的に次のようなポイントをチェックします。
- スプライトの数
- スプライトの種類
- 各スプライトの役割
- 処理の大きな流れ
- 変数の特徴
- リストの特徴
- メッセージの特徴
この辺りを押さえるだけでも、リミックスを開始できる方もいるでしょう。
大きな流れがわかれば、細かいリミックス作業をしているときも「この作業は○○という流れの一環としてやっている」「この作業の目的は○○」ということを把握できます。
スプライトについて
第一歩として、スクラッチプロジェクトの根幹を成すスプライトについて把握していきましょう。
スプライトの数
全部で29個のスプライトがありますが、1つはダミーなので実際は28個です。
各スプライトに含まれるブロック数はバラバラなので、全て超難解ということではありません。大丈夫。
スプライトの種類
28個のスプライトを独自に6つの種類に分けました。
ゲームメニュー用スプライト
- Stage Sprite(ゲームスターター)
- Menu1(ゲームメニューの枠組み)
- Menu2(ゲームメニューの枠組み内に表示する内容)
- Splash_select(ゲームメニューのボタン)
- selected(選択中のメニュー)
- Save Game(セーブ機能)
プレイヤー用スプライト
- Steve(プレイヤーの身体)
- Steve Head(プレイヤーの顔)
- Steve Arm(プレイヤーの腕)
- Steve Legs2(プレイヤーの足)
プレイヤーのステータス用スプライト
- Health(体力)
- Oxygen(酸素、空気)
- Armor(防御力)
- Hunger(満腹度)
インベントリ用スプライト
- gui_invrow(インベントリの枠組み)
- gui_invsel(インベントリで選択中のアイテム)
- Counts(インベントリ内のアイテム数)
- CreativeOverlay(アイテム種類一覧)
ゲーム外観用スプライト
- Mob(モブ)
- Tiles(ブロック)
- snow(天気)
- Arrow Progress(制作の進捗)
- Smelt Progress(鍛冶の進捗)
その他
- Cursor(カーソル)
- Commands(コマンド)
- Pseudorandom Cycle(疑似乱数サイクル)
- Generator(地形生成)
- Processor(ゲーム処理)
- Blank(ダミー)
このように6つの種類に分かれています。
特にヘビーなのがその他に分類されているGeneratorとProcessorです。
新しいバイオームを追加するリミックスを考えているなら、この2つにテコ入れする必要があり、かなり難易度は高いです。ペーパーマインクラフトへの高い理解力も求められます。
リミックスはなんにせよ大変
といっても、他のリミックスならカンタンというわけでもありません。
たとえばモブを追加する場合はどうでしょうか。Mobというスプライトがあるのでここだけ変えれば良さそうなものですが、違います。
実はモブの動きを管理しているのはProcessorスプライトなのです。Processorスプライトは木の成長具合やダメージ判定なども担当しており、複数のスプライトと関係があります。どんなモブを追加するのかによっては、こちらも触る必要があるかもしれません。
またモブの管理にはリスト変数を使っています。リスト変数の中にモブごとの基本情報(マスタデータ)が格納されているのです。
ペーパーマインクラフトは「モブならMobをいじればリミックスできる!」といったシンプルな作りではないということが分かったと思います。それがリミックスのハードルを高めているのです。
だからこそリミックス最後の砦として、このシリーズではペーパーマインクラフトを必要最低限で解明しつつ、最小の努力でリミックスする方法を模索していきます。
一緒に最高のMODを作る一歩を踏み出しましょう。
各スプライトの役割(カンタンに)
順番はスクラッチのプロジェクトに並べられている順に紹介していきます。
スプライト | 和訳 | 種類 | 役割(カンタンに) |
Blank | ダミー | その他 | 何も書かれてない。チラッと中を見た人への配慮。(いきなりGeneratorだと読み込み処理が重いから) |
Generator | 地形生成 | その他 | バイオーム生成を担当する。 |
Processor | ゲーム処理 | その他 | モブを動かしたり植物の成長を管理したりダメージ処理を行ったり、ゲームの主要処理を担当する。 |
Steve Arm | プレイヤー腕 | プレイヤー | 採掘したり攻撃したり、色々な腕の振る舞いを担当する。 |
Steve | プレイヤー身体 | プレイヤー | プレイヤーの移動などを検知する、腕・顔・足のまとめ役のような存在。 |
Steve Legs2 | プレイヤー足 | プレイヤー | プレイヤーの足の振る舞いを担当する。 |
Steve Head | プレイヤー頭 | プレイヤー | プレイヤーの頭の振る舞いを担当する。 |
Tiles | ブロック | ゲーム外観 | 建築ブロックや、武器や、植物や水などのすべてのブロックがこのスプライトに格納されている。ブロック一覧はこちら。 |
Cursor | カーソル | その他 | プレイヤーが攻撃したりアイテムを設置しようとしている場所を表す役割。 |
gui_invrow | インベントリの枠組み | インベントリ | インベントリの枠を担当する。クラフト用の枠や装備用の枠などもある。 |
gui_invsel | インベントリの枠組み内の選択中のアイテム | インベントリ | インベントリ内でプレイヤーが何を選択中かを表す役割。 |
Counts | アイテム数 | インベントリ | 土ブロックが64個ある、みたいなアイテム数を担当する。ツルハシの耐久力なども担当する。 |
Arrow Progress | 製作の進捗 | ゲーム外観 | たとえば鉄の鉱石を石炭で焼いてインゴットにする際などの進捗状況を担当する。 |
Smelt Progress | 鍛冶の進捗 | ゲーム外観 | たとえば、鉄の鉱石を石炭で焼いている際に、あとどのくらい石炭が燃やせるか、といった状況表示を担当する。 |
Mob | モブ | ゲーム外観 | 敵モブ、動物、村人などのモブを担当する。Mob一覧はこちら。 |
Health | 体力 | プレイヤーステータス | 体力の表示を担当する。 |
Oxygen | 酸素、空気 | プレイヤーステータス | プレイヤーが水に潜っているときに、あとどのくらい息が続くかの表示を担当する。 |
Armor | 防御力 | プレイヤーステータス | プレイヤーの防御力を担当する。 |
Hunger | 満腹度 | プレイヤーステータス | プレイヤーがどのくらいお腹が空いているかを担当する。 |
selected | 選択中のメニュー | ゲームメニュー | 選択中のメニューを担当する。 |
CreativeOverlay | アイテム種類一覧 | インベントリ | クリエイティブモードのときに表示されるアイテム種類一覧表を担当する。 |
Menu1 | ゲームメニューの枠組み | ゲームメニュー | ゲームメニューのラベルと枠組みの表示を担当する。 |
Splash_select | ゲームメニューのボタン | ゲームメニュー | 最初に表示されるゲームメニューの選択ボタンを担当する。 |
Menu2 | ゲームメニューの枠組み内の選択肢 | ゲームメニュー | ゲームメニューの各種選択肢を担当する。 |
Save Game | セーブ機能 | ゲームメニュー | ゲームのセーブやロードを担当する。 |
Commands | コマンド | その他 | コマンドを担当する。コマンド一覧はこちら。 |
Pseudorandom Cycle | 疑似乱数サイクル | その他 | ゲーム内で利用する乱数の生成を担当する。 |
Stage Sprite | ゲームスターター | ゲームメニュー | ゲームを開始する画面を担当する。 |
snow | 天気 | ゲーム外観 | 天気を担当する。 |
リミックスを困難にしている要素
メッセージが多岐にわたってる
ペーパーマインクラフトのリミックスを難しくしている要素に「メッセージが複雑」というものがあります。
そこで、僕がいつも使っているメッセージ関係図を本格的に拡張して、ペーパーマインクラフトのメッセージ関係を分析してみました。
変数名が独特すぎる
ペーパーマインクラフトの変数はスーパー分かりづらいです。たとえば変数「gt_i」というものがあります。これの意味するところは「GrowTreeというブロック定義で使われるループカウンタ変数」なのですが、絶対わからないですよね(笑)gt_iのgtがGrowTreeということも、iというのがプログラミングではループ内でよく使われる合言葉だということも、めっちゃ考察しないと分からないです……。
変数もなんとか解明していきたいです。リミックスに必要な変数に焦点を当てて、わかりやすく解説できるよう努めます。
リストでマスタデータ管理してる
スクラッチでリストという変数を使ったことがありますか?
ない人もいると思います。
リスト変数というのは、基本的にグローバル変数です。つまりすべてのスプライトから利用できる変数です。
そして、1次元の配列構造になっています……っていうと固いですね。
普通の変数が箱だとすると、リストは箱がたくさんつながっている状態です。
ペーパーマインクラフトではマスタデータを管理するためにもリストを使っています。
マスタデータというのは、ちょっと解説しましたが、ゲームで使われるなんらかの定義データです。たとえばブタの体力は10で、アニメーションのスピードは8です、という定義です。
これにリストを使っています。
これがめっちゃ見にくい。たとえばブタのマスタデータはこちら。
リスト「_MOB_DATA」
1
Pig
56
0.4
1
72
5
14
10
143
1
0
分かりづらいですよね……。これをきれいに書くと次のようになります。
ラベル | バリュー |
モブID | 1 |
モブ名 | Pig |
大きさ(%) | 56 |
Half Height | 0.4 |
Y Offset | 1 |
最初のコスチューム | 72 |
Walk Cycle Length | 5 |
アニメーションスピード | 14 |
体力 | 10 |
エサ | 143 |
プレイヤーとの関係 | なし |
Costume Set Mode | 0 |
英語の部分はまだ僕も解明しきれてないところなので和訳してません。
表にするとわかりやすいですが、リストデータのままだとなかなか読みづらいですね。どこかのタイミングで全て表に直して掲載するようにしますね。
処理の流れ(ざっくり)
追記:メッセージ関係図(途中)を公開しました。途中なので第3フェーズのメッセージ関係はすべてを網羅していません。予めご了承ください。
ペーパーマインクラフトの処理の流れは大きく3段階に分かれます。
- 1段階目)ゲームメニュー選択
- 2段階目)メニュー通りのデータのロードや地形生成
- 3段階目)ゲーム中の処理
そして3段階目のゲーム中の処理には次のようなものがあります。
- 植物の成長
- モブの移動や行動
- 天気の変更
- 昼と夜の変更
- コマンド
- プレイヤーや敵モブの被ダメージ
- 画面の端まで行くとシーンが切り替わる
- などなど
1段階目と2段階目はスプライト「Stage Sprite」がメインで動きます。
3段階目からはスプライト「Processor」がメインで動くようになります。
メッセージをたどって処理を追う
次のスクショは、1段階目から3段階目までのメッセージの流れをバババっと追いかけたものです。
1段階目:ゲームメニュー選択画面フェーズ
1段階目の最初にスプライト「Stage Sprite」からgreen flagというメッセージが送られます。これによって全てのスプライトの初期化が行われます。
そしてメッセージ「splash1」が送られて、プレイヤーがゲームメニューを選択します。
プレイヤーの操作によってメッセージ「world option」が送られて、サバイバルモードとかスキンはアレックスを使うとか選択され、すべて決定後にメッセージ「start clicked」が送られて二段階目のゲームスタート処理が始まります。
2段階目:ゲームスタート処理フェーズ
メッセージ「start clicked」を受け取ると、次のように初期化がドドドっと行われます。
スプライト「Stage Sprite」はメッセージ「start clicked」を送ると、自分自身でも受け取り、ゲームスタート処理を開始します。
複数のメッセージが次の順番で送信されます。
- init
- inita
- bring to life
- init1b
- init2
- init3
- switch mode
- animate
- go
最後のメッセージ「go」こそが、ゲームが始まる合図です。
3段階目:ゲーム中フェーズ
スプライト「Processor」がメッセージ「go」を受け取ると、メインループ(ずっとブロック)が始まります。
このループの中でメッセージ「animate」が送られ続けます。これによって様々なスプライトのアニメーションが実行されるのです。
また、コマンドを使ったり、プレイヤーがダメージを受けたり、木が成長したり、天気が変わったり、夜になったり、様々なゲーム中の処理がこのフェーズから始まります。
その多くはスプライト「Processor」によって管理されます。
以上が全体の流れです。
さらなる詳細については、ペーパーマインクラフトのリミックス方法を載せてくれているプロジェクトの紹介を参考にしてください。
追記:リミックス最大の注意点
ペーパーマインクラフトをリミックスする際の最大の注意点は、保存できなくなる現象です。
あることをするとプロジェクトが保存できなくなり、そこまでの作業がパアになります。
超絶注意すべき行動
- エディタページで
- プロジェクトをプレイして
- 地形生成してしまうと、
プロジェクトが保存できなくなります。普通にプロジェクトページでプレイする分には問題ありません。エディタページで緑の旗を押すだけでも問題ありません。
しかし、ゲームを開始してスプライト「Generator」が駆動して地形生成(ワールド作成)をしてしまうと、それ以降は保存できなくなります。
対処法
プロジェクトが保存できなくなったら、ブラウザを閉じて、もう一度開き直せば大丈夫です。
ただ、保存してなかった変更点は失われます。
予防法
未然に防ぐには、本格的にプレイして動きを確かめる際などは、いったんエディタページから出てプロジェクトページにしてから緑の旗を押すようにします。
または、変更する度にこまめに保存して、さいあく保存できなくなってしまっても手戻りを最小限にすれば、そこまで恐れる必要はありません。
コレ以外にも、スクラッチの容量いっぱいまで作り込んだ場合も保存できなくなるという報告があります。またはリストに数万件のデータを入れた場合なども保存できなくなります。
まとめ
この全体論を読むだけでも、かなりペーパーマインクラフトのリミックスがしやすくなると思います。
なぜなら、最もハードルが高いのは大きな処理の流れが分かりづらい、という点だからです。
今回はその大きな処理の流れを軽く紹介しました。
さぁ、ここからリミックスへの挑戦が始まります!