//============================================================================= // 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)); } } })();