185 lines
6.6 KiB
JavaScript
185 lines
6.6 KiB
JavaScript
export class SaveSystem {
|
|
constructor(game) {
|
|
this.game = game;
|
|
this.key = 'bomzh_rpg_save';
|
|
}
|
|
|
|
save() {
|
|
const data = {
|
|
version: 5,
|
|
timestamp: Date.now(),
|
|
gameTime: this.game.gameTime,
|
|
gameDay: this.game.gameDay,
|
|
player: {
|
|
stats: { ...this.game.player.stats },
|
|
position: {
|
|
x: this.game.player.position.x,
|
|
y: this.game.player.position.y,
|
|
z: this.game.player.position.z
|
|
},
|
|
stamina: this.game.player.stamina,
|
|
isDiseased: this.game.player.isDiseased,
|
|
diseaseTimer: this.game.player.diseaseTimer,
|
|
addictionLevel: this.game.player.addictionLevel,
|
|
lastDrinkTime: this.game.player.lastDrinkTime
|
|
},
|
|
inventory: { ...this.game.inventory.items },
|
|
inventoryMaxSlots: this.game.inventory.maxSlots,
|
|
quests: this.game.questSystem.quests.map(q => ({
|
|
id: q.id,
|
|
progress: q.progress,
|
|
completed: q.completed || false
|
|
})),
|
|
weather: this.game.weather.current,
|
|
temperature: this.game.weather.temperature,
|
|
skills: this.game.skills.getSaveData(),
|
|
dog: {
|
|
adopted: this.game.dog.adopted
|
|
},
|
|
reputation: this.game.reputation.getSaveData(),
|
|
seasons: this.game.seasons.getSaveData(),
|
|
jobSystem: this.game.jobSystem.getSaveData(),
|
|
equipment: this.game.equipment.getSaveData(),
|
|
achievements: this.game.achievements.getSaveData(),
|
|
housing: this.game.housing.getSaveData(),
|
|
gameStats: {
|
|
totalJobsCompleted: this.game.totalJobsCompleted,
|
|
totalBottlesSold: this.game.totalBottlesSold,
|
|
totalCrafted: this.game.totalCrafted,
|
|
talkedNPCs: [...this.game.talkedNPCs],
|
|
visitedLocations: [...this.game.visitedLocations],
|
|
enemiesDefeated: this.game.enemiesDefeated,
|
|
consecutiveFights: this.game.consecutiveFights
|
|
}
|
|
};
|
|
|
|
try {
|
|
localStorage.setItem(this.key, JSON.stringify(data));
|
|
this.game.notify('Игра сохранена!');
|
|
return true;
|
|
} catch (e) {
|
|
this.game.notify('Ошибка сохранения!');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
load() {
|
|
try {
|
|
const raw = localStorage.getItem(this.key);
|
|
if (!raw) return false;
|
|
|
|
const data = JSON.parse(raw);
|
|
if (!data || data.version < 2) return false;
|
|
|
|
this.game.gameTime = data.gameTime;
|
|
this.game.gameDay = data.gameDay;
|
|
|
|
// Восстановление игрока
|
|
Object.assign(this.game.player.stats, data.player.stats);
|
|
this.game.player.position.set(
|
|
data.player.position.x,
|
|
data.player.position.y,
|
|
data.player.position.z
|
|
);
|
|
if (data.player.stamina !== undefined) {
|
|
this.game.player.stamina = data.player.stamina;
|
|
}
|
|
if (data.player.isDiseased) {
|
|
this.game.player.isDiseased = data.player.isDiseased;
|
|
this.game.player.diseaseTimer = data.player.diseaseTimer || 0;
|
|
}
|
|
if (data.player.addictionLevel) {
|
|
this.game.player.addictionLevel = data.player.addictionLevel;
|
|
this.game.player.lastDrinkTime = data.player.lastDrinkTime || 0;
|
|
}
|
|
|
|
// Инвентарь
|
|
this.game.inventory.items = { ...data.inventory };
|
|
if (data.inventoryMaxSlots) {
|
|
this.game.inventory.maxSlots = data.inventoryMaxSlots;
|
|
}
|
|
|
|
// Квесты
|
|
data.quests.forEach(saved => {
|
|
const quest = this.game.questSystem.quests.find(q => q.id === saved.id);
|
|
if (quest) {
|
|
quest.progress = saved.progress;
|
|
quest.completed = saved.completed;
|
|
}
|
|
});
|
|
|
|
// Погода
|
|
if (data.weather) {
|
|
this.game.weather.current = data.weather;
|
|
this.game.weather.temperature = data.temperature || 15;
|
|
this.game.particles.setWeather(data.weather);
|
|
}
|
|
|
|
// Навыки
|
|
if (data.skills) {
|
|
this.game.skills.loadSaveData(data.skills);
|
|
}
|
|
|
|
// Пёс
|
|
if (data.dog && data.dog.adopted) {
|
|
this.game.dog.adopt();
|
|
}
|
|
|
|
// Репутация
|
|
if (data.reputation) {
|
|
this.game.reputation.loadSaveData(data.reputation);
|
|
}
|
|
|
|
// Сезоны
|
|
if (data.seasons) {
|
|
this.game.seasons.loadSaveData(data.seasons);
|
|
}
|
|
|
|
// Работа
|
|
if (data.jobSystem) {
|
|
this.game.jobSystem.loadSaveData(data.jobSystem);
|
|
}
|
|
|
|
// Экипировка
|
|
if (data.equipment) {
|
|
this.game.equipment.loadSaveData(data.equipment);
|
|
}
|
|
|
|
// Достижения
|
|
if (data.achievements) {
|
|
this.game.achievements.loadSaveData(data.achievements);
|
|
}
|
|
|
|
// Укрытие
|
|
if (data.housing) {
|
|
this.game.housing.loadSaveData(data.housing);
|
|
}
|
|
|
|
// Статистика
|
|
if (data.gameStats) {
|
|
this.game.totalJobsCompleted = data.gameStats.totalJobsCompleted || 0;
|
|
this.game.totalBottlesSold = data.gameStats.totalBottlesSold || 0;
|
|
this.game.totalCrafted = data.gameStats.totalCrafted || 0;
|
|
this.game.talkedNPCs = new Set(data.gameStats.talkedNPCs || []);
|
|
this.game.visitedLocations = new Set(data.gameStats.visitedLocations || []);
|
|
this.game.enemiesDefeated = data.gameStats.enemiesDefeated || 0;
|
|
this.game.consecutiveFights = data.gameStats.consecutiveFights || 0;
|
|
}
|
|
|
|
this.game.notify('Игра загружена!');
|
|
return true;
|
|
} catch (e) {
|
|
this.game.notify('Ошибка загрузки!');
|
|
return false;
|
|
}
|
|
}
|
|
|
|
hasSave() {
|
|
return !!localStorage.getItem(this.key);
|
|
}
|
|
|
|
deleteSave() {
|
|
localStorage.removeItem(this.key);
|
|
}
|
|
}
|