|
//-----------------------------------------------------------------------------
// DataManager
// 数据管理器
// The static class that manages the database and game objects.
// 这个静态的类 管理 数据库 和 游戏对象
function DataManager() {
throw new Error('This is a static class');
}
var $dataActors = null;
var $dataClasses = null;
var $dataSkills = null;
var $dataItems = null;
var $dataWeapons = null;
var $dataArmors = null;
var $dataEnemies = null;
var $dataTroops = null;
var $dataStates = null;
var $dataAnimations = null;
var $dataTilesets = null;
var $dataCommonEvents = null;
var $dataSystem = null;
var $dataMapInfos = null;
var $dataMap = null;
var $gameTemp = null;
var $gameSystem = null;
var $gameScreen = null;
var $gameTimer = null;
var $gameMessage = null;
var $gameSwitches = null;
var $gameVariables = null;
var $gameSelfSwitches = null;
var $gameActors = null;
var $gameParty = null;
var $gameTroop = null;
var $gameMap = null;
var $gamePlayer = null;
var $testEvent = null;
DataManager._globalId = 'RPGMV';
DataManager._lastAccessedId = 1;
DataManager._errorUrl = null;
//数据库文件
DataManager._databaseFiles = [
{ name: '$dataActors', src: 'Actors.json' },
{ name: '$dataClasses', src: 'Classes.json' },
{ name: '$dataSkills', src: 'Skills.json' },
{ name: '$dataItems', src: 'Items.json' },
{ name: '$dataWeapons', src: 'Weapons.json' },
{ name: '$dataArmors', src: 'Armors.json' },
{ name: '$dataEnemies', src: 'Enemies.json' },
{ name: '$dataTroops', src: 'Troops.json' },
{ name: '$dataStates', src: 'States.json' },
{ name: '$dataAnimations', src: 'Animations.json' },
{ name: '$dataTilesets', src: 'Tilesets.json' },
{ name: '$dataCommonEvents', src: 'CommonEvents.json' },
{ name: '$dataSystem', src: 'System.json' },
{ name: '$dataMapInfos', src: 'MapInfos.json' }
];
//加载数据库
DataManager.loadDatabase = function() {
var test = this.isBattleTest() || this.isEventTest();
var prefix = test ? 'Test_' : '';
for (var i = 0; i < this._databaseFiles.length; i++) {
var name = this._databaseFiles[i].name;
var src = this._databaseFiles[i].src;
this.loadDataFile(name, prefix + src);
}
if (this.isEventTest()) {
this.loadDataFile('$testEvent', prefix + 'Event.json');
}
};
//加载数据文件
DataManager.loadDataFile = function(name, src) {
var xhr = new XMLHttpRequest();
var url = 'data/' + src;
xhr.open('GET', url);
xhr.overrideMimeType('application/json');
xhr.onload = function() {
if (xhr.status < 400) {
window[name] = JSON.parse(xhr.responseText);
DataManager.onLoad(window[name]);
}
};
xhr.onerror = function() {
DataManager._errorUrl = DataManager._errorUrl || url;
};
window[name] = null;
xhr.send();
};
//在数据库中加载之后
DataManager.isDatabaseLoaded = function() {
this.checkError();
for (var i = 0; i < this._databaseFiles.length; i++) {
if (!window[this._databaseFiles[i].name]) {
return false;
}
}
return true;
};
//加载地图数据
DataManager.loadMapData = function(mapId) {
if (mapId > 0) {
var filename = 'Map%1.json'.format(mapId.padZero(3));
this.loadDataFile('$dataMap', filename);
} else {
this.makeEmptyMap();
}
};
//作空地图
DataManager.makeEmptyMap = function() {
$dataMap = {};
$dataMap.data = [];
$dataMap.events = [];
$dataMap.width = 100;
$dataMap.height = 100;
$dataMap.scrollType = 3;
};
//在地图已加载
DataManager.isMapLoaded = function() {
this.checkError();
return !!$dataMap;
};
//装载
DataManager.onLoad = function(object) {
var array;
if (object === $dataMap) {
this.extractMetadata(object);
array = object.events;
} else {
array = object;
}
if (Array.isArray(array)) {
for (var i = 0; i < array.length; i++) {
var data = array[i];
if (data && data.note !== undefined) {
this.extractMetadata(data);
}
}
}
};
//提取元数据
DataManager.extractMetadata = function(data) {
var re = /<([^<>:]+)(:?)([^>]*)>/g;
data.meta = {};
for (;;) {
var match = re.exec(data.note);
if (match) {
if (match[2] === ':') {
data.meta[match[1]] = match[3];
} else {
data.meta[match[1]] = true;
}
} else {
break;
}
}
};
//检查错误
DataManager.checkError = function() {
if (DataManager._errorUrl) {
throw new Error('Failed to load: ' + DataManager._errorUrl);
}
};
//是战斗测试
DataManager.isBattleTest = function() {
return Utils.isOptionValid('btest');
};
//是事件测试
DataManager.isEventTest = function() {
return Utils.isOptionValid('etest');
};
//是技能
DataManager.isSkill = function(item) {
return item && $dataSkills.contains(item);
};
//是物品
DataManager.isItem = function(item) {
return item && $dataItems.contains(item);
};
//是武器
DataManager.isWeapon = function(item) {
return item && $dataWeapons.contains(item);
};
//是装甲
DataManager.isArmor = function(item) {
return item && $dataArmors.contains(item);
};
//创建游戏对象
DataManager.createGameObjects = function() {
$gameTemp = new Game_Temp();
$gameSystem = new Game_System();
$gameScreen = new Game_Screen();
$gameTimer = new Game_Timer();
$gameMessage = new Game_Message();
$gameSwitches = new Game_Switches();
$gameVariables = new Game_Variables();
$gameSelfSwitches = new Game_SelfSwitches();
$gameActors = new Game_Actors();
$gameParty = new Game_Party();
$gameTroop = new Game_Troop();
$gameMap = new Game_Map();
$gamePlayer = new Game_Player();
};
//安装新游戏
DataManager.setupNewGame = function() {
this.createGameObjects();
this.selectSavefileForNewGame();
$gameParty.setupStartingMembers();
$gamePlayer.reserveTransfer($dataSystem.startMapId,
$dataSystem.startX, $dataSystem.startY);
Graphics.frameCount = 0;
};
//设置战斗测试
DataManager.setupBattleTest = function() {
this.createGameObjects();
$gameParty.setupBattleTest();
BattleManager.setup($dataSystem.testTroopId, true, false);
BattleManager.setBattleTest(true);
BattleManager.playBattleBgm();
};
//设置事件测试
DataManager.setupEventTest = function() {
this.createGameObjects();
this.selectSavefileForNewGame();
$gameParty.setupStartingMembers();
$gamePlayer.reserveTransfer(-1, 8, 6);
$gamePlayer.setTransparent(false);
};
//加载全局信息
DataManager.loadGlobalInfo = function() {
var json;
try {
json = StorageManager.load(0);
} catch (e) {
console.error(e);
return [];
}
if (json) {
var globalInfo = JSON.parse(json);
for (var i = 1; i <= this.maxSavefiles(); i++) {
if (!StorageManager.exists(i)) {
delete globalInfo[i];
}
}
return globalInfo;
} else {
return [];
}
};
//保存全局信息
DataManager.saveGlobalInfo = function(info) {
StorageManager.save(0, JSON.stringify(info));
};
//是游戏档案
DataManager.isThisGameFile = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
if (globalInfo && globalInfo[savefileId]) {
if (StorageManager.isLocalMode()) {
return true;
} else {
var savefile = globalInfo[savefileId];
return (savefile.globalId === this._globalId &&
savefile.title === $dataSystem.gameTitle);
}
} else {
return false;
}
};
//是任何保存文件存在
DataManager.isAnySavefileExists = function() {
var globalInfo = this.loadGlobalInfo();
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i)) {
return true;
}
}
}
return false;
};
//最新的保存文件
DataManager.latestSavefileId = function() {
var globalInfo = this.loadGlobalInfo();
var savefileId = 1;
var timestamp = 0;
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i) && globalInfo[i].timestamp > timestamp) {
timestamp = globalInfo[i].timestamp;
savefileId = i;
}
}
}
return savefileId;
};
//加载所有保存文件中的图像
DataManager.loadAllSavefileImages = function() {
var globalInfo = this.loadGlobalInfo();
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i)) {
var info = globalInfo[i];
this.loadSavefileImages(info);
}
}
}
};
//读取保存文件中的图像
DataManager.loadSavefileImages = function(info) {
if (info.characters) {
for (var i = 0; i < info.characters.length; i++) {
ImageManager.loadCharacter(info.characters[i][0]);
}
}
if (info.faces) {
for (var j = 0; j < info.faces.length; j++) {
ImageManager.loadFace(info.faces[j][0]);
}
}
};
//最大保存文件
DataManager.maxSavefiles = function() {
return 20;
};
//保存游戏
DataManager.saveGame = function(savefileId) {
try {
return this.saveGameWithoutRescue(savefileId);
} catch (e) {
console.error(e);
try {
StorageManager.remove(savefileId);
} catch (e2) {
}
return false;
}
};
//加载游戏
DataManager.loadGame = function(savefileId) {
try {
return this.loadGameWithoutRescue(savefileId);
} catch (e) {
console.error(e);
return false;
}
};
//加载保存文件信息
DataManager.loadSavefileInfo = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
return (globalInfo && globalInfo[savefileId]) ? globalInfo[savefileId] : null;
};
//上次访问保存文件ID
DataManager.lastAccessedSavefileId = function() {
return this._lastAccessedId;
};
//保存游戏无救援
DataManager.saveGameWithoutRescue = function(savefileId) {
var json = JsonEx.stringify(this.makeSaveContents());
if (json.length >= 200000) {
console.warn('Save data too big!');
}
StorageManager.save(savefileId, json);
this._lastAccessedId = savefileId;
var globalInfo = this.loadGlobalInfo() || [];
globalInfo[savefileId] = this.makeSavefileInfo();
this.saveGlobalInfo(globalInfo);
return true;
};
//加载游戏无救援
DataManager.loadGameWithoutRescue = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
if (this.isThisGameFile(savefileId)) {
var json = StorageManager.load(savefileId);
this.createGameObjects();
this.extractSaveContents(JsonEx.parse(json));
this._lastAccessedId = savefileId;
return true;
} else {
return false;
}
};
//选择保存文件对于新游戏
DataManager.selectSavefileForNewGame = function() {
var globalInfo = this.loadGlobalInfo();
this._lastAccessedId = 1;
if (globalInfo) {
var numSavefiles = Math.max(0, globalInfo.length - 1);
if (numSavefiles < this.maxSavefiles()) {
this._lastAccessedId = numSavefiles + 1;
} else {
var timestamp = Number.MAX_VALUE;
for (var i = 1; i < globalInfo.length; i++) {
if (!globalInfo[i]) {
this._lastAccessedId = i;
break;
}
if (globalInfo[i].timestamp < timestamp) {
timestamp = globalInfo[i].timestamp;
this._lastAccessedId = i;
}
}
}
}
};
//生成保存文件信息
DataManager.makeSavefileInfo = function() {
var info = {};
info.globalId = this._globalId;
info.title = $dataSystem.gameTitle;
info.characters = $gameParty.charactersForSavefile();
info.faces = $gameParty.facesForSavefile();
info.playtime = $gameSystem.playtimeText();
info.timestamp = Date.now();
return info;
};
//生成保存目录
DataManager.makeSaveContents = function() {
// A save data does not contain $gameTemp, $gameMessage, and $gameTroop.
var contents = {};
contents.system = $gameSystem;
contents.screen = $gameScreen;
contents.timer = $gameTimer;
contents.switches = $gameSwitches;
contents.variables = $gameVariables;
contents.selfSwitches = $gameSelfSwitches;
contents.actors = $gameActors;
contents.party = $gameParty;
contents.map = $gameMap;
contents.player = $gamePlayer;
return contents;
};
//提取保存目录
DataManager.extractSaveContents = function(contents) {
$gameSystem = contents.system;
$gameScreen = contents.screen;
$gameTimer = contents.timer;
$gameSwitches = contents.switches;
$gameVariables = contents.variables;
$gameSelfSwitches = contents.selfSwitches;
$gameActors = contents.actors;
$gameParty = contents.party;
$gameMap = contents.map;
$gamePlayer = contents.player;
};
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-5-11 03:11
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.