# おさるの練習用セーブデータを任意に作成する方法
## 免責事項
ここに記載してあることを実行して、損害が生じた場合、いかなる責任も負いかねますので、ご容赦ください。
(セーブデータのフォルダのバックアップを取っておけば基本的に問題ないですが……)
## 謝辞
[のりしげさんのブログ](https://norishige710speedrun.hatenablog.com/entry/GibbonData) を参考にしました。ありがとうございます。
## 結論(プログラマー向け)
1. おさるは閉じておく
2. GUID を適当に生成する
3. `%HOMEPATH%\AppData\LocalLow\Broken Rules\Gibbon` に移動
4. `META_KEY.synced.txt` の `profiles` に規定の形式でオブジェクトを追加し、 `id` を先程生成した GUID に変更する
5. `{GUID}.local.txt` と、`{GUID}.synced.txt` を作成し、規定の形式で保存する
## とてもわかりやすい手順
### おさるを閉じる
おさるは寝かせてあげてください。
### GUID を作成する
GUID というのは、
> 世界中で重複することがない、ユニークな128bitのランダムな数値
> https://zenn.dev/kenghaya/articles/016db152531139
です。
「GUID 生成」と検索して出てきたサイトで生成し、出てきた文字列をどこかに保存しておいてください。
[ここのサイト](https://www.uuidgenerator.net/version4) がわかりやすいかも?
![](https://hackmd.io/_uploads/rJm6QV8C2.png)
真ん中に書いてある `XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` みたいなのが GUID です。
### セーブデータを作る
エクスプローラーを開いて、アドレスバーに `%HOMEPATH%\AppData\LocalLow\Broken Rules\Gibbon` と入力してください。
![](https://hackmd.io/_uploads/Sy094VLAn.png)
こんなフォルダが出てきます。
![](https://hackmd.io/_uploads/B1RoN480h.png)
#### `META_KEY.synced.txt` をいじる
この中から、 `META_KEY.synced.txt` というファイルを見つけて、開いてください。
```json
{
"storedData": [],
"profiles": [
{
"id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"created": 000000000000000000,
"lastPlayed": 000000000000000000,
"playTime": 0,
"isValid": true,
"syncState": 1
},
{
"id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"created": 000000000000000000,
"lastPlayed": 000000000000000000,
"playTime": 0,
"isValid": true,
"syncState": 1
},
...
]
}
```
こんなやつです。
ここに、新たに作るセーブデータの情報を記載します。
```json
"profiles": [
// ここ!!!!
{
"id": "34d11c9a-1d8a-4b90-ae07-90e15eb59c72",
"created": 600000000000000008,
"lastPlayed": 638296484400039353,
"playTime": 0,
"isValid": true,
"syncState": 1
},
]
```
`ここ!!!!` と書いてある場所に、他のデータと同じように、下記のような情報を書いてあげてください。
```json
"profiles": [
{
"id": "{さっき取得した GUID}",
"created": 適当な数値,
"lastPlayed": 適当な数値,
"playTime": 0,
"isValid": true,
"syncState": 1
},
{
"id": "34d11c9a-1d8a-4b90-ae07-90e15eb59c72",
"created": 600000000000000008,
"lastPlayed": 638296484400039353,
"playTime": 0,
"isValid": true,
"syncState": 1
},
]
```
`"{さっき取得した GUID}"` と書いてある場所は、他の例に習ってさっき取得した GUID を記入してください。
適当な数値と書いてあるところは、まあほんとに適当な数値でいいです。一応18桁以内が望ましい。
`"created": 適当な数値` に記入されている数値は、小さければ小さいほど、ファイル選択画面で上の方に配置されます。逆もしかり。
`"lastPlayed": 適当な数値` に記入されている数値は、最も大きいものが起動時に読み込まれるようになっています。
記載し終わったらセーブしてください。
#### セーブデータ本体を作成する
同じフォルダに、 `{さっき取得した GUID}.local.txt` と `{さっき取得した GUID}.synced.txt` を作成してください。
`{さっき取得した GUID}.local.txt` の方には、他の `{GUID}.local.txt` があれば、それをコピペすれば大丈夫です。
なければ下記をコピペしてください。
```json
{
"audioData": {
"musicVol": 1.0,
"sfxVol": 1.0
},
"sensitivityData": {
"sensitivity": 0.5
},
"graphicsData": {
"mobilePerformanceMode": false,
"curResolution": {
"x": 1920,
"y": 1080
},
"curRefreshRate": 60,
"fullscreen": true,
"graphicsQuality": 2
}
}
```
`{さっき取得した GUID}.synced.txt` の方はマジのガチのホントのセーブデータ本体です。
下記のテンプレートをコピペして保存してください。
```json
{
"storedData": [
{
"identifier": "Story Progess",
"serialized": "{\"lastCheckpoint\":0}"
},
{
"identifier": "Liberation Progress",
"serialized": "{\"animalStates\":[{\"type\":4,\"state\":2,\"numFreed\":0,\"numToFree\":10},{\"type\":1,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":64,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":2,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":256,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":16,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":128,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":512,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":8,\"state\":1,\"numFreed\":0,\"numToFree\":10},{\"type\":32,\"state\":1,\"numFreed\":0,\"numToFree\":10}],\"usedSpawnPoints\":[]}"
},
{
"identifier": "Gameplay Data",
"serialized": "{\"storyModeCompleted\":false,\"liberationModeCompleted\":false}"
},
{
"identifier": "Language Data",
"serialized": "{\"currentLanguage\":320}"
},
{
"identifier": "Hint Data",
"serialized": "{\"hintShownCounts\":{\"keys\":[],\"values\":[]},\"lastHintShown\":\"InvalidHint\",\"penaltyPopupsShown\":0,\"penaltyHistory\":[false,false,false,false,false,false,false,false,false,false],\"penaltyHistoryNextIdx\":0}"
},
{
"identifier": "Achievements Data",
"serialized": "{\"numDoubleBackflips\":0,\"numPairThrows\":0,\"throwFlip\":false,\"sameVine\":false,\"fiveBounce\":false,\"backflipSlide\":false,\"canabalt\":false,\"drop\":false}"
},
{
"identifier": "RestartManager Data",
"serialized": "{\"creditsShown\":false,\"liberationEndShown\":false}"
}
]
}
```
この中身に関しては[のりしげさんのブログ](https://norishige710speedrun.hatenablog.com/entry/GibbonData#練習用データ作成)がとても良くまとまっているので、そちらを参照して、好きなセーブデータを作ってください。
どちらもセーブして、保存しておいてください。
### ゲームを起動する
おさるを叩き起こして上げましょう。
## 技術的詳細(プログラマー向け)
データは見ての通り json ファイル。
また、おさるは Unity 製なので、C# 由来のデータが多いのがわかると思います。
`"created": 000000000000000000,`
の数値は、 ~~`DateTime.ToBinary()`~~ `DateTime.Ticks` で得られる値です。
以上!