UNPKG

skynovel

Version:
191 lines (163 loc) 6.12 kB
/* ***** BEGIN LICENSE BLOCK ***** Copyright (c) 2018-2020 Famibee (famibee.blog38.fc2.com) This software is released under the MIT License. http://opensource.org/licenses/mit-license.php ** ***** END LICENSE BLOCK ***** */ import {HArg} from './CmnInterface'; // =============== Global export function int(o: any): number {return parseInt(String(o), 10)} export function uint(o: any): number { const v = parseInt(String(o), 10); return v < 0 ? -v : v; } export function trim(s: string): string {return s.replace(/^\s+|\s+$/g,'')} if (! ('toInt' in String.prototype)) { (String.prototype as any)['toInt'] = function () { return int(this); }; } if (! ('toUint' in String.prototype)) { (String.prototype as any)['toUint'] = function () { const v = int(this); return v < 0 ? -v : v; }; } if (! String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^\s+|\s+$/g,''); }; } export function getDateStr(spl_dd = '/', spl_dt = ' ', spl_tt = ':', spl_ms = ''): string { const now = new Date(); return now.getFullYear() + spl_dd+ String(100 +now.getMonth() +1).substr(1, 2) + spl_dd+ String(100 +now.getDate()).substr(1, 2) + spl_dt+ String(100 +now.getHours()).substr(1, 2) + spl_tt+ String(100 +now.getMinutes()).substr(1, 2) + (spl_ms == '' ?'' :spl_ms+ String(now.getMilliseconds())); } // =============== EventMng import {interaction, DisplayObject} from 'pixi.js'; import {EventListenerCtn} from './EventListenerCtn'; export interface IEvt2Fnc {(e: Event): void}; export interface IHEvt2Fnc {[name: string]: IEvt2Fnc;}; export interface IEvtMng { button(hArg: HArg, em: DisplayObject): void; isSkipKeyDown(): boolean; stdWait(fnc: (e?: interaction.InteractionEvent)=> void, canskip?: boolean): void; popLocalEvts(): IHEvt2Fnc; pushLocalEvts(a: IHEvt2Fnc): void; waitCustomEvent(hArg: HArg, elc: EventListenerCtn, fnc: ()=> void): void; resvFlameEvent(win: Window): void; } import m_path = require('path'); const platform = require('platform'); export class CmnLib { static stageW = 0; static stageH = 0; static ofsPadLeft_Dom2PIXI = 0; static ofsPadTop_Dom2PIXI = 0; static cvsWidth = 0; static cvsHeight = 0; static cvsScale = 1; static debugLog = false; static platform = {...platform}; static isSafari = platform.name == 'Safari'; static isFirefox = platform.name == 'Firefox'; static isMac = new RegExp('OS X').test(CmnLib.platform.os.family); static isMobile = ! new RegExp('(Windows|OS X)').test(CmnLib.platform.os.family); static hDip : {[name: string]: string} = {}; static isRetina = false; static isDarkMode = false; static retinaRate = 1; static readonly SN_ID = 'skynovel'; static argChk_Num(hash: any, name: string, def: number): number { const v = hash[name]; if (! (name in hash)) { if (isNaN(def)) throw '['+ hash['タグ名'] +']属性 '+ name +' は必須です'; hash[name] = def; return def; } const n = (String(v).substr(0, 2) == '0x') ? parseInt(v) : parseFloat(v); if (isNaN(n)) throw '['+ hash['タグ名'] +']属性 '+ name +' の値【'+ v +'】が数値ではありません'; return hash[name] = n; } /* それぞれの型を Boolean 型に変換した場合の値は以下のようになります。 Undefiend false Null false Boolean 変換前のオブジェクトと同じ Number 0 または NaN は false それ以外の値は true String 空文字列は false それ以外の値は true Object true */ static argChk_Boolean(hash: any, name: string, def: boolean): boolean { // t-r-a-c-e(Boolean(null),Boolean(""),Boolean(undefined),Boolean("0"),Boolean("1"),Boolean("true"),Boolean("false"),Boolean("あい")); // [exec] false false false true true true true true /*console.log('%o %o %o %o %o %o %o %o', Boolean(null), Boolean(""), Boolean(undefined), Boolean("0"), Boolean("1"), Boolean("true"), Boolean("false"), Boolean("あい")); */ //if (! hArg[name]) return hArg[name] = def; if (! (name in hash)) return hash[name] = def; const v = hash[name]; if (v == null) return false; const v2 = String(v); return hash[name] = (v2 == "false")? false : Boolean(v2); } static cvsResize(cvs: HTMLCanvasElement): boolean { const bk_cw = CmnLib.cvsWidth; const bk_ch = CmnLib.cvsHeight; let wiw = window.innerWidth; let wih = window.innerHeight; const wi: any = window; const lp = screen.orientation ? screen.orientation.type.charAt(0) : ((wi.orientation ?? 90) % 180 == 0) ?'p' :'l'; // 4Safari if (CmnLib.isMobile && ((lp == 'p' && wiw > wih) || (lp == 'l' && wiw < wih)) ) [wiw, wih] = [wih, wiw]; if (CmnLib.argChk_Boolean(CmnLib.hDip, 'expanding', true) || CmnLib.stageW > wiw || CmnLib.stageH > wih ) { if (CmnLib.stageW /CmnLib.stageH <= wiw /wih) { CmnLib.cvsHeight = wih; CmnLib.cvsWidth = CmnLib.stageW /CmnLib.stageH *wih; } else { CmnLib.cvsWidth = wiw; CmnLib.cvsHeight = CmnLib.stageH /CmnLib.stageW *wiw; } CmnLib.cvsScale = CmnLib.cvsWidth /CmnLib.stageW; const cr = cvs.getBoundingClientRect(); CmnLib.ofsPadLeft_Dom2PIXI = (CmnLib.isMobile ? (window.innerWidth -CmnLib.cvsWidth) /2 : cr.left ) *(1- CmnLib.cvsScale); CmnLib.ofsPadTop_Dom2PIXI = (CmnLib.isMobile ? (window.innerHeight -CmnLib.cvsHeight) /2 : cr.top ) *(1- CmnLib.cvsScale); // [left] /CmnLib.cvsScale -[left] // PaddingLeft を DOMで引いてPIXIで足すイメージ } else { CmnLib.cvsWidth = CmnLib.stageW; CmnLib.cvsHeight = CmnLib.stageH; CmnLib.cvsScale = 1; CmnLib.ofsPadLeft_Dom2PIXI = 0; CmnLib.ofsPadTop_Dom2PIXI = 0; } if (cvs.parentElement) { const ps = cvs.parentElement.style; ps.position = 'relative'; const s = cvs.style; ps.width = s.width = `${CmnLib.cvsWidth}px`; ps.height= s.height= `${CmnLib.cvsHeight}px`; } return bk_cw != CmnLib.cvsWidth || bk_ch != CmnLib.cvsHeight; } static readonly getFn = (path: string)=> m_path.basename(path, m_path.extname(path)); static readonly getExt = (path: string)=> m_path.extname(path).slice(1); }