Scratch 2.0をハッキングしてみよう　その1

<b>はじめまして！</b>
何回かに分けてScratchのプロジェクトをハッキング(=ソースコードを特別な方法で編集する)する方法をまとめました。今回は1回目です。
##ハッキングとは？
プロジェクトのソースが入っているJSONを編集して改造することを指す。
クラッキングとは異なる。

##方法
1. [Scratch 2.0エディター](https://scratch.mit.edu/projects/editor/)の灰色のバーにある``ファイル``をクリックしてドロップダウンメニューを表示させる(上の方にある)。
2. 手元のコンピューターにダウンロードを選択。
3. ファイル名を``[プロジェクト名].sb2``から``[プロジェクト名].zip``に変えてダウンロード。
4. ダウンロードしたファイルを解凍して、`project.json`を開く。

##jsonの解説
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/270426/6f600f03-f892-3996-bd8e-71c7f18a7711.jpeg)
このプログラムをHackしてみる。

```json:project.json
	"objName": "Stage",
	"sounds": [{
			"soundName": "pop",
			"soundID": 1,
			"md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav",
			"sampleCount": 258,
			"rate": 11025,
			"format": ""
		}],
	"costumes": [{
			"costumeName": "backdrop1",
			"baseLayerID": 3,
			"baseLayerMD5": "739b5e2a2435f6e1ec2993791b423146.png",
			"bitmapResolution": 1,
			"rotationCenterX": 240,
			"rotationCenterY": 180
		}],
	"currentCostumeIndex": 0,
	"penLayerMD5": "5c81a336fab8be57adc039a8a2b33ca9.png",
	"penLayerID": 0,
	"tempoBPM": 60,
	"videoAlpha": 0.5,
	"children": [{
			"objName": "Sprite1",
			"scripts": [[13, 21, [["whenGreenFlag"], ["say:", "Hello World!"], ["say:", "縺薙ｓ縺ｫ縺｡縺ｯ 荳也阜���"]]]],
			"sounds": [{
					"soundName": "meow",
					"soundID": 0,
					"md5": "83c36d806dc92327b9e7049a565c6bff.wav",
					"sampleCount": 18688,
					"rate": 22050,
					"format": ""
				}],
			"costumes": [{
					"costumeName": "costume1",
					"baseLayerID": 1,
					"baseLayerMD5": "f9a1c175dbe2e5dee472858dd30d16bb.svg",
					"bitmapResolution": 1,
					"rotationCenterX": 47,
					"rotationCenterY": 55
				},
				{
					"costumeName": "costume2",
					"baseLayerID": 2,
					"baseLayerMD5": "6e8bd9ae68fdb02b7e1e3df656a75635.svg",
					"bitmapResolution": 1,
					"rotationCenterX": 47,
					"rotationCenterY": 55
				}],
			"currentCostumeIndex": 0,
			"scratchX": 0,
			"scratchY": 0,
			"scale": 1,
			"direction": 90,
			"rotationStyle": "normal",
			"isDraggable": false,
			"indexInLibrary": 1,
			"visible": true,
			"spriteInfo": {
			}
		}],
	"info": {
		"scriptCount": 1,
		"hasCloudData": false,
		"userAgent": "Mozilla.......",
		"projectID": "236389663",
		"swfVersion": "v461",
		"spriteCount": 1,
		"videoOn": false,
		"flashVersion": "WIN 21,0,0,213"
	}
```
まず、3～10行目のソースコード

```json:3～10行目
    "sounds": [{
            "soundName": "pop",
            "soundID": 1,
            "md5": "1234567890.wav",
            "sampleCount": 258,
            "rate": 11025,
            "format": ""
        }],
```
ここは背景のサウンド関連のコードとなっている。
ここの中の2行目はサウンドの名前,4行目がサウンドファイルのファイル名となっている。

次に11～19行目

```json:11～19行目
    "costumes": [{
            "costumeName": "backdrop1",
            "baseLayerID": 3,
            "baseLayerMD5": "1234567890.png",
            "bitmapResolution": 1,
            "rotationCenterX": 240,
            "rotationCenterY": 180
        }],
```

ここも背景の画像関連のコードとなっている。
サウンドのコードと同じ要領だ。

そして、20行目からはスプライトのサウンド,画像そしてプログラムのコードとなっていく。

そのコードがこのコード
<small>
文字化けしているのは気にしない。多分zipでDLしたから。:sweat:
もし気になるのであれば(<b>というか、DLしたままjsonを編集しようとすると、書き込み禁止の場合もあるし、編集しにくい。でも、zipから外に出してあげると文字化けも解消される。</b>)</small>

``` json:project.json
"scripts": [[13, 21, [["whenGreenFlag"], ["say:", "Hello World!"], ["say:", "縺薙ｓ縺ｫ縺｡縺ｯ 荳也阜���"]]]],
```
まずは``["say:","Hello World!"]``。
``"say:"``というのは``()と言う``ブロックを表す。そして、``"Hello World!"``は、そう。
白い部分``Hello World!``という引数を表す。
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/270426/6f600f03-f892-3996-bd8e-71c7f18a7711.jpeg)
そして、``["say:", "縺薙ｓ縺ｫ縺｡縺ｯ 荳也阜���"]``は、``こんにちは 世界！``を表す。

##ハッキングの一歩手前
では、今回は``["say:", "縺薙ｓ縺ｫ縺｡縺ｯ 荳也阜���"]``の文字化けしてる部分を(すいません。zipから出すのさぼりました...今度からはちゃんとzipファイルから出して文字化けしないようにします...)``["say:", "ほげ"]``というように書き換えてみよう。
そして、以下の手順でアップロードしてみよう！
1.  編集したjsonをzipに戻す(このとき編集前のjsonが残っている場合は置き換えてください)。
2.  Scratchエディターに戻る。
3.  灰色のバー(初めと同じところ)にある``ファイル``から``手元のコンピューターからアップロード``を選択して、そのzipを選択してアップロードする(表示されるファイルの種類を``カスタムファイル``から``すべてのファイル``にしないとzipは表示されない)。
4.  ``アップロードしますか？``的な事を聞かれるので迷わずOK。
5.  引数が変わっていることを確認。>終了！


今回はここまで。次回は有意義なハッキングをします(そもそも今回はハッキングではないが)！