2022-11-13 18:02:05 +08:00
/** 工具类 主要用来进行一些辅助函数的计算 */
declare class utils {
/ * *
* 将 一 段 文 字 中 的 $ { } ( 表 达 式 ) 进 行 替 换 。
* @example core . replaceText ( '衬衫的价格是${status:hp}镑${item:yellowKey}便士。' ) ; // 把主角的生命值和持有的黄钥匙数量代入这句话
* @param text 模 板 字 符 串 , 可 以 使 用 $ { } 计 算 js表达式 , 支 持 “ 状 态 、 物 品 、 变 量 、 独 立 开 关 、 全 局 存 储 、 图 块 id 、 图 块 类 型 、 敌 人 数 据 、 装 备 id ” 等 量 参 与 运 算
* @returns 替 换 完 毕 后 的 字 符 串
* /
replaceText ( text : string , prefix? : string ) : string ;
/ * *
* 对 一 个 表 达 式 中 的 特 殊 规 则 进 行 替 换 , 如status :xxx等 。
* @example core . replaceValue ( '衬衫的价格是${status:hp}镑${item:yellowKey}便士。' ) ; // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用
* @param value 模 板 字 符 串 , 注 意 独 立 开 关 不 会 被 替 换
* @returns 替 换 完 毕 后 的 字 符 串
* /
replaceValue ( value : string ) : string ;
/ * *
* 计 算 一 个 表 达 式 的 值 , 支持status :xxx等的计算 。
* @example core . calValue ( 'status:hp + status:def' ) ; // 计算主角的生命值加防御力
* @param value 待 求 值 的 表 达 式
* @param prefix 独 立 开 关 前 缀 , 一 般 可 省 略
* @returns 求 出 的 值
* /
calValue ( value : string , prefix? : string ) : any ;
/ * *
* 将 b ( 可 以 是 另 一 个 数 组 ) 插 入 数 组 a的开头 , 此 函 数 用 于 弥 补 a . unshift ( b ) 中 b只能是单项的不足 。
* @example core . unshift ( todo , { type : 'unfollow' } ) ; // 在事件指令数组todo的开头插入“取消所有跟随者”指令
* @param a 原 数 组
* @param b 待 插 入 的 新 首 项 或 前 缀 数 组
* @returns 插 入 完 毕 后 的 新 数 组 , 它 是 改 变 原 数 组 a本身得到的
* /
unshift ( a : any [ ] , b : any ) : any [ ] ;
/ * *
* 将 b ( 可 以 是 另 一 个 数 组 ) 插 入 数 组 a的末尾 , 此 函 数 用 于 弥 补 a . push ( b ) 中 b只能是单项的不足 。
* @example core . push ( todo , { type : 'unfollow' } ) ; // 在事件指令数组todo的末尾插入“取消所有跟随者”指令
* @param a 原 数 组
* @param b 待 插 入 的 新 末 项 或 后 缀 数 组
* @returns 插 入 完 毕 后 的 新 数 组 , 它 是 改 变 原 数 组 a本身得到的
* /
push ( a : any [ ] , b : any ) : any [ ] ;
/ * *
* 设 置 一 个 全 局 存 储 , 适用于global :xxx , 录 像 播 放 时 将 忽 略 此 函 数 。
* @example core . setBlobal ( '一周目已通关' , true ) ; // 设置全局存储“一周目已通关”为true, 方便二周目游戏中的新要素。
* @param key 全 局 变 量 名 称 , 支 持 中 文
* @param value 全 局 变 量 的 新 值 , 不 填 或 null表示清除此全局存储
* /
setGlobal ( key : string , value? : any ) : void ;
/ * *
* 读 取 一 个 全 局 存 储 , 适用于global :xxx , 支 持 录 像 。
* @example if ( core . getGlobal ( '一周目已通关' , false ) === true ) core . getItem ( 'dagger' ) ; // 二周目游戏进行到此处时会获得一把屠龙匕首
* @param key 全 局 变 量 名 称 , 支 持 中 文
* @param defaultValue 可 选 , 当 此 全 局 变 量 不 存 在 或 值 为 null 、 undefined时 , 用 此 值 代 替
* @returns 全 局 变 量 的 值
* /
getGlobal ( key : string , defaultValue? : any ) : any ;
/ * *
* 深 拷 贝 一 个 对 象 ( 函 数 将 原 样 返 回 )
* @example core . clone ( core . status . hero , ( name , value ) = > ( name == 'items' || typeof value == 'number' ) , false ) ; // 深拷贝主角的属性和道具
* @param data 待 拷 贝 对 象
* @param filter 过 滤 器 , 可 选 , 表 示 data为数组或对象时拷贝哪些项或属性 , true表示拷贝
* @param recursion 过 滤 器 是 否 递 归 , 可 选 。 true表示过滤器也被递归
* @returns 拷 贝 的 结 果 , 注 意 函 数 将 原 样 返 回
* /
clone < T > (
data? : T ,
filter ? : ( name : string , value : any ) = > boolean ,
recursion? : boolean
) : T ;
/** 深拷贝一个1D或2D的数组 */
cloneArray (
data? : Array < number > | Array < Array < number > >
) : Array < number > | Array < Array < number > > ;
/ * *
* 等 比 例 切 分 一 张 图 片
* @example core . splitImage ( core . material . images . images [ 'npc48.png' ] , 32 , 48 ) ; // 把npc48.png切分成若干32× 48px的小人
* @param image 图 片 名 ( 支 持 映 射 前 的 中 文 名 ) 或 图 片 对 象 ( 参 见 上 面 的 例 子 ) , 获 取 不 到 时 返 回 [ ]
* @param width 子 图 的 宽 度 , 单 位 为 像 素 。 原 图 总 宽 度 必 须 是 其 倍 数 , 不 填 视 为 32
* @param height 子 图 的 高 度 , 单 位 为 像 素 。 原 图 总 高 度 必 须 是 其 倍 数 , 不 填 视 为 正 方 形
* @returns 子 图 组 成 的 数 组 , 在 原 图 中 呈 先 行 后 列 , 从 左 到 右 、 从 上 到 下 排 列 。
* /
splitImage (
image? : string | HTMLImageElement ,
width? : number ,
height? : number
) : HTMLImageElement [ ] ;
/ * *
* 大 数 字 格 式 化 , 单 位 为 10000 的 倍 数 ( w , e , z , j , g ) , 末 尾 四 舍 五 入
* @example core . formatBigNumber ( 123456789 , false ) ; // "12346w"
* @param x 原 数 字
* @param onMap 可 选 , true表示用于地图显伤 , 结 果 总 字 符 数 最 多 为 5 , 否 则 最 多 为 6
* @returns 格 式 化 结 果
* /
2022-11-19 11:30:14 +08:00
formatBigNumber (
x : number | string ,
onMap? : boolean ,
onCritical? : boolean
) : string ;
2022-11-13 18:02:05 +08:00
/** 变速移动 */
applyEasing ( mode? : string ) : ( number ) = > number ;
/ * *
* 颜 色 数 组 转 十 六 进 制
* @example core . arrayToRGB ( [ 102 , 204 , 255 ] ) ; // "#66ccff",加载画面的宣传色
* @param color 一 行 三 列 的 数 组 , 各 元 素 必 须 为 不 大 于 255 的 自 然 数
* @returns 该 颜 色 的 十 六 进 制 表 示 , 使 用 小 写 字 母
* /
arrayToRGB ( color : [ number , number , number ] ) : string ;
/ * *
* 颜 色 数 组 转 字 符 串
* @example core . arrayToRGBA ( [ 102 , 204 , 255 ] ) ; // "rgba(102,204,255,1)"
* @param color 一 行 三 列 或 一 行 四 列 的 数 组 , 前 三 个 元 素 必 须 为 不 大 于 255 的 自 然 数 。 第 四 个 元 素 ( 如 果 有 ) 必 须 为 0 或 不 大 于 1 的 数 字 , 第 四 个 元 素 不 填 视 为 1
* @returns 该 颜 色 的 字 符 串 表 示
* /
2022-11-19 11:30:14 +08:00
arrayToRGBA ( color : [ number , number , number , number ? ] | string ) : string ;
2022-11-13 18:02:05 +08:00
/ * *
* 录 像 一 压 , 其 结 果 会 被 再 次 base64压缩
* @example core . encodeRoute ( core . status . route ) ; // 一压当前录像
* @param route 原 始 录 像 , 自 定 义 内 容 ( 不 予 压 缩 , 原 样 写 入 ) 必 须 由 0 - 9 A - Za - z和下划线 、 冒 号 组 成 , 所 以 中 文 和 数 组 需 要 用 JSON . stringify预处理再base64压缩才能交由一压
* @returns 一 压 的 结 果
* /
encodeRoute ( route : string [ ] ) : string ;
/ * *
* 录 像 解 压 的 最 后 一 步 , 即 一 压 的 逆 过 程
* @example core . decodeRoute ( core . encodeRoute ( core . status . route ) ) ; // 一压当前录像再解压-_-|
* @param route 录 像 解 压 倒 数 第 二 步 的 结 果 , 即 一 压 的 结 果
* @returns 原 始 录 像
* /
decodeRoute ( route : string ) : string [ ] ;
/ * *
* 判 断 一 个 值 是 否 不 为 null , undefined和NaN
* @example core . isset ( 0 / 0 ) ; // false, 因为0/0等于NaN
* @param v 待 测 值 , 可 选
* @returns false表示待测值为null 、 undefined 、 NaN或未填写 , true表示为其他值 。 即 ! ( v == null || v != v )
* /
isset ( v? : any ) : boolean ;
/ * *
* 判 定 一 个 数 组 是 否 为 另 一 个 数 组 的 前 缀 , 用 于 录 像 接 续 播 放 。 请 注 意 函 数 名 没 有 大 写 字 母
* @example core . subarray ( [ 'ad' , '米库' , '小精灵' , '小破草' , '小艾' ] , [ 'ad' , '米库' , '小精灵' ] ) ; // ['小破草', '小艾']
* @param a 可 能 的 母 数 组 , 不 填 或 比 b短将返回null
* @param b 可 能 的 前 缀 , 不 填 或 比 a长将返回null
* @returns 如 果 b不是a的前缀将返回null , 否 则 将 返 回 a去掉此前缀后的剩余数组
* /
subarray ( a? : any [ ] , b? : any [ ] ) : any [ ] | null ;
/ * *
* 判 定 array是不是一个数组 , 以 及 element是否在该数组中 。
* @param array 可 能 的 数 组 , 不 为 数 组 或 不 填 将 导 致 返 回 值 为 false
* @param element 待 查 找 的 元 素
* @returns 如 果 array为数组且具有element这项 , 就 返 回 true , 否 则 返 回 false
* /
inArray ( array? : any , element? : any ) : boolean ;
/ * *
* 将 x限定在 [ a , b ] 区 间 内 , 注 意 a和b可交换
* @example core . clamp ( 1200 , 1 , 1000 ) ; // 1000
* @param x 原 始 值 , ! x为true时x一律视为0
* @param a 下 限 值 , 大 于 b将导致与b交换
* @param b 上 限 值 , 小 于 a将导致与a交换
* /
clamp ( x : number , a : number , b : number ) : number ;
/ * *
* 填 写 非 自 绘 状 态 栏
* @example core . setStatusBarInnerHTML ( 'hp' , core . status . hero . hp , 'color: #66CCFF' ) ; // 更新状态栏中的主角生命,使用加载画面的宣传色
* @param name 状 态 栏 项 的 名 称 , 如 'hp' , 'atk' , 'def' 等 。 必 须 是 core . statusBar中的一个合法项
* @param value 要 填 写 的 内 容 , 大 数 字 会 被 格 式 化 为 至 多 6 个 字 符 , 无 中 文 的 内 容 会 被 自 动 设 为 斜 体
* @param css 额 外 的 css样式 , 可 选 。 如 更 改 颜 色 等
* /
setStatusBarInnerHTML ( name : string , value : any , css? : string ) : void ;
/ * *
* 求 字 符 串 的 国 标 码 字 节 数 , 也 可 用 于 等 宽 字 体 下 文 本 的 宽 度 测 算 。 请 注 意 样 板 的 默 认 字 体 Verdana不是等宽字体
* @example core . strlen ( '无敌ad' ) ; // 6
* @param str 待 测 字 符 串
* @returns 字 符 串 的 国 标 码 字 节 数 , 每 个 汉 字 为 2 , 每 个 ASCII字符为1
* /
strlen ( str : string ) : number ;
/ * *
* 通 配 符 匹 配 , 用 于 搜 索 图 块 等 批 量 处 理 。
* @example core . playSound ( core . matchWildcard ( '*Key' , itemId ) ? 'item.mp3' : 'door.mp3' ) ; // 判断捡到的是钥匙还是别的道具,从而播放不同的音效
* @param pattern 模 式 串 , 每 个 星 号 表 示 任 意 多 个 ( 0 个 起 ) 字 符
* @param string 待 测 串
* @returns true表示匹配成功 , false表示匹配失败
* /
matchWildcard ( pattern : string , string : string ) : boolean ;
/ * *
* base64加密
* @example core . encodeBase64 ( 'If you found this note in a small wooden box with a heart on it' ) ; // "SWYgeW91IGZvdW5kIHRoaXMgbm90ZSBpbiBhIHNtYWxsIHdvb2RlbiBib3ggd2l0aCBhIGhlYXJ0IG9uIGl0"
* @param str 明 文
* @returns 密 文
* /
encodeBase64 ( str : string ) : string ;
/ * *
* base64解密
* @example core . decodeBase64 ( 'SWYgeW91IGZvdW5kIHRoaXMgbm90ZSBpbiBhIHNtYWxsIHdvb2RlbiBib3ggd2l0aCBhIGhlYXJ0IG9uIGl0' ) ; // "If you found this note in a small wooden box with a heart on it"
* @param str 密 文
* @returns 明 文
* /
decodeBase64 ( str : string ) : string ;
/ * *
* 不 支 持 SL的随机数
* @exmaple 1 + core . rand ( 6 ) ; // 随机生成一个小于7的正整数, 模拟骰子的效果
* @param num 填 正 数 表 示 生 成 小 于 num的随机自然数 , 否 则 生 成 小 于 1 的 随 机 正 数
* @returns 随 机 数 , 即 使 读 档 也 不 会 改 变 结 果
* /
rand ( num? : number ) : number ;
/ * *
* 支 持 SL的随机数 , 并 计 入 录 像
* @exmaple 1 + core . rand2 ( 6 ) ; // 随机生成一个小于7的正整数, 模拟骰子的效果
* @param num 正 整 数 , 0 或 不 填 会 被 视 为 2147483648
* @returns 属 于 [ 0 , num ) 的 随 机 数
* /
rand2 ( num? : number ) : number ;
/ * *
* 弹 窗 请 求 下 载 一 个 文 本 文 件
* @example core . download ( 'route.txt' , core . status . route ) ; // 弹窗请求下载录像
* @param filename 文 件 名
* @param content 文 件 内 容
* /
download ( filename : string , content : string | String [ ] ) : void ;
/ * *
* 显 示 确 认 框 , 类 似 core . drawConfirmBox ( )
* @example core . myconfirm ( '重启游戏?' , core . restart ) ; // 弹窗询问玩家是否重启游戏
* @param hint 弹 窗 的 内 容
* @param yesCallback 确 定 后 的 回 调 函 数
* @param noCallback 取 消 后 的 回 调 函 数 , 可 选
* /
myconfirm (
hint : string ,
yesCallback : ( ) = > void ,
noCallback ? : ( ) = > void
) : void ;
/ * *
* 判 定 深 层 相 等 , 会 逐 层 比 较 每 个 元 素
* @example core . same ( [ '1' , 2 ] , [ '1' , 2 ] ) ; // true
* /
same ( a? : any , b? : any ) : boolean ;
/ * *
* 尝 试 请 求 读 取 一 个 本 地 文 件 内 容 [ 异 步 ]
* @param success 成 功 后 的 回 调
* @param error 失 败 后 的 回 调
* @param readType 不 设 置 则 以 文 本 读 取 , 否 则 以 DataUrl形式读取
* /
readFile ( success , error , readType ) : void ;
/ * *
* 文 件 读 取 完 毕 后 的 内 容 处 理 [ 异 步 ]
* @param content
* /
readFileContent ( content ) : void ;
/ * *
* 尝 试 复 制 一 段 文 本 到 剪 切 板 。
* /
copy ( data : string ) : void ;
/ * *
* 发 送 一 个 HTTP请求 [ 异 步 ]
* @param type 请 求 类 型
* @param url 目 标 地 址
* @param formData 如 果 是 POST请求则为表单数据
* @param success 成 功 后 的 回 调
* @param error 失 败 后 的 回 调
* /
http (
type : 'GET' | 'POST' ,
url : string ,
formData : FormData ,
success : ( ) = > void ,
error : ( ) = > void
) : void ;
/** 获得浏览器唯一的guid */
getGuid ( ) : string ;
/** 解压缩一个数据 */
decompress ( value : any ) : any ;
/** 设置本地存储 */
setLocalStorage ( key : string , value? : any ) : void ;
/** 获得本地存储 */
getLocalStorage ( key : string , defaultValue? : any ) : any ;
/** 移除本地存储 */
removeLocalStorage ( key : string ) : void ;
/** 往数据库写入一段数据 */
setLocalForage (
key : string ,
value? : any ,
successCallback ? : ( ) = > void ,
errorCallback ? : ( ) = > void
) : void ;
/** 从数据库读出一段数据 */
getLocalForage (
key : string ,
defaultValue? : any ,
successCallback ? : ( data : any ) = > void ,
errorCallback ? : ( ) = > void
) : void ;
/** 移除数据库的数据 */
removeLocalForage (
key : string ,
successCallback ? : ( ) = > void ,
errorCallback ? : ( ) = > void
) : void ;
/** 格式化日期为字符串 */
formatDate ( date : Date ) : string ;
/** 格式化日期为最简字符串 */
formatDate2 ( date : Date ) : string ;
/** 格式化时间 */
formatTime ( time : number ) : string ;
/** 两位数显示 */
setTwoDigits ( x : number ) : string ;
/** 格式化文件大小 */
formatSize ( size : number ) : string ;
/** 访问浏览器cookie */
getCookie ( name : string ) : string ;
/ * *
* 计 算 应 当 转 向 某 个 方 向
* @param turn 转 向 的 方 向
* @param direction 当 前 方 向
* /
turnDirection (
turn : 'up' | 'down' | 'left' | 'right' | ':left' | ':right' | ':back' ,
direction? : string
) : string ;
/** 是否满足正则表达式 */
matchRegex ( pattern : string , string : string ) : string ;
/** 让用户输入一段文字 */
myprompt (
hint : string ,
value : string ,
callback ? : ( data? : string ) = > any
) : void ;
/** 动画显示某对象 */
showWithAnimate ( obj? : any , speed? : number , callback ? : ( ) = > any ) : void ;
/** 动画使某对象消失 */
hideWithAnimate ( obj? : any , speed? : number , callback ? : ( ) = > any ) : void ;
/** 解压一段内容 */
unzip (
blobOrUrl? : any ,
success ? : ( data : any ) = > void ,
error ? : ( error : string ) = > void ,
convertToText? : boolean ,
onprogress ? : ( loaded : number , total : number ) = > void
) : void ;
}
interface TextContentConfig {
left? : number ;
top? : number ;
maxWidth? : number ;
color? : rgbarray | string ;
align ? : 'left' | 'center' | 'right' ;
fontSize : number ;
lineHeight? : number ;
time? : number ;
font? : string ;
letterSpacing? : number ;
bold? : boolean ;
italic? : boolean ;
}
type direction = 'up' | 'down' | 'left' | 'right' ;
type move = 'forward' | direction ;
type loc = { direction : direction ; x : number ; y : number } ;
type rgbarray = [ number , number , number , number ] ;
2022-11-16 23:01:23 +08:00
type BlockCls =
| 'terrain'
| 'animate'
| 'enemy'
| 'item'
| 'enemy48'
| 'npcs'
| 'npc48'
| 'autotile'
| 'tilesets' ;
2022-11-13 18:02:05 +08:00
type Events = MotaAction [ ] | string ;
type Block = {
x : number ;
y : number ;
id : number ;
event : {
cls : string ;
id : string ;
[ key : string ] : any ;
} ;
} ;
type frameObj = {
angle : number ;
index : number ;
mirror : number ;
opacity : number ;
x : number ;
y : number ;
zoom : number ;
} ;
type CtxRefer =
| string
| CanvasRenderingContext2D
| HTMLCanvasElement
| HTMLImageElement ;
type Animate = {
frame : number ;
frames : frameObj [ ] [ ] ;
images : HTMLImageElement [ ] ;
ratio : number ;
se : string ;
} ;
type Floor = {
title : string ;
ratio : number ;
} ;
type ResolvedMap = {
floorId : string ;
afterBattle : { [ x : string ] : Events } ;
afterOpenDoor : { [ x : string ] : Events } ;
afterGetItem : { [ x : string ] : Events } ;
autoEvent : Event ;
beforeBattle : { [ x : string ] : Events } ;
canFlyFrom : boolean ;
canFltTo : boolean ;
canUseQuickShop : boolean ;
cannotMove : Object ;
cannotMoveIn : Object ;
cannotViewMap : boolean ;
changeFloor : {
[ x : string ] : {
floorId : ':before' | ':after' | ':now' | string ;
loc ? : [ number , number ] ;
stair ? :
| 'upFloor'
| 'downFloor'
| ':symmetry'
| ':symmetry_x'
| ':symmetry_y'
| 'flyPoint' ;
direction ? :
| 'left'
| 'right'
| 'up'
| 'down'
| ':left'
| ':right'
| ':back'
| ':hero'
| ':backhero' ;
time? : number ;
ignoreChangeFloor? : boolean ;
} ;
} ;
defaultGround : string ;
bgm : string | Array < string > ;
bgmap : number [ ] [ ] ;
/** 事件层 */
map : number [ ] [ ] ;
fgmap : number [ ] [ ] ;
width : number ;
height : number ;
images : Array < {
canvas : 'bg' | 'auto' | 'fg' ;
name : string ;
x : number ;
y : number ;
reverse ? : ':x' | ':y' | ':o' ;
disable? : boolean ;
sx? : number ;
sy? : number ;
w? : number ;
h? : number ;
frame? : number ;
} > ;
name : string ;
ratio : number ;
title : string ;
weather : [ string , number ] ;
blocks : Array < Block > ;
} ;
type Enemy = {
id : string ;
name : string ;
displayIdInBook : string ;
2022-11-16 23:01:23 +08:00
special : number [ ] ;
2022-11-13 18:02:05 +08:00
hp : number ;
atk : number ;
def : number ;
money : number ;
exp : number ;
point : number ;
[ key : string ] : any ;
} ;
2022-11-16 23:01:23 +08:00
type DetailedEnemy = {
name : string ;
specialText : string [ ] ;
specialColor : ( string | rgbarray ) [ ] ;
damage : number ;
critical : number ;
criticalDamage : number ;
defDamage : number ;
toShowSpecial? : string [ ] ;
toShowColor? : any [ ] ;
damageColor? : string ;
} ;
2022-11-13 18:02:05 +08:00
type Item = {
2022-11-21 20:00:34 +08:00
name : string ;
cls : 'items' | 'constants' | 'tools' | 'equips' ;
text : string ;
hideInToolbox? : boolean ;
color? : string ;
css? : string ;
2022-11-13 18:02:05 +08:00
[ key : string ] : any ;
} ;
type Save = { } ;
type MotaAction =
| {
type : string ;
[ key : string ] : any ;
}
| string ;
type SystemFlags = {
enableXxx : boolean ;
flyNearStair : boolean ;
steelDoorWithoutKey : boolean ;
betweenAttackMax : boolean ;
ignoreChangeFloor : boolean ;
disableShopOnDamage : boolean ;
blurFg : boolean ;
} ;
type event = { type : string ; [ key : string ] : any } ;
type step = 'up' | 'down' | 'left' | 'right' | 'forward' | 'backward' ;