You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

637 lines
19 KiB
JavaScript

//=============================================================================
// Salted Fish Plugins - Core
// SF_Core.js
//=============================================================================
"use strict";
var Imported = Imported || {};
Imported.SF_Core = true;
var SF_Plugins = SF_Plugins || {};
//=============================================================================
/*:
* @plugindesc core lib for salted fish plugins
* @author Salted Fish
*/
//=============================================================================
(function () {
var SF_Core = {};
SF_Plugins.Core = SF_Core;
SF_Core.version = 1.0;
//=============================================================================
// Sprite
//=============================================================================
Sprite.prototype.canvasToLocalX = function (x) {
var node = this;
while (node) {
x -= node.x;
node = node.parent;
}
return x;
};
Sprite.prototype.canvasToLocalY = function (y) {
var node = this;
while (node) {
y -= node.y;
node = node.parent;
}
return y;
};
//=============================================================================
// Pointer
//=============================================================================
// event[array]: pointer-down, pointer-up, pointer-move, pointer-cancel
function Pointer() {
this.initialize.apply(this, arguments);
}
SF_Core.Pointer = Pointer;
Pointer.prototype = Object.create(Object.prototype);
Pointer.prototype.constructor = Pointer;
Pointer.prototype.initialize = function (x, y) {
this.x = x;
this.y = y;
this.event = [];
this.ext = null;
this.user = null;
}
Pointer.prototype.set = function (x, y) {
this.x = x;
this.y = y;
}
Pointer.prototype.setEvents = function (events) {
this.event = events;
}
Pointer.prototype.addEvent = function (event) {
this.event.push(event);
}
Pointer.prototype.clearEvent = function () {
this.event = [];
}
Pointer.prototype.getEvents = function () {
return this.event;
}
Pointer.prototype.setExt = function (ext) {
this.ext = ext;
}
Pointer.prototype.getExt = function () {
return this.ext;
}
Pointer.prototype.setUser = function (user) {
this.user = user;
}
Pointer.prototype.getUser = function () {
return this.user;
}
Pointer.prototype.removeUser = function () {
this.user = null;
}
Pointer.prototype.isEmpty = function () {
return this.event.length === 0;
}
Pointer.prototype.clear = function () {
this.event = [];
this.ext = null;
}
Pointer.prototype.isDown = function () {
return this.event.indexOf('pointer-down') >= 0;
}
Pointer.prototype.isUp = function () {
return this.event.indexOf('pointer-up') >= 0;
}
Pointer.prototype.isMove = function () {
return this.event.indexOf('pointer-move') >= 0;
}
Pointer.prototype.isCancel = function () {
return this.event.indexOf('pointer-cancel') >= 0;
}
Pointer.prototype.isCanUsed = function (user) {
return this.user === user || this.user === null;
}
//=============================================================================
// TouchInput
//=============================================================================
SF_Core.TouchInput_clear = TouchInput.clear;
TouchInput.clear = function () {
SF_Core.TouchInput_clear.call(this);
this._pointer = {};
this._losedPointer = [];
this._mouseValid = false;
this._mouse = new Pointer(0, 0);
this._events._mouse = new Pointer(0, 0);
this._events._mouseValid = false;
this._events.event = null;
this._events._pointer = {};
this._events._losedPointer = [];
}
SF_Core.TouchInput_update = TouchInput.update;
TouchInput.update = function () {
SF_Core.TouchInput_update.call(this);
// update mouse
if (this._events._mouseValid) {
this._mouse.set(this._events._mouse.x, this._events._mouse.y);
this._mouse.setEvents(this._events._mouse.getEvents());
this._mouse.setExt(this._events._mouse.getExt());
this._mouseValid = true;
this._events._mouseValid = false;
this._events._mouse.clear();
} else {
this._mouse.clear();
}
// update pointer
this._losedPointer = this._events._losedPointer;
this._events._losedPointer = [];
// delete losed pointer
var tmp_pointer = {};
for (var i in this._pointer) {
var pointer = this._pointer[i];
if (pointer.isCancel() || pointer.isUp()) {
continue;
}
tmp_pointer[i] = pointer;
}
this._pointer = tmp_pointer;
for (var i in this._events._pointer) {
var pointer = this._events._pointer[i];
if (pointer.isCancel() || pointer.isUp()) {
SF_Core.Utils.error('pointer cancel or up');
}
var p = this._pointer[i];
if (p) {
p.set(pointer.x, pointer.y);
p.setEvents(pointer.getEvents());
p.setExt(pointer.getExt());
} else {
this._pointer[i] = pointer;
}
}
}
SF_Core.TouchInput_onMouseDown = TouchInput._onMouseDown;
TouchInput._onMouseDown = function (event) {
SF_Core.TouchInput_onMouseDown.call(this, event);
this._events.event = event;
this._events._mouseValid = true;
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
this._events._mouse.set(x, y);
this._events._mouse.addEvent('pointer-down');
}
SF_Core.TouchInput__onMouseMove = TouchInput._onMouseMove;
TouchInput._onMouseMove = function (event) {
SF_Core.TouchInput__onMouseMove.call(this, event);
this._events.event = event;
this._events._mouseValid = true;
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
this._events._mouse.set(x, y);
this._events._mouse.addEvent('pointer-move');
}
SF_Core.TouchInput__onMouseUp = TouchInput._onMouseUp;
TouchInput._onMouseUp = function (event) {
SF_Core.TouchInput__onMouseUp.call(this, event);
this._events.event = event;
this._events._mouseValid = true;
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
this._events._mouse.set(x, y);
this._events._mouse.addEvent('pointer-up');
}
SF_Core.TouchInput__onMouseWheel = TouchInput._onMouseWheel;
TouchInput._onMouseWheel = function (event) {
SF_Core.TouchInput__onMouseWheel.call(this, event);
this._events.event = event;
}
SF_Core.TouchInput__onTouchStart = TouchInput._onTouchStart;
TouchInput._onTouchStart = function (event) {
SF_Core.TouchInput__onTouchStart.call(this, event);
this._events.event = event;
this._pointerFromTouch(event, "pointer-down");
}
SF_Core.TouchInput__onTouchMove = TouchInput._onTouchMove;
TouchInput._onTouchMove = function (event) {
SF_Core.TouchInput__onTouchMove.call(this, event);
this._events.event = event;
this._pointerFromTouch(event, "pointer-move");
}
SF_Core.TouchInput__onTouchEnd = TouchInput._onTouchEnd;
TouchInput._onTouchEnd = function (event) {
SF_Core.TouchInput__onTouchEnd.call(this, event);
//console.log(event.changedTouches);
this._events.event = event;
this._pointerFromTouch(event, "pointer-up");
}
SF_Core.TouchInput__onTouchCancel = TouchInput._onTouchCancel;
TouchInput._onTouchCancel = function (event) {
SF_Core.TouchInput__onTouchCancel.call(this, event);
this._events.event = event;
this._pointerFromTouch(event, "pointer-cancel");
}
TouchInput._pointerFromTouch = function (event, type) {
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var x = Graphics.pageToCanvasX(touch.pageX);
var y = Graphics.pageToCanvasY(touch.pageY);
var id = touch.identifier;
var pointer = this._events._pointer[id];
if (!pointer) {
pointer = new Pointer(x, y);
this._events._pointer[id] = pointer;
}
pointer.set(x, y);
pointer.addEvent(type);
switch (type) {
case "pointer-down":
break;
case "pointer-up":
case "pointer-cancel":
delete this._events._pointer[id];
this._events._losedPointer.push(pointer);
break;
}
}
}
TouchInput.getPointers = function (user) {
var result = [];
if (this._mouseValid && this._mouse.isCanUsed(user)) {
result.push(this._mouse);
}
for (var i = 0; i < this._losedPointer.length; i++) {
var pointer = this._losedPointer[i];
if (pointer.isCanUsed(user)) {
result.push(pointer);
}
}
for (var i in this._pointer) {
var pointer = this._pointer[i];
if (pointer.isCanUsed(user)) {
result.push(pointer);
}
}
return result;
}
TouchInput.removeUsers = function () {
for (var i in this._pointer) {
var pointer = this._pointer[i];
pointer.removeUser();
}
for (var i = 0; i < this._losedPointer.length; i++) {
var pointer = this._losedPointer[i];
pointer.removeUser();
}
this._mouse.removeUser();
}
//=============================================================================
// PIXI.Container
//=============================================================================
PIXI.Container.prototype.getPointer = function () {
var pointers = TouchInput.getPointers(this);
var lastUsePointer = null;
var inFramePointer = null;
for (var i = 0; i < pointers.length; i++) {
if (pointers[i].getUser() === this) {
lastUsePointer = pointers[i];
break;
}
if (this.containsPoint(new Point(pointers[i].x, pointers[i].y))) {
inFramePointer = pointers[i];
}
}
return lastUsePointer || inFramePointer || pointers[0] || null;
}
PIXI.Container.prototype.releasePointer = function () {
var pointer = this.getPointer();
if (pointer) {
pointer.removeUser();
}
}
//=============================================================================
// SF_Utils
//=============================================================================
SF_Core.Utils = {};
SF_Core.Utils.assert = function (condition, message) {
if (!condition) {
SF_Core.Utils.error(message);
}
};
SF_Core.Utils.error = function (message) {
if (typeof console === "object") {
console.error(message);
}
throw new Error(message);
};
SF_Core.Utils.isPC = function () {
return !!Utils.isNwjs();
}
SF_Core.Utils.isAndroid = function () {
return !!window.FileUtils && !SF_Core.Utils.isPC();
}
SF_Core.Utils.isWeb = function () {
return !SF_Core.Utils.isPC() && !SF_Core.Utils.isAndroid();
}
//=============================================================================
// CallBack Scope Transport
//=============================================================================
function CallBack() {
throw new Exception("this is static method");
}
window.CallBack = CallBack;
CallBack.initialize = function () {
this.clear();
}
// Return closureIndex
CallBack.getNew = function () {
var closureIndex = this._closureIndex++;
return closureIndex;
}
CallBack.setByClosureIndex = function (closureIndex, closureFunction) {
this._closureFunction[closureIndex] = closureFunction;
}
CallBack.unregister = function (closureIndex) {
delete this._closureFunction[closureIndex];
}
CallBack.callByClosureIndex = function (closureIndex) {
if (this._closureFunction[closureIndex]) {
this._closureFunction[closureIndex]();
}
}
CallBack.convertToString = function (closureIndex) {
return "CallBack.callByClosureIndex(" + closureIndex + ")";
}
CallBack.clear = function () {
this._closureFunction = {};
this._closureIndex = 0;
}
CallBack.registerOneTime = function (closureFunction) {
var closureIndex = this.getNew();
this.setByClosureIndex(closureIndex, (function () { closureFunction(); this.unregister(closureIndex); }).bind(this));
return this.convertToString(closureIndex);
}
CallBack.registerOneTimeList = function (closureFunctionList) {
var indexList = [];
var result = [];
for (var i = 0; i < closureFunctionList.length; i++) {
var index = this.getNew();
indexList.push(index);
}
var removeAllFunc = (function () {
for (var i = 0; i < indexList.length; i++) {
this.unregister(indexList[i]);
}
}).bind(this);
for (var i = 0; i < indexList.length; i++) {
this.setByClosureIndex(indexList[i], (function (i) {
return (function () { closureFunctionList[i](); removeAllFunc(); });
})(i).bind(this));
result.push(this.convertToString(indexList[i]));
}
return result;
}
//=============================================================================
// FileUtils
//=============================================================================
if (SF_Core.Utils.isPC()) {
var FileUtils = window.FileUtils || {};
window.FileUtils = FileUtils;
var fs = require('fs');
var path = require('path');
var crypto = require('crypto');
FileUtils.evaluateJavascript = function (script) {
(new Function(script)).call(window);
}
FileUtils.canExecute = function (fileName) {
try {
fs.accessSync(fileName, fs.X_OK);
return true;
} catch (e) {
return false;
}
}
FileUtils.canRead = function (fileName) {
try {
fs.accessSync(fileName, fs.R_OK);
return true;
} catch (e) {
return false;
}
}
FileUtils.canWrite = function (fileName) {
try {
fs.accessSync(fileName, fs.W_OK);
return true;
} catch (e) {
return false;
}
}
FileUtils.createNewFile = function (fileName) {
try {
fs.writeFileSync(fileName, "");
return true;
} catch (e) {
return false;
}
}
FileUtils.delete = function (fileName) {
try {
fs.unlinkSync(fileName);
return true;
} catch (e) {
return false;
}
}
FileUtils.exists = function (fileName) {
try {
fs.accessSync(fileName, fs.F_OK);
return true;
} catch (e) {
return false;
}
}
FileUtils.getAbsolutePath = function (fileName) {
return path.resolve(fileName);
}
FileUtils.getCanonicalPath = function (fileName) {
return path.resolve(fileName);
}
FileUtils.getName = function (fileName) {
return path.basename(fileName);
}
FileUtils.getParent = function (fileName) {
return path.dirname(fileName);
}
FileUtils.getPath = function (fileName) {
return path.resolve(fileName);
}
FileUtils.isAbsolute = function (fileName) {
return path.isAbsolute(fileName);
}
FileUtils.isDirectory = function (fileName) {
return fs.statSync(fileName).isDirectory();
}
FileUtils.isFile = function (fileName) {
return fs.statSync(fileName).isFile();
}
FileUtils.lastModified = function (fileName) {
return fs.statSync(fileName).mtime.getTime();
}
FileUtils.length = function (fileName) {
return fs.statSync(fileName).size;
}
FileUtils.list = function (dirName) {
return fs.readdirSync(dirName);
}
FileUtils.mkdir = function (fileName) {
try {
fs.mkdirSync(fileName);
return true;
} catch (e) {
return false;
}
}
FileUtils.mkdirs = function (fileName) {
try {
fs.mkdirSync(fileName, { recursive: true });
return true;
} catch (e) {
return false;
}
}
FileUtils.reanmeTo = function (srcName, dstName) {
try {
fs.renameSync(oldFileName, newFileName);
return true;
} catch (e) {
return false;
}
}
FileUtils.toString = function (fileName) {
return path.resolve(fileName);
}
FileUtils.readTextFile = function (fileName) {
return fs.readFileSync(fileName, 'utf-8');
}
FileUtils.writeTextFile = function (fileName, text) {
return fs.writeFileSync(fileName, text, 'utf-8');
}
FileUtils.getFileHashHex = function (fileName, algorithm) {
var hash = crypto.createHash(algorithm || 'SHA512');
var data = fs.readFileSync(fileName);
hash.update(data);
return hash.digest('hex');
}
}
if (SF_Core.Utils.isAndroid()) {
var FileUtils_List = FileUtils.list;
FileUtils.list = function (name) {
return JsonEx.parse(FileUtils_List.call(this, arguments));
}
}
})();