Files

132 lines
4.0 KiB
TypeScript
Raw Permalink Normal View History

1970-01-01 08:27:52 +08:00
import { sys } from "cc";
import { LevelConfig } from "./LevelBuilder";
import { BoardShapeName } from "./BoardShape";
export class LevelManager {
private static _instance: LevelManager;
public static get instance() {
if (!this._instance) this._instance = new LevelManager();
return this._instance;
}
private levelIndex: number = 0;
private unlockedLevels: number = 1; // 已解锁关卡数
private STORAGE_KEY = "MY_GAME_PROGRESS";
private TUTORIAL_KEY = "TUTORIAL_COMPLETED";
// 预设关卡配置表(可以继续扩展) //rectangle L_shape T_shape cross_shape
private levels: LevelConfig[] = [
{ currentShape: "rectangle", blockSize: 100, tileTypes: 5 },
{ currentShape: "L_shape", blockSize: 90, tileTypes: 4 },
{ currentShape: "T_shape", blockSize: 80, tileTypes: 3 },
{ currentShape: "cross_shape", blockSize: 70, tileTypes: 3 },
{ currentShape: "diamond", blockSize: 80, tileTypes: 4 },
];
constructor() {
this.loadProgress();
}
public isTutorialCompleted(): boolean {
return sys.localStorage.getItem(this.TUTORIAL_KEY) === "true";
}
public setTutorialCompleted() {
sys.localStorage.setItem(this.TUTORIAL_KEY, "true");
}
public getTutorialLevel(): LevelConfig {
return {
isTutorial: true,
tileTypes: 2,
blockSize: 120,
fixedBoard: [
[0, 0, -1],
[1, -1, 1]
]
};
}
public getCurrentLevel(): LevelConfig {
if (!this.isTutorialCompleted()) {
return this.getTutorialLevel();
}
if (this.levelIndex < this.levels.length) {
return this.levels[this.levelIndex];
}
console.log('随机关卡')
return this.generateRandomLevel(this.levelIndex + 1);
}
public nextLevel(): LevelConfig | null {
if (!this.isTutorialCompleted()) {
this.setTutorialCompleted();
this.levelIndex = 0;
this.saveProgress();
return this.getCurrentLevel();
}
this.levelIndex++;
this.saveProgress();
return this.getCurrentLevel();
}
public reset() {
this.levelIndex = 0;
this.unlockedLevels = 1;
this.saveProgress();
// 重置时是否重置教学?通常不用,除非显式清除数据
// sys.localStorage.removeItem(this.TUTORIAL_KEY);
}
/** 本地存储进度 */
private saveProgress() {
const data = {
levelIndex: this.levelIndex,
unlockedLevels: this.unlockedLevels,
};
sys.localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
}
/** 读取本地存储 */
private loadProgress() {
const json = sys.localStorage.getItem(this.STORAGE_KEY);
if (json) {
try {
const data = JSON.parse(json);
this.levelIndex = data.levelIndex ?? 0;
this.unlockedLevels = data.unlockedLevels ?? 1;
// 如果是老玩家已解锁超过1关跳过教学
if (this.unlockedLevels > 1 && !this.isTutorialCompleted()) {
this.setTutorialCompleted();
}
} catch (e) {
console.warn("进度解析失败, 重置进度");
this.reset();
}
}
}
private generateRandomLevel(id: number): LevelConfig {
const allShapes: BoardShapeName[] = ["rectangle", "L_shape", "T_shape", "cross_shape", "diamond"];
// 随机选一个形状
const shape = allShapes[Math.floor(Math.random() * allShapes.length)];
// 随机决定方块种类 (6~12)
const tileTypes = 5;
// const tileTypes = 6 + Math.floor(Math.random() * 7);
// 随机大小 (70~100)
const blockSize = 70 + Math.floor(Math.random() * 31);
return {
currentShape: shape,
tileTypes,
blockSize,
};
}
}