Skip to content

Commit 98212d4

Browse files
committed
セーブデータの保存形式を改善
1 parent 1054d3f commit 98212d4

File tree

6 files changed

+140
-19
lines changed

6 files changed

+140
-19
lines changed

Script/dataSaver.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"use strict";
2+
export default class dataSaver {
3+
//class dataSaver {
4+
/**
5+
* dataSaverクラスのインスタンスを生成。保存先がnullなら空のJSONを保存する。
6+
* @constructor
7+
* @this {dataSaver}
8+
* @param {string} ref 保存先
9+
*/
10+
constructor(ref) {
11+
this.ref = ref;
12+
//init
13+
if (localStorage.getItem(ref) == null)
14+
localStorage.setItem(ref, "{}");
15+
this.data = JSON.parse(localStorage.getItem(ref));
16+
}
17+
/**
18+
* データを読み取る
19+
* @param {(string | number)[]} path
20+
* @returns {any} 読み取った値
21+
*/
22+
getData(path) {
23+
return path.reduce((prev, curr) => prev?.[curr], this.data);
24+
}
25+
/**
26+
* データを保存します。パスがぞんざいしなかったらエラー出す
27+
* @param {(string | number)[]} path
28+
* @param {any} data 保存したいデータ
29+
* @returns {bool} 書き込みに成功したか
30+
*/
31+
setData(path, data) {
32+
if (path.length == 0)
33+
throw new Error("Can't save at root");
34+
const UNTIL_OBJ = this.getData(path.slice(0, -1));
35+
console.info(UNTIL_OBJ);
36+
const PATH_LAST = path.at(-1);
37+
UNTIL_OBJ[PATH_LAST] = data;
38+
localStorage.setItem(this.ref, JSON.stringify(this.data));
39+
return true;
40+
}
41+
/**
42+
* データが存在しない場合のみそれを保存します。
43+
* @param {(string | number)[]} path
44+
* @param {any} data 保存したいデータ
45+
* @returns {bool} 書き込みに成功したか
46+
*/
47+
initData(path, data) {
48+
if (path.length == 0)
49+
throw new Error("Can't save at root");
50+
const UNTIL_OBJ = this.getData(path.slice(0, -1));
51+
console.info(UNTIL_OBJ);
52+
const PATH_LAST = path.at(-1);
53+
if (UNTIL_OBJ[PATH_LAST] !== void 0)
54+
return false;
55+
UNTIL_OBJ[PATH_LAST] = data;
56+
localStorage.setItem(this.ref, JSON.stringify(this.data));
57+
return true;
58+
}
59+
}

Script/puzzle.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import dataSaver from "./dataSaver.js";
12
export default (scenes) => {
3+
const SAVER = new dataSaver("savedata");
24
const ORB_COLORS = 5;
35
const [BASE_SCORE, SCORE_EXPONENT] = [100, 1.5];
46
const ANIM_SPEED = 100;
@@ -169,10 +171,10 @@ export default (scenes) => {
169171
chain_color = -1;
170172
chain_yx = [];
171173
if (DATA.target.hand <= 0) {
172-
if (Number(localStorage.haveCoin) >= CONTINUE_COST &&
174+
if (SAVER.getData(["haveCoin"]) >= CONTINUE_COST &&
173175
confirm(`コンテニューしますか?(手数+${CONTINUE_BONUS})`)) {
174176
DATA.target.hand += CONTINUE_BONUS;
175-
localStorage.haveCoin -= CONTINUE_COST;
177+
SAVER.setData(["haveCoin"], SAVER.getData(["haveCoin"]) - CONTINUE_COST);
176178
return;
177179
}
178180
alert(`ゲームオーバー! スコアは${DATA.target.score}でした!`);

Script/start.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1+
import dataSaver from "./dataSaver.js";
12
export default (scenes) => {
3+
const Saver = new dataSaver("savedata");
24
const CLEARBONUS = 100;
3-
if (!localStorage.maxStage)
4-
localStorage.maxStage = 1; //NEVER ZERO
5-
if (!localStorage.haveCoin)
6-
localStorage.haveCoin = 0;
5+
Saver.initData(["maxstage"], 1);
6+
Saver.initData(["haveCoin"], 0);
77
const DIV_STAGE_SELECT = document.getElementById("stage_select");
88
const INPUT_STAGE_LINK = document.getElementById("StageLink");
99
const START_BUTTON = document.getElementById("startbutton");
1010
const initer = (wasSuccess = false, stagePlayed = -1) => {
1111
if (wasSuccess) {
12-
localStorage.haveCoin -= (-CLEARBONUS);
13-
if (stagePlayed === Number(localStorage.maxStage))
14-
localStorage.maxStage++;
12+
Saver.setData(["haveCoin"], Saver.getData(["haveCoin"]) + CLEARBONUS);
13+
Saver.setData(["maxstage"], Math.max(Saver.getData(["maxstage"]), stagePlayed + 1));
1514
}
1615
DIV_STAGE_SELECT.style.display = "block";
1716
START_BUTTON.onclick = () => {
17+
const MAXSTAGE = Saver.getData(["maxstage"]);
1818
const STAGE_ID = Number(INPUT_STAGE_LINK.value);
1919
if (isNaN(STAGE_ID) || STAGE_ID < 1) {
2020
alert("正の数字を入力しろぉ!");
2121
return 1;
2222
}
23-
if (localStorage.maxStage < STAGE_ID) {
24-
alert(`未開放!最大ステージ番号:${localStorage.maxStage}`);
23+
if (MAXSTAGE < STAGE_ID) {
24+
alert(`未開放!最大ステージ番号:${MAXSTAGE}`);
2525
return 1;
2626
}
2727
DIV_STAGE_SELECT.style.display = "none";

Script_ts/dataSaver.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"use strict";
2+
export default class dataSaver {
3+
//class dataSaver {
4+
/**
5+
* dataSaverクラスのインスタンスを生成。保存先がnullなら空のJSONを保存する。
6+
* @constructor
7+
* @this {dataSaver}
8+
* @param {string} ref 保存先
9+
*/
10+
constructor(ref) {
11+
this.ref = ref;
12+
//init
13+
if (localStorage.getItem(ref) == null) localStorage.setItem(ref, "{}");
14+
this.data = JSON.parse(localStorage.getItem(ref));
15+
}
16+
/**
17+
* データを読み取る
18+
* @param {(string | number)[]} path
19+
* @returns {any} 読み取った値
20+
*/
21+
getData(path) {
22+
return path.reduce((prev, curr) => prev?.[curr], this.data);
23+
}
24+
/**
25+
* データを保存します。パスがぞんざいしなかったらエラー出す
26+
* @param {(string | number)[]} path
27+
* @param {any} data 保存したいデータ
28+
* @returns {bool} 書き込みに成功したか
29+
*/
30+
setData(path, data) {
31+
if (path.length == 0) throw new Error("Can't save at root");
32+
const UNTIL_OBJ = this.getData(path.slice(0, -1));
33+
console.info(UNTIL_OBJ);
34+
const PATH_LAST = path.at(-1);
35+
UNTIL_OBJ[PATH_LAST] = data;
36+
localStorage.setItem(this.ref, JSON.stringify(this.data));
37+
return true;
38+
}
39+
/**
40+
* データが存在しない場合のみそれを保存します。
41+
* @param {(string | number)[]} path
42+
* @param {any} data 保存したいデータ
43+
* @returns {bool} 書き込みに成功したか
44+
*/
45+
initData(path, data) {
46+
if (path.length == 0) throw new Error("Can't save at root");
47+
const UNTIL_OBJ = this.getData(path.slice(0, -1));
48+
console.info(UNTIL_OBJ);
49+
const PATH_LAST = path.at(-1);
50+
if (UNTIL_OBJ[PATH_LAST] !== void 0) return false;
51+
UNTIL_OBJ[PATH_LAST] = data;
52+
localStorage.setItem(this.ref, JSON.stringify(this.data));
53+
return true;
54+
}
55+
}

Script_ts/puzzle.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import dataSaver from "./dataSaver.js";
12
export default (scenes : any) => {
23
// SECTOR_1:定数群
34
interface point {
45
x: number;
56
y: number;
67
}
8+
const SAVER = new dataSaver("savedata");
79
const ORB_COLORS = 5;
810
const [BASE_SCORE, SCORE_EXPONENT] = [100, 1.5];
911
const ANIM_SPEED = 100;
@@ -179,11 +181,11 @@ export default (scenes : any) => {
179181
chain_yx = [];
180182
if (DATA.target.hand <= 0) {
181183
if (
182-
Number(localStorage.haveCoin) >= CONTINUE_COST &&
184+
SAVER.getData(["haveCoin"]) >= CONTINUE_COST &&
183185
confirm(`コンテニューしますか?(手数+${CONTINUE_BONUS})`)
184186
) {
185187
DATA.target.hand += CONTINUE_BONUS;
186-
localStorage.haveCoin -= CONTINUE_COST;
188+
SAVER.setData(["haveCoin"],SAVER.getData(["haveCoin"])-CONTINUE_COST);
187189
return;
188190
}
189191
alert(`ゲームオーバー! スコアは${DATA.target.score}でした!`);

Script_ts/start.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1+
import dataSaver from "./dataSaver.js"
12
export default (scenes : any) => {
3+
const Saver = new dataSaver("savedata");
24
const CLEARBONUS = 100;
3-
if (!localStorage.maxStage) localStorage.maxStage = 1; //NEVER ZERO
4-
if (!localStorage.haveCoin) localStorage.haveCoin = 0;
5+
Saver.initData(["maxstage"],1);
6+
Saver.initData(["haveCoin"],0);
57
const DIV_STAGE_SELECT = document.getElementById("stage_select")!;
68
const INPUT_STAGE_LINK = document.getElementById("StageLink")! as HTMLInputElement;
79
const START_BUTTON = document.getElementById("startbutton")!;
810
const initer = (wasSuccess = false, stagePlayed = -1) => {
911
if (wasSuccess) {
10-
localStorage.haveCoin -= (-CLEARBONUS);
11-
if (stagePlayed === Number(localStorage.maxStage)) localStorage.maxStage++;
12+
Saver.setData(["haveCoin"],Saver.getData(["haveCoin"])+CLEARBONUS);
13+
Saver.setData(["maxstage"],Math.max(Saver.getData(["maxstage"]),stagePlayed+1));
1214
}
1315
DIV_STAGE_SELECT.style.display = "block";
1416
START_BUTTON.onclick = () => {
17+
const MAXSTAGE = Saver.getData(["maxstage"]);
1518
const STAGE_ID = Number(INPUT_STAGE_LINK.value);
1619
if (isNaN(STAGE_ID) || STAGE_ID < 1) {
1720
alert("正の数字を入力しろぉ!");
1821
return 1;
1922
}
20-
if (localStorage.maxStage < STAGE_ID) {
21-
alert(`未開放!最大ステージ番号:${localStorage.maxStage}`);
23+
if (MAXSTAGE < STAGE_ID) {
24+
alert(`未開放!最大ステージ番号:${MAXSTAGE}`);
2225
return 1;
2326
}
2427
DIV_STAGE_SELECT.style.display = "none";

0 commit comments

Comments
 (0)