Diff
checker
Texte
Texte
Images
Documents
Excel
Dossiers
Legal
Enterprise
Application de bureau
Prix
Se connecter
Télécharger Diffchecker Desktop
Comparer le texte
Trouver la différence entre deux fichiers texte
Outils
Historique
Éditeur live
Masquer les espaces
Cacher identiques
Sans retour à la ligne
Vue
Divisé
Unifié
Niveau de précision
Intelligent
Mot
Caractère
Styles de texte
Modifier l’apparence
Coloration syntaxique
Choisir la syntaxe
Ignorer
Transformer le texte
Aller au premier écart
Modifier l'entrée
Diffchecker Desktop
La façon la plus sécurisée d'utiliser Diffchecker. Obtenez l'application Diffchecker Desktop : vos diffs ne quittent jamais votre ordinateur !
Obtenir Desktop
rpg_managers.js versus new_rpg_managers.js
Créé
il y a 7 ans
Le diff n'expire jamais
Effacer
Exporter
Partager
Expliquer
34 suppressions
Lignes
Total
Supprimé
Caractères
Total
Supprimé
Pour continuer à utiliser cette fonctionnalité, passez à
Diff
checker
Pro
Voir les prix
847 lignes
Copier tout
34 ajouts
Lignes
Total
Ajouté
Caractères
Total
Ajouté
Pour continuer à utiliser cette fonctionnalité, passez à
Diff
checker
Pro
Voir les prix
842 lignes
Copier tout
//=============================================================================
//=============================================================================
// 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() {
Copier
Copié
Copier
Copié
// 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";
Copier
Copié
Copier
Copié
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) {
Copier
Copié
Copier
Copié
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");
Copier
Copié
Copier
Copié
} 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);
Copier
Copié
Copier
Copié
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);
Copier
Copié
Copier
Copié
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);
Copier
Copié
Copier
Copié
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";
Copier
Copié
Copier
Copié
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";
Copier
Copié
Copier
Copié
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);
Copier
Copié
Copier
Copié
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);
Copier
Copié
Copier
Copié
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) {
Copier
Copié
Copier
Copié
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
Différences enregistrées
Texte d'origine
Ouvrir un fichier
//============================================================================= // 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); };
Texte modifié
Ouvrir un fichier
//============================================================================= // 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); };
Trouver la différence