Diff
checker
Text
Text
Bilder
Dokumente
Excel
Ordner
Legal
Enterprise
Desktop-App
Preise
Einloggen
Diffchecker Desktop herunterladen
Texte vergleichen
Finde den Unterschied zwischen zwei Textdateien
Werkzeuge
Verlauf
Live-Editor
Leerzeichen ausblenden
Gleiches ausblenden
Zeilenumbruch aus
Ansicht
Zweispaltig
Einspaltig
Vergleichsgenauigkeit
Intelligent
Wort
Zeichen
Textstile
Darstellung ändern
Syntaxhervorhebung
Syntax auswählen
Ignorieren
Text umwandeln
Zur ersten Änderung
Eingabe bearbeiten
Diffchecker Desktop
Der sicherste Weg, Diffchecker zu nutzen. Hol dir die Desktop-App: Deine Diffs verlassen nie deinen Computer!
Desktop holen
rpg_managers.js versus new_rpg_managers.js
Erstellt
vor 7 Jahren
Diff läuft nie ab
Löschen
Exportieren
Teilen
Erklären
34 Entfernungen
Zeilen
Gesamt
Entfernt
Zeichen
Gesamt
Entfernt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
847 Zeilen
Kopieren
34 Hinzufügungen
Zeilen
Gesamt
Hinzugefügt
Zeichen
Gesamt
Hinzugefügt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
842 Zeilen
Kopieren
//=============================================================================
//=============================================================================
// 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() {
Kopieren
Kopiert
Kopieren
Kopiert
// 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";
Kopieren
Kopiert
Kopieren
Kopiert
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) {
Kopieren
Kopiert
Kopieren
Kopiert
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");
Kopieren
Kopiert
Kopieren
Kopiert
} 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);
Kopieren
Kopiert
Kopieren
Kopiert
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);
Kopieren
Kopiert
Kopieren
Kopiert
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);
Kopieren
Kopiert
Kopieren
Kopiert
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";
Kopieren
Kopiert
Kopieren
Kopiert
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";
Kopieren
Kopiert
Kopieren
Kopiert
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);
Kopieren
Kopiert
Kopieren
Kopiert
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);
Kopieren
Kopiert
Kopieren
Kopiert
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) {
Kopieren
Kopiert
Kopieren
Kopiert
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
Gespeicherte Diffs
Originaltext
Datei öffnen
//============================================================================= // 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); };
Bearbeitung
Datei öffnen
//============================================================================= // 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); };
Unterschied finden