Diff
checker
Texto
Texto
Imagens
Documentos
Excel
Pastas
Legal
Enterprise
Aplicativo para desktop
Preços
Fazer login
Baixar o Diffchecker Desktop
Comparar texto
Encontre a diferença entre dois arquivos de texto
Ferramentas
Histórico
Editor live
Ocultar espaços em branco
Recolher inalteradas
Sem quebra de linha
Layout
Dividido
Unificado
Nível de detalhe
Inteligente
Palavra
Caractere
Estilos de texto
Alterar aparência
Realce de sintaxe
Escolher sintaxe
Ignorar
Transformar texto
Ir à primeira mudança
Editar entrada
Diffchecker Desktop
A maneira mais segura de usar o Diffchecker. Obtenha o aplicativo Diffchecker Desktop: seus diffs nunca saem do seu computador!
Obter Desktop
rpg_managers.js versus new_rpg_managers.js
Criado
há 7 anos
O diff nunca expira
Limpar
Exportar
Compartilhar
Explicar
34 remoções
Linhas
Total
Removido
Caracteres
Total
Removido
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
847 linhas
Copiar tudo
34 adições
Linhas
Total
Adicionado
Caracteres
Total
Adicionado
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
842 linhas
Copiar tudo
//=============================================================================
//=============================================================================
// rpg_managers.js v1.5.2
// rpg_managers.js v1.5.2
//=============================================================================
//=============================================================================
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// DataManager
// DataManager
//
//
// The static class that manages the database and game objects.
// The static class that manages the database and game objects.
function DataManager() {
function DataManager() {
throw new Error('This is a static class');
throw new Error('This is a static class');
}
}
var $dataActors = null;
var $dataActors = null;
var $dataClasses = null;
var $dataClasses = null;
var $dataSkills = null;
var $dataSkills = null;
var $dataItems = null;
var $dataItems = null;
var $dataWeapons = null;
var $dataWeapons = null;
var $dataArmors = null;
var $dataArmors = null;
var $dataEnemies = null;
var $dataEnemies = null;
var $dataTroops = null;
var $dataTroops = null;
var $dataStates = null;
var $dataStates = null;
var $dataAnimations = null;
var $dataAnimations = null;
var $dataTilesets = null;
var $dataTilesets = null;
var $dataCommonEvents = null;
var $dataCommonEvents = null;
var $dataSystem = null;
var $dataSystem = null;
var $dataMapInfos = null;
var $dataMapInfos = null;
var $dataMap = null;
var $dataMap = null;
var $gameTemp = null;
var $gameTemp = null;
var $gameSystem = null;
var $gameSystem = null;
var $gameScreen = null;
var $gameScreen = null;
var $gameTimer = null;
var $gameTimer = null;
var $gameMessage = null;
var $gameMessage = null;
var $gameSwitches = null;
var $gameSwitches = null;
var $gameVariables = null;
var $gameVariables = null;
var $gameSelfSwitches = null;
var $gameSelfSwitches = null;
var $gameActors = null;
var $gameActors = null;
var $gameParty = null;
var $gameParty = null;
var $gameTroop = null;
var $gameTroop = null;
var $gameMap = null;
var $gameMap = null;
var $gamePlayer = null;
var $gamePlayer = null;
var $testEvent = null;
var $testEvent = null;
DataManager._globalId = 'RPGMV';
DataManager._globalId = 'RPGMV';
DataManager._lastAccessedId = 1;
DataManager._lastAccessedId = 1;
DataManager._errorUrl = null;
DataManager._errorUrl = null;
DataManager._databaseFiles = [
DataManager._databaseFiles = [
{ name: '$dataActors', src: 'Actors.json' },
{ name: '$dataActors', src: 'Actors.json' },
{ name: '$dataClasses', src: 'Classes.json' },
{ name: '$dataClasses', src: 'Classes.json' },
{ name: '$dataSkills', src: 'Skills.json' },
{ name: '$dataSkills', src: 'Skills.json' },
{ name: '$dataItems', src: 'Items.json' },
{ name: '$dataItems', src: 'Items.json' },
{ name: '$dataWeapons', src: 'Weapons.json' },
{ name: '$dataWeapons', src: 'Weapons.json' },
{ name: '$dataArmors', src: 'Armors.json' },
{ name: '$dataArmors', src: 'Armors.json' },
{ name: '$dataEnemies', src: 'Enemies.json' },
{ name: '$dataEnemies', src: 'Enemies.json' },
{ name: '$dataTroops', src: 'Troops.json' },
{ name: '$dataTroops', src: 'Troops.json' },
{ name: '$dataStates', src: 'States.json' },
{ name: '$dataStates', src: 'States.json' },
{ name: '$dataAnimations', src: 'Animations.json' },
{ name: '$dataAnimations', src: 'Animations.json' },
{ name: '$dataTilesets', src: 'Tilesets.json' },
{ name: '$dataTilesets', src: 'Tilesets.json' },
{ name: '$dataCommonEvents', src: 'CommonEvents.json' },
{ name: '$dataCommonEvents', src: 'CommonEvents.json' },
{ name: '$dataSystem', src: 'System.json' },
{ name: '$dataSystem', src: 'System.json' },
{ name: '$dataMapInfos', src: 'MapInfos.json' }
{ name: '$dataMapInfos', src: 'MapInfos.json' }
];
];
DataManager.loadDatabase = function() {
DataManager.loadDatabase = function() {
Copiar
Copiado
Copiar
Copiado
// The initialization of DB driver below would ideally be on the main.html page
localforage.defineDriver(window.cordovaSQLiteDriver).then(function() {
return localforage.setDriver([
window.cordovaSQLiteDriver._driver,
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
]);
}
var test = this.isBattleTest() || this.isEventTest();
var test = this.isBattleTest() || this.isEventTest();
var prefix = test ? 'Test_' : '';
var prefix = test ? 'Test_' : '';
for (var i = 0; i < this._databaseFiles.length; i++) {
for (var i = 0; i < this._databaseFiles.length; i++) {
var name = this._databaseFiles[i].name;
var name = this._databaseFiles[i].name;
var src = this._databaseFiles[i].src;
var src = this._databaseFiles[i].src;
this.loadDataFile(name, prefix + src);
this.loadDataFile(name, prefix + src);
}
}
if (this.isEventTest()) {
if (this.isEventTest()) {
this.loadDataFile('$testEvent', prefix + 'Event.json');
this.loadDataFile('$testEvent', prefix + 'Event.json');
}
}
};
};
DataManager.loadDataFile = function(name, src) {
DataManager.loadDataFile = function(name, src) {
var xhr = new XMLHttpRequest();
var xhr = new XMLHttpRequest();
var url = 'data/' + src;
var url = 'data/' + src;
xhr.open('GET', url);
xhr.open('GET', url);
xhr.overrideMimeType('application/json');
xhr.overrideMimeType('application/json');
xhr.onload = function() {
xhr.onload = function() {
if (xhr.status < 400) {
if (xhr.status < 400) {
window[name] = JSON.parse(xhr.responseText);
window[name] = JSON.parse(xhr.responseText);
DataManager.onLoad(window[name]);
DataManager.onLoad(window[name]);
}
}
};
};
xhr.onerror = this._mapLoader || function() {
xhr.onerror = this._mapLoader || function() {
DataManager._errorUrl = DataManager._errorUrl || url;
DataManager._errorUrl = DataManager._errorUrl || url;
};
};
window[name] = null;
window[name] = null;
xhr.send();
xhr.send();
};
};
DataManager.isDatabaseLoaded = function() {
DataManager.isDatabaseLoaded = function() {
this.checkError();
this.checkError();
for (var i = 0; i < this._databaseFiles.length; i++) {
for (var i = 0; i < this._databaseFiles.length; i++) {
if (!window[this._databaseFiles[i].name]) {
if (!window[this._databaseFiles[i].name]) {
return false;
return false;
}
}
}
}
return true;
return true;
};
};
DataManager.loadMapData = function(mapId) {
DataManager.loadMapData = function(mapId) {
if (mapId > 0) {
if (mapId > 0) {
var filename = 'Map%1.json'.format(mapId.padZero(3));
var filename = 'Map%1.json'.format(mapId.padZero(3));
this._mapLoader = ResourceHandler.createLoader('data/' + filename, this.loadDataFile.bind(this, '$dataMap', filename));
this._mapLoader = ResourceHandler.createLoader('data/' + filename, this.loadDataFile.bind(this, '$dataMap', filename));
this.loadDataFile('$dataMap', filename);
this.loadDataFile('$dataMap', filename);
} else {
} else {
this.makeEmptyMap();
this.makeEmptyMap();
}
}
};
};
DataManager.makeEmptyMap = function() {
DataManager.makeEmptyMap = function() {
$dataMap = {};
$dataMap = {};
$dataMap.data = [];
$dataMap.data = [];
$dataMap.events = [];
$dataMap.events = [];
$dataMap.width = 100;
$dataMap.width = 100;
$dataMap.height = 100;
$dataMap.height = 100;
$dataMap.scrollType = 3;
$dataMap.scrollType = 3;
};
};
DataManager.isMapLoaded = function() {
DataManager.isMapLoaded = function() {
this.checkError();
this.checkError();
return !!$dataMap;
return !!$dataMap;
};
};
DataManager.onLoad = function(object) {
DataManager.onLoad = function(object) {
var array;
var array;
if (object === $dataMap) {
if (object === $dataMap) {
this.extractMetadata(object);
this.extractMetadata(object);
array = object.events;
array = object.events;
} else {
} else {
array = object;
array = object;
}
}
if (Array.isArray(array)) {
if (Array.isArray(array)) {
for (var i = 0; i < array.length; i++) {
for (var i = 0; i < array.length; i++) {
var data = array[i];
var data = array[i];
if (data && data.note !== undefined) {
if (data && data.note !== undefined) {
this.extractMetadata(data);
this.extractMetadata(data);
}
}
}
}
}
}
if (object === $dataSystem) {
if (object === $dataSystem) {
Decrypter.hasEncryptedImages = !!object.hasEncryptedImages;
Decrypter.hasEncryptedImages = !!object.hasEncryptedImages;
Decrypter.hasEncryptedAudio = !!object.hasEncryptedAudio;
Decrypter.hasEncryptedAudio = !!object.hasEncryptedAudio;
Scene_Boot.loadSystemImages();
Scene_Boot.loadSystemImages();
}
}
};
};
DataManager.extractMetadata = function(data) {
DataManager.extractMetadata = function(data) {
var re = /<([^<>:]+)(:?)([^>]*)>/g;
var re = /<([^<>:]+)(:?)([^>]*)>/g;
data.meta = {};
data.meta = {};
for (;;) {
for (;;) {
var match = re.exec(data.note);
var match = re.exec(data.note);
if (match) {
if (match) {
if (match[2] === ':') {
if (match[2] === ':') {
data.meta[match[1]] = match[3];
data.meta[match[1]] = match[3];
} else {
} else {
data.meta[match[1]] = true;
data.meta[match[1]] = true;
}
}
} else {
} else {
break;
break;
}
}
}
}
};
};
DataManager.checkError = function() {
DataManager.checkError = function() {
if (DataManager._errorUrl) {
if (DataManager._errorUrl) {
throw new Error('Failed to load: ' + DataManager._errorUrl);
throw new Error('Failed to load: ' + DataManager._errorUrl);
}
}
};
};
DataManager.isBattleTest = function() {
DataManager.isBattleTest = function() {
return Utils.isOptionValid('btest');
return Utils.isOptionValid('btest');
};
};
DataManager.isEventTest = function() {
DataManager.isEventTest = function() {
return Utils.isOptionValid('etest');
return Utils.isOptionValid('etest');
};
};
DataManager.isSkill = function(item) {
DataManager.isSkill = function(item) {
return item && $dataSkills.contains(item);
return item && $dataSkills.contains(item);
};
};
DataManager.isItem = function(item) {
DataManager.isItem = function(item) {
return item && $dataItems.contains(item);
return item && $dataItems.contains(item);
};
};
DataManager.isWeapon = function(item) {
DataManager.isWeapon = function(item) {
return item && $dataWeapons.contains(item);
return item && $dataWeapons.contains(item);
};
};
DataManager.isArmor = function(item) {
DataManager.isArmor = function(item) {
return item && $dataArmors.contains(item);
return item && $dataArmors.contains(item);
};
};
DataManager.createGameObjects = function() {
DataManager.createGameObjects = function() {
$gameTemp = new Game_Temp();
$gameTemp = new Game_Temp();
$gameSystem = new Game_System();
$gameSystem = new Game_System();
$gameScreen = new Game_Screen();
$gameScreen = new Game_Screen();
$gameTimer = new Game_Timer();
$gameTimer = new Game_Timer();
$gameMessage = new Game_Message();
$gameMessage = new Game_Message();
$gameSwitches = new Game_Switches();
$gameSwitches = new Game_Switches();
$gameVariables = new Game_Variables();
$gameVariables = new Game_Variables();
$gameSelfSwitches = new Game_SelfSwitches();
$gameSelfSwitches = new Game_SelfSwitches();
$gameActors = new Game_Actors();
$gameActors = new Game_Actors();
$gameParty = new Game_Party();
$gameParty = new Game_Party();
$gameTroop = new Game_Troop();
$gameTroop = new Game_Troop();
$gameMap = new Game_Map();
$gameMap = new Game_Map();
$gamePlayer = new Game_Player();
$gamePlayer = new Game_Player();
};
};
DataManager.setupNewGame = function() {
DataManager.setupNewGame = function() {
this.createGameObjects();
this.createGameObjects();
this.selectSavefileForNewGame();
this.selectSavefileForNewGame();
$gameParty.setupStartingMembers();
$gameParty.setupStartingMembers();
$gamePlayer.reserveTransfer($dataSystem.startMapId,
$gamePlayer.reserveTransfer($dataSystem.startMapId,
$dataSystem.startX, $dataSystem.startY);
$dataSystem.startX, $dataSystem.startY);
Graphics.frameCount = 0;
Graphics.frameCount = 0;
};
};
DataManager.setupBattleTest = function() {
DataManager.setupBattleTest = function() {
this.createGameObjects();
this.createGameObjects();
$gameParty.setupBattleTest();
$gameParty.setupBattleTest();
BattleManager.setup($dataSystem.testTroopId, true, false);
BattleManager.setup($dataSystem.testTroopId, true, false);
BattleManager.setBattleTest(true);
BattleManager.setBattleTest(true);
BattleManager.playBattleBgm();
BattleManager.playBattleBgm();
};
};
DataManager.setupEventTest = function() {
DataManager.setupEventTest = function() {
this.createGameObjects();
this.createGameObjects();
this.selectSavefileForNewGame();
this.selectSavefileForNewGame();
$gameParty.setupStartingMembers();
$gameParty.setupStartingMembers();
$gamePlayer.reserveTransfer(-1, 8, 6);
$gamePlayer.reserveTransfer(-1, 8, 6);
$gamePlayer.setTransparent(false);
$gamePlayer.setTransparent(false);
};
};
DataManager.loadGlobalInfo = function() {
DataManager.loadGlobalInfo = function() {
var json;
var json;
try {
try {
json = StorageManager.load(0);
json = StorageManager.load(0);
} catch (e) {
} catch (e) {
console.error(e);
console.error(e);
return [];
return [];
}
}
if (json) {
if (json) {
var globalInfo = JSON.parse(json);
var globalInfo = JSON.parse(json);
for (var i = 1; i <= this.maxSavefiles(); i++) {
for (var i = 1; i <= this.maxSavefiles(); i++) {
if (!StorageManager.exists(i)) {
if (!StorageManager.exists(i)) {
delete globalInfo[i];
delete globalInfo[i];
}
}
}
}
return globalInfo;
return globalInfo;
} else {
} else {
return [];
return [];
}
}
};
};
DataManager.saveGlobalInfo = function(info) {
DataManager.saveGlobalInfo = function(info) {
StorageManager.save(0, JSON.stringify(info));
StorageManager.save(0, JSON.stringify(info));
};
};
DataManager.isThisGameFile = function(savefileId) {
DataManager.isThisGameFile = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
if (globalInfo && globalInfo[savefileId]) {
if (globalInfo && globalInfo[savefileId]) {
if (StorageManager.isLocalMode()) {
if (StorageManager.isLocalMode()) {
return true;
return true;
} else {
} else {
var savefile = globalInfo[savefileId];
var savefile = globalInfo[savefileId];
return (savefile.globalId === this._globalId &&
return (savefile.globalId === this._globalId &&
savefile.title === $dataSystem.gameTitle);
savefile.title === $dataSystem.gameTitle);
}
}
} else {
} else {
return false;
return false;
}
}
};
};
DataManager.isAnySavefileExists = function() {
DataManager.isAnySavefileExists = function() {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
if (globalInfo) {
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i)) {
if (this.isThisGameFile(i)) {
return true;
return true;
}
}
}
}
}
}
return false;
return false;
};
};
DataManager.latestSavefileId = function() {
DataManager.latestSavefileId = function() {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
var savefileId = 1;
var savefileId = 1;
var timestamp = 0;
var timestamp = 0;
if (globalInfo) {
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i) && globalInfo[i].timestamp > timestamp) {
if (this.isThisGameFile(i) && globalInfo[i].timestamp > timestamp) {
timestamp = globalInfo[i].timestamp;
timestamp = globalInfo[i].timestamp;
savefileId = i;
savefileId = i;
}
}
}
}
}
}
return savefileId;
return savefileId;
};
};
DataManager.loadAllSavefileImages = function() {
DataManager.loadAllSavefileImages = function() {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
if (globalInfo) {
if (globalInfo) {
for (var i = 1; i < globalInfo.length; i++) {
for (var i = 1; i < globalInfo.length; i++) {
if (this.isThisGameFile(i)) {
if (this.isThisGameFile(i)) {
var info = globalInfo[i];
var info = globalInfo[i];
this.loadSavefileImages(info);
this.loadSavefileImages(info);
}
}
}
}
}
}
};
};
DataManager.loadSavefileImages = function(info) {
DataManager.loadSavefileImages = function(info) {
if (info.characters) {
if (info.characters) {
for (var i = 0; i < info.characters.length; i++) {
for (var i = 0; i < info.characters.length; i++) {
ImageManager.reserveCharacter(info.characters[i][0]);
ImageManager.reserveCharacter(info.characters[i][0]);
}
}
}
}
if (info.faces) {
if (info.faces) {
for (var j = 0; j < info.faces.length; j++) {
for (var j = 0; j < info.faces.length; j++) {
ImageManager.reserveFace(info.faces[j][0]);
ImageManager.reserveFace(info.faces[j][0]);
}
}
}
}
};
};
DataManager.maxSavefiles = function() {
DataManager.maxSavefiles = function() {
return 20;
return 20;
};
};
DataManager.saveGame = function(savefileId) {
DataManager.saveGame = function(savefileId) {
try {
try {
StorageManager.backup(savefileId);
StorageManager.backup(savefileId);
return this.saveGameWithoutRescue(savefileId);
return this.saveGameWithoutRescue(savefileId);
} catch (e) {
} catch (e) {
console.error(e);
console.error(e);
try {
try {
StorageManager.remove(savefileId);
StorageManager.remove(savefileId);
StorageManager.restoreBackup(savefileId);
StorageManager.restoreBackup(savefileId);
} catch (e2) {
} catch (e2) {
}
}
return false;
return false;
}
}
};
};
DataManager.loadGame = function(savefileId) {
DataManager.loadGame = function(savefileId) {
try {
try {
return this.loadGameWithoutRescue(savefileId);
return this.loadGameWithoutRescue(savefileId);
} catch (e) {
} catch (e) {
console.error(e);
console.error(e);
return false;
return false;
}
}
};
};
DataManager.loadSavefileInfo = function(savefileId) {
DataManager.loadSavefileInfo = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
return (globalInfo && globalInfo[savefileId]) ? globalInfo[savefileId] : null;
return (globalInfo && globalInfo[savefileId]) ? globalInfo[savefileId] : null;
};
};
DataManager.lastAccessedSavefileId = function() {
DataManager.lastAccessedSavefileId = function() {
return this._lastAccessedId;
return this._lastAccessedId;
};
};
DataManager.saveGameWithoutRescue = function(savefileId) {
DataManager.saveGameWithoutRescue = function(savefileId) {
var json = JsonEx.stringify(this.makeSaveContents());
var json = JsonEx.stringify(this.makeSaveContents());
if (json.length >= 200000) {
if (json.length >= 200000) {
console.warn('Save data too big!');
console.warn('Save data too big!');
}
}
StorageManager.save(savefileId, json);
StorageManager.save(savefileId, json);
this._lastAccessedId = savefileId;
this._lastAccessedId = savefileId;
var globalInfo = this.loadGlobalInfo() || [];
var globalInfo = this.loadGlobalInfo() || [];
globalInfo[savefileId] = this.makeSavefileInfo();
globalInfo[savefileId] = this.makeSavefileInfo();
this.saveGlobalInfo(globalInfo);
this.saveGlobalInfo(globalInfo);
return true;
return true;
};
};
DataManager.loadGameWithoutRescue = function(savefileId) {
DataManager.loadGameWithoutRescue = function(savefileId) {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
if (this.isThisGameFile(savefileId)) {
if (this.isThisGameFile(savefileId)) {
var json = StorageManager.load(savefileId);
var json = StorageManager.load(savefileId);
this.createGameObjects();
this.createGameObjects();
this.extractSaveContents(JsonEx.parse(json));
this.extractSaveContents(JsonEx.parse(json));
this._lastAccessedId = savefileId;
this._lastAccessedId = savefileId;
return true;
return true;
} else {
} else {
return false;
return false;
}
}
};
};
DataManager.selectSavefileForNewGame = function() {
DataManager.selectSavefileForNewGame = function() {
var globalInfo = this.loadGlobalInfo();
var globalInfo = this.loadGlobalInfo();
this._lastAccessedId = 1;
this._lastAccessedId = 1;
if (globalInfo) {
if (globalInfo) {
var numSavefiles = Math.max(0, globalInfo.length - 1);
var numSavefiles = Math.max(0, globalInfo.length - 1);
if (numSavefiles < this.maxSavefiles()) {
if (numSavefiles < this.maxSavefiles()) {
this._lastAccessedId = numSavefiles + 1;
this._lastAccessedId = numSavefiles + 1;
} else {
} else {
var timestamp = Number.MAX_VALUE;
var timestamp = Number.MAX_VALUE;
for (var i = 1; i < globalInfo.length; i++) {
for (var i = 1; i < globalInfo.length; i++) {
if (!globalInfo[i]) {
if (!globalInfo[i]) {
this._lastAccessedId = i;
this._lastAccessedId = i;
break;
break;
}
}
if (globalInfo[i].timestamp < timestamp) {
if (globalInfo[i].timestamp < timestamp) {
timestamp = globalInfo[i].timestamp;
timestamp = globalInfo[i].timestamp;
this._lastAccessedId = i;
this._lastAccessedId = i;
}
}
}
}
}
}
}
}
};
};
DataManager.makeSavefileInfo = function() {
DataManager.makeSavefileInfo = function() {
var info = {};
var info = {};
info.globalId = this._globalId;
info.globalId = this._globalId;
info.title = $dataSystem.gameTitle;
info.title = $dataSystem.gameTitle;
info.characters = $gameParty.charactersForSavefile();
info.characters = $gameParty.charactersForSavefile();
info.faces = $gameParty.facesForSavefile();
info.faces = $gameParty.facesForSavefile();
info.playtime = $gameSystem.playtimeText();
info.playtime = $gameSystem.playtimeText();
info.timestamp = Date.now();
info.timestamp = Date.now();
return info;
return info;
};
};
DataManager.makeSaveContents = function() {
DataManager.makeSaveContents = function() {
// A save data does not contain $gameTemp, $gameMessage, and $gameTroop.
// A save data does not contain $gameTemp, $gameMessage, and $gameTroop.
var contents = {};
var contents = {};
contents.system = $gameSystem;
contents.system = $gameSystem;
contents.screen = $gameScreen;
contents.screen = $gameScreen;
contents.timer = $gameTimer;
contents.timer = $gameTimer;
contents.switches = $gameSwitches;
contents.switches = $gameSwitches;
contents.variables = $gameVariables;
contents.variables = $gameVariables;
contents.selfSwitches = $gameSelfSwitches;
contents.selfSwitches = $gameSelfSwitches;
contents.actors = $gameActors;
contents.actors = $gameActors;
contents.party = $gameParty;
contents.party = $gameParty;
contents.map = $gameMap;
contents.map = $gameMap;
contents.player = $gamePlayer;
contents.player = $gamePlayer;
return contents;
return contents;
};
};
DataManager.extractSaveContents = function(contents) {
DataManager.extractSaveContents = function(contents) {
$gameSystem = contents.system;
$gameSystem = contents.system;
$gameScreen = contents.screen;
$gameScreen = contents.screen;
$gameTimer = contents.timer;
$gameTimer = contents.timer;
$gameSwitches = contents.switches;
$gameSwitches = contents.switches;
$gameVariables = contents.variables;
$gameVariables = contents.variables;
$gameSelfSwitches = contents.selfSwitches;
$gameSelfSwitches = contents.selfSwitches;
$gameActors = contents.actors;
$gameActors = contents.actors;
$gameParty = contents.party;
$gameParty = contents.party;
$gameMap = contents.map;
$gameMap = contents.map;
$gamePlayer = contents.player;
$gamePlayer = contents.player;
};
};
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// ConfigManager
// ConfigManager
//
//
// The static class that manages the configuration data.
// The static class that manages the configuration data.
function ConfigManager() {
function ConfigManager() {
throw new Error('This is a static class');
throw new Error('This is a static class');
}
}
ConfigManager.alwaysDash = false;
ConfigManager.alwaysDash = false;
ConfigManager.commandRemember = false;
ConfigManager.commandRemember = false;
Object.defineProperty(ConfigManager, 'bgmVolume', {
Object.defineProperty(ConfigManager, 'bgmVolume', {
get: function() {
get: function() {
return AudioManager._bgmVolume;
return AudioManager._bgmVolume;
},
},
set: function(value) {
set: function(value) {
AudioManager.bgmVolume = value;
AudioManager.bgmVolume = value;
},
},
configurable: true
configurable: true
});
});
Object.defineProperty(ConfigManager, 'bgsVolume', {
Object.defineProperty(ConfigManager, 'bgsVolume', {
get: function() {
get: function() {
return AudioManager.bgsVolume;
return AudioManager.bgsVolume;
},
},
set: function(value) {
set: function(value) {
AudioManager.bgsVolume = value;
AudioManager.bgsVolume = value;
},
},
configurable: true
configurable: true
});
});
Object.defineProperty(ConfigManager, 'meVolume', {
Object.defineProperty(ConfigManager, 'meVolume', {
get: function() {
get: function() {
return AudioManager.meVolume;
return AudioManager.meVolume;
},
},
set: function(value) {
set: function(value) {
AudioManager.meVolume = value;
AudioManager.meVolume = value;
},
},
configurable: true
configurable: true
});
});
Object.defineProperty(ConfigManager, 'seVolume', {
Object.defineProperty(ConfigManager, 'seVolume', {
get: function() {
get: function() {
return AudioManager.seVolume;
return AudioManager.seVolume;
},
},
set: function(value) {
set: function(value) {
AudioManager.seVolume = value;
AudioManager.seVolume = value;
},
},
configurable: true
configurable: true
});
});
ConfigManager.load = function() {
ConfigManager.load = function() {
var json;
var json;
var config = {};
var config = {};
try {
try {
json = StorageManager.load(-1);
json = StorageManager.load(-1);
} catch (e) {
} catch (e) {
console.error(e);
console.error(e);
}
}
if (json) {
if (json) {
config = JSON.parse(json);
config = JSON.parse(json);
}
}
this.applyData(config);
this.applyData(config);
};
};
ConfigManager.save = function() {
ConfigManager.save = function() {
StorageManager.save(-1, JSON.stringify(this.makeData()));
StorageManager.save(-1, JSON.stringify(this.makeData()));
};
};
ConfigManager.makeData = function() {
ConfigManager.makeData = function() {
var config = {};
var config = {};
config.alwaysDash = this.alwaysDash;
config.alwaysDash = this.alwaysDash;
config.commandRemember = this.commandRemember;
config.commandRemember = this.commandRemember;
config.bgmVolume = this.bgmVolume;
config.bgmVolume = this.bgmVolume;
config.bgsVolume = this.bgsVolume;
config.bgsVolume = this.bgsVolume;
config.meVolume = this.meVolume;
config.meVolume = this.meVolume;
config.seVolume = this.seVolume;
config.seVolume = this.seVolume;
return config;
return config;
};
};
ConfigManager.applyData = function(config) {
ConfigManager.applyData = function(config) {
this.alwaysDash = this.readFlag(config, 'alwaysDash');
this.alwaysDash = this.readFlag(config, 'alwaysDash');
this.commandRemember = this.readFlag(config, 'commandRemember');
this.commandRemember = this.readFlag(config, 'commandRemember');
this.bgmVolume = this.readVolume(config, 'bgmVolume');
this.bgmVolume = this.readVolume(config, 'bgmVolume');
this.bgsVolume = this.readVolume(config, 'bgsVolume');
this.bgsVolume = this.readVolume(config, 'bgsVolume');
this.meVolume = this.readVolume(config, 'meVolume');
this.meVolume = this.readVolume(config, 'meVolume');
this.seVolume = this.readVolume(config, 'seVolume');
this.seVolume = this.readVolume(config, 'seVolume');
};
};
ConfigManager.readFlag = function(config, name) {
ConfigManager.readFlag = function(config, name) {
return !!config[name];
return !!config[name];
};
};
ConfigManager.readVolume = function(config, name) {
ConfigManager.readVolume = function(config, name) {
var value = config[name];
var value = config[name];
if (value !== undefined) {
if (value !== undefined) {
return Number(value).clamp(0, 100);
return Number(value).clamp(0, 100);
} else {
} else {
return 100;
return 100;
}
}
};
};
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// StorageManager
// StorageManager
//
//
// The static class that manages storage for saving game data.
// The static class that manages storage for saving game data.
function StorageManager() {
function StorageManager() {
throw new Error('This is a static class');
throw new Error('This is a static class');
}
}
StorageManager.save = function(savefileId, json) {
StorageManager.save = function(savefileId, json) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
this.saveToLocalFile(savefileId, json);
this.saveToLocalFile(savefileId, json);
} else {
} else {
this.saveToWebStorage(savefileId, json);
this.saveToWebStorage(savefileId, json);
}
}
};
};
StorageManager.load = function(savefileId) {
StorageManager.load = function(savefileId) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
return this.loadFromLocalFile(savefileId);
return this.loadFromLocalFile(savefileId);
} else {
} else {
return this.loadFromWebStorage(savefileId);
return this.loadFromWebStorage(savefileId);
}
}
};
};
StorageManager.exists = function(savefileId) {
StorageManager.exists = function(savefileId) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
return this.localFileExists(savefileId);
return this.localFileExists(savefileId);
} else {
} else {
return this.webStorageExists(savefileId);
return this.webStorageExists(savefileId);
}
}
};
};
StorageManager.remove = function(savefileId) {
StorageManager.remove = function(savefileId) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
this.removeLocalFile(savefileId);
this.removeLocalFile(savefileId);
} else {
} else {
this.removeWebStorage(savefileId);
this.removeWebStorage(savefileId);
}
}
};
};
StorageManager.backup = function(savefileId) {
StorageManager.backup = function(savefileId) {
if (this.exists(savefileId)) {
if (this.exists(savefileId)) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
var data = this.loadFromLocalFile(savefileId);
var data = this.loadFromLocalFile(savefileId);
var compressed = LZString.compressToBase64(data);
var compressed = LZString.compressToBase64(data);
var fs = require('fs');
var fs = require('fs');
var dirPath = this.localFileDirectoryPath();
var dirPath = this.localFileDirectoryPath();
var filePath = this.localFilePath(savefileId) + ".bak";
var filePath = this.localFilePath(savefileId) + ".bak";
if (!fs.existsSync(dirPath)) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
fs.mkdirSync(dirPath);
}
}
fs.writeFileSync(filePath, compressed);
fs.writeFileSync(filePath, compressed);
} else {
} else {
var data = this.loadFromWebStorage(savefileId);
var data = this.loadFromWebStorage(savefileId);
var compressed = LZString.compressToBase64(data);
var compressed = LZString.compressToBase64(data);
var key = this.webStorageKey(savefileId) + "bak";
var key = this.webStorageKey(savefileId) + "bak";
Copiar
Copiado
Copiar
Copiado
local
St
orage.setItem(key, compressed);
local
f
orage.setItem(key, compressed);
}
}
}
}
};
};
StorageManager.backupExists = function(savefileId) {
StorageManager.backupExists = function(savefileId) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
return this.localFileBackupExists(savefileId);
return this.localFileBackupExists(savefileId);
} else {
} else {
return this.webStorageBackupExists(savefileId);
return this.webStorageBackupExists(savefileId);
}
}
};
};
StorageManager.cleanBackup = function(savefileId) {
StorageManager.cleanBackup = function(savefileId) {
Copiar
Copiado
Copiar
Copiado
if (this.backupExists(savefileId)) {
if (this.backupExists(savefileId)) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
var fs = require('fs');
var fs = require('fs');
var dirPath = this.localFileDirectoryPath();
var dirPath = this.localFileDirectoryPath();
var filePath = this.localFilePath(savefileId);
var filePath = this.localFilePath(savefileId);
fs.unlinkSync(filePath + ".bak");
fs.unlinkSync(filePath + ".bak");
Copiar
Copiado
Copiar
Copiado
} else {
} else {
var key = this.webStorageKey(savefileId);
var key = this.webStorageKey(savefileId);
local
St
orage.removeItem(key + "bak");
local
f
orage.removeItem(key + "bak");
}
}
}
}
};
};
StorageManager.restoreBackup = function(savefileId) {
StorageManager.restoreBackup = function(savefileId) {
if (this.backupExists(savefileId)) {
if (this.backupExists(savefileId)) {
if (this.isLocalMode()) {
if (this.isLocalMode()) {
var data = this.loadFromLocalBackupFile(savefileId);
var data = this.loadFromLocalBackupFile(savefileId);
var compressed = LZString.compressToBase64(data);
var compressed = LZString.compressToBase64(data);
var fs = require('fs');
var fs = require('fs');
var dirPath = this.localFileDirectoryPath();
var dirPath = this.localFileDirectoryPath();
var filePath = this.localFilePath(savefileId);
var filePath = this.localFilePath(savefileId);
if (!fs.existsSync(dirPath)) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
fs.mkdirSync(dirPath);
}
}
fs.writeFileSync(filePath, compressed);
fs.writeFileSync(filePath, compressed);
fs.unlinkSync(filePath + ".bak");
fs.unlinkSync(filePath + ".bak");
} else {
} else {
var data = this.loadFromWebStorageBackup(savefileId);
var data = this.loadFromWebStorageBackup(savefileId);
var compressed = LZString.compressToBase64(data);
var compressed = LZString.compressToBase64(data);
var key = this.webStorageKey(savefileId);
var key = this.webStorageKey(savefileId);
Copiar
Copiado
Copiar
Copiado
local
St
orage.setItem(key, compressed);
await
local
f
orage.setItem(key, compressed);
local
St
orage.removeItem(key + "bak");
local
f
orage.removeItem(key + "bak");
}
}
}
}
};
};
StorageManager.isLocalMode = function() {
StorageManager.isLocalMode = function() {
return Utils.isNwjs();
return Utils.isNwjs();
};
};
StorageManager.saveToLocalFile = function(savefileId, json) {
StorageManager.saveToLocalFile = function(savefileId, json) {
var data = LZString.compressToBase64(json);
var data = LZString.compressToBase64(json);
var fs = require('fs');
var fs = require('fs');
var dirPath = this.localFileDirectoryPath();
var dirPath = this.localFileDirectoryPath();
var filePath = this.localFilePath(savefileId);
var filePath = this.localFilePath(savefileId);
if (!fs.existsSync(dirPath)) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
fs.mkdirSync(dirPath);
}
}
fs.writeFileSync(filePath, data);
fs.writeFileSync(filePath, data);
};
};
StorageManager.loadFromLocalFile = function(savefileId) {
StorageManager.loadFromLocalFile = function(savefileId) {
var data = null;
var data = null;
var fs = require('fs');
var fs = require('fs');
var filePath = this.localFilePath(savefileId);
var filePath = this.localFilePath(savefileId);
if (fs.existsSync(filePath)) {
if (fs.existsSync(filePath)) {
data = fs.readFileSync(filePath, { encoding: 'utf8' });
data = fs.readFileSync(filePath, { encoding: 'utf8' });
}
}
return LZString.decompressFromBase64(data);
return LZString.decompressFromBase64(data);
};
};
StorageManager.loadFromLocalBackupFile = function(savefileId) {
StorageManager.loadFromLocalBackupFile = function(savefileId) {
var data = null;
var data = null;
var fs = require('fs');
var fs = require('fs');
var filePath = this.localFilePath(savefileId) + ".bak";
var filePath = this.localFilePath(savefileId) + ".bak";
if (fs.existsSync(filePath)) {
if (fs.existsSync(filePath)) {
data = fs.readFileSync(filePath, { encoding: 'utf8' });
data = fs.readFileSync(filePath, { encoding: 'utf8' });
}
}
return LZString.decompressFromBase64(data);
return LZString.decompressFromBase64(data);
};
};
StorageManager.localFileBackupExists = function(savefileId) {
StorageManager.localFileBackupExists = function(savefileId) {
var fs = require('fs');
var fs = require('fs');
return fs.existsSync(this.localFilePath(savefileId) + ".bak");
return fs.existsSync(this.localFilePath(savefileId) + ".bak");
};
};
StorageManager.localFileExists = function(savefileId) {
StorageManager.localFileExists = function(savefileId) {
var fs = require('fs');
var fs = require('fs');
return fs.existsSync(this.localFilePath(savefileId));
return fs.existsSync(this.localFilePath(savefileId));
};
};
StorageManager.removeLocalFile = function(savefileId) {
StorageManager.removeLocalFile = function(savefileId) {
var fs = require('fs');
var fs = require('fs');
var filePath = this.localFilePath(savefileId);
var filePath = this.localFilePath(savefileId);
if (fs.existsSync(filePath)) {
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
fs.unlinkSync(filePath);
}
}
};
};
StorageManager.saveToWebStorage = function(savefileId, json) {
StorageManager.saveToWebStorage = function(savefileId, json) {
var key = this.webStorageKey(savefileId);
var key = this.webStorageKey(savefileId);
var data = LZString.compressToBase64(json);
var data = LZString.compressToBase64(json);
Copiar
Copiado
Copiar
Copiado
local
St
orage.setItem(key, data);
local
f
orage.setItem(key, data);
};
};
StorageManager.loadFromWebStorage = function(savefileId) {
StorageManager.loadFromWebStorage = function(savefileId) {
var key = this.webStorageKey(savefileId);
var key = this.webStorageKey(savefileId);
Copiar
Copiado
Copiar
Copiado
var data =
local
St
orage.getItem(key);
var data =
await
local
f
orage.getItem(key);
return LZString.decompressFromBase64(data);
return LZString.decompressFromBase64(data);
};
};
StorageManager.loadFromWebStorageBackup = function(savefileId) {
StorageManager.loadFromWebStorageBackup = function(savefileId) {
var key = this.webStorageKey(savefileId) + "bak";
var key = this.webStorageKey(savefileId) + "bak";
Copiar
Copiado
Copiar
Copiado
var data =
local
St
orage.getItem(key);
var data =
await
local
f
orage.getItem(key);
return LZString.decompressFromBase64(data);
return LZString.decompressFromBase64(data);
};
};
StorageManager.webStorageBackupExists = function(savefileId) {
StorageManager.webStorageBackupExists = function(savefileId) {
var key = this.webStorageKey(savefileId) + "bak";
var key = this.webStorageKey(savefileId) + "bak";
Copiar
Copiado
Copiar
Copiado
return
!!local
St
orage.getItem(key);
return
await
!!local
f
orage.getItem(key);
};
};
StorageManager.webStorageExists = function(savefileId) {
StorageManager.webStorageExists = function(savefileId) {
var key = this.webStorageKey(savefileId);
var key = this.webStorageKey(savefileId);
Copiar
Copiado
Copiar
Copiado
return
!!local
St
orage.getItem(key);
return
await
!!local
f
orage.getItem(key);
};
};
StorageManager.removeWebStorage = function(savefileId) {
StorageManager.removeWebStorage = function(savefileId) {
var key = this.webStorageKey(savefileId);
var key = this.webStorageKey(savefileId);
Copiar
Copiado
Copiar
Copiado
local
St
orage.removeItem(key);
local
f
orage.removeItem(key);
};
};
StorageManager.localFileDirectoryPath = function() {
StorageManager.localFileDirectoryPath = function() {
var path = require('path');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
var base = path.dirname(process.mainModule.filename);
return path.join(base, 'save/');
return path.join(base, 'save/');
};
};
StorageManager.localFilePath = function(savefileId) {
StorageManager.localFilePath = function(savefileId) {
var name;
var name;
if (savefileId < 0) {
if (savefileId < 0) {
name = 'config.rpgsave';
name = 'config.rpgsave';
} else if (savefileId === 0) {
} else if (savefileId === 0) {
name = 'global.rpgsave';
name = 'global.rpgsave';
} else {
} else {
name = 'file%1.rpgsave'.format(savefileId);
name = 'file%1.rpgsave'.format(savefileId);
}
}
return this.localFileDirectoryPath() + name;
return this.localFileDirectoryPath() + name;
};
};
StorageManager.webStorageKey = function(savefileId) {
StorageManager.webStorageKey = function(savefileId) {
if (savefileId < 0) {
if (savefileId < 0) {
return 'RPG Config';
return 'RPG Config';
} else if (savefileId === 0) {
} else if (savefileId === 0) {
return 'RPG Global';
return 'RPG Global';
} else {
} else {
return 'RPG File%1'.format(savefileId);
return 'RPG File%1'.format(savefileId);
}
}
};
};
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// ImageManager
// ImageManager
//
//
// The static class that loads images, creates bitmap objects and retains them.
// The static class that loads images, creates bitmap objects and retains them.
function ImageManager() {
function ImageManager() {
throw new Error('This is a static class');
throw new Error('This is a static class');
}
}
ImageManager.cache = new CacheMap(ImageManager);
ImageManager.cache = new CacheMap(ImageManager);
ImageManager._imageCache = new ImageCache();
ImageManager._imageCache = new ImageCache();
ImageManager._requestQueue = new RequestQueue();
ImageManager._requestQueue = new RequestQueue();
ImageManager._systemReservationId = Utils.generateRuntimeId();
ImageManager._systemReservationId = Utils.generateRuntimeId();
ImageManager._generateCacheKey = function(path, hue){
ImageManager._generateCacheKey = function(path, hue){
return path + ':' + hue;
return path + ':' + hue;
};
};
ImageManager.loadAnimation = function(filename, hue) {
ImageManager.loadAnimation = function(filename, hue) {
return this.loadBitmap('img/animations/', filename, hue, true);
return this.loadBitmap('img/animations/', filename, hue, true);
};
};
ImageManager.loadBattleback1 = function(filename, hue) {
ImageManager.loadBattleback1 = function(filename, hue) {
return this.loadBitmap('img/battlebacks1/', filename, hue, true);
return this.loadBitmap('img/battlebacks1/', filename, hue, true);
};
};
ImageManager.loadBattleback2 = function(filename, hue) {
ImageManager.loadBattleback2 = function(filename, hue) {
return this.loadBitmap('img/battlebacks2/', filename, hue, true);
return this.loadBitmap('img/battlebacks2/', filename, hue, true);
};
};
ImageManager.loadEnemy = function(filename, hue) {
ImageManager.loadEnemy = function(filename, hue) {
return this.loadBitmap('img/enemies/', filename, hue, true);
return this.loadBitmap('img/enemies/', filename, hue, true);
};
};
ImageManager.loadCharacter = function(filename, hue) {
ImageManager.loadCharacter = function(filename, hue) {
return this.loadBitmap('img/characters/', filename, hue, false);
return this.loadBitmap('img/characters/', filename, hue, false);
};
};
ImageManager.loadFace = function(filename, hue) {
ImageManager.loadFace = function(filename, hue) {
return this.loadBitmap('img/faces/', filename, hue, true);
return this.loadBitmap('img/faces/', filename, hue, true);
};
};
ImageManager.loadParallax = function(filename, hue) {
ImageManager.loadParallax = function(filename, hue) {
return this.loadBitmap('img/parallaxes/', filename, hue, true);
return this.loadBitmap('img/parallaxes/', filename, hue, true);
};
};
ImageManager.loadPicture = function(filename, hue) {
ImageManager.loadPicture = function(filename, hue) {
Copiar
Copiado
Copiar
Copiado
return this.loadBitmap('img/pictures/',
filename, hue, true);
return this.loadBitmap('img/pictures/',
f
};
ImageManager.loadSvActor = function(filename, hue) {
return this.loadBitmap('img/sv_actors/', filename, hue, false);
};
ImageManager.loadSvEnemy = function(filename, hue) {
return this.loadBitmap('img/sv_enemies/', filename, hue, true);
};
ImageManager.loadSystem = function(filename, hue) {
return this.loadBitmap('img/system/', filename, hue, false);
};
ImageManager.loadTiles
Diferenças salvas
Texto original
Abrir arquivo
//============================================================================= // rpg_managers.js v1.5.2 //============================================================================= //----------------------------------------------------------------------------- // 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 = this._mapLoader || 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._mapLoader = ResourceHandler.createLoader('data/' + filename, this.loadDataFile.bind(this, '$dataMap', filename)); 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); } } } if (object === $dataSystem) { Decrypter.hasEncryptedImages = !!object.hasEncryptedImages; Decrypter.hasEncryptedAudio = !!object.hasEncryptedAudio; Scene_Boot.loadSystemImages(); } }; 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.reserveCharacter(info.characters[i][0]); } } if (info.faces) { for (var j = 0; j < info.faces.length; j++) { ImageManager.reserveFace(info.faces[j][0]); } } }; DataManager.maxSavefiles = function() { return 20; }; DataManager.saveGame = function(savefileId) { try { StorageManager.backup(savefileId); return this.saveGameWithoutRescue(savefileId); } catch (e) { console.error(e); try { StorageManager.remove(savefileId); StorageManager.restoreBackup(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; }; 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; }; //----------------------------------------------------------------------------- // ConfigManager // // The static class that manages the configuration data. function ConfigManager() { throw new Error('This is a static class'); } ConfigManager.alwaysDash = false; ConfigManager.commandRemember = false; Object.defineProperty(ConfigManager, 'bgmVolume', { get: function() { return AudioManager._bgmVolume; }, set: function(value) { AudioManager.bgmVolume = value; }, configurable: true }); Object.defineProperty(ConfigManager, 'bgsVolume', { get: function() { return AudioManager.bgsVolume; }, set: function(value) { AudioManager.bgsVolume = value; }, configurable: true }); Object.defineProperty(ConfigManager, 'meVolume', { get: function() { return AudioManager.meVolume; }, set: function(value) { AudioManager.meVolume = value; }, configurable: true }); Object.defineProperty(ConfigManager, 'seVolume', { get: function() { return AudioManager.seVolume; }, set: function(value) { AudioManager.seVolume = value; }, configurable: true }); ConfigManager.load = function() { var json; var config = {}; try { json = StorageManager.load(-1); } catch (e) { console.error(e); } if (json) { config = JSON.parse(json); } this.applyData(config); }; ConfigManager.save = function() { StorageManager.save(-1, JSON.stringify(this.makeData())); }; ConfigManager.makeData = function() { var config = {}; config.alwaysDash = this.alwaysDash; config.commandRemember = this.commandRemember; config.bgmVolume = this.bgmVolume; config.bgsVolume = this.bgsVolume; config.meVolume = this.meVolume; config.seVolume = this.seVolume; return config; }; ConfigManager.applyData = function(config) { this.alwaysDash = this.readFlag(config, 'alwaysDash'); this.commandRemember = this.readFlag(config, 'commandRemember'); this.bgmVolume = this.readVolume(config, 'bgmVolume'); this.bgsVolume = this.readVolume(config, 'bgsVolume'); this.meVolume = this.readVolume(config, 'meVolume'); this.seVolume = this.readVolume(config, 'seVolume'); }; ConfigManager.readFlag = function(config, name) { return !!config[name]; }; ConfigManager.readVolume = function(config, name) { var value = config[name]; if (value !== undefined) { return Number(value).clamp(0, 100); } else { return 100; } }; //----------------------------------------------------------------------------- // StorageManager // // The static class that manages storage for saving game data. function StorageManager() { throw new Error('This is a static class'); } StorageManager.save = function(savefileId, json) { if (this.isLocalMode()) { this.saveToLocalFile(savefileId, json); } else { this.saveToWebStorage(savefileId, json); } }; StorageManager.load = function(savefileId) { if (this.isLocalMode()) { return this.loadFromLocalFile(savefileId); } else { return this.loadFromWebStorage(savefileId); } }; StorageManager.exists = function(savefileId) { if (this.isLocalMode()) { return this.localFileExists(savefileId); } else { return this.webStorageExists(savefileId); } }; StorageManager.remove = function(savefileId) { if (this.isLocalMode()) { this.removeLocalFile(savefileId); } else { this.removeWebStorage(savefileId); } }; StorageManager.backup = function(savefileId) { if (this.exists(savefileId)) { if (this.isLocalMode()) { var data = this.loadFromLocalFile(savefileId); var compressed = LZString.compressToBase64(data); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId) + ".bak"; if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, compressed); } else { var data = this.loadFromWebStorage(savefileId); var compressed = LZString.compressToBase64(data); var key = this.webStorageKey(savefileId) + "bak"; localStorage.setItem(key, compressed); } } }; StorageManager.backupExists = function(savefileId) { if (this.isLocalMode()) { return this.localFileBackupExists(savefileId); } else { return this.webStorageBackupExists(savefileId); } }; StorageManager.cleanBackup = function(savefileId) { if (this.backupExists(savefileId)) { if (this.isLocalMode()) { var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); fs.unlinkSync(filePath + ".bak"); } else { var key = this.webStorageKey(savefileId); localStorage.removeItem(key + "bak"); } } }; StorageManager.restoreBackup = function(savefileId) { if (this.backupExists(savefileId)) { if (this.isLocalMode()) { var data = this.loadFromLocalBackupFile(savefileId); var compressed = LZString.compressToBase64(data); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, compressed); fs.unlinkSync(filePath + ".bak"); } else { var data = this.loadFromWebStorageBackup(savefileId); var compressed = LZString.compressToBase64(data); var key = this.webStorageKey(savefileId); localStorage.setItem(key, compressed); localStorage.removeItem(key + "bak"); } } }; StorageManager.isLocalMode = function() { return Utils.isNwjs(); }; StorageManager.saveToLocalFile = function(savefileId, json) { var data = LZString.compressToBase64(json); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, data); }; StorageManager.loadFromLocalFile = function(savefileId) { var data = null; var fs = require('fs'); var filePath = this.localFilePath(savefileId); if (fs.existsSync(filePath)) { data = fs.readFileSync(filePath, { encoding: 'utf8' }); } return LZString.decompressFromBase64(data); }; StorageManager.loadFromLocalBackupFile = function(savefileId) { var data = null; var fs = require('fs'); var filePath = this.localFilePath(savefileId) + ".bak"; if (fs.existsSync(filePath)) { data = fs.readFileSync(filePath, { encoding: 'utf8' }); } return LZString.decompressFromBase64(data); }; StorageManager.localFileBackupExists = function(savefileId) { var fs = require('fs'); return fs.existsSync(this.localFilePath(savefileId) + ".bak"); }; StorageManager.localFileExists = function(savefileId) { var fs = require('fs'); return fs.existsSync(this.localFilePath(savefileId)); }; StorageManager.removeLocalFile = function(savefileId) { var fs = require('fs'); var filePath = this.localFilePath(savefileId); if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); } }; StorageManager.saveToWebStorage = function(savefileId, json) { var key = this.webStorageKey(savefileId); var data = LZString.compressToBase64(json); localStorage.setItem(key, data); }; StorageManager.loadFromWebStorage = function(savefileId) { var key = this.webStorageKey(savefileId); var data = localStorage.getItem(key); return LZString.decompressFromBase64(data); }; StorageManager.loadFromWebStorageBackup = function(savefileId) { var key = this.webStorageKey(savefileId) + "bak"; var data = localStorage.getItem(key); return LZString.decompressFromBase64(data); }; StorageManager.webStorageBackupExists = function(savefileId) { var key = this.webStorageKey(savefileId) + "bak"; return !!localStorage.getItem(key); }; StorageManager.webStorageExists = function(savefileId) { var key = this.webStorageKey(savefileId); return !!localStorage.getItem(key); }; StorageManager.removeWebStorage = function(savefileId) { var key = this.webStorageKey(savefileId); localStorage.removeItem(key); }; StorageManager.localFileDirectoryPath = function() { var path = require('path'); var base = path.dirname(process.mainModule.filename); return path.join(base, 'save/'); }; StorageManager.localFilePath = function(savefileId) { var name; if (savefileId < 0) { name = 'config.rpgsave'; } else if (savefileId === 0) { name = 'global.rpgsave'; } else { name = 'file%1.rpgsave'.format(savefileId); } return this.localFileDirectoryPath() + name; }; StorageManager.webStorageKey = function(savefileId) { if (savefileId < 0) { return 'RPG Config'; } else if (savefileId === 0) { return 'RPG Global'; } else { return 'RPG File%1'.format(savefileId); } }; //----------------------------------------------------------------------------- // ImageManager // // The static class that loads images, creates bitmap objects and retains them. function ImageManager() { throw new Error('This is a static class'); } ImageManager.cache = new CacheMap(ImageManager); ImageManager._imageCache = new ImageCache(); ImageManager._requestQueue = new RequestQueue(); ImageManager._systemReservationId = Utils.generateRuntimeId(); ImageManager._generateCacheKey = function(path, hue){ return path + ':' + hue; }; ImageManager.loadAnimation = function(filename, hue) { return this.loadBitmap('img/animations/', filename, hue, true); }; ImageManager.loadBattleback1 = function(filename, hue) { return this.loadBitmap('img/battlebacks1/', filename, hue, true); }; ImageManager.loadBattleback2 = function(filename, hue) { return this.loadBitmap('img/battlebacks2/', filename, hue, true); }; ImageManager.loadEnemy = function(filename, hue) { return this.loadBitmap('img/enemies/', filename, hue, true); }; ImageManager.loadCharacter = function(filename, hue) { return this.loadBitmap('img/characters/', filename, hue, false); }; ImageManager.loadFace = function(filename, hue) { return this.loadBitmap('img/faces/', filename, hue, true); }; ImageManager.loadParallax = function(filename, hue) { return this.loadBitmap('img/parallaxes/', filename, hue, true); }; ImageManager.loadPicture = function(filename, hue) { return this.loadBitmap('img/pictures/', filename, hue, true); }; ImageManager.loadSvActor = function(filename, hue) { return this.loadBitmap('img/sv_actors/', filename, hue, false); }; ImageManager.loadSvEnemy = function(filename, hue) { return this.loadBitmap('img/sv_enemies/', filename, hue, true); }; ImageManager.loadSystem = function(filename, hue) { return this.loadBitmap('img/system/', filename, hue, false); }; ImageManager.loadTileset = function(filename, hue) { return this.loadBitmap('img/tilesets/', filename, hue, false); }; ImageManager.loadTitle1 = function(filename, hue) { return this.loadBitmap('img/titles1/', filename, hue, true); }; ImageManager.loadTitle2 = function(filename, hue) { return this.loadBitmap('img/titles2/', filename, hue, true); }; ImageManager.loadBitmap = function(folder, filename, hue, smooth) { if (filename) { var path = folder + encodeURIComponent(filename) + '.png'; var bitmap = this.loadNormalBitmap(path, hue || 0); bitmap.smooth = smooth; return bitmap; } else { return this.loadEmptyBitmap(); } }; ImageManager.loadEmptyBitmap = function() { var empty = this._imageCache.get('empty'); if(!empty){ empty = new Bitmap(); this._imageCache.add('empty', empty); this._imageCache.reserve('empty', empty, this._systemReservationId); } return empty; }; ImageManager.loadNormalBitmap = function(path, hue) { var key = this._generateCacheKey(path, hue); var bitmap = this._imageCache.get(key); if (!bitmap) { bitmap = Bitmap.load(path); bitmap.addLoadListener(function() { bitmap.rotateHue(hue); }); this._imageCache.add(key, bitmap); }else if(!bitmap.isReady()){ bitmap.decode(); } return bitmap; }; ImageManager.clear = function() { this._imageCache = new ImageCache(); }; ImageManager.isReady = function() { return this._imageCache.isReady(); }; ImageManager.isObjectCharacter = function(filename) { var sign = filename.match(/^[\!\$]+/); return sign && sign[0].contains('!'); }; ImageManager.isBigCharacter = function(filename) { var sign = filename.match(/^[\!\$]+/); return sign && sign[0].contains('$'); }; ImageManager.isZeroParallax = function(filename) { return filename.charAt(0) === '!'; }; ImageManager.reserveAnimation = function(filename, hue, reservationId) { return this.reserveBitmap('img/animations/', filename, hue, true, reservationId); }; ImageManager.reserveBattleback1 = function(filename, hue, reservationId) { return this.reserveBitmap('img/battlebacks1/', filename, hue, true, reservationId); }; ImageManager.reserveBattleback2 = function(filename, hue, reservationId) { return this.reserveBitmap('img/battlebacks2/', filename, hue, true, reservationId); }; ImageManager.reserveEnemy = function(filename, hue, reservationId) { return this.reserveBitmap('img/enemies/', filename, hue, true, reservationId); }; ImageManager.reserveCharacter = function(filename, hue, reservationId) { return this.reserveBitmap('img/characters/', filename, hue, false, reservationId); }; ImageManager.reserveFace = function(filename, hue, reservationId) { return this.reserveBitmap('img/faces/', filename, hue, true, reservationId); }; ImageManager.reserveParallax = function(filename, hue, reservationId) { return this.reserveBitmap('img/parallaxes/', filename, hue, true, reservationId); }; ImageManager.reservePicture = function(filename, hue, reservationId) { return this.reserveBitmap('img/pictures/', filename, hue, true, reservationId); }; ImageManager.reserveSvActor = function(filename, hue, reservationId) { return this.reserveBitmap('img/sv_actors/', filename, hue, false, reservationId); }; ImageManager.reserveSvEnemy = function(filename, hue, reservationId) { return this.reserveBitmap('img/sv_enemies/', filename, hue, true, reservationId); }; ImageManager.reserveSystem = function(filename, hue, reservationId) { return this.reserveBitmap('img/system/', filename, hue, false, reservationId || this._systemReservationId); }; ImageManager.reserveTileset = function(filename, hue, reservationId) { return this.reserveBitmap('img/tilesets/', filename, hue, false, reservationId); }; ImageManager.reserveTitle1 = function(filename, hue, reservationId) { return this.reserveBitmap('img/titles1/', filename, hue, true, reservationId); }; ImageManager.reserveTitle2 = function(filename, hue, reservationId) { return this.reserveBitmap('img/titles2/', filename, hue, true, reservationId); }; ImageManager.reserveBitmap = function(folder, filename, hue, smooth, reservationId) { if (filename) { var path = folder + encodeURIComponent(filename) + '.png'; var bitmap = this.reserveNormalBitmap(path, hue || 0, reservationId || this._defaultReservationId); bitmap.smooth = smooth; return bitmap; } else { return this.loadEmptyBitmap(); } }; ImageManager.reserveNormalBitmap = function(path, hue, reservationId){ var bitmap = this.loadNormalBitmap(path, hue); this._imageCache.reserve(this._generateCacheKey(path, hue), bitmap, reservationId); return bitmap; }; ImageManager.releaseReservation = function(reservationId){ this._imageCache.releaseReservation(reservationId); }; ImageManager.setDefaultReservationId = function(reservationId){ this._defaultReservationId = reservationId; }; ImageManager.requestAnimation = function(filename, hue) { return this.requestBitmap('img/animations/', filename, hue, true); }; ImageManager.requestBattleback1 = function(filename, hue) { return this.requestBitmap('img/battlebacks1/', filename, hue, true); }; ImageManager.requestBattleback2 = function(filename, hue) { return this.requestBitmap('img/battlebacks2/', filename, hue, true); }; ImageManager.requestEnemy = function(filename, hue) { return this.requestBitmap('img/enemies/', filename, hue, true); }; ImageManager.requestCharacter = function(filename, hue) { return this.requestBitmap('img/characters/', filename, hue, false); }; ImageManager.requestFace = function(filename, hue) { return this.requestBitmap('img/faces/', filename, hue, true); }; ImageManager.requestParallax = function(filename, hue) { return this.requestBitmap('img/parallaxes/', filename, hue, true); }; ImageManager.requestPicture = function(filename, hue) { return this.requestBitmap('img/pictures/', filename, hue, true); }; ImageManager.requestSvActor = function(filename, hue) { return this.requestBitmap('img/sv_actors/', filename, hue, false); }; ImageManager.requestSvEnemy = function(filename, hue) { return this.requestBitmap('img/sv_enemies/', filename, hue, true); }; ImageManager.requestSystem = function(filename, hue) { return this.requestBitmap('img/system/', filename, hue, false); }; ImageManager.requestTileset = function(filename, hue) { return this.requestBitmap('img/tilesets/', filename, hue, false); }; ImageManager.requestTitle1 = function(filename, hue) { return this.requestBitmap('img/titles1/', filename, hue, true); }; ImageManager.requestTitle2 = function(filename, hue) { return this.requestBitmap('img/titles2/', filename, hue, true); }; ImageManager.requestBitmap = function(folder, filename, hue, smooth) { if (filename) { var path = folder + encodeURIComponent(filename) + '.png'; var bitmap = this.requestNormalBitmap(path, hue || 0); bitmap.smooth = smooth; return bitmap; } else { return this.loadEmptyBitmap(); } }; ImageManager.requestNormalBitmap = function(path, hue){ var key = this._generateCacheKey(path, hue); var bitmap = this._imageCache.get(key); if(!bitmap){ bitmap = Bitmap.request(path); bitmap.addLoadListener(function(){ bitmap.rotateHue(hue); }); this._imageCache.add(key, bitmap); this._requestQueue.enqueue(key, bitmap); }else{ this._requestQueue.raisePriority(key); } return bitmap; }; ImageManager.update = function(){ this._requestQueue.update(); }; ImageManager.clearRequest = function(){ this._requestQueue.clear(); }; //----------------------------------------------------------------------------- // AudioManager // // The static class that handles BGM, BGS, ME and SE. function AudioManager() { throw new Error('This is a static class'); } AudioManager._masterVolume = 1; // (min: 0, max: 1) AudioManager._bgmVolume = 100; AudioManager._bgsVolume = 100; AudioManager._meVolume = 100; AudioManager._seVolume = 100; AudioManager._currentBgm = null; AudioManager._currentBgs = null; AudioManager._bgmBuffer = null; AudioManager._bgsBuffer = null; AudioManager._meBuffer = null; AudioManager._seBuffers = []; AudioManager._staticBuffers = []; AudioManager._replayFadeTime = 0.5; AudioManager._path = 'audio/'; AudioManager._blobUrl = null; Object.defineProperty(AudioManager, 'masterVolume', { get: function() { return this._masterVolume; }, set: function(value) { this._masterVolume = value; WebAudio.setMasterVolume(this._masterVolume); Graphics.setVideoVolume(this._masterVolume); }, configurable: true }); Object.defineProperty(AudioManager, 'bgmVolume', { get: function() { return this._bgmVolume; }, set: function(value) { this._bgmVolume = value; this.updateBgmParameters(this._currentBgm); }, configurable: true }); Object.defineProperty(AudioManager, 'bgsVolume', { get: function() { return this._bgsVolume; }, set: function(value) { this._bgsVolume = value; this.updateBgsParameters(this._currentBgs); }, configurable: true }); Object.defineProperty(AudioManager, 'meVolume', { get: function() { return this._meVolume; }, set: function(value) { this._meVolume = value; this.updateMeParameters(this._currentMe); }, configurable: true }); Object.defineProperty(AudioManager, 'seVolume', { get: function() { return this._seVolume; }, set: function(value) { this._seVolume = value; }, configurable: true }); AudioManager.playBgm = function(bgm, pos) { if (this.isCurrentBgm(bgm)) { this.updateBgmParameters(bgm); } else { this.stopBgm(); if (bgm.name) { if(Decrypter.hasEncryptedAudio && this.shouldUseHtml5Audio()){ this.playEncryptedBgm(bgm, pos); } else { this._bgmBuffer = this.createBuffer('bgm', bgm.name); this.updateBgmParameters(bgm); if (!this._meBuffer) { this._bgmBuffer.play(true, pos || 0); } } } } this.updateCurrentBgm(bgm, pos); }; AudioManager.playEncryptedBgm = function(bgm, pos) { var ext = this.audioFileExt(); var url = this._path + 'bgm/' + encodeURIComponent(bgm.name) + ext; url = Decrypter.extToEncryptExt(url); Decrypter.decryptHTML5Audio(url, bgm, pos); }; AudioManager.createDecryptBuffer = function(url, bgm, pos){ this._blobUrl = url; this._bgmBuffer = this.createBuffer('bgm', bgm.name); this.updateBgmParameters(bgm); if (!this._meBuffer) { this._bgmBuffer.play(true, pos || 0); } this.updateCurrentBgm(bgm, pos); }; AudioManager.replayBgm = function(bgm) { if (this.isCurrentBgm(bgm)) { this.updateBgmParameters(bgm); } else { this.playBgm(bgm, bgm.pos); if (this._bgmBuffer) { this._bgmBuffer.fadeIn(this._replayFadeTime); } } }; AudioManager.isCurrentBgm = function(bgm) { return (this._currentBgm && this._bgmBuffer && this._currentBgm.name === bgm.name); }; AudioManager.updateBgmParameters = function(bgm) { this.updateBufferParameters(this._bgmBuffer, this._bgmVolume, bgm); }; AudioManager.updateCurrentBgm = function(bgm, pos) { this._currentBgm = { name: bgm.name, volume: bgm.volume, pitch: bgm.pitch, pan: bgm.pan, pos: pos }; }; AudioManager.stopBgm = function() { if (this._bgmBuffer) { this._bgmBuffer.stop(); this._bgmBuffer = null; this._currentBgm = null; } }; AudioManager.fadeOutBgm = function(duration) { if (this._bgmBuffer && this._currentBgm) { this._bgmBuffer.fadeOut(duration); this._currentBgm = null; } }; AudioManager.fadeInBgm = function(duration) { if (this._bgmBuffer && this._currentBgm) { this._bgmBuffer.fadeIn(duration); } }; AudioManager.playBgs = function(bgs, pos) { if (this.isCurrentBgs(bgs)) { this.updateBgsParameters(bgs); } else { this.stopBgs(); if (bgs.name) { this._bgsBuffer = this.createBuffer('bgs', bgs.name); this.updateBgsParameters(bgs); this._bgsBuffer.play(true, pos || 0); } } this.updateCurrentBgs(bgs, pos); }; AudioManager.replayBgs = function(bgs) { if (this.isCurrentBgs(bgs)) { this.updateBgsParameters(bgs); } else { this.playBgs(bgs, bgs.pos); if (this._bgsBuffer) { this._bgsBuffer.fadeIn(this._replayFadeTime); } } }; AudioManager.isCurrentBgs = function(bgs) { return (this._currentBgs && this._bgsBuffer && this._currentBgs.name === bgs.name); }; AudioManager.updateBgsParameters = function(bgs) { this.updateBufferParameters(this._bgsBuffer, this._bgsVolume, bgs); }; AudioManager.updateCurrentBgs = function(bgs, pos) { this._currentBgs = { name: bgs.name, volume: bgs.volume, pitch: bgs.pitch, pan: bgs.pan, pos: pos }; }; AudioManager.stopBgs = function() { if (this._bgsBuffer) { this._bgsBuffer.stop(); this._bgsBuffer = null; this._currentBgs = null; } }; AudioManager.fadeOutBgs = function(duration) { if (this._bgsBuffer && this._currentBgs) { this._bgsBuffer.fadeOut(duration); this._currentBgs = null; } }; AudioManager.fadeInBgs = function(duration) { if (this._bgsBuffer && this._currentBgs) { this._bgsBuffer.fadeIn(duration); } }; AudioManager.playMe = function(me) { this.stopMe(); if (me.name) { if (this._bgmBuffer && this._currentBgm) { this._currentBgm.pos = this._bgmBuffer.seek(); this._bgmBuffer.stop(); } this._meBuffer = this.createBuffer('me', me.name); this.updateMeParameters(me); this._meBuffer.play(false); this._meBuffer.addStopListener(this.stopMe.bind(this)); } }; AudioManager.updateMeParameters = function(me) { this.updateBufferParameters(this._meBuffer, this._meVolume, me); }; AudioManager.fadeOutMe = function(duration) { if (this._meBuffer) { this._meBuffer.fadeOut(duration); } }; AudioManager.stopMe = function() { if (this._meBuffer) { this._meBuffer.stop(); this._meBuffer = null; if (this._bgmBuffer && this._currentBgm && !this._bgmBuffer.isPlaying()) { this._bgmBuffer.play(true, this._currentBgm.pos); this._bgmBuffer.fadeIn(this._replayFadeTime); } } }; AudioManager.playSe = function(se) { if (se.name) { this._seBuffers = this._seBuffers.filter(function(audio) { return audio.isPlaying(); }); var buffer = this.createBuffer('se', se.name); this.updateSeParameters(buffer, se); buffer.play(false); this._seBuffers.push(buffer); } }; AudioManager.updateSeParameters = function(buffer, se) { this.updateBufferParameters(buffer, this._seVolume, se); }; AudioManager.stopSe = function() { this._seBuffers.forEach(function(buffer) { buffer.stop(); }); this._seBuffers = []; }; AudioManager.playStaticSe = function(se) { if (se.name) { this.loadStaticSe(se); for (var i = 0; i < this._staticBuffers.length; i++) { var buffer = this._staticBuffers[i]; if (buffer._reservedSeName === se.name) { buffer.stop(); this.updateSeParameters(buffer, se); buffer.play(false); break; } } } }; AudioManager.loadStaticSe = function(se) { if (se.name && !this.isStaticSe(se)) { var buffer = this.createBuffer('se', se.name); buffer._reservedSeName = se.name; this._staticBuffers.push(buffer); if (this.shouldUseHtml5Audio()) { Html5Audio.setStaticSe(buffer._url); } } }; AudioManager.isStaticSe = function(se) { for (var i = 0; i < this._staticBuffers.length; i++) { var buffer = this._staticBuffers[i]; if (buffer._reservedSeName === se.name) { return true; } } return false; }; AudioManager.stopAll = function() { this.stopMe(); this.stopBgm(); this.stopBgs(); this.stopSe(); }; AudioManager.saveBgm = function() { if (this._currentBgm) { var bgm = this._currentBgm; return { name: bgm.name, volume: bgm.volume, pitch: bgm.pitch, pan: bgm.pan, pos: this._bgmBuffer ? this._bgmBuffer.seek() : 0 }; } else { return this.makeEmptyAudioObject(); } }; AudioManager.saveBgs = function() { if (this._currentBgs) { var bgs = this._currentBgs; return { name: bgs.name, volume: bgs.volume, pitch: bgs.pitch, pan: bgs.pan, pos: this._bgsBuffer ? this._bgsBuffer.seek() : 0 }; } else { return this.makeEmptyAudioObject(); } }; AudioManager.makeEmptyAudioObject = function() { return { name: '', volume: 0, pitch: 0 }; }; AudioManager.createBuffer = function(folder, name) { var ext = this.audioFileExt(); var url = this._path + folder + '/' + encodeURIComponent(name) + ext; if (this.shouldUseHtml5Audio() && folder === 'bgm') { if(this._blobUrl) Html5Audio.setup(this._blobUrl); else Html5Audio.setup(url); return Html5Audio; } else { return new WebAudio(url); } }; AudioManager.updateBufferParameters = function(buffer, configVolume, audio) { if (buffer && audio) { buffer.volume = configVolume * (audio.volume || 0) / 10000; buffer.pitch = (audio.pitch || 0) / 100; buffer.pan = (audio.pan || 0) / 100; } }; AudioManager.audioFileExt = function() { if (WebAudio.canPlayOgg() && !Utils.isMobileDevice()) { return '.ogg'; } else { return '.m4a'; } }; AudioManager.shouldUseHtml5Audio = function() { // The only case where we wanted html5audio was android/ no encrypt // Atsuma-ru asked to force webaudio there too, so just return false for ALL // return Utils.isAndroidChrome() && !Decrypter.hasEncryptedAudio; return false; }; AudioManager.checkErrors = function() { this.checkWebAudioError(this._bgmBuffer); this.checkWebAudioError(this._bgsBuffer); this.checkWebAudioError(this._meBuffer); this._seBuffers.forEach(function(buffer) { this.checkWebAudioError(buffer); }.bind(this)); this._staticBuffers.forEach(function(buffer) { this.checkWebAudioError(buffer); }.bind(this)); }; AudioManager.checkWebAudioError = function(webAudio) { if (webAudio && webAudio.isError()) { throw new Error('Failed to load: ' + webAudio.url); } }; //----------------------------------------------------------------------------- // SoundManager // // The static class that plays sound effects defined in the database. function SoundManager() { throw new Error('This is a static class'); } SoundManager.preloadImportantSounds = function() { this.loadSystemSound(0); this.loadSystemSound(1); this.loadSystemSound(2); this.loadSystemSound(3); }; SoundManager.loadSystemSound = function(n) { if ($dataSystem) { AudioManager.loadStaticSe($dataSystem.sounds[n]); } }; SoundManager.playSystemSound = function(n) { if ($dataSystem) { AudioManager.playStaticSe($dataSystem.sounds[n]); } }; SoundManager.playCursor = function() { this.playSystemSound(0); }; SoundManager.playOk = function() { this.playSystemSound(1); }; SoundManager.playCancel = function() { this.playSystemSound(2); }; SoundManager.playBuzzer = function() { this.playSystemSound(3); }; SoundManager.playEquip = function() { this.playSystemSound(4); }; SoundManager.playSave = function() { this.playSystemSound(5); }; SoundManager.playLoad = function() { this.playSystemSound(6); }; SoundManager.playBattleStart = function() { this.playSystemSound(7); }; SoundManager.playEscape = function() { this.playSystemSound(8); }; SoundManager.playEnemyAttack = function() { this.playSystemSound(9); }; SoundManager.playEnemyDamage = function() { this.playSystemSound(10); }; SoundManager.playEnemyCollapse = function() { this.playSystemSound(11); }; SoundManager.playBossCollapse1 = function() { this.playSystemSound(12); }; SoundManager.playBossCollapse2 = function() { this.playSystemSound(13); }; SoundManager.playActorDamage = function() { this.playSystemSound(14); }; SoundManager.playActorCollapse = function() { this.playSystemSound(15); }; SoundManager.playRecovery = function() { this.playSystemSound(16); }; SoundManager.playMiss = function() { this.playSystemSound(17); }; SoundManager.playEvasion = function() { this.playSystemSound(18); }; SoundManager.playMagicEvasion = function() { this.playSystemSound(19); }; SoundManager.playReflection = function() { this.playSystemSound(20); }; SoundManager.playShop = function() { this.playSystemSound(21); }; SoundManager.playUseItem = function() { this.playSystemSound(22); }; SoundManager.playUseSkill = function() { this.playSystemSound(23); }; //----------------------------------------------------------------------------- // TextManager // // The static class that handles terms and messages. function TextManager() { throw new Error('This is a static class'); } TextManager.basic = function(basicId) { return $dataSystem.terms.basic[basicId] || ''; }; TextManager.param = function(paramId) { return $dataSystem.terms.params[paramId] || ''; }; TextManager.command = function(commandId) { return $dataSystem.terms.commands[commandId] || ''; }; TextManager.message = function(messageId) { return $dataSystem.terms.messages[messageId] || ''; }; TextManager.getter = function(method, param) { return { get: function() { return this[method](param); }, configurable: true }; }; Object.defineProperty(TextManager, 'currencyUnit', { get: function() { return $dataSystem.currencyUnit; }, configurable: true }); Object.defineProperties(TextManager, { level : TextManager.getter('basic', 0), levelA : TextManager.getter('basic', 1), hp : TextManager.getter('basic', 2), hpA : TextManager.getter('basic', 3), mp : TextManager.getter('basic', 4), mpA : TextManager.getter('basic', 5), tp : TextManager.getter('basic', 6), tpA : TextManager.getter('basic', 7), exp : TextManager.getter('basic', 8), expA : TextManager.getter('basic', 9), fight : TextManager.getter('command', 0), escape : TextManager.getter('command', 1), attack : TextManager.getter('command', 2), guard : TextManager.getter('command', 3), item : TextManager.getter('command', 4), skill : TextManager.getter('command', 5), equip : TextManager.getter('command', 6), status : TextManager.getter('command', 7), formation : TextManager.getter('command', 8), save : TextManager.getter('command', 9), gameEnd : TextManager.getter('command', 10), options : TextManager.getter('command', 11), weapon : TextManager.getter('command', 12), armor : TextManager.getter('command', 13), keyItem : TextManager.getter('command', 14), equip2 : TextManager.getter('command', 15), optimize : TextManager.getter('command', 16), clear : TextManager.getter('command', 17), newGame : TextManager.getter('command', 18), continue_ : TextManager.getter('command', 19), toTitle : TextManager.getter('command', 21), cancel : TextManager.getter('command', 22), buy : TextManager.getter('command', 24), sell : TextManager.getter('command', 25), alwaysDash : TextManager.getter('message', 'alwaysDash'), commandRemember : TextManager.getter('message', 'commandRemember'), bgmVolume : TextManager.getter('message', 'bgmVolume'), bgsVolume : TextManager.getter('message', 'bgsVolume'), meVolume : TextManager.getter('message', 'meVolume'), seVolume : TextManager.getter('message', 'seVolume'), possession : TextManager.getter('message', 'possession'), expTotal : TextManager.getter('message', 'expTotal'), expNext : TextManager.getter('message', 'expNext'), saveMessage : TextManager.getter('message', 'saveMessage'), loadMessage : TextManager.getter('message', 'loadMessage'), file : TextManager.getter('message', 'file'), partyName : TextManager.getter('message', 'partyName'), emerge : TextManager.getter('message', 'emerge'), preemptive : TextManager.getter('message', 'preemptive'), surprise : TextManager.getter('message', 'surprise'), escapeStart : TextManager.getter('message', 'escapeStart'), escapeFailure : TextManager.getter('message', 'escapeFailure'), victory : TextManager.getter('message', 'victory'), defeat : TextManager.getter('message', 'defeat'), obtainExp : TextManager.getter('message', 'obtainExp'), obtainGold : TextManager.getter('message', 'obtainGold'), obtainItem : TextManager.getter('message', 'obtainItem'), levelUp : TextManager.getter('message', 'levelUp'), obtainSkill : TextManager.getter('message', 'obtainSkill'), useItem : TextManager.getter('message', 'useItem'), criticalToEnemy : TextManager.getter('message', 'criticalToEnemy'), criticalToActor : TextManager.getter('message', 'criticalToActor'), actorDamage : TextManager.getter('message', 'actorDamage'), actorRecovery : TextManager.getter('message', 'actorRecovery'), actorGain : TextManager.getter('message', 'actorGain'), actorLoss : TextManager.getter('message', 'actorLoss'), actorDrain : TextManager.getter('message', 'actorDrain'), actorNoDamage : TextManager.getter('message', 'actorNoDamage'), actorNoHit : TextManager.getter('message', 'actorNoHit'), enemyDamage : TextManager.getter('message', 'enemyDamage'), enemyRecovery : TextManager.getter('message', 'enemyRecovery'), enemyGain : TextManager.getter('message', 'enemyGain'), enemyLoss : TextManager.getter('message', 'enemyLoss'), enemyDrain : TextManager.getter('message', 'enemyDrain'), enemyNoDamage : TextManager.getter('message', 'enemyNoDamage'), enemyNoHit : TextManager.getter('message', 'enemyNoHit'), evasion : TextManager.getter('message', 'evasion'), magicEvasion : TextManager.getter('message', 'magicEvasion'), magicReflection : TextManager.getter('message', 'magicReflection'), counterAttack : TextManager.getter('message', 'counterAttack'), substitute : TextManager.getter('message', 'substitute'), buffAdd : TextManager.getter('message', 'buffAdd'), debuffAdd : TextManager.getter('message', 'debuffAdd'), buffRemove : TextManager.getter('message', 'buffRemove'), actionFailure : TextManager.getter('message', 'actionFailure'), }); //----------------------------------------------------------------------------- // SceneManager // // The static class that manages scene transitions. function SceneManager() { throw new Error('This is a static class'); } /* * Gets the current time in ms without on iOS Safari. * @private */ SceneManager._getTimeInMsWithoutMobileSafari = function() { return performance.now(); }; SceneManager._scene = null; SceneManager._nextScene = null; SceneManager._stack = []; SceneManager._stopped = false; SceneManager._sceneStarted = false; SceneManager._exiting = false; SceneManager._previousClass = null; SceneManager._backgroundBitmap = null; SceneManager._screenWidth = 816; SceneManager._screenHeight = 624; SceneManager._boxWidth = 816; SceneManager._boxHeight = 624; SceneManager._deltaTime = 1.0 / 60.0; if (!Utils.isMobileSafari()) SceneManager._currentTime = SceneManager._getTimeInMsWithoutMobileSafari(); SceneManager._accumulator = 0.0; SceneManager.run = function(sceneClass) { try { this.initialize(); this.goto(sceneClass); this.requestUpdate(); } catch (e) { this.catchException(e); } }; SceneManager.initialize = function() { this.initGraphics(); this.checkFileAccess(); this.initAudio(); this.initInput(); this.initNwjs(); this.checkPluginErrors(); this.setupErrorHandlers(); }; SceneManager.initGraphics = function() { var type = this.preferableRendererType(); Graphics.initialize(this._screenWidth, this._screenHeight, type); Graphics.boxWidth = this._boxWidth; Graphics.boxHeight = this._boxHeight; Graphics.setLoadingImage('img/system/Loading.png'); if (Utils.isOptionValid('showfps')) { Graphics.showFps(); } if (type === 'webgl') { this.checkWebGL(); } }; SceneManager.preferableRendererType = function() { if (Utils.isOptionValid('canvas')) { return 'canvas'; } else if (Utils.isOptionValid('webgl')) { return 'webgl'; } else { return 'auto'; } }; SceneManager.shouldUseCanvasRenderer = function() { return Utils.isMobileDevice(); }; SceneManager.checkWebGL = function() { if (!Graphics.hasWebGL()) { throw new Error('Your browser does not support WebGL.'); } }; SceneManager.checkFileAccess = function() { if (!Utils.canReadGameFiles()) { throw new Error('Your browser does not allow to read local files.'); } }; SceneManager.initAudio = function() { var noAudio = Utils.isOptionValid('noaudio'); if (!WebAudio.initialize(noAudio) && !noAudio) { throw new Error('Your browser does not support Web Audio API.'); } }; SceneManager.initInput = function() { Input.initialize(); TouchInput.initialize(); }; SceneManager.initNwjs = function() { if (Utils.isNwjs()) { var gui = require('nw.gui'); var win = gui.Window.get(); if (process.platform === 'darwin' && !win.menu) { var menubar = new gui.Menu({ type: 'menubar' }); var option = { hideEdit: true, hideWindow: true }; menubar.createMacBuiltin('Game', option); win.menu = menubar; } } }; SceneManager.checkPluginErrors = function() { PluginManager.checkErrors(); }; SceneManager.setupErrorHandlers = function() { window.addEventListener('error', this.onError.bind(this)); document.addEventListener('keydown', this.onKeyDown.bind(this)); }; SceneManager.requestUpdate = function() { if (!this._stopped) { requestAnimationFrame(this.update.bind(this)); } }; SceneManager.update = function() { try { this.tickStart(); if (Utils.isMobileSafari()) { this.updateInputData(); } this.updateManagers(); this.updateMain(); this.tickEnd(); } catch (e) { this.catchException(e); } }; SceneManager.terminate = function() { window.close(); }; SceneManager.onError = function(e) { console.error(e.message); console.error(e.filename, e.lineno); try { this.stop(); Graphics.printError('Error', e.message); AudioManager.stopAll(); } catch (e2) { } }; SceneManager.onKeyDown = function(event) { if (!event.ctrlKey && !event.altKey) { switch (event.keyCode) { case 116: // F5 if (Utils.isNwjs()) { location.reload(); } break; case 119: // F8 if (Utils.isNwjs() && Utils.isOptionValid('test')) { require('nw.gui').Window.get().showDevTools(); } break; } } }; SceneManager.catchException = function(e) { if (e instanceof Error) { Graphics.printError(e.name, e.message); console.error(e.stack); } else { Graphics.printError('UnknownError', e); } AudioManager.stopAll(); this.stop(); }; SceneManager.tickStart = function() { Graphics.tickStart(); }; SceneManager.tickEnd = function() { Graphics.tickEnd(); }; SceneManager.updateInputData = function() { Input.update(); TouchInput.update(); }; SceneManager.updateMain = function() { if (Utils.isMobileSafari()) { this.changeScene(); this.updateScene(); } else { var newTime = this._getTimeInMsWithoutMobileSafari(); var fTime = (newTime - this._currentTime) / 1000; if (fTime > 0.25) fTime = 0.25; this._currentTime = newTime; this._accumulator += fTime; while (this._accumulator >= this._deltaTime) { this.updateInputData(); this.changeScene(); this.updateScene(); this._accumulator -= this._deltaTime; } } this.renderScene(); this.requestUpdate(); }; SceneManager.updateManagers = function() { ImageManager.update(); }; SceneManager.changeScene = function() { if (this.isSceneChanging() && !this.isCurrentSceneBusy()) { if (this._scene) { this._scene.terminate(); this._scene.detachReservation(); this._previousClass = this._scene.constructor; } this._scene = this._nextScene; if (this._scene) { this._scene.attachReservation(); this._scene.create(); this._nextScene = null; this._sceneStarted = false; this.onSceneCreate(); } if (this._exiting) { this.terminate(); } } }; SceneManager.updateScene = function() { if (this._scene) { if (!this._sceneStarted && this._scene.isReady()) { this._scene.start(); this._sceneStarted = true; this.onSceneStart(); } if (this.isCurrentSceneStarted()) { this._scene.update(); } } }; SceneManager.renderScene = function() { if (this.isCurrentSceneStarted()) { Graphics.render(this._scene); } else if (this._scene) { this.onSceneLoading(); } }; SceneManager.onSceneCreate = function() { Graphics.startLoading(); }; SceneManager.onSceneStart = function() { Graphics.endLoading(); }; SceneManager.onSceneLoading = function() { Graphics.updateLoading(); }; SceneManager.isSceneChanging = function() { return this._exiting || !!this._nextScene; }; SceneManager.isCurrentSceneBusy = function() { return this._scene && this._scene.isBusy(); }; SceneManager.isCurrentSceneStarted = function() { return this._scene && this._sceneStarted; }; SceneManager.isNextScene = function(sceneClass) { return this._nextScene && this._nextScene.constructor === sceneClass; }; SceneManager.isPreviousScene = function(sceneClass) { return this._previousClass === sceneClass; }; SceneManager.goto = function(sceneClass) { if (sceneClass) { this._nextScene = new sceneClass(); } if (this._scene) { this._scene.stop(); } }; SceneManager.push = function(sceneClass) { this._stack.push(this._scene.constructor); this.goto(sceneClass); }; SceneManager.pop = function() { if (this._stack.length > 0) { this.goto(this._stack.pop()); } else { this.exit(); } }; SceneManager.exit = function() { this.goto(null); this._exiting = true; }; SceneManager.clearStack = function() { this._stack = []; }; SceneManager.stop = function() { this._stopped = true; }; SceneManager.prepareNextScene = function() { this._nextScene.prepare.apply(this._nextScene, arguments); }; SceneManager.snap = function() { return Bitmap.snap(this._scene); }; SceneManager.snapForBackground = function() { this._backgroundBitmap = this.snap(); this._backgroundBitmap.blur(); }; SceneManager.backgroundBitmap = function() { return this._backgroundBitmap; }; SceneManager.resume = function() { this._stopped = false; this.requestUpdate(); if (!Utils.isMobileSafari()) { this._currentTime = this._getTimeInMsWithoutMobileSafari(); this._accumulator = 0; } }; //----------------------------------------------------------------------------- // BattleManager // // The static class that manages battle progress. function BattleManager() { throw new Error('This is a static class'); } BattleManager.setup = function(troopId, canEscape, canLose) { this.initMembers(); this._canEscape = canEscape; this._canLose = canLose; $gameTroop.setup(troopId); $gameScreen.onBattleStart(); this.makeEscapeRatio(); }; BattleManager.initMembers = function() { this._phase = 'init'; this._canEscape = false; this._canLose = false; this._battleTest = false; this._eventCallback = null; this._preemptive = false; this._surprise = false; this._actorIndex = -1; this._actionForcedBattler = null; this._mapBgm = null; this._mapBgs = null; this._actionBattlers = []; this._subject = null; this._action = null; this._targets = []; this._logWindow = null; this._statusWindow = null; this._spriteset = null; this._escapeRatio = 0; this._escaped = false; this._rewards = {}; this._turnForced = false; }; BattleManager.isBattleTest = function() { return this._battleTest; }; BattleManager.setBattleTest = function(battleTest) { this._battleTest = battleTest; }; BattleManager.setEventCallback = function(callback) { this._eventCallback = callback; }; BattleManager.setLogWindow = function(logWindow) { this._logWindow = logWindow; }; BattleManager.setStatusWindow = function(statusWindow) { this._statusWindow = statusWindow; }; BattleManager.setSpriteset = function(spriteset) { this._spriteset = spriteset; }; BattleManager.onEncounter = function() { this._preemptive = (Math.random() < this.ratePreemptive()); this._surprise = (Math.random() < this.rateSurprise() && !this._preemptive); }; BattleManager.ratePreemptive = function() { return $gameParty.ratePreemptive($gameTroop.agility()); }; BattleManager.rateSurprise = function() { return $gameParty.rateSurprise($gameTroop.agility()); }; BattleManager.saveBgmAndBgs = function() { this._mapBgm = AudioManager.saveBgm(); this._mapBgs = AudioManager.saveBgs(); }; BattleManager.playBattleBgm = function() { AudioManager.playBgm($gameSystem.battleBgm()); AudioManager.stopBgs(); }; BattleManager.playVictoryMe = function() { AudioManager.playMe($gameSystem.victoryMe()); }; BattleManager.playDefeatMe = function() { AudioManager.playMe($gameSystem.defeatMe()); }; BattleManager.replayBgmAndBgs = function() { if (this._mapBgm) { AudioManager.replayBgm(this._mapBgm); } else { AudioManager.stopBgm(); } if (this._mapBgs) { AudioManager.replayBgs(this._mapBgs); } }; BattleManager.makeEscapeRatio = function() { this._escapeRatio = 0.5 * $gameParty.agility() / $gameTroop.agility(); }; BattleManager.update = function() { if (!this.isBusy() && !this.updateEvent()) { switch (this._phase) { case 'start': this.startInput(); break; case 'turn': this.updateTurn(); break; case 'action': this.updateAction(); break; case 'turnEnd': this.updateTurnEnd(); break; case 'battleEnd': this.updateBattleEnd(); break; } } }; BattleManager.updateEvent = function() { switch (this._phase) { case 'start': case 'turn': case 'turnEnd': if (this.isActionForced()) { this.processForcedAction(); return true; } else { return this.updateEventMain(); } } return this.checkAbort(); }; BattleManager.updateEventMain = function() { $gameTroop.updateInterpreter(); $gameParty.requestMotionRefresh(); if ($gameTroop.isEventRunning() || this.checkBattleEnd()) { return true; } $gameTroop.setupBattleEvent(); if ($gameTroop.isEventRunning() || SceneManager.isSceneChanging()) { return true; } return false; }; BattleManager.isBusy = function() { return ($gameMessage.isBusy() || this._spriteset.isBusy() || this._logWindow.isBusy()); }; BattleManager.isInputting = function() { return this._phase === 'input'; }; BattleManager.isInTurn = function() { return this._phase === 'turn'; }; BattleManager.isTurnEnd = function() { return this._phase === 'turnEnd'; }; BattleManager.isAborting = function() { return this._phase === 'aborting'; }; BattleManager.isBattleEnd = function() { return this._phase === 'battleEnd'; }; BattleManager.canEscape = function() { return this._canEscape; }; BattleManager.canLose = function() { return this._canLose; }; BattleManager.isEscaped = function() { return this._escaped; }; BattleManager.actor = function() { return this._actorIndex >= 0 ? $gameParty.members()[this._actorIndex] : null; }; BattleManager.clearActor = function() { this.changeActor(-1, ''); }; BattleManager.changeActor = function(newActorIndex, lastActorActionState) { var lastActor = this.actor(); this._actorIndex = newActorIndex; var newActor = this.actor(); if (lastActor) { lastActor.setActionState(lastActorActionState); } if (newActor) { newActor.setActionState('inputting'); } }; BattleManager.startBattle = function() { this._phase = 'start'; $gameSystem.onBattleStart(); $gameParty.onBattleStart(); $gameTroop.onBattleStart(); this.displayStartMessages(); }; BattleManager.displayStartMessages = function() { $gameTroop.enemyNames().forEach(function(name) { $gameMessage.add(TextManager.emerge.format(name)); }); if (this._preemptive) { $gameMessage.add(TextManager.preemptive.format($gameParty.name())); } else if (this._surprise) { $gameMessage.add(TextManager.surprise.format($gameParty.name())); } }; BattleManager.startInput = function() { this._phase = 'input'; $gameParty.makeActions(); $gameTroop.makeActions(); this.clearActor(); if (this._surprise || !$gameParty.canInput()) { this.startTurn(); } }; BattleManager.inputtingAction = function() { return this.actor() ? this.actor().inputtingAction() : null; }; BattleManager.selectNextCommand = function() { do { if (!this.actor() || !this.actor().selectNextCommand()) { this.changeActor(this._actorIndex + 1, 'waiting'); if (this._actorIndex >= $gameParty.size()) { this.startTurn(); break; } } } while (!this.actor().canInput()); }; BattleManager.selectPreviousCommand = function() { do { if (!this.actor() || !this.actor().selectPreviousCommand()) { this.changeActor(this._actorIndex - 1, 'undecided'); if (this._actorIndex < 0) { return; } } } while (!this.actor().canInput()); }; BattleManager.refreshStatus = function() { this._statusWindow.refresh(); }; BattleManager.startTurn = function() { this._phase = 'turn'; this.clearActor(); $gameTroop.increaseTurn(); this.makeActionOrders(); $gameParty.requestMotionRefresh(); this._logWindow.startTurn(); }; BattleManager.updateTurn = function() { $gameParty.requestMotionRefresh(); if (!this._subject) { this._subject = this.getNextSubject(); } if (this._subject) { this.processTurn(); } else { this.endTurn(); } }; BattleManager.processTurn = function() { var subject = this._subject; var action = subject.currentAction(); if (action) { action.prepare(); if (action.isValid()) { this.startAction(); } subject.removeCurrentAction(); } else { subject.onAllActionsEnd(); this.refreshStatus(); this._logWindow.displayAutoAffectedStatus(subject); this._logWindow.displayCurrentState(subject); this._logWindow.displayRegeneration(subject); this._subject = this.getNextSubject(); } }; BattleManager.endTurn = function() { this._phase = 'turnEnd'; this._preemptive = false; this._surprise = false; this.allBattleMembers().forEach(function(battler) { battler.onTurnEnd(); this.refreshStatus(); this._logWindow.displayAutoAffectedStatus(battler); this._logWindow.displayRegeneration(battler); }, this); if (this.isForcedTurn()) { this._turnForced = false; } }; BattleManager.isForcedTurn = function () { return this._turnForced; }; BattleManager.updateTurnEnd = function() { this.startInput(); }; BattleManager.getNextSubject = function() { for (;;) { var battler = this._actionBattlers.shift(); if (!battler) { return null; } if (battler.isBattleMember() && battler.isAlive()) { return battler; } } }; BattleManager.allBattleMembers = function() { return $gameParty.members().concat($gameTroop.members()); }; BattleManager.makeActionOrders = function() { var battlers = []; if (!this._surprise) { battlers = battlers.concat($gameParty.members()); } if (!this._preemptive) { battlers = battlers.concat($gameTroop.members()); } battlers.forEach(function(battler) { battler.makeSpeed(); }); battlers.sort(function(a, b) { return b.speed() - a.speed(); }); this._actionBattlers = battlers; }; BattleManager.startAction = function() { var subject = this._subject; var action = subject.currentAction(); var targets = action.makeTargets(); this._phase = 'action'; this._action = action; this._targets = targets; subject.useItem(action.item()); this._action.applyGlobal(); this.refreshStatus(); this._logWindow.startAction(subject, action, targets); }; BattleManager.updateAction = function() { var target = this._targets.shift(); if (target) { this.invokeAction(this._subject, target); } else { this.endAction(); } }; BattleManager.endAction = function() { this._logWindow.endAction(this._subject); this._phase = 'turn'; }; BattleManager.invokeAction = function(subject, target) { this._logWindow.push('pushBaseLine'); if (Math.random() < this._action.itemCnt(target)) { this.invokeCounterAttack(subject, target); } else if (Math.random() < this._action.itemMrf(target)) { this.invokeMagicReflection(subject, target); } else { this.invokeNormalAction(subject, target); } subject.setLastTarget(target); this._logWindow.push('popBaseLine'); this.refreshStatus(); }; BattleManager.invokeNormalAction = function(subject, target) { var realTarget = this.applySubstitute(target); this._action.apply(realTarget); this._logWindow.displayActionResults(subject, realTarget); }; BattleManager.invokeCounterAttack = function(subject, target) { var action = new Game_Action(target); action.setAttack(); action.apply(subject); this._logWindow.displayCounter(target); this._logWindow.displayActionResults(target, subject); }; BattleManager.invokeMagicReflection = function(subject, target) { this._action._reflectionTarget = target; this._logWindow.displayReflection(target); this._action.apply(subject); this._logWindow.displayActionResults(target, subject); }; BattleManager.applySubstitute = function(target) { if (this.checkSubstitute(target)) { var substitute = target.friendsUnit().substituteBattler(); if (substitute && target !== substitute) { this._logWindow.displaySubstitute(substitute, target); return substitute; } } return target; }; BattleManager.checkSubstitute = function(target) { return target.isDying() && !this._action.isCertainHit(); }; BattleManager.isActionForced = function() { return !!this._actionForcedBattler; }; BattleManager.forceAction = function(battler) { this._actionForcedBattler = battler; var index = this._actionBattlers.indexOf(battler); if (index >= 0) { this._actionBattlers.splice(index, 1); } }; BattleManager.processForcedAction = function() { if (this._actionForcedBattler) { this._turnForced = true; this._subject = this._actionForcedBattler; this._actionForcedBattler = null; this.startAction(); this._subject.removeCurrentAction(); } }; BattleManager.abort = function() { this._phase = 'aborting'; }; BattleManager.checkBattleEnd = function() { if (this._phase) { if (this.checkAbort()) { return true; } else if ($gameParty.isAllDead()) { this.processDefeat(); return true; } else if ($gameTroop.isAllDead()) { this.processVictory(); return true; } } return false; }; BattleManager.checkAbort = function() { if ($gameParty.isEmpty() || this.isAborting()) { SoundManager.playEscape(); this._escaped = true; this.processAbort(); } return false; }; BattleManager.processVictory = function() { $gameParty.removeBattleStates(); $gameParty.performVictory(); this.playVictoryMe(); this.replayBgmAndBgs(); this.makeRewards(); this.displayVictoryMessage(); this.displayRewards(); this.gainRewards(); this.endBattle(0); }; BattleManager.processEscape = function() { $gameParty.performEscape(); SoundManager.playEscape(); var success = this._preemptive ? true : (Math.random() < this._escapeRatio); if (success) { this.displayEscapeSuccessMessage(); this._escaped = true; this.processAbort(); } else { this.displayEscapeFailureMessage(); this._escapeRatio += 0.1; $gameParty.clearActions(); this.startTurn(); } return success; }; BattleManager.processAbort = function() { $gameParty.removeBattleStates(); this.replayBgmAndBgs(); this.endBattle(1); }; BattleManager.processDefeat = function() { this.displayDefeatMessage(); this.playDefeatMe(); if (this._canLose) { this.replayBgmAndBgs(); } else { AudioManager.stopBgm(); } this.endBattle(2); }; BattleManager.endBattle = function(result) { this._phase = 'battleEnd'; if (this._eventCallback) { this._eventCallback(result); } if (result === 0) { $gameSystem.onBattleWin(); } else if (this._escaped) { $gameSystem.onBattleEscape(); } }; BattleManager.updateBattleEnd = function() { if (this.isBattleTest()) { AudioManager.stopBgm(); SceneManager.exit(); } else if (!this._escaped && $gameParty.isAllDead()) { if (this._canLose) { $gameParty.reviveBattleMembers(); SceneManager.pop(); } else { SceneManager.goto(Scene_Gameover); } } else { SceneManager.pop(); } this._phase = null; }; BattleManager.makeRewards = function() { this._rewards = {}; this._rewards.gold = $gameTroop.goldTotal(); this._rewards.exp = $gameTroop.expTotal(); this._rewards.items = $gameTroop.makeDropItems(); }; BattleManager.displayVictoryMessage = function() { $gameMessage.add(TextManager.victory.format($gameParty.name())); }; BattleManager.displayDefeatMessage = function() { $gameMessage.add(TextManager.defeat.format($gameParty.name())); }; BattleManager.displayEscapeSuccessMessage = function() { $gameMessage.add(TextManager.escapeStart.format($gameParty.name())); }; BattleManager.displayEscapeFailureMessage = function() { $gameMessage.add(TextManager.escapeStart.format($gameParty.name())); $gameMessage.add('\\.' + TextManager.escapeFailure); }; BattleManager.displayRewards = function() { this.displayExp(); this.displayGold(); this.displayDropItems(); }; BattleManager.displayExp = function() { var exp = this._rewards.exp; if (exp > 0) { var text = TextManager.obtainExp.format(exp, TextManager.exp); $gameMessage.add('\\.' + text); } }; BattleManager.displayGold = function() { var gold = this._rewards.gold; if (gold > 0) { $gameMessage.add('\\.' + TextManager.obtainGold.format(gold)); } }; BattleManager.displayDropItems = function() { var items = this._rewards.items; if (items.length > 0) { $gameMessage.newPage(); items.forEach(function(item) { $gameMessage.add(TextManager.obtainItem.format(item.name)); }); } }; BattleManager.gainRewards = function() { this.gainExp(); this.gainGold(); this.gainDropItems(); }; BattleManager.gainExp = function() { var exp = this._rewards.exp; $gameParty.allMembers().forEach(function(actor) { actor.gainExp(exp); }); }; BattleManager.gainGold = function() { $gameParty.gainGold(this._rewards.gold); }; BattleManager.gainDropItems = function() { var items = this._rewards.items; items.forEach(function(item) { $gameParty.gainItem(item, 1); }); }; //----------------------------------------------------------------------------- // PluginManager // // The static class that manages the plugins. function PluginManager() { throw new Error('This is a static class'); } PluginManager._path = 'js/plugins/'; PluginManager._scripts = []; PluginManager._errorUrls = []; PluginManager._parameters = {}; PluginManager.setup = function(plugins) { plugins.forEach(function(plugin) { if (plugin.status && !this._scripts.contains(plugin.name)) { this.setParameters(plugin.name, plugin.parameters); this.loadScript(plugin.name + '.js'); this._scripts.push(plugin.name); } }, this); }; PluginManager.checkErrors = function() { var url = this._errorUrls.shift(); if (url) { throw new Error('Failed to load: ' + url); } }; PluginManager.parameters = function(name) { return this._parameters[name.toLowerCase()] || {}; }; PluginManager.setParameters = function(name, parameters) { this._parameters[name.toLowerCase()] = parameters; }; PluginManager.loadScript = function(name) { var url = this._path + name; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.async = false; script.onerror = this.onError.bind(this); script._url = url; document.body.appendChild(script); }; PluginManager.onError = function(e) { this._errorUrls.push(e.target._url); };
Texto alterado
Abrir arquivo
//============================================================================= // rpg_managers.js v1.5.2 //============================================================================= //----------------------------------------------------------------------------- // 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() { // The initialization of DB driver below would ideally be on the main.html page localforage.defineDriver(window.cordovaSQLiteDriver).then(function() { return localforage.setDriver([ window.cordovaSQLiteDriver._driver, localforage.INDEXEDDB, localforage.WEBSQL, localforage.LOCALSTORAGE ]); } 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 = this._mapLoader || 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._mapLoader = ResourceHandler.createLoader('data/' + filename, this.loadDataFile.bind(this, '$dataMap', filename)); 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); } } } if (object === $dataSystem) { Decrypter.hasEncryptedImages = !!object.hasEncryptedImages; Decrypter.hasEncryptedAudio = !!object.hasEncryptedAudio; Scene_Boot.loadSystemImages(); } }; 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.reserveCharacter(info.characters[i][0]); } } if (info.faces) { for (var j = 0; j < info.faces.length; j++) { ImageManager.reserveFace(info.faces[j][0]); } } }; DataManager.maxSavefiles = function() { return 20; }; DataManager.saveGame = function(savefileId) { try { StorageManager.backup(savefileId); return this.saveGameWithoutRescue(savefileId); } catch (e) { console.error(e); try { StorageManager.remove(savefileId); StorageManager.restoreBackup(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; }; 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; }; //----------------------------------------------------------------------------- // ConfigManager // // The static class that manages the configuration data. function ConfigManager() { throw new Error('This is a static class'); } ConfigManager.alwaysDash = false; ConfigManager.commandRemember = false; Object.defineProperty(ConfigManager, 'bgmVolume', { get: function() { return AudioManager._bgmVolume; }, set: function(value) { AudioManager.bgmVolume = value; }, configurable: true }); Object.defineProperty(ConfigManager, 'bgsVolume', { get: function() { return AudioManager.bgsVolume; }, set: function(value) { AudioManager.bgsVolume = value; }, configurable: true }); Object.defineProperty(ConfigManager, 'meVolume', { get: function() { return AudioManager.meVolume; }, set: function(value) { AudioManager.meVolume = value; }, configurable: true }); Object.defineProperty(ConfigManager, 'seVolume', { get: function() { return AudioManager.seVolume; }, set: function(value) { AudioManager.seVolume = value; }, configurable: true }); ConfigManager.load = function() { var json; var config = {}; try { json = StorageManager.load(-1); } catch (e) { console.error(e); } if (json) { config = JSON.parse(json); } this.applyData(config); }; ConfigManager.save = function() { StorageManager.save(-1, JSON.stringify(this.makeData())); }; ConfigManager.makeData = function() { var config = {}; config.alwaysDash = this.alwaysDash; config.commandRemember = this.commandRemember; config.bgmVolume = this.bgmVolume; config.bgsVolume = this.bgsVolume; config.meVolume = this.meVolume; config.seVolume = this.seVolume; return config; }; ConfigManager.applyData = function(config) { this.alwaysDash = this.readFlag(config, 'alwaysDash'); this.commandRemember = this.readFlag(config, 'commandRemember'); this.bgmVolume = this.readVolume(config, 'bgmVolume'); this.bgsVolume = this.readVolume(config, 'bgsVolume'); this.meVolume = this.readVolume(config, 'meVolume'); this.seVolume = this.readVolume(config, 'seVolume'); }; ConfigManager.readFlag = function(config, name) { return !!config[name]; }; ConfigManager.readVolume = function(config, name) { var value = config[name]; if (value !== undefined) { return Number(value).clamp(0, 100); } else { return 100; } }; //----------------------------------------------------------------------------- // StorageManager // // The static class that manages storage for saving game data. function StorageManager() { throw new Error('This is a static class'); } StorageManager.save = function(savefileId, json) { if (this.isLocalMode()) { this.saveToLocalFile(savefileId, json); } else { this.saveToWebStorage(savefileId, json); } }; StorageManager.load = function(savefileId) { if (this.isLocalMode()) { return this.loadFromLocalFile(savefileId); } else { return this.loadFromWebStorage(savefileId); } }; StorageManager.exists = function(savefileId) { if (this.isLocalMode()) { return this.localFileExists(savefileId); } else { return this.webStorageExists(savefileId); } }; StorageManager.remove = function(savefileId) { if (this.isLocalMode()) { this.removeLocalFile(savefileId); } else { this.removeWebStorage(savefileId); } }; StorageManager.backup = function(savefileId) { if (this.exists(savefileId)) { if (this.isLocalMode()) { var data = this.loadFromLocalFile(savefileId); var compressed = LZString.compressToBase64(data); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId) + ".bak"; if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, compressed); } else { var data = this.loadFromWebStorage(savefileId); var compressed = LZString.compressToBase64(data); var key = this.webStorageKey(savefileId) + "bak"; localforage.setItem(key, compressed); } } }; StorageManager.backupExists = function(savefileId) { if (this.isLocalMode()) { return this.localFileBackupExists(savefileId); } else { return this.webStorageBackupExists(savefileId); } }; StorageManager.cleanBackup = function(savefileId) { if (this.backupExists(savefileId)) { if (this.isLocalMode()) { var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); fs.unlinkSync(filePath + ".bak"); } else { var key = this.webStorageKey(savefileId); localforage.removeItem(key + "bak"); } } }; StorageManager.restoreBackup = function(savefileId) { if (this.backupExists(savefileId)) { if (this.isLocalMode()) { var data = this.loadFromLocalBackupFile(savefileId); var compressed = LZString.compressToBase64(data); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, compressed); fs.unlinkSync(filePath + ".bak"); } else { var data = this.loadFromWebStorageBackup(savefileId); var compressed = LZString.compressToBase64(data); var key = this.webStorageKey(savefileId); await localforage.setItem(key, compressed); localforage.removeItem(key + "bak"); } } }; StorageManager.isLocalMode = function() { return Utils.isNwjs(); }; StorageManager.saveToLocalFile = function(savefileId, json) { var data = LZString.compressToBase64(json); var fs = require('fs'); var dirPath = this.localFileDirectoryPath(); var filePath = this.localFilePath(savefileId); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } fs.writeFileSync(filePath, data); }; StorageManager.loadFromLocalFile = function(savefileId) { var data = null; var fs = require('fs'); var filePath = this.localFilePath(savefileId); if (fs.existsSync(filePath)) { data = fs.readFileSync(filePath, { encoding: 'utf8' }); } return LZString.decompressFromBase64(data); }; StorageManager.loadFromLocalBackupFile = function(savefileId) { var data = null; var fs = require('fs'); var filePath = this.localFilePath(savefileId) + ".bak"; if (fs.existsSync(filePath)) { data = fs.readFileSync(filePath, { encoding: 'utf8' }); } return LZString.decompressFromBase64(data); }; StorageManager.localFileBackupExists = function(savefileId) { var fs = require('fs'); return fs.existsSync(this.localFilePath(savefileId) + ".bak"); }; StorageManager.localFileExists = function(savefileId) { var fs = require('fs'); return fs.existsSync(this.localFilePath(savefileId)); }; StorageManager.removeLocalFile = function(savefileId) { var fs = require('fs'); var filePath = this.localFilePath(savefileId); if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); } }; StorageManager.saveToWebStorage = function(savefileId, json) { var key = this.webStorageKey(savefileId); var data = LZString.compressToBase64(json); localforage.setItem(key, data); }; StorageManager.loadFromWebStorage = function(savefileId) { var key = this.webStorageKey(savefileId); var data = await localforage.getItem(key); return LZString.decompressFromBase64(data); }; StorageManager.loadFromWebStorageBackup = function(savefileId) { var key = this.webStorageKey(savefileId) + "bak"; var data = await localforage.getItem(key); return LZString.decompressFromBase64(data); }; StorageManager.webStorageBackupExists = function(savefileId) { var key = this.webStorageKey(savefileId) + "bak"; return await !!localforage.getItem(key); }; StorageManager.webStorageExists = function(savefileId) { var key = this.webStorageKey(savefileId); return await !!localforage.getItem(key); }; StorageManager.removeWebStorage = function(savefileId) { var key = this.webStorageKey(savefileId); localforage.removeItem(key); }; StorageManager.localFileDirectoryPath = function() { var path = require('path'); var base = path.dirname(process.mainModule.filename); return path.join(base, 'save/'); }; StorageManager.localFilePath = function(savefileId) { var name; if (savefileId < 0) { name = 'config.rpgsave'; } else if (savefileId === 0) { name = 'global.rpgsave'; } else { name = 'file%1.rpgsave'.format(savefileId); } return this.localFileDirectoryPath() + name; }; StorageManager.webStorageKey = function(savefileId) { if (savefileId < 0) { return 'RPG Config'; } else if (savefileId === 0) { return 'RPG Global'; } else { return 'RPG File%1'.format(savefileId); } }; //----------------------------------------------------------------------------- // ImageManager // // The static class that loads images, creates bitmap objects and retains them. function ImageManager() { throw new Error('This is a static class'); } ImageManager.cache = new CacheMap(ImageManager); ImageManager._imageCache = new ImageCache(); ImageManager._requestQueue = new RequestQueue(); ImageManager._systemReservationId = Utils.generateRuntimeId(); ImageManager._generateCacheKey = function(path, hue){ return path + ':' + hue; }; ImageManager.loadAnimation = function(filename, hue) { return this.loadBitmap('img/animations/', filename, hue, true); }; ImageManager.loadBattleback1 = function(filename, hue) { return this.loadBitmap('img/battlebacks1/', filename, hue, true); }; ImageManager.loadBattleback2 = function(filename, hue) { return this.loadBitmap('img/battlebacks2/', filename, hue, true); }; ImageManager.loadEnemy = function(filename, hue) { return this.loadBitmap('img/enemies/', filename, hue, true); }; ImageManager.loadCharacter = function(filename, hue) { return this.loadBitmap('img/characters/', filename, hue, false); }; ImageManager.loadFace = function(filename, hue) { return this.loadBitmap('img/faces/', filename, hue, true); }; ImageManager.loadParallax = function(filename, hue) { return this.loadBitmap('img/parallaxes/', filename, hue, true); }; ImageManager.loadPicture = function(filename, hue) { return this.loadBitmap('img/pictures/', filename, hue, true); }; ImageManager.loadSvActor = function(filename, hue) { return this.loadBitmap('img/sv_actors/', filename, hue, false); }; ImageManager.loadSvEnemy = function(filename, hue) { return this.loadBitmap('img/sv_enemies/', filename, hue, true); }; ImageManager.loadSystem = function(filename, hue) { return this.loadBitmap('img/system/', filename, hue, false); }; ImageManager.loadTileset = function(filename, hue) { return this.loadBitmap('img/tilesets/', filename, hue, false); }; ImageManager.loadTitle1 = function(filename, hue) { return this.loadBitmap('img/titles1/', filename, hue, true); }; ImageManager.loadTitle2 = function(filename, hue) { return this.loadBitmap('img/titles2/', filename, hue, true); }; ImageManager.loadBitmap = function(folder, filename, hue, smooth) { if (filename) { var path = folder + encodeURIComponent(filename) + '.png'; var bitmap = this.loadNormalBitmap(path, hue || 0); bitmap.smooth = smooth; return bitmap; } else { return this.loadEmptyBitmap(); } }; ImageManager.loadEmptyBitmap = function() { var empty = this._imageCache.get('empty'); if(!empty){ empty = new Bitmap(); this._imageCache.add('empty', empty); this._imageCache.reserve('empty', empty, this._systemReservationId); } return empty; }; ImageManager.loadNormalBitmap = function(path, hue) { var key = this._generateCacheKey(path, hue); var bitmap = this._imageCache.get(key); if (!bitmap) { bitmap = Bitmap.load(path); bitmap.addLoadListener(function() { bitmap.rotateHue(hue); }); this._imageCache.add(key, bitmap); }else if(!bitmap.isReady()){ bitmap.decode(); } return bitmap; }; ImageManager.clear = function() { this._imageCache = new ImageCache(); }; ImageManager.isReady = function() { return this._imageCache.isReady(); }; ImageManager.isObjectCharacter = function(filename) { var sign = filename.match(/^[\!\$]+/); return sign && sign[0].contains('!'); }; ImageManager.isBigCharacter = function(filename) { var sign = filename.match(/^[\!\$]+/); return sign && sign[0].contains('$'); }; ImageManager.isZeroParallax = function(filename) { return filename.charAt(0) === '!'; }; ImageManager.reserveAnimation = function(filename, hue, reservationId) { return this.reserveBitmap('img/animations/', filename, hue, true, reservationId); }; ImageManager.reserveBattleback1 = function(filename, hue, reservationId) { return this.reserveBitmap('img/battlebacks1/', filename, hue, true, reservationId); }; ImageManager.reserveBattleback2 = function(filename, hue, reservationId) { return this.reserveBitmap('img/battlebacks2/', filename, hue, true, reservationId); }; ImageManager.reserveEnemy = function(filename, hue, reservationId) { return this.reserveBitmap('img/enemies/', filename, hue, true, reservationId); }; ImageManager.reserveCharacter = function(filename, hue, reservationId) { return this.reserveBitmap('img/characters/', filename, hue, false, reservationId); }; ImageManager.reserveFace = function(filename, hue, reservationId) { return this.reserveBitmap('img/faces/', filename, hue, true, reservationId); }; ImageManager.reserveParallax = function(filename, hue, reservationId) { return this.reserveBitmap('img/parallaxes/', filename, hue, true, reservationId); }; ImageManager.reservePicture = function(filename, hue, reservationId) { return this.reserveBitmap('img/pictures/', filename, hue, true, reservationId); }; ImageManager.reserveSvActor = function(filename, hue, reservationId) { return this.reserveBitmap('img/sv_actors/', filename, hue, false, reservationId); }; ImageManager.reserveSvEnemy = function(filename, hue, reservationId) { return this.reserveBitmap('img/sv_enemies/', filename, hue, true, reservationId); }; ImageManager.reserveSystem = function(filename, hue, reservationId) { return this.reserveBitmap('img/system/', filename, hue, false, reservationId || this._systemReservationId); }; ImageManager.reserveTileset = function(filename, hue, reservationId) { return this.reserveBitmap('img/tilesets/', filename, hue, false, reservationId); }; ImageManager.reserveTitle1 = function(filename, hue, reservationId) { return this.reserveBitmap('img/titles1/', filename, hue, true, reservationId); }; ImageManager.reserveTitle2 = function(filename, hue, reservationId) { return this.reserveBitmap('img/titles2/', filename, hue, true, reservationId); }; ImageManager.reserveBitmap = function(folder, filename, hue, smooth, reservationId) { if (filename) { var path = folder + encodeURIComponent(filename) + '.png'; var bitmap = this.reserveNormalBitmap(path, hue || 0, reservationId || this._defaultReservationId); bitmap.smooth = smooth; return bitmap; } else { return this.loadEmptyBitmap(); } }; ImageManager.reserveNormalBitmap = function(path, hue, reservationId){ var bitmap = this.loadNormalBitmap(path, hue); this._imageCache.reserve(this._generateCacheKey(path, hue), bitmap, reservationId); return bitmap; }; ImageManager.releaseReservation = function(reservationId){ this._imageCache.releaseReservation(reservationId); }; ImageManager.setDefaultReservationId = function(reservationId){ this._defaultReservationId = reservationId; }; ImageManager.requestAnimation = function(filename, hue) { return this.requestBitmap('img/animations/', filename, hue, true); }; ImageManager.requestBattleback1 = function(filename, hue) { return this.requestBitmap('img/battlebacks1/', filename, hue, true); }; ImageManager.requestBattleback2 = function(filename, hue) { return this.requestBitmap('img/battlebacks2/', filename, hue, true); }; ImageManager.requestEnemy = function(filename, hue) { return this.requestBitmap('img/enemies/', filename, hue, true); }; ImageManager.requestCharacter = function(filename, hue) { return this.requestBitmap('img/characters/', filename, hue, false); }; ImageManager.requestFace = function(filename, hue) { return this.requestBitmap('img/faces/', filename, hue, true); }; ImageManager.requestParallax = function(filename, hue) { return this.requestBitmap('img/parallaxes/', filename, hue, true); }; ImageManager.requestPicture = function(filename, hue) { return this.requestBitmap('img/pictures/', filename, hue, true); }; ImageManager.requestSvActor = function(filename, hue) { return this.requestBitmap('img/sv_actors/', filename, hue, false); }; ImageManager.requestSvEnemy = function(filename, hue) { return this.requestBitmap('img/sv_enemies/', filename, hue, true); }; ImageManager.requestSystem = function(filename, hue) { return this.requestBitmap('img/system/', filename, hue, false); }; ImageManager.requestTileset = function(filename, hue) { return this.requestBitmap('img/tilesets/', filename, hue, false); }; ImageManager.requestTitle1 = function(filename, hue) { return this.requestBitmap('img/titles1/', filename, hue, true); }; ImageManager.requestTitle2 = function(filename, hue) { return this.requestBitmap('img/titles2/', filename, hue, true); }; ImageManager.requestBitmap = function(folder, filename, hue, smooth) { if (filename) { var path = folder + encodeURIComponent(filename) + '.png'; var bitmap = this.requestNormalBitmap(path, hue || 0); bitmap.smooth = smooth; return bitmap; } else { return this.loadEmptyBitmap(); } }; ImageManager.requestNormalBitmap = function(path, hue){ var key = this._generateCacheKey(path, hue); var bitmap = this._imageCache.get(key); if(!bitmap){ bitmap = Bitmap.request(path); bitmap.addLoadListener(function(){ bitmap.rotateHue(hue); }); this._imageCache.add(key, bitmap); this._requestQueue.enqueue(key, bitmap); }else{ this._requestQueue.raisePriority(key); } return bitmap; }; ImageManager.update = function(){ this._requestQueue.update(); }; ImageManager.clearRequest = function(){ this._requestQueue.clear(); }; //----------------------------------------------------------------------------- // AudioManager // // The static class that handles BGM, BGS, ME and SE. function AudioManager() { throw new Error('This is a static class'); } AudioManager._masterVolume = 1; // (min: 0, max: 1) AudioManager._bgmVolume = 100; AudioManager._bgsVolume = 100; AudioManager._meVolume = 100; AudioManager._seVolume = 100; AudioManager._currentBgm = null; AudioManager._currentBgs = null; AudioManager._bgmBuffer = null; AudioManager._bgsBuffer = null; AudioManager._meBuffer = null; AudioManager._seBuffers = []; AudioManager._staticBuffers = []; AudioManager._replayFadeTime = 0.5; AudioManager._path = 'audio/'; AudioManager._blobUrl = null; Object.defineProperty(AudioManager, 'masterVolume', { get: function() { return this._masterVolume; }, set: function(value) { this._masterVolume = value; WebAudio.setMasterVolume(this._masterVolume); Graphics.setVideoVolume(this._masterVolume); }, configurable: true }); Object.defineProperty(AudioManager, 'bgmVolume', { get: function() { return this._bgmVolume; }, set: function(value) { this._bgmVolume = value; this.updateBgmParameters(this._currentBgm); }, configurable: true }); Object.defineProperty(AudioManager, 'bgsVolume', { get: function() { return this._bgsVolume; }, set: function(value) { this._bgsVolume = value; this.updateBgsParameters(this._currentBgs); }, configurable: true }); Object.defineProperty(AudioManager, 'meVolume', { get: function() { return this._meVolume; }, set: function(value) { this._meVolume = value; this.updateMeParameters(this._currentMe); }, configurable: true }); Object.defineProperty(AudioManager, 'seVolume', { get: function() { return this._seVolume; }, set: function(value) { this._seVolume = value; }, configurable: true }); AudioManager.playBgm = function(bgm, pos) { if (this.isCurrentBgm(bgm)) { this.updateBgmParameters(bgm); } else { this.stopBgm(); if (bgm.name) { if(Decrypter.hasEncryptedAudio && this.shouldUseHtml5Audio()){ this.playEncryptedBgm(bgm, pos); } else { this._bgmBuffer = this.createBuffer('bgm', bgm.name); this.updateBgmParameters(bgm); if (!this._meBuffer) { this._bgmBuffer.play(true, pos || 0); } } } } this.updateCurrentBgm(bgm, pos); }; AudioManager.playEncryptedBgm = function(bgm, pos) { var ext = this.audioFileExt(); var url = this._path + 'bgm/' + encodeURIComponent(bgm.name) + ext; url = Decrypter.extToEncryptExt(url); Decrypter.decryptHTML5Audio(url, bgm, pos); }; AudioManager.createDecryptBuffer = function(url, bgm, pos){ this._blobUrl = url; this._bgmBuffer = this.createBuffer('bgm', bgm.name); this.updateBgmParameters(bgm); if (!this._meBuffer) { this._bgmBuffer.play(true, pos || 0); } this.updateCurrentBgm(bgm, pos); }; AudioManager.replayBgm = function(bgm) { if (this.isCurrentBgm(bgm)) { this.updateBgmParameters(bgm); } else { this.playBgm(bgm, bgm.pos); if (this._bgmBuffer) { this._bgmBuffer.fadeIn(this._replayFadeTime); } } }; AudioManager.isCurrentBgm = function(bgm) { return (this._currentBgm && this._bgmBuffer && this._currentBgm.name === bgm.name); }; AudioManager.updateBgmParameters = function(bgm) { this.updateBufferParameters(this._bgmBuffer, this._bgmVolume, bgm); }; AudioManager.updateCurrentBgm = function(bgm, pos) { this._currentBgm = { name: bgm.name, volume: bgm.volume, pitch: bgm.pitch, pan: bgm.pan, pos: pos }; }; AudioManager.stopBgm = function() { if (this._bgmBuffer) { this._bgmBuffer.stop(); this._bgmBuffer = null; this._currentBgm = null; } }; AudioManager.fadeOutBgm = function(duration) { if (this._bgmBuffer && this._currentBgm) { this._bgmBuffer.fadeOut(duration); this._currentBgm = null; } }; AudioManager.fadeInBgm = function(duration) { if (this._bgmBuffer && this._currentBgm) { this._bgmBuffer.fadeIn(duration); } }; AudioManager.playBgs = function(bgs, pos) { if (this.isCurrentBgs(bgs)) { this.updateBgsParameters(bgs); } else { this.stopBgs(); if (bgs.name) { this._bgsBuffer = this.createBuffer('bgs', bgs.name); this.updateBgsParameters(bgs); this._bgsBuffer.play(true, pos || 0); } } this.updateCurrentBgs(bgs, pos); }; AudioManager.replayBgs = function(bgs) { if (this.isCurrentBgs(bgs)) { this.updateBgsParameters(bgs); } else { this.playBgs(bgs, bgs.pos); if (this._bgsBuffer) { this._bgsBuffer.fadeIn(this._replayFadeTime); } } }; AudioManager.isCurrentBgs = function(bgs) { return (this._currentBgs && this._bgsBuffer && this._currentBgs.name === bgs.name); }; AudioManager.updateBgsParameters = function(bgs) { this.updateBufferParameters(this._bgsBuffer, this._bgsVolume, bgs); }; AudioManager.updateCurrentBgs = function(bgs, pos) { this._currentBgs = { name: bgs.name, volume: bgs.volume, pitch: bgs.pitch, pan: bgs.pan, pos: pos }; }; AudioManager.stopBgs = function() { if (this._bgsBuffer) { this._bgsBuffer.stop(); this._bgsBuffer = null; this._currentBgs = null; } }; AudioManager.fadeOutBgs = function(duration) { if (this._bgsBuffer && this._currentBgs) { this._bgsBuffer.fadeOut(duration); this._currentBgs = null; } }; AudioManager.fadeInBgs = function(duration) { if (this._bgsBuffer && this._currentBgs) { this._bgsBuffer.fadeIn(duration); } }; AudioManager.playMe = function(me) { this.stopMe(); if (me.name) { if (this._bgmBuffer && this._currentBgm) { this._currentBgm.pos = this._bgmBuffer.seek(); this._bgmBuffer.stop(); } this._meBuffer = this.createBuffer('me', me.name); this.updateMeParameters(me); this._meBuffer.play(false); this._meBuffer.addStopListener(this.stopMe.bind(this)); } }; AudioManager.updateMeParameters = function(me) { this.updateBufferParameters(this._meBuffer, this._meVolume, me); }; AudioManager.fadeOutMe = function(duration) { if (this._meBuffer) { this._meBuffer.fadeOut(duration); } }; AudioManager.stopMe = function() { if (this._meBuffer) { this._meBuffer.stop(); this._meBuffer = null; if (this._bgmBuffer && this._currentBgm && !this._bgmBuffer.isPlaying()) { this._bgmBuffer.play(true, this._currentBgm.pos); this._bgmBuffer.fadeIn(this._replayFadeTime); } } }; AudioManager.playSe = function(se) { if (se.name) { this._seBuffers = this._seBuffers.filter(function(audio) { return audio.isPlaying(); }); var buffer = this.createBuffer('se', se.name); this.updateSeParameters(buffer, se); buffer.play(false); this._seBuffers.push(buffer); } }; AudioManager.updateSeParameters = function(buffer, se) { this.updateBufferParameters(buffer, this._seVolume, se); }; AudioManager.stopSe = function() { this._seBuffers.forEach(function(buffer) { buffer.stop(); }); this._seBuffers = []; }; AudioManager.playStaticSe = function(se) { if (se.name) { this.loadStaticSe(se); for (var i = 0; i < this._staticBuffers.length; i++) { var buffer = this._staticBuffers[i]; if (buffer._reservedSeName === se.name) { buffer.stop(); this.updateSeParameters(buffer, se); buffer.play(false); break; } } } }; AudioManager.loadStaticSe = function(se) { if (se.name && !this.isStaticSe(se)) { var buffer = this.createBuffer('se', se.name); buffer._reservedSeName = se.name; this._staticBuffers.push(buffer); if (this.shouldUseHtml5Audio()) { Html5Audio.setStaticSe(buffer._url); } } }; AudioManager.isStaticSe = function(se) { for (var i = 0; i < this._staticBuffers.length; i++) { var buffer = this._staticBuffers[i]; if (buffer._reservedSeName === se.name) { return true; } } return false; }; AudioManager.stopAll = function() { this.stopMe(); this.stopBgm(); this.stopBgs(); this.stopSe(); }; AudioManager.saveBgm = function() { if (this._currentBgm) { var bgm = this._currentBgm; return { name: bgm.name, volume: bgm.volume, pitch: bgm.pitch, pan: bgm.pan, pos: this._bgmBuffer ? this._bgmBuffer.seek() : 0 }; } else { return this.makeEmptyAudioObject(); } }; AudioManager.saveBgs = function() { if (this._currentBgs) { var bgs = this._currentBgs; return { name: bgs.name, volume: bgs.volume, pitch: bgs.pitch, pan: bgs.pan, pos: this._bgsBuffer ? this._bgsBuffer.seek() : 0 }; } else { return this.makeEmptyAudioObject(); } }; AudioManager.makeEmptyAudioObject = function() { return { name: '', volume: 0, pitch: 0 }; }; AudioManager.createBuffer = function(folder, name) { var ext = this.audioFileExt(); var url = this._path + folder + '/' + encodeURIComponent(name) + ext; if (this.shouldUseHtml5Audio() && folder === 'bgm') { if(this._blobUrl) Html5Audio.setup(this._blobUrl); else Html5Audio.setup(url); return Html5Audio; } else { return new WebAudio(url); } }; AudioManager.updateBufferParameters = function(buffer, configVolume, audio) { if (buffer && audio) { buffer.volume = configVolume * (audio.volume || 0) / 10000; buffer.pitch = (audio.pitch || 0) / 100; buffer.pan = (audio.pan || 0) / 100; } }; AudioManager.audioFileExt = function() { if (WebAudio.canPlayOgg() && !Utils.isMobileDevice()) { return '.ogg'; } else { return '.m4a'; } }; AudioManager.shouldUseHtml5Audio = function() { // The only case where we wanted html5audio was android/ no encrypt // Atsuma-ru asked to force webaudio there too, so just return false for ALL // return Utils.isAndroidChrome() && !Decrypter.hasEncryptedAudio; return false; }; AudioManager.checkErrors = function() { this.checkWebAudioError(this._bgmBuffer); this.checkWebAudioError(this._bgsBuffer); this.checkWebAudioError(this._meBuffer); this._seBuffers.forEach(function(buffer) { this.checkWebAudioError(buffer); }.bind(this)); this._staticBuffers.forEach(function(buffer) { this.checkWebAudioError(buffer); }.bind(this)); }; AudioManager.checkWebAudioError = function(webAudio) { if (webAudio && webAudio.isError()) { throw new Error('Failed to load: ' + webAudio.url); } }; //----------------------------------------------------------------------------- // SoundManager // // The static class that plays sound effects defined in the database. function SoundManager() { throw new Error('This is a static class'); } SoundManager.preloadImportantSounds = function() { this.loadSystemSound(0); this.loadSystemSound(1); this.loadSystemSound(2); this.loadSystemSound(3); }; SoundManager.loadSystemSound = function(n) { if ($dataSystem) { AudioManager.loadStaticSe($dataSystem.sounds[n]); } }; SoundManager.playSystemSound = function(n) { if ($dataSystem) { AudioManager.playStaticSe($dataSystem.sounds[n]); } }; SoundManager.playCursor = function() { this.playSystemSound(0); }; SoundManager.playOk = function() { this.playSystemSound(1); }; SoundManager.playCancel = function() { this.playSystemSound(2); }; SoundManager.playBuzzer = function() { this.playSystemSound(3); }; SoundManager.playEquip = function() { this.playSystemSound(4); }; SoundManager.playSave = function() { this.playSystemSound(5); }; SoundManager.playLoad = function() { this.playSystemSound(6); }; SoundManager.playBattleStart = function() { this.playSystemSound(7); }; SoundManager.playEscape = function() { this.playSystemSound(8); }; SoundManager.playEnemyAttack = function() { this.playSystemSound(9); }; SoundManager.playEnemyDamage = function() { this.playSystemSound(10); }; SoundManager.playEnemyCollapse = function() { this.playSystemSound(11); }; SoundManager.playBossCollapse1 = function() { this.playSystemSound(12); }; SoundManager.playBossCollapse2 = function() { this.playSystemSound(13); }; SoundManager.playActorDamage = function() { this.playSystemSound(14); }; SoundManager.playActorCollapse = function() { this.playSystemSound(15); }; SoundManager.playRecovery = function() { this.playSystemSound(16); }; SoundManager.playMiss = function() { this.playSystemSound(17); }; SoundManager.playEvasion = function() { this.playSystemSound(18); }; SoundManager.playMagicEvasion = function() { this.playSystemSound(19); }; SoundManager.playReflection = function() { this.playSystemSound(20); }; SoundManager.playShop = function() { this.playSystemSound(21); }; SoundManager.playUseItem = function() { this.playSystemSound(22); }; SoundManager.playUseSkill = function() { this.playSystemSound(23); }; //----------------------------------------------------------------------------- // TextManager // // The static class that handles terms and messages. function TextManager() { throw new Error('This is a static class'); } TextManager.basic = function(basicId) { return $dataSystem.terms.basic[basicId] || ''; }; TextManager.param = function(paramId) { return $dataSystem.terms.params[paramId] || ''; }; TextManager.command = function(commandId) { return $dataSystem.terms.commands[commandId] || ''; }; TextManager.message = function(messageId) { return $dataSystem.terms.messages[messageId] || ''; }; TextManager.getter = function(method, param) { return { get: function() { return this[method](param); }, configurable: true }; }; Object.defineProperty(TextManager, 'currencyUnit', { get: function() { return $dataSystem.currencyUnit; }, configurable: true }); Object.defineProperties(TextManager, { level : TextManager.getter('basic', 0), levelA : TextManager.getter('basic', 1), hp : TextManager.getter('basic', 2), hpA : TextManager.getter('basic', 3), mp : TextManager.getter('basic', 4), mpA : TextManager.getter('basic', 5), tp : TextManager.getter('basic', 6), tpA : TextManager.getter('basic', 7), exp : TextManager.getter('basic', 8), expA : TextManager.getter('basic', 9), fight : TextManager.getter('command', 0), escape : TextManager.getter('command', 1), attack : TextManager.getter('command', 2), guard : TextManager.getter('command', 3), item : TextManager.getter('command', 4), skill : TextManager.getter('command', 5), equip : TextManager.getter('command', 6), status : TextManager.getter('command', 7), formation : TextManager.getter('command', 8), save : TextManager.getter('command', 9), gameEnd : TextManager.getter('command', 10), options : TextManager.getter('command', 11), weapon : TextManager.getter('command', 12), armor : TextManager.getter('command', 13), keyItem : TextManager.getter('command', 14), equip2 : TextManager.getter('command', 15), optimize : TextManager.getter('command', 16), clear : TextManager.getter('command', 17), newGame : TextManager.getter('command', 18), continue_ : TextManager.getter('command', 19), toTitle : TextManager.getter('command', 21), cancel : TextManager.getter('command', 22), buy : TextManager.getter('command', 24), sell : TextManager.getter('command', 25), alwaysDash : TextManager.getter('message', 'alwaysDash'), commandRemember : TextManager.getter('message', 'commandRemember'), bgmVolume : TextManager.getter('message', 'bgmVolume'), bgsVolume : TextManager.getter('message', 'bgsVolume'), meVolume : TextManager.getter('message', 'meVolume'), seVolume : TextManager.getter('message', 'seVolume'), possession : TextManager.getter('message', 'possession'), expTotal : TextManager.getter('message', 'expTotal'), expNext : TextManager.getter('message', 'expNext'), saveMessage : TextManager.getter('message', 'saveMessage'), loadMessage : TextManager.getter('message', 'loadMessage'), file : TextManager.getter('message', 'file'), partyName : TextManager.getter('message', 'partyName'), emerge : TextManager.getter('message', 'emerge'), preemptive : TextManager.getter('message', 'preemptive'), surprise : TextManager.getter('message', 'surprise'), escapeStart : TextManager.getter('message', 'escapeStart'), escapeFailure : TextManager.getter('message', 'escapeFailure'), victory : TextManager.getter('message', 'victory'), defeat : TextManager.getter('message', 'defeat'), obtainExp : TextManager.getter('message', 'obtainExp'), obtainGold : TextManager.getter('message', 'obtainGold'), obtainItem : TextManager.getter('message', 'obtainItem'), levelUp : TextManager.getter('message', 'levelUp'), obtainSkill : TextManager.getter('message', 'obtainSkill'), useItem : TextManager.getter('message', 'useItem'), criticalToEnemy : TextManager.getter('message', 'criticalToEnemy'), criticalToActor : TextManager.getter('message', 'criticalToActor'), actorDamage : TextManager.getter('message', 'actorDamage'), actorRecovery : TextManager.getter('message', 'actorRecovery'), actorGain : TextManager.getter('message', 'actorGain'), actorLoss : TextManager.getter('message', 'actorLoss'), actorDrain : TextManager.getter('message', 'actorDrain'), actorNoDamage : TextManager.getter('message', 'actorNoDamage'), actorNoHit : TextManager.getter('message', 'actorNoHit'), enemyDamage : TextManager.getter('message', 'enemyDamage'), enemyRecovery : TextManager.getter('message', 'enemyRecovery'), enemyGain : TextManager.getter('message', 'enemyGain'), enemyLoss : TextManager.getter('message', 'enemyLoss'), enemyDrain : TextManager.getter('message', 'enemyDrain'), enemyNoDamage : TextManager.getter('message', 'enemyNoDamage'), enemyNoHit : TextManager.getter('message', 'enemyNoHit'), evasion : TextManager.getter('message', 'evasion'), magicEvasion : TextManager.getter('message', 'magicEvasion'), magicReflection : TextManager.getter('message', 'magicReflection'), counterAttack : TextManager.getter('message', 'counterAttack'), substitute : TextManager.getter('message', 'substitute'), buffAdd : TextManager.getter('message', 'buffAdd'), debuffAdd : TextManager.getter('message', 'debuffAdd'), buffRemove : TextManager.getter('message', 'buffRemove'), actionFailure : TextManager.getter('message', 'actionFailure'), }); //----------------------------------------------------------------------------- // SceneManager // // The static class that manages scene transitions. function SceneManager() { throw new Error('This is a static class'); } /* * Gets the current time in ms without on iOS Safari. * @private */ SceneManager._getTimeInMsWithoutMobileSafari = function() { return performance.now(); }; SceneManager._scene = null; SceneManager._nextScene = null; SceneManager._stack = []; SceneManager._stopped = false; SceneManager._sceneStarted = false; SceneManager._exiting = false; SceneManager._previousClass = null; SceneManager._backgroundBitmap = null; SceneManager._screenWidth = 816; SceneManager._screenHeight = 624; SceneManager._boxWidth = 816; SceneManager._boxHeight = 624; SceneManager._deltaTime = 1.0 / 60.0; if (!Utils.isMobileSafari()) SceneManager._currentTime = SceneManager._getTimeInMsWithoutMobileSafari(); SceneManager._accumulator = 0.0; SceneManager.run = function(sceneClass) { try { this.initialize(); this.goto(sceneClass); this.requestUpdate(); } catch (e) { this.catchException(e); } }; SceneManager.initialize = function() { this.initGraphics(); this.checkFileAccess(); this.initAudio(); this.initInput(); this.initNwjs(); this.checkPluginErrors(); this.setupErrorHandlers(); }; SceneManager.initGraphics = function() { var type = this.preferableRendererType(); Graphics.initialize(this._screenWidth, this._screenHeight, type); Graphics.boxWidth = this._boxWidth; Graphics.boxHeight = this._boxHeight; Graphics.setLoadingImage('img/system/Loading.png'); if (Utils.isOptionValid('showfps')) { Graphics.showFps(); } if (type === 'webgl') { this.checkWebGL(); } }; SceneManager.preferableRendererType = function() { if (Utils.isOptionValid('canvas')) { return 'canvas'; } else if (Utils.isOptionValid('webgl')) { return 'webgl'; } else { return 'auto'; } }; SceneManager.shouldUseCanvasRenderer = function() { return Utils.isMobileDevice(); }; SceneManager.checkWebGL = function() { if (!Graphics.hasWebGL()) { throw new Error('Your browser does not support WebGL.'); } }; SceneManager.checkFileAccess = function() { if (!Utils.canReadGameFiles()) { throw new Error('Your browser does not allow to read local files.'); } }; SceneManager.initAudio = function() { var noAudio = Utils.isOptionValid('noaudio'); if (!WebAudio.initialize(noAudio) && !noAudio) { throw new Error('Your browser does not support Web Audio API.'); } }; SceneManager.initInput = function() { Input.initialize(); TouchInput.initialize(); }; SceneManager.initNwjs = function() { if (Utils.isNwjs()) { var gui = require('nw.gui'); var win = gui.Window.get(); if (process.platform === 'darwin' && !win.menu) { var menubar = new gui.Menu({ type: 'menubar' }); var option = { hideEdit: true, hideWindow: true }; menubar.createMacBuiltin('Game', option); win.menu = menubar; } } }; SceneManager.checkPluginErrors = function() { PluginManager.checkErrors(); }; SceneManager.setupErrorHandlers = function() { window.addEventListener('error', this.onError.bind(this)); document.addEventListener('keydown', this.onKeyDown.bind(this)); }; SceneManager.requestUpdate = function() { if (!this._stopped) { requestAnimationFrame(this.update.bind(this)); } }; SceneManager.update = function() { try { this.tickStart(); if (Utils.isMobileSafari()) { this.updateInputData(); } this.updateManagers(); this.updateMain(); this.tickEnd(); } catch (e) { this.catchException(e); } }; SceneManager.terminate = function() { window.close(); }; SceneManager.onError = function(e) { console.error(e.message); console.error(e.filename, e.lineno); try { this.stop(); Graphics.printError('Error', e.message); AudioManager.stopAll(); } catch (e2) { } }; SceneManager.onKeyDown = function(event) { if (!event.ctrlKey && !event.altKey) { switch (event.keyCode) { case 116: // F5 if (Utils.isNwjs()) { location.reload(); } break; case 119: // F8 if (Utils.isNwjs() && Utils.isOptionValid('test')) { require('nw.gui').Window.get().showDevTools(); } break; } } }; SceneManager.catchException = function(e) { if (e instanceof Error) { Graphics.printError(e.name, e.message); console.error(e.stack); } else { Graphics.printError('UnknownError', e); } AudioManager.stopAll(); this.stop(); }; SceneManager.tickStart = function() { Graphics.tickStart(); }; SceneManager.tickEnd = function() { Graphics.tickEnd(); }; SceneManager.updateInputData = function() { Input.update(); TouchInput.update(); }; SceneManager.updateMain = function() { if (Utils.isMobileSafari()) { this.changeScene(); this.updateScene(); } else { var newTime = this._getTimeInMsWithoutMobileSafari(); var fTime = (newTime - this._currentTime) / 1000; if (fTime > 0.25) fTime = 0.25; this._currentTime = newTime; this._accumulator += fTime; while (this._accumulator >= this._deltaTime) { this.updateInputData(); this.changeScene(); this.updateScene(); this._accumulator -= this._deltaTime; } } this.renderScene(); this.requestUpdate(); }; SceneManager.updateManagers = function() { ImageManager.update(); }; SceneManager.changeScene = function() { if (this.isSceneChanging() && !this.isCurrentSceneBusy()) { if (this._scene) { this._scene.terminate(); this._scene.detachReservation(); this._previousClass = this._scene.constructor; } this._scene = this._nextScene; if (this._scene) { this._scene.attachReservation(); this._scene.create(); this._nextScene = null; this._sceneStarted = false; this.onSceneCreate(); } if (this._exiting) { this.terminate(); } } }; SceneManager.updateScene = function() { if (this._scene) { if (!this._sceneStarted && this._scene.isReady()) { this._scene.start(); this._sceneStarted = true; this.onSceneStart(); } if (this.isCurrentSceneStarted()) { this._scene.update(); } } }; SceneManager.renderScene = function() { if (this.isCurrentSceneStarted()) { Graphics.render(this._scene); } else if (this._scene) { this.onSceneLoading(); } }; SceneManager.onSceneCreate = function() { Graphics.startLoading(); }; SceneManager.onSceneStart = function() { Graphics.endLoading(); }; SceneManager.onSceneLoading = function() { Graphics.updateLoading(); }; SceneManager.isSceneChanging = function() { return this._exiting || !!this._nextScene; }; SceneManager.isCurrentSceneBusy = function() { return this._scene && this._scene.isBusy(); }; SceneManager.isCurrentSceneStarted = function() { return this._scene && this._sceneStarted; }; SceneManager.isNextScene = function(sceneClass) { return this._nextScene && this._nextScene.constructor === sceneClass; }; SceneManager.isPreviousScene = function(sceneClass) { return this._previousClass === sceneClass; }; SceneManager.goto = function(sceneClass) { if (sceneClass) { this._nextScene = new sceneClass(); } if (this._scene) { this._scene.stop(); } }; SceneManager.push = function(sceneClass) { this._stack.push(this._scene.constructor); this.goto(sceneClass); }; SceneManager.pop = function() { if (this._stack.length > 0) { this.goto(this._stack.pop()); } else { this.exit(); } }; SceneManager.exit = function() { this.goto(null); this._exiting = true; }; SceneManager.clearStack = function() { this._stack = []; }; SceneManager.stop = function() { this._stopped = true; }; SceneManager.prepareNextScene = function() { this._nextScene.prepare.apply(this._nextScene, arguments); }; SceneManager.snap = function() { return Bitmap.snap(this._scene); }; SceneManager.snapForBackground = function() { this._backgroundBitmap = this.snap(); this._backgroundBitmap.blur(); }; SceneManager.backgroundBitmap = function() { return this._backgroundBitmap; }; SceneManager.resume = function() { this._stopped = false; this.requestUpdate(); if (!Utils.isMobileSafari()) { this._currentTime = this._getTimeInMsWithoutMobileSafari(); this._accumulator = 0; } }; //----------------------------------------------------------------------------- // BattleManager // // The static class that manages battle progress. function BattleManager() { throw new Error('This is a static class'); } BattleManager.setup = function(troopId, canEscape, canLose) { this.initMembers(); this._canEscape = canEscape; this._canLose = canLose; $gameTroop.setup(troopId); $gameScreen.onBattleStart(); this.makeEscapeRatio(); }; BattleManager.initMembers = function() { this._phase = 'init'; this._canEscape = false; this._canLose = false; this._battleTest = false; this._eventCallback = null; this._preemptive = false; this._surprise = false; this._actorIndex = -1; this._actionForcedBattler = null; this._mapBgm = null; this._mapBgs = null; this._actionBattlers = []; this._subject = null; this._action = null; this._targets = []; this._logWindow = null; this._statusWindow = null; this._spriteset = null; this._escapeRatio = 0; this._escaped = false; this._rewards = {}; this._turnForced = false; }; BattleManager.isBattleTest = function() { return this._battleTest; }; BattleManager.setBattleTest = function(battleTest) { this._battleTest = battleTest; }; BattleManager.setEventCallback = function(callback) { this._eventCallback = callback; }; BattleManager.setLogWindow = function(logWindow) { this._logWindow = logWindow; }; BattleManager.setStatusWindow = function(statusWindow) { this._statusWindow = statusWindow; }; BattleManager.setSpriteset = function(spriteset) { this._spriteset = spriteset; }; BattleManager.onEncounter = function() { this._preemptive = (Math.random() < this.ratePreemptive()); this._surprise = (Math.random() < this.rateSurprise() && !this._preemptive); }; BattleManager.ratePreemptive = function() { return $gameParty.ratePreemptive($gameTroop.agility()); }; BattleManager.rateSurprise = function() { return $gameParty.rateSurprise($gameTroop.agility()); }; BattleManager.saveBgmAndBgs = function() { this._mapBgm = AudioManager.saveBgm(); this._mapBgs = AudioManager.saveBgs(); }; BattleManager.playBattleBgm = function() { AudioManager.playBgm($gameSystem.battleBgm()); AudioManager.stopBgs(); }; BattleManager.playVictoryMe = function() { AudioManager.playMe($gameSystem.victoryMe()); }; BattleManager.playDefeatMe = function() { AudioManager.playMe($gameSystem.defeatMe()); }; BattleManager.replayBgmAndBgs = function() { if (this._mapBgm) { AudioManager.replayBgm(this._mapBgm); } else { AudioManager.stopBgm(); } if (this._mapBgs) { AudioManager.replayBgs(this._mapBgs); } }; BattleManager.makeEscapeRatio = function() { this._escapeRatio = 0.5 * $gameParty.agility() / $gameTroop.agility(); }; BattleManager.update = function() { if (!this.isBusy() && !this.updateEvent()) { switch (this._phase) { case 'start': this.startInput(); break; case 'turn': this.updateTurn(); break; case 'action': this.updateAction(); break; case 'turnEnd': this.updateTurnEnd(); break; case 'battleEnd': this.updateBattleEnd(); break; } } }; BattleManager.updateEvent = function() { switch (this._phase) { case 'start': case 'turn': case 'turnEnd': if (this.isActionForced()) { this.processForcedAction(); return true; } else { return this.updateEventMain(); } } return this.checkAbort(); }; BattleManager.updateEventMain = function() { $gameTroop.updateInterpreter(); $gameParty.requestMotionRefresh(); if ($gameTroop.isEventRunning() || this.checkBattleEnd()) { return true; } $gameTroop.setupBattleEvent(); if ($gameTroop.isEventRunning() || SceneManager.isSceneChanging()) { return true; } return false; }; BattleManager.isBusy = function() { return ($gameMessage.isBusy() || this._spriteset.isBusy() || this._logWindow.isBusy()); }; BattleManager.isInputting = function() { return this._phase === 'input'; }; BattleManager.isInTurn = function() { return this._phase === 'turn'; }; BattleManager.isTurnEnd = function() { return this._phase === 'turnEnd'; }; BattleManager.isAborting = function() { return this._phase === 'aborting'; }; BattleManager.isBattleEnd = function() { return this._phase === 'battleEnd'; }; BattleManager.canEscape = function() { return this._canEscape; }; BattleManager.canLose = function() { return this._canLose; }; BattleManager.isEscaped = function() { return this._escaped; }; BattleManager.actor = function() { return this._actorIndex >= 0 ? $gameParty.members()[this._actorIndex] : null; }; BattleManager.clearActor = function() { this.changeActor(-1, ''); }; BattleManager.changeActor = function(newActorIndex, lastActorActionState) { var lastActor = this.actor(); this._actorIndex = newActorIndex; var newActor = this.actor(); if (lastActor) { lastActor.setActionState(lastActorActionState); } if (newActor) { newActor.setActionState('inputting'); } }; BattleManager.startBattle = function() { this._phase = 'start'; $gameSystem.onBattleStart(); $gameParty.onBattleStart(); $gameTroop.onBattleStart(); this.displayStartMessages(); }; BattleManager.displayStartMessages = function() { $gameTroop.enemyNames().forEach(function(name) { $gameMessage.add(TextManager.emerge.format(name)); }); if (this._preemptive) { $gameMessage.add(TextManager.preemptive.format($gameParty.name())); } else if (this._surprise) { $gameMessage.add(TextManager.surprise.format($gameParty.name())); } }; BattleManager.startInput = function() { this._phase = 'input'; $gameParty.makeActions(); $gameTroop.makeActions(); this.clearActor(); if (this._surprise || !$gameParty.canInput()) { this.startTurn(); } }; BattleManager.inputtingAction = function() { return this.actor() ? this.actor().inputtingAction() : null; }; BattleManager.selectNextCommand = function() { do { if (!this.actor() || !this.actor().selectNextCommand()) { this.changeActor(this._actorIndex + 1, 'waiting'); if (this._actorIndex >= $gameParty.size()) { this.startTurn(); break; } } } while (!this.actor().canInput()); }; BattleManager.selectPreviousCommand = function() { do { if (!this.actor() || !this.actor().selectPreviousCommand()) { this.changeActor(this._actorIndex - 1, 'undecided'); if (this._actorIndex < 0) { return; } } } while (!this.actor().canInput()); }; BattleManager.refreshStatus = function() { this._statusWindow.refresh(); }; BattleManager.startTurn = function() { this._phase = 'turn'; this.clearActor(); $gameTroop.increaseTurn(); this.makeActionOrders(); $gameParty.requestMotionRefresh(); this._logWindow.startTurn(); }; BattleManager.updateTurn = function() { $gameParty.requestMotionRefresh(); if (!this._subject) { this._subject = this.getNextSubject(); } if (this._subject) { this.processTurn(); } else { this.endTurn(); } }; BattleManager.processTurn = function() { var subject = this._subject; var action = subject.currentAction(); if (action) { action.prepare(); if (action.isValid()) { this.startAction(); } subject.removeCurrentAction(); } else { subject.onAllActionsEnd(); this.refreshStatus(); this._logWindow.displayAutoAffectedStatus(subject); this._logWindow.displayCurrentState(subject); this._logWindow.displayRegeneration(subject); this._subject = this.getNextSubject(); } }; BattleManager.endTurn = function() { this._phase = 'turnEnd'; this._preemptive = false; this._surprise = false; this.allBattleMembers().forEach(function(battler) { battler.onTurnEnd(); this.refreshStatus(); this._logWindow.displayAutoAffectedStatus(battler); this._logWindow.displayRegeneration(battler); }, this); if (this.isForcedTurn()) { this._turnForced = false; } }; BattleManager.isForcedTurn = function () { return this._turnForced; }; BattleManager.updateTurnEnd = function() { this.startInput(); }; BattleManager.getNextSubject = function() { for (;;) { var battler = this._actionBattlers.shift(); if (!battler) { return null; } if (battler.isBattleMember() && battler.isAlive()) { return battler; } } }; BattleManager.allBattleMembers = function() { return $gameParty.members().concat($gameTroop.members()); }; BattleManager.makeActionOrders = function() { var battlers = []; if (!this._surprise) { battlers = battlers.concat($gameParty.members()); } if (!this._preemptive) { battlers = battlers.concat($gameTroop.members()); } battlers.forEach(function(battler) { battler.makeSpeed(); }); battlers.sort(function(a, b) { return b.speed() - a.speed(); }); this._actionBattlers = battlers; }; BattleManager.startAction = function() { var subject = this._subject; var action = subject.currentAction(); var targets = action.makeTargets(); this._phase = 'action'; this._action = action; this._targets = targets; subject.useItem(action.item()); this._action.applyGlobal(); this.refreshStatus(); this._logWindow.startAction(subject, action, targets); }; BattleManager.updateAction = function() { var target = this._targets.shift(); if (target) { this.invokeAction(this._subject, target); } else { this.endAction(); } }; BattleManager.endAction = function() { this._logWindow.endAction(this._subject); this._phase = 'turn'; }; BattleManager.invokeAction = function(subject, target) { this._logWindow.push('pushBaseLine'); if (Math.random() < this._action.itemCnt(target)) { this.invokeCounterAttack(subject, target); } else if (Math.random() < this._action.itemMrf(target)) { this.invokeMagicReflection(subject, target); } else { this.invokeNormalAction(subject, target); } subject.setLastTarget(target); this._logWindow.push('popBaseLine'); this.refreshStatus(); }; BattleManager.invokeNormalAction = function(subject, target) { var realTarget = this.applySubstitute(target); this._action.apply(realTarget); this._logWindow.displayActionResults(subject, realTarget); }; BattleManager.invokeCounterAttack = function(subject, target) { var action = new Game_Action(target); action.setAttack(); action.apply(subject); this._logWindow.displayCounter(target); this._logWindow.displayActionResults(target, subject); }; BattleManager.invokeMagicReflection = function(subject, target) { this._action._reflectionTarget = target; this._logWindow.displayReflection(target); this._action.apply(subject); this._logWindow.displayActionResults(target, subject); }; BattleManager.applySubstitute = function(target) { if (this.checkSubstitute(target)) { var substitute = target.friendsUnit().substituteBattler(); if (substitute && target !== substitute) { this._logWindow.displaySubstitute(substitute, target); return substitute; } } return target; }; BattleManager.checkSubstitute = function(target) { return target.isDying() && !this._action.isCertainHit(); }; BattleManager.isActionForced = function() { return !!this._actionForcedBattler; }; BattleManager.forceAction = function(battler) { this._actionForcedBattler = battler; var index = this._actionBattlers.indexOf(battler); if (index >= 0) { this._actionBattlers.splice(index, 1); } }; BattleManager.processForcedAction = function() { if (this._actionForcedBattler) { this._turnForced = true; this._subject = this._actionForcedBattler; this._actionForcedBattler = null; this.startAction(); this._subject.removeCurrentAction(); } }; BattleManager.abort = function() { this._phase = 'aborting'; }; BattleManager.checkBattleEnd = function() { if (this._phase) { if (this.checkAbort()) { return true; } else if ($gameParty.isAllDead()) { this.processDefeat(); return true; } else if ($gameTroop.isAllDead()) { this.processVictory(); return true; } } return false; }; BattleManager.checkAbort = function() { if ($gameParty.isEmpty() || this.isAborting()) { SoundManager.playEscape(); this._escaped = true; this.processAbort(); } return false; }; BattleManager.processVictory = function() { $gameParty.removeBattleStates(); $gameParty.performVictory(); this.playVictoryMe(); this.replayBgmAndBgs(); this.makeRewards(); this.displayVictoryMessage(); this.displayRewards(); this.gainRewards(); this.endBattle(0); }; BattleManager.processEscape = function() { $gameParty.performEscape(); SoundManager.playEscape(); var success = this._preemptive ? true : (Math.random() < this._escapeRatio); if (success) { this.displayEscapeSuccessMessage(); this._escaped = true; this.processAbort(); } else { this.displayEscapeFailureMessage(); this._escapeRatio += 0.1; $gameParty.clearActions(); this.startTurn(); } return success; }; BattleManager.processAbort = function() { $gameParty.removeBattleStates(); this.replayBgmAndBgs(); this.endBattle(1); }; BattleManager.processDefeat = function() { this.displayDefeatMessage(); this.playDefeatMe(); if (this._canLose) { this.replayBgmAndBgs(); } else { AudioManager.stopBgm(); } this.endBattle(2); }; BattleManager.endBattle = function(result) { this._phase = 'battleEnd'; if (this._eventCallback) { this._eventCallback(result); } if (result === 0) { $gameSystem.onBattleWin(); } else if (this._escaped) { $gameSystem.onBattleEscape(); } }; BattleManager.updateBattleEnd = function() { if (this.isBattleTest()) { AudioManager.stopBgm(); SceneManager.exit(); } else if (!this._escaped && $gameParty.isAllDead()) { if (this._canLose) { $gameParty.reviveBattleMembers(); SceneManager.pop(); } else { SceneManager.goto(Scene_Gameover); } } else { SceneManager.pop(); } this._phase = null; }; BattleManager.makeRewards = function() { this._rewards = {}; this._rewards.gold = $gameTroop.goldTotal(); this._rewards.exp = $gameTroop.expTotal(); this._rewards.items = $gameTroop.makeDropItems(); }; BattleManager.displayVictoryMessage = function() { $gameMessage.add(TextManager.victory.format($gameParty.name())); }; BattleManager.displayDefeatMessage = function() { $gameMessage.add(TextManager.defeat.format($gameParty.name())); }; BattleManager.displayEscapeSuccessMessage = function() { $gameMessage.add(TextManager.escapeStart.format($gameParty.name())); }; BattleManager.displayEscapeFailureMessage = function() { $gameMessage.add(TextManager.escapeStart.format($gameParty.name())); $gameMessage.add('\\.' + TextManager.escapeFailure); }; BattleManager.displayRewards = function() { this.displayExp(); this.displayGold(); this.displayDropItems(); }; BattleManager.displayExp = function() { var exp = this._rewards.exp; if (exp > 0) { var text = TextManager.obtainExp.format(exp, TextManager.exp); $gameMessage.add('\\.' + text); } }; BattleManager.displayGold = function() { var gold = this._rewards.gold; if (gold > 0) { $gameMessage.add('\\.' + TextManager.obtainGold.format(gold)); } }; BattleManager.displayDropItems = function() { var items = this._rewards.items; if (items.length > 0) { $gameMessage.newPage(); items.forEach(function(item) { $gameMessage.add(TextManager.obtainItem.format(item.name)); }); } }; BattleManager.gainRewards = function() { this.gainExp(); this.gainGold(); this.gainDropItems(); }; BattleManager.gainExp = function() { var exp = this._rewards.exp; $gameParty.allMembers().forEach(function(actor) { actor.gainExp(exp); }); }; BattleManager.gainGold = function() { $gameParty.gainGold(this._rewards.gold); }; BattleManager.gainDropItems = function() { var items = this._rewards.items; items.forEach(function(item) { $gameParty.gainItem(item, 1); }); }; //----------------------------------------------------------------------------- // PluginManager // // The static class that manages the plugins. function PluginManager() { throw new Error('This is a static class'); } PluginManager._path = 'js/plugins/'; PluginManager._scripts = []; PluginManager._errorUrls = []; PluginManager._parameters = {}; PluginManager.setup = function(plugins) { plugins.forEach(function(plugin) { if (plugin.status && !this._scripts.contains(plugin.name)) { this.setParameters(plugin.name, plugin.parameters); this.loadScript(plugin.name + '.js'); this._scripts.push(plugin.name); } }, this); }; PluginManager.checkErrors = function() { var url = this._errorUrls.shift(); if (url) { throw new Error('Failed to load: ' + url); } }; PluginManager.parameters = function(name) { return this._parameters[name.toLowerCase()] || {}; }; PluginManager.setParameters = function(name, parameters) { this._parameters[name.toLowerCase()] = parameters; }; PluginManager.loadScript = function(name) { var url = this._path + name; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.async = false; script.onerror = this.onError.bind(this); script._url = url; document.body.appendChild(script); }; PluginManager.onError = function(e) { this._errorUrls.push(e.target._url); };
Encontrar Diferença