From 9342c128424d7e686dc187114ce3a325fb761ae3 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sat, 6 Jun 2020 22:59:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E5=8A=A8=E8=A1=A5?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/CodeMirror/codeMirror.plugin.js | 41 ++++--- _server/CodeMirror/defs.js | 130 ++++++++++---------- _server/editor_multi.js | 7 +- libs/control.js | 2 +- libs/core.js | 2 + libs/events.js | 10 +- libs/ui.js | 2 +- project/items.js | 2 +- runtime.d.ts | 155 ++++++++++++++---------- 9 files changed, 194 insertions(+), 157 deletions(-) diff --git a/_server/CodeMirror/codeMirror.plugin.js b/_server/CodeMirror/codeMirror.plugin.js index 50f770cd..91ed8624 100644 --- a/_server/CodeMirror/codeMirror.plugin.js +++ b/_server/CodeMirror/codeMirror.plugin.js @@ -1831,11 +1831,11 @@ var obj = {from: from, to: to, list: completions}; var tooltip = null; - CodeMirror.on(obj, "close", function() { remove(tooltip); }); + CodeMirror.on(obj, "close", function() { remove(tooltip); }); CodeMirror.on(obj, "update", function() { remove(tooltip); }); CodeMirror.on(obj, "select", function(cur, node) { remove(tooltip); - var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; + var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : buildTooltip(cur.data); if (content) { tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, node.getBoundingClientRect().top + window.pageYOffset, content); @@ -1860,25 +1860,32 @@ function showContextInfo(ts, cm, pos, queryName, c) { ts.request(cm, queryName, function(error, data) { - data = data || {}; - data.type = data.type || ''; - data.doc = data.doc || ''; - if (!error && (data.type.startsWith('fn(') || data.doc)) { - var tip = elt("span", null, elt("strong", null, data.type || "not found")); - if (data.doc) - tip.appendChild(document.createTextNode("\n" + data.doc.replace(//g,"\n"))); - if (data.url) { - tip.appendChild(document.createTextNode("\n")); - var child = tip.appendChild(elt("a", null, "[文档]")); - child.href = data.url; - child.target = "_blank"; - } - tempTooltip(cm, tip, ts); + if (!error) { + var tip = buildTooltip(data); + if (tip) tempTooltip(cm, tip, ts); } if (c) c(); }, pos); } + function buildTooltip(data) { + data = data || {}; + data.type = data.type || ''; + data.doc = data.doc || ''; + if (data.type.startsWith('fn(') || data.doc) { + var tip = elt("span", null, elt("strong", null, data.type || "not found")); + if (data.doc) + tip.appendChild(document.createTextNode("\n" + data.doc.replace(//g,"\n"))); + if (data.url) { + tip.appendChild(document.createTextNode("\n")); + var child = tip.appendChild(elt("a", null, "[文档]")); + child.href = data.url; + child.target = "_blank"; + } + return tip; + } + } + // Maintaining argument hints function updateArgHints(ts, cm) { @@ -2211,7 +2218,7 @@ function clear() { if (mouseOnTip) { mouseOnTip = false; - setTimeout(clear, 50); + setTimeout(clear, 100); return; } cm.state.ternTooltip = null; diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js index 0ff5a0ca..de741741 100644 --- a/_server/CodeMirror/defs.js +++ b/_server/CodeMirror/defs.js @@ -650,7 +650,6 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "返回一个布尔值,指示对象是否具有指定的属性.", } }, - "!doc": "创建对象包装器.", }, "Function": { "!type": "fn(body: string) -> fn()", @@ -676,7 +675,6 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ }, "prototype": "?" }, - "!doc": " JavaScript中的每个函数实际上都是一个Function对象." }, "Array": { "!type": "fn(size: number) -> !custom:Array_ctor", @@ -813,7 +811,6 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "确定数组是否包含某个元素,并根据需要返回true或false.,", } }, - "!doc": " JavaScript Array全局对象是数组的构造函数,这些数组是高级的,类似于列表的对象.", }, "String": { "!type": "fn(value: ?) -> string", @@ -842,11 +839,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ }, "substring": { "!type": "fn(from: number, to?: number) -> string", - "!doc": "返回一个索引与另一个索引之间或字符串末尾的字符串子集.", + "!doc": "返回一个索引与另一个索引之间或字符串末尾的字符串子集.
from为起始位置,to为终止位置.", }, "substr": { "!type": "fn(from: number, length?: number) -> string", - "!doc": "以指定的字符数返回从指定位置开始的字符串中的字符.", + "!doc": "以指定的字符数返回从指定位置开始的字符串中的字符.
from为起始位置,length为长度", }, "slice": { "!type": "fn(from: number, to?: number) -> string", @@ -905,7 +902,6 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": " startsWith()方法确定一个字符串是否以另一个字符串的字符开头,并根据需要返回true或false.,", } }, - "!doc": " String全局对象是字符串或字符序列的构造函数.", }, "Number": { "!type": "fn(value: ?) -> number", @@ -980,14 +976,12 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(string: string, radix?: number) -> number", "!doc": " Number.parseInt()方法解析字符串参数并返回指定基数或基数的整数.,", }, - "!doc": " Number JavaScript对象是一个包装器对象,允许您使用数值.使用Number()构造函数创建Number对象.", }, "Boolean": { "!type": "fn(value: ?) -> bool", "prototype": { "!stdProto": "Boolean" }, - "!doc": "布尔对象是布尔值的对象包装.", }, "RegExp": { "!type": "fn(source: string, flags?: string)", @@ -2027,11 +2021,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "startReplay": { - "!doc": "开始播放", + "!doc": "开始播放录像", "!type": "fn(list: [string])" }, "triggerReplay": { - "!doc": "更改播放状态", + "!doc": "播放或暂停录像回放", "!type": "fn()" }, "screenFlash": { @@ -2078,8 +2072,12 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "回放录像时浏览地图", "!type": "fn()" }, + "playSound": { + "!doc": "播放一个音效", + "!tyoe": "fn(sound: string)" + }, "stopSound": { - "!doc": "停止所有音频", + "!doc": "停止所有SE", "!type": "fn()" }, "addGameCanvasTranslate": { @@ -2091,7 +2089,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string, value: number)" }, "drawHero": { - "!doc": "绘制主角和跟随者并重置视野到以主角为中心
例如:core.drawHero(); // 原地绘制主角的静止帧(第一帧)并重置视野,这样调用一般就是用来重置视野
status: 绘制第几帧(默认支持1、2、4,推荐在project\\icons.js中把第三帧也注册了,这里预留了一个'midFoot'作为其枚举值),不填视为静止帧(第一帧)。
offset: 相对主角逻辑位置的偏移量,不填视为无偏移。用于绘制行走中的主角(正数表示前进,负数表示后退,但跟随者的后退很难看)或表现一些特殊的演出效果", + "!doc": "绘制主角和跟随者并重置视野到以主角为中心
例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野
status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。
offset: 相对主角逻辑位置的偏移量,不填视为无偏移。
frame: 绘制的第几帧", "!type": "fn(status?: string, offset?: number, frame?: number)" }, "pauseBgm": { @@ -2115,7 +2113,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string, value: number)" }, "setAutomaticRoute": { - "!doc": "半自动寻路,用于鼠标或手指拖动
例如:core.setAutomaticRoute(0, 0, [{direction: \"right\", x: 4, y: 9}, {direction: \"right\", x: 5, y: 9}, {direction: \"right\", x: 6, y: 9}, {direction: \"up\", x: 6, y: 8}]);
destX: 鼠标或手指的起拖点横坐标
destY: 鼠标或手指的起拖点横坐标
stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。", + "!doc": "半自动寻路,用于鼠标或手指拖动
例如:core.setAutomaticRoute(0, 0, [{direction: \"right\", x: 4, y: 9}, {direction: \"right\", x: 5, y: 9}]);
destX: 鼠标或手指的起拖点横坐标
destY: 鼠标或手指的起拖点纵坐标
stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。", "!type": "fn(destX: number, destY: number, stepPostfix: [loc])" }, "triggerHero": { @@ -2171,7 +2169,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(callback?: fn())" }, "hideStatusBar": { - "!doc": "隐藏状态栏", + "!doc": "隐藏状态栏
showToolbox: 是否不隐藏竖屏工具栏", "!type": "fn(showToolbox?: bool)" }, "getBuff": { @@ -2247,7 +2245,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn() -> bool" }, "triggerBgm": { - "!doc": "更改背景音乐的播放", + "!doc": "开启或关闭背景音乐的播放", "!type": "fn()" }, "moveHero": { @@ -2279,8 +2277,8 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(type?: string, level?: number)" }, "updateStatusBar": { - "!doc": "立刻刷新状态栏和地图显伤", - "!type": "fn()" + "!doc": "立刻刷新状态栏和地图显伤
doNotCheckAutoEvents: 是否不检查自动事件", + "!type": "fn(doNotCheckAutoEvents?: bool)" }, "autosave": { "!doc": "自动存档", @@ -2291,7 +2289,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "moveAction": { - "!doc": "尝试前进一步,如果面前不可被踏入就会直接触发该点事件
例如:core.moveAction(core.doAction); // 尝试前进一步,然后继续事件处理。常用于在事件流中让主角像自由行动时一样前进一步,可以照常触发moveOneStep(跑毒和计步)和面前的事件(包括但不限于阻激夹域捕)
callback: 走一步后的回调函数,可选", + "!doc": "尝试前进一步,如果面前不可被踏入就会直接触发该点事件
请勿直接使用此函数,如有需要请使用「勇士前进一步或撞击」事件", "!type": "fn(callback?: fn())" }, "hasFlag": { @@ -2299,7 +2297,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string) -> bool" }, "rewindReplay": { - "!doc": "回退", + "!doc": "回退到上一个录像节点", "!type": "fn()" }, "toolboxReplay": { @@ -2322,8 +2320,8 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "获得所有存在存档的存档位", "!type": "fn(callback?: fn())" }, - "unLockControl": { - "!doc": "解锁状态栏", + "unlockControl": { + "!doc": "解锁用户控制行为", "!type": "fn()" }, "syncSave": { @@ -2347,7 +2345,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "turnHero": { - "!doc": "主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心
例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果
direction: 主角的新朝向,可选", + "!doc": "主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心
例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果
direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一", "!type": "fn(direction?: string)" }, "resumeReplay": { @@ -2367,7 +2365,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(index?: number, callback?: fn(data: ?))" }, "setViewport": { - "!doc": "设置视野范围", + "!doc": "设置视野范围
x,y: 左上角相对大地图的像素坐标,不需要为32倍数", "!type": "fn(x?: number, y?: number)" }, "chooseReplayFile": { @@ -2375,7 +2373,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "lockControl": { - "!doc": "锁定状态栏,常常用于事件处理", + "!doc": "锁定用户控制,常常用于事件处理", "!type": "fn()" }, "updateCheckBlock": { @@ -2399,7 +2397,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string)" }, "nearHero": { - "!doc": "判定主角是否身处某个点的锯齿领域(即曼哈顿距离)
例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域
x: 领域的中心横坐标
y: 领域的中心纵坐标
n: 领域的半径,不填视为1", + "!doc": "判定主角是否身处某个点的锯齿领域(取曼哈顿距离)
例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域
x: 领域的中心横坐标
y: 领域的中心纵坐标
n: 领域的半径,不填视为1", "!type": "fn(x: number, y: number, n?: number) -> bool" }, "stepReplay": { @@ -2435,7 +2433,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "resumeBgm": { - "!doc": "恢复背景音乐的播放", + "!doc": "恢复背景音乐的播放
resumeTime: 从哪一秒开始恢复播放", "!type": "fn(resumeTime?: number)" }, "setGameCanvasTranslate": { @@ -2497,7 +2495,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(equipType: number) -> string" }, "loadEquip": { - "!doc": "尝试穿上某件装备并提示
例如:core.loadEquip('sword5') // 尝试装备上神圣剑,无回调
equipId: 装备id
callback: 穿戴成功或失败后的回调函数", + "!doc": "尝试穿上某件背包里面的装备并提示
例如:core.loadEquip('sword5') // 尝试装备上背包里面的神圣剑,无回调
equipId: 装备id
callback: 穿戴成功或失败后的回调函数", "!type": "fn(equipId: string, callback?: fn())" }, "itemCount": { @@ -2537,7 +2535,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(index: number)" }, "setItem": { - "!doc": "设置某种道具的持有量
例如:core.setItem('shoes') // 没收绿鞋,重新启用passNet触发器
itemId: 道具id
itemNum: 新的持有量,可选,自然数,默认为0", + "!doc": "设置某种道具的持有量
例如:core.setItem('yellowKey', 3) // 设置黄钥匙为3把
itemId: 道具id
itemNum: 新的持有量,可选,自然数,默认为0", "!type": "fn(itemId: string, itemNum?: number)" }, "compareEquipment": { @@ -2699,7 +2697,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(a?: [?], b?: [?]) -> [?]|null" }, "turnDirection": { - "!doc": "转向某方向
turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种
direction: 当前方向", + "!doc": "计算应当转向某个方向
turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种
direction: 当前方向", "!type": "fn(turn: string, direction?: string) -> string" }, "myconfirm": { @@ -2727,7 +2725,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(key: string, defaultValue?: ?)" }, "arrayToRGB": { - "!doc": "颜色数组转字符串
例如:core.arrayToRGBA([102, 204, 255]); // \"rgba(102,204,255,1)\"
color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1
返回值:该颜色的字符串表示", + "!doc": "颜色数组转字符串
例如:core.arrayToRGB([102, 204, 255]); // \"#66ccff\"
color: 一行三列的数组,必须为不大于255的自然数
返回值:该颜色的#xxxxxx字符串表示", + "!type": "fn(color: [number]) -> string" + }, + "arrayToRGBA": { + "!doc": "颜色数组转字符串
例如:core.arrayToRGBA([102, 204, 255, 0.3]); // \"rgba(102,204,255,0.3)\"
color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1
返回值:该颜色的rgba(...)字符串表示", "!type": "fn(color: [number]) -> string" }, "formatBigNumber": { @@ -2767,7 +2769,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())" }, "inArray": { - "!doc": "判定array是不是一个数组,以及element是否在该数组中。
例如:core.inArray(core.material.enemys.greenSlime.special, 1); // 判定绿头怪除先攻外还有无其他特殊属性
array: 可能的数组,不为数组或不填将导致返回值为false
element: 待查找的元素
返回值:如果array为数组且具有element这项,就返回true,否则返回false", + "!doc": "判定array是不是一个数组,以及element是否在该数组中。
array: 可能的数组,不为数组或不填将导致返回值为false
element: 待查找的元素
返回值:如果array为数组且具有element这项,就返回true,否则返回false", "!type": "fn(array?: ?, element?: ?) -> bool" }, "setGlobal": { @@ -2900,7 +2902,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(x: number, y: number, floorId?: string) -> bool" }, "drawAnimate": { - "!doc": "播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数
例如:core.drawAnimate('attack', core.nextX(), core.nextY(), core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒
name: 动画文件名,不含后缀
x: 绝对横坐标
y: 绝对纵坐标
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", + "!doc": "播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数
例如:core.drawAnimate('attack', core.nextX(), core.nextY(), false, core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒
name: 动画文件名,不含后缀
x: 横坐标
y: 纵坐标
alignWindow: 是否是相对窗口的坐标
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", "!type": "fn(name: string, x: number, y: number, alignWindow: bool, callback?: fn()) -> number" }, "getBlockCls": { @@ -2908,11 +2910,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string" }, "drawMap": { - "!doc": "地图重绘
例如:core.drawMap(); // 重绘当前地图,常用于更改贴图后的刷新
floorId: 地图id,建议省略
callback: 重绘完毕后的回调函数,可选", + "!doc": "地图重绘
例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新
floorId: 地图id,可省略表示当前楼层
callback: 重绘完毕后的回调函数,可选", "!type": "fn(floorId?: string)" }, "nearStair": { - "!doc": "当前位置是否在楼梯边", + "!doc": "当前位置是否在楼梯边;在楼传平面塔模式下对箭头也有效", "!type": "fn() -> bool" }, "turnBlock": { @@ -2924,7 +2926,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(floorId?: string) -> [[number]]" }, "jumpBlock": { - "!doc": "跳跃图块
例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出
sx: 起点的横坐标
sy: 起点的纵坐标
ex: 终点的横坐标
ey: 终点的纵坐标
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 落地或淡出后的回调函数,可选", + "!doc": "跳跃图块;从V2.7开始不再有音效
例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出
sx: 起点的横坐标
sy: 起点的纵坐标
ex: 终点的横坐标
ey: 终点的纵坐标
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 落地或淡出后的回调函数,可选", "!type": "fn(sx: number, sy: number, ex: number, ey: number, time?: number, keep?: bool, callback?: fn())" }, "replaceBlock": { @@ -2964,11 +2966,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(number: number) -> block" }, "removeBlock": { - "!doc": "尝试删除一个图块,此函数会被打怪开门捡道具、“隐藏事件”指令和“移动/跳跃事件”指令的起点直接调用。
例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!doc": "删除一个图块,对应于「隐藏事件」并同时删除
例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", "!type": "fn(x: number, y: number, floorId?: string)" }, "hideBlock": { - "!doc": "隐藏(显示或隐藏的)图块,此函数不会被任何事件指令【直接】调用
例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", + "!doc": "隐藏一个图块,对应于「隐藏事件」且不删除
例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图", "!type": "fn(x: number, y: number, floorId?: string)" }, "removeBlockByIndex": { @@ -2992,16 +2994,16 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(floorId?: string)" }, "getFgNumber": { - "!doc": "判定前景层的一个位置是什么
例如:core.getFgNumber(core.status.hero.loc.x, core.status.hero.loc.y); // 判断主角脚下的前景层图块的数字
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存", + "!doc": "判定某点的前景层的数字
例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字
x: 横坐标,不填为勇士坐标
y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存而强制重算", "!type": "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number" }, "moveBlock": { - "!doc": "移动图块
例如:core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格,用时半秒,再花半秒淡出
x: 起点的横坐标
y: 起点的纵坐标
steps: 步伐数组,前进和后退用于带朝向的npc
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 移动或淡出后的回调函数,可选", + "!doc": "移动图块
例如:core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格
x: 起点的横坐标
y: 起点的纵坐标
steps: 步伐数组
time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 移动或淡出后的回调函数,可选", "!type": "fn(x: number, y: number, steps: [string], time?: number, keep?: bool, callback?: fn())" }, "getBgNumber": { - "!doc": "判定背景层的一个位置是什么,主要用于滑冰(167)
例如:core.getBgNumber(core.status.hero.loc.x, core.status.hero.loc.y); // 判断主角脚下的背景层图块的数字
x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
@param 可选,true表示不使用缓存", - "!type": "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number" + "!doc": "判定某点的背景层的数字
例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字
x: 横坐标,不填为勇士坐标
y: 纵坐标,不填为勇士坐标
floorId: 地图id,不填视为当前地图
noCache: 可选,true表示不使用缓存而强制重算", + "!type": "fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number" }, "getIdOfThis": { "!doc": "获得当前事件点的ID", @@ -3072,7 +3074,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)" }, "canMoveDirectly": { - "!doc": "能否瞬移到某点,并求出节约的步数。此函数会无视可通行图块的script属性,如需使用该属性请手动禁止瞬移
例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角
destX: 目标点的横坐标
destY: 目标点的纵坐标
返回值:正数表示节约的步数,-1表示不可瞬移", + "!doc": "能否瞬移到某点,并求出节约的步数。
例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角
destX: 目标点的横坐标
destY: 目标点的纵坐标
返回值:正数表示节约的步数,-1表示不可瞬移", "!type": "fn(destX: number, destY: number) -> number" }, "saveMap": { @@ -3124,7 +3126,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" }, "canMoveHero": { - "!doc": "单点单朝向的可通行性判定
@exmaple core.canMoveHero(); // 判断主角是否可以前进一步
x: 起点横坐标,不填视为主角当前的
y: 起点纵坐标,不填视为主角当前的
direction: 移动的方向,不填视为主角面对的方向
floorId: 地图id,不填视为当前地图
返回值:true表示可移动,false表示不可移动", + "!doc": "单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响
x: 起点横坐标,不填视为主角当前的
y: 起点纵坐标,不填视为主角当前的
direction: 移动的方向,不填视为主角面对的方向
floorId: 地图id,不填视为当前地图", "!type": "fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool" }, "drawThumbnail": { @@ -3195,7 +3197,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(page?: ?)" }, "setOpacity": { - "!doc": "设置某个canvas的透明度;尽量不要使用本函数,而是全部换成setAlpha实现", + "!doc": "设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效
如果仅想对接下来的绘制生效请使用setAlpha", "!type": "fn(name: string|CanvasRenderingContext2D, opacity: number)" }, "drawAbout": { @@ -3249,7 +3251,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string|CanvasRenderingContext2D, image: string|image, x: number, y: number, w?: number, h?: number, x1?: number, y1?: number, w1?: number, h1?: number, angle?: number)" }, "drawTip": { - "!doc": "左上角绘制一段提示", + "!doc": "左上角绘制一段提示
text: 要提示的字符串,支持${}语法
id: 要绘制的图标ID
frame: 要绘制该图标的第几帧", "!type": "fn(text: string, id?: string, frame?: number)" }, "drawBackground": { @@ -3283,7 +3285,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)" }, "setTextBaseline": { - "!doc": "设置某个canvas的baseline", + "!doc": "设置某个canvas的基准线
baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom", "!url": "https://www.w3school.com.cn/tags/canvas_textbaseline.asp", "!type": "fn(name: string|CanvasRenderingContext2D, baseline: string)" }, @@ -3296,11 +3298,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string|CanvasRenderingContext2D)" }, "splitLines": { - "!doc": "字符串自动换行的分割", + "!doc": "字符串自动换行的分割;具有标点禁则功能", "!type": "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)" }, "setAlpha": { - "!doc": "设置某个canvas的alpha值", + "!doc": "设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容
如果需要修改画布本身的不透明度请使用setOpacity", "!url": "https://www.w3school.com.cn/tags/canvas_globalalpha.asp", "!type": "fn(name: string|CanvasRenderingContext2D, alpha: number)" }, @@ -3449,7 +3451,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "strokeRect": { "!doc": "绘制一个矩形的边框
style: 绘制的样式", "!url": "https://www.w3school.com.cn/tags/canvas_strokerect.asp", - "!type": "fn(name: CtxRefer, x: number, y: number, width: number, height: number, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style: string)" }, "drawBook": { "!doc": "绘制怪物手册", @@ -3460,8 +3462,8 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)" }, "fillBoldText": { - "!doc": "在某个画布上绘制一个描黑边的文字
text: 要绘制的文本
style: 绘制的样式
font: 绘制的字体", - "!type": "fn(name: CtxRefer, text: string, x: number, y: number, style: string, font: string)" + "!doc": "在某个画布上绘制一个描边文字
text: 要绘制的文本
style: 绘制的样式
strokeStyle: 要绘制的描边颜色
font: 绘制的字体", + "!type": "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string)" }, "drawSyncSave": { "!doc": "绘制存档同步界面", @@ -3476,7 +3478,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "createCanvas": { - "!doc": "动态创建一个画布。name为要创建的画布名,如果已存在则会直接取用当前存在的。
x,y为创建的画布相对窗口左上角的像素坐标,width,height为创建的长宽。
zIndex为创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。
返回创建的画布的context,也可以通过core.dymCanvas[name]调用。
name:
x:
y:
width:
height:
zIndex:", + "!doc": "动态创建一个画布。
name: 要创建的画布名,如果已存在则会直接取用当前存在的。
x,y: 创建的画布相对窗口左上角的像素坐标
width,height: 创建的长宽。
zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。
返回创建的画布的context,也可以通过core.dymCanvas[name]调用。", "!type": "fn(name: string, x: number, y: number, width: number, height: number, zIndex: number) -> CanvasRenderingContext2D" }, "setTextAlign": { @@ -3535,11 +3537,11 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn()" }, "insertAction": { - "!doc": "插入事件
例如:core.insertAction('一段文字'); // 插入一个显示文章
action: 单个事件指令,或事件指令数组
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", + "!doc": "插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent
例如:core.insertAction('一段文字'); // 插入一个显示文章
action: 单个事件指令,或事件指令数组
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", "!type": "fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" }, "unfollow": { - "!doc": "取消跟随", + "!doc": "取消跟随
name: 取消跟随的行走图,不填则取消全部跟随者", "!type": "fn(name?: string)" }, "hasVisitedFloor": { @@ -3583,7 +3585,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(id: string, x?: number, y?: number, force?: bool, callback?: fn())" }, "follow": { - "!doc": "跟随", + "!doc": "跟随
name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册", "!type": "fn(name: string)" }, "beforeBattle": { @@ -3611,7 +3613,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(fromUserAction?: bool)" }, "getNextItem": { - "!doc": "获得面前的物品(轻按)", + "!doc": "轻按获得面前的物品或周围唯一物品
noRoute: 若为true则不计入录像", "!type": "fn(noRoute?: bool)" }, "hasAsync": { @@ -3647,7 +3649,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(type: string)" }, "trigger": { - "!doc": "触发(x,y)点的事件", + "!doc": "触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等
callback: 执行完毕的回调函数", "!type": "fn(x?: number, y?: number, callback?: fn())" }, "restart": { @@ -3683,7 +3685,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(fromUserAction?: bool)" }, "insertCommonEvent": { - "!doc": "往当前事件列表之前或之后添加一个公共事件", + "!doc": "插入一个公共事件
例如:core.insertCommonEvent('毒衰咒处理', [0]);
name: 公共事件名;如果公共事件不存在则直接忽略
args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...
x: 新的当前点横坐标,可选
y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", "!type": "fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" }, "hideImage": { @@ -3709,11 +3711,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "autoEventExecuted": { "!doc": "当前是否执行过某个自动事件", "!type": "fn(symbol?: string, value?: ?) -> bool" - }, - "addValue": { - "!doc": "数值增减", - "!type": "fn(name: string, value: ?, prefix?: string)" - }, + }, "onSki": { "!doc": "当前是否在冰上", "!type": "fn(number?: number) -> bool" @@ -3743,7 +3741,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)" }, "setFloorInfo": { - "!doc": "设置一项楼层属性并刷新状态栏
例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果
name: 'title','name','canFlyTo','canUseQuickShop','cannotViewMap','cannotMoveDirectly','upFloor','downFloor','defaultGround','images','color','weather','bgm','ratio','underGround'之一
values: 属性的新值,可选。对'title'、'name'、'defaultGround'和'bgm'需要是字符串,对'underGround'和四个'canXxx'需要是布尔值,对两个'xxxFloor'需要是一行两列的自然数数组,对'ratio'需要是数字
floorId: 楼层id,不填视为当前层
prefix: 独立开关前缀,一般不需要,下同", + "!doc": "设置一项楼层属性并刷新状态栏
例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果
name: 要修改的属性名
values: 属性的新值。
floorId: 楼层id,不填视为当前层
prefix: 独立开关前缀,一般不需要", "!type": "fn(name: string, values: ?, floorId?: string, prefix?: string)" }, "openDoor": { @@ -3783,8 +3781,8 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(steps: [step], time?: number, callback?: fn())" }, "changeFloor": { - "!doc": "场景切换
例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取全塔属性中的值
floorId: 传送的目标地图id,可以填':before'和':after'分别表示楼下或楼上
stair: 传送的位置,可以填':now'(保持不变,可省略),':symmetry'(中心对称),':symmetry_x'(左右对称),':symmetry_y'(上下对称)或图块id(该图块最好在目标层唯一,一般为'downFloor'或'upFloor')
heroLoc: 传送的坐标(如果填写了,就会覆盖上述的粗略目标位置)和传送后主角的朝向(不填表示保持不变)
time: 传送的黑屏时间,单位为毫秒。可以填0(无黑屏)或不小于100的正整数,也可以省略(取全塔属性中的值)
callback: 黑屏结束后的回调函数,可选(这居然不是最后一个参数)
fromLoad: 本次场景切换是否为读档,读档会提示且没有黑屏,不会触发“每次到达事件”,也不会导致重生怪复活", - "!type": "fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn(), fromLoad?: bool)" + "!doc": "场景切换
例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值
floorId: 传送的目标地图id,可以填':before'和':after'分别表示楼下或楼上
stair: 传送的位置
heroLoc: 传送的坐标;会覆盖stair
time: 传送的黑屏时间,单位为毫秒;不填为用户设置值
callback: 传送的回调函数", + "!type": "fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())" }, "getCommonEvent": { "!doc": "获得一个公共事件", diff --git a/_server/editor_multi.js b/_server/editor_multi.js index 23e44d7a..82c660d1 100644 --- a/_server/editor_multi.js +++ b/_server/editor_multi.js @@ -32,6 +32,7 @@ editor_multi = function () { styleActiveLine: true, extraKeys: extraKeys, foldGutter: true, + inputStyle: "textarea", highlightSelectionMatches: { showToken: /\w/, annotateScrollbar: true } }); @@ -141,9 +142,10 @@ editor_multi = function () { var one = coredef.core[name][funcname] || {}; var type = one["!type"] || ""; if (type.startsWith("fn(")) { + var forwardname = (functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a[name] || {})[funcname] ? '脚本编辑' : name; coredef.core[funcname] = { "!type": one["!type"], - "!doc": one["!doc"] + "
(转发到 " + name + " 中)" + "!doc": one["!doc"] + "
(转发到" + forwardname + "中)" }; if (one["!url"]) coredef.core[funcname]["!url"] = one["!url"]; } @@ -180,7 +182,8 @@ editor_multi = function () { editor_multi.codeEditor = codeEditor; codeEditor.on("cursorActivity", function (cm) { - if (codeEditor.getOption("autocomplete")) { + var cursor = cm.getCursor(); + if (codeEditor.getOption("autocomplete") && !(cursor.line == 0 && cursor.ch == 0)) { ternServer.updateArgHints(cm); ternServer.showDocs(cm); } diff --git a/libs/control.js b/libs/control.js index bbf08cba..a29e99b8 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2155,7 +2155,7 @@ control.prototype.lockControl = function () { } ////// 解锁状态栏 ////// -control.prototype.unLockControl = function () { +control.prototype.unlockControl = function () { core.status.lockControl = false; } diff --git a/libs/core.js b/libs/core.js index 148d537b..878eb52f 100644 --- a/libs/core.js +++ b/libs/core.js @@ -249,6 +249,8 @@ core.prototype._init_flags = function () { // 让你总是拼错! window.on = true; window.off = false; + window.ture = true; + window.flase = false; core.dom.versionLabel.innerText = core.firstData.version; core.dom.logoLabel.innerText = core.firstData.title; diff --git a/libs/events.js b/libs/events.js index b3f558ec..a9093243 100644 --- a/libs/events.js +++ b/libs/events.js @@ -448,7 +448,7 @@ events.prototype.openDoor = function (x, y, needKey, callback) { if (!this._openDoor_check(id, x, y, needKey)) { var locked = core.status.lockControl; core.waitHeroToStop(function () { - if (!locked) core.unLockControl(); + if (!locked) core.unlockControl(); if (callback) callback(); }); return; @@ -531,7 +531,7 @@ events.prototype._openDoor_animate = function (id, x, y, callback) { if (state == 4) { clearInterval(animate); delete core.animateFrame.asyncId[animate]; - if (!locked) core.unLockControl(); + if (!locked) core.unlockControl(); core.status.replay.animate = false; core.events.afterOpenDoor(id, x, y); if (callback) callback(); @@ -747,7 +747,7 @@ events.prototype._changeFloor_changing = function (info, callback) { } events.prototype._changeFloor_afterChange = function (info, callback) { - if (!info.locked) core.unLockControl(); + if (!info.locked) core.unlockControl(); core.status.replay.animate = false; core.events.afterChangeFloor(info.floorId); @@ -2426,14 +2426,14 @@ events.prototype.useFly = function (fromUserAction) { if (!this._checkStatus('fly', fromUserAction, true)) return; if (core.flags.flyNearStair && !core.nearStair()) { core.drawTip("只有在楼梯边才能使用" + core.material.items['fly'].name); - core.unLockControl(); + core.unlockControl(); core.status.event.data = null; core.status.event.id = null; return; } if (!core.canUseItem('fly')) { core.drawTip(core.material.items['fly'].name + "好像失效了"); - core.unLockControl(); + core.unlockControl(); core.status.event.data = null; core.status.event.id = null; return; diff --git a/libs/ui.js b/libs/ui.js index 61fd58a5..b7f7163e 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -645,7 +645,7 @@ ui.prototype.closePanel = function () { this.clearUI(); core.maps.generateGroundPattern(); core.updateStatusBar(true); - core.unLockControl(); + core.unlockControl(); core.status.event.data = null; core.status.event.id = null; core.status.event.selection = null; diff --git a/project/items.js b/project/items.js index f081dd34..60476be5 100644 --- a/project/items.js +++ b/project/items.js @@ -355,7 +355,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "tools", "name": "大黄门钥匙", "text": "可以开启当前层所有黄门", - "itemEffect": "core.status.hero.items.keys.yellowKey++;core.status.hero.items.keys.blueKey++;core.status.hero.items.keys.redKey++;", + "itemEffect": "core.addItem('yellowKey', 1);\ncore.addItem('blueKey', 1);\ncore.addItem('redKey', 1);", "itemEffectTip": ",全钥匙+1", "useItemEffect": "(function () {\n\tvar actions = core.searchBlock(\"yellowDoor\").map(function (block) {\n\t\treturn { \"type\": \"openDoor\", \"loc\": [block.x, block.y], \"async\": true };\n\t});\n\tactions.push({ \"type\": \"waitAsync\" });\n\tactions.push({ \"type\": \"tip\", \"text\": core.material.items[itemId].name + \"使用成功\" });\n\tcore.insertAction(actions);\n})();", "canUseItemEffect": "(function () {\n\treturn core.searchBlock('yellowDoor').length > 0;\n})();" diff --git a/runtime.d.ts b/runtime.d.ts index 78a6016f..0fb404a2 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -252,8 +252,9 @@ declare class control { /** * 立刻刷新状态栏和地图显伤 + * @param doNotCheckAutoEvents 是否不检查自动事件 */ - updateStatusBar(): void + updateStatusBar(doNotCheckAutoEvents?: boolean): void /** * 设置某个自定义变量或flag @@ -311,7 +312,7 @@ declare class control { * 半自动寻路,用于鼠标或手指拖动 * @example core.setAutomaticRoute(0, 0, [{direction: "right", x: 4, y: 9}, {direction: "right", x: 5, y: 9}, {direction: "right", x: 6, y: 9}, {direction: "up", x: 6, y: 8}]); * @param destX 鼠标或手指的起拖点横坐标 - * @param destY 鼠标或手指的起拖点横坐标 + * @param destY 鼠标或手指的起拖点纵坐标 * @param stepPostfix 拖动轨迹的数组表示,每项为一步的方向和目标点。 */ setAutomaticRoute(destX: number, destY: number, stepPostfix: Array<{ direction: direction, x: number, y: number }>): void @@ -348,7 +349,7 @@ declare class control { /** * 主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心 * @example core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果 - * @param direction 主角的新朝向,可选 + * @param direction 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一 */ turnHero(direction?: direction): void @@ -362,9 +363,10 @@ declare class control { /** * 绘制主角和跟随者并重置视野到以主角为中心 - * @example core.drawHero(); // 原地绘制主角的静止帧(第一帧)并重置视野,这样调用一般就是用来重置视野 - * @param status 绘制第几帧(默认支持1、2、4,推荐在project\icons.js中把第三帧也注册了,这里预留了一个'midFoot'作为其枚举值),不填视为静止帧(第一帧)。 - * @param offset 相对主角逻辑位置的偏移量,不填视为无偏移。用于绘制行走中的主角(正数表示前进,负数表示后退,但跟随者的后退很难看)或表现一些特殊的演出效果 + * @example core.drawHero(); // 原地绘制主角的静止帧 + * @param status 绘制状态,一般用stop + * @param offset 相对主角逻辑位置的偏移量,不填视为无偏移 + * @param frame 绘制第几帧 */ drawHero(status?: 'stop' | 'leftFoot' | 'rightFoot', offset?: number, frame?: number): void @@ -383,7 +385,7 @@ declare class control { nextY(n?: number): number /** - * 判定主角是否身处某个点的锯齿领域(即曼哈顿距离) + * 判定主角是否身处某个点的锯齿领域(取曼哈顿距离) * @example core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域 * @param x 领域的中心横坐标 * @param y 领域的中心纵坐标 @@ -604,7 +606,10 @@ declare class control { /** 加减画布偏移 */ addGameCanvasTranslate(x?: number, y?: number): void - /** 设置视野范围 */ + /** + * 设置视野范围 + * x,y: 左上角相对大地图的像素坐标,不需要为32倍数 + */ setViewport(x?: number, y?: number): void /** 移动视野范围 */ @@ -730,11 +735,11 @@ declare class control { /** 获得勇士原始属性(无装备和衰弱影响) */ getNakedStatus(name?: string): any - /** 锁定状态栏,常常用于事件处理 */ + /** 锁定用户控制,常常用于事件处理 */ lockControl(): void - /** 解锁状态栏 */ - unLockControl(): void + /** 解锁用户控制 */ + unlockControl(): void /** 获得映射文件名 */ getMappedName(name?: string): string @@ -748,9 +753,12 @@ declare class control { /** 设置音乐图标的显隐状态 */ setMusicBtn(): void - /** 更改背景音乐的播放 */ + /** 开启或关闭背景音乐的播放 */ triggerBgm(): void + /** 播放一个音效 */ + playSound(sound: string): void + /** 停止所有音频 */ stopSound(): void @@ -842,15 +850,14 @@ declare class events { /** * 场景切换 - * @example core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取全塔属性中的值 + * @example core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户设置值 * @param floorId 传送的目标地图id,可以填':before'和':after'分别表示楼下或楼上 * @param stair 传送的位置,可以填':now'(保持不变,可省略),':symmetry'(中心对称),':symmetry_x'(左右对称),':symmetry_y'(上下对称)或图块id(该图块最好在目标层唯一,一般为'downFloor'或'upFloor') * @param heroLoc 传送的坐标(如果填写了,就会覆盖上述的粗略目标位置)和传送后主角的朝向(不填表示保持不变) - * @param time 传送的黑屏时间,单位为毫秒。可以填0(无黑屏)或不小于100的正整数,也可以省略(取全塔属性中的值) - * @param callback 黑屏结束后的回调函数,可选(这居然不是最后一个参数) - * @param fromLoad 本次场景切换是否为读档,读档会提示且没有黑屏,不会触发“每次到达事件”,也不会导致重生怪复活 + * @param time 传送的黑屏时间,单位为毫秒。不填为用户设置值 + * @param callback 黑屏结束后的回调函数,可选 */ - changeFloor(floorId: string, stair?: string, heroLoc?: { x?: number, y?: number, direction?: direction }, time?: number, callback?: () => void, fromLoad?: boolean): void + changeFloor(floorId: string, stair?: string, heroLoc?: { x?: number, y?: number, direction?: direction }, time?: number, callback?: () => void): void /** * 执行下一个事件指令,常作为回调 @@ -860,12 +867,12 @@ declare class events { doAction(keepUI?: true): void /** - * 插入事件 - * @example core.insertAction('回收钥匙商店'); // 插入公共事件“回收钥匙商店” - * @param action 公共事件名,或单个事件指令,或事件指令数组 + * 插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent + * @example core.insertAction('一段文字'); // 插入一个显示文章 + * @param action 单个事件指令,或事件指令数组 * @param x 新的当前点横坐标,可选 * @param y 新的当前点纵坐标,可选 - * @param callback 新的回调函数,可选(这居然也不是最后一个参数) + * @param callback 新的回调函数,可选 * @param addToLast 插入的位置,true表示插入到末尾,否则插入到开头 */ insertAction(action: string | MotaAction | MotaAction[], x?: number, y?: number, callback?: () => void, addToLast?: boolean): void @@ -883,8 +890,8 @@ declare class events { /** * 设置一项楼层属性并刷新状态栏 * @example core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果 - * @param name 'title','name','canFlyTo','canUseQuickShop','cannotViewMap','cannotMoveDirectly','upFloor','downFloor','defaultGround','images','color','weather','bgm','ratio','underGround'之一 - * @param values 属性的新值,可选。对'title'、'name'、'defaultGround'和'bgm'需要是字符串,对'underGround'和四个'canXxx'需要是布尔值,对两个'xxxFloor'需要是一行两列的自然数数组,对'ratio'需要是数字 + * @param name 要求改的属性名 + * @param values 属性的新值 * @param floorId 楼层id,不填视为当前层 * @param prefix 独立开关前缀,一般不需要,下同 */ @@ -1029,7 +1036,9 @@ declare class events { /** 执行一个系统事件 */ doSystemEvent(type: string, data?: any, callback?: () => any): void - /** 触发(x,y)点的事件 */ + /** + * 触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等 + */ trigger(x?: number, y?: number, callback?: () => any): void /** 战斗前触发的事件 */ @@ -1044,7 +1053,10 @@ declare class events { /** 获得一个道具后的shij */ afterGetItem(id?: string, x?: number, y?: number, isGentleClick?: boolean): void - /** 获得面前的物品(轻按) */ + /** + * 轻按获得面前的物品或周围唯一物品 + * @param noRoute 若为true则不计入录像 + */ getNextItem(noRoute?: boolean): void /** 楼层转换中 */ @@ -1088,7 +1100,16 @@ declare class events { /** 开始执行一系列自定义事件 */ startEvents(list?: any, x?: number, y?: number, callback?: () => any): void - /** 往当前事件列表之前或之后添加一个公共事件 */ + /** + * 插入一个公共事件 + * @example core.insertCommonEvent('毒衰咒处理', [0]); + * @param name 公共事件名;如果公共事件不存在则直接忽略 + * @param args 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ... + * @param x 新的当前点横坐标,可选 + * @param y 新的当前点纵坐标,可选 + * @param callback 新的回调函数,可选 + * @param addToLast 插入的位置,true表示插入到末尾,否则插入到开头 + */ insertCommonEvent(name?: string, args?: any, x?: number, y?: number, callback?: () => any, addToLast?: boolean): void /** 获得一个公共事件 */ @@ -1142,10 +1163,16 @@ declare class events { /** 当前是否有未处理完毕的异步事件 */ hasAsync(): boolean - /** 跟随 */ + /** + * 跟随 + * @param name 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册 + */ follow(name: string): void - /** 取消跟随 */ + /** + * 取消跟随 + * @param name 取消跟随的行走图,不填则取消全部跟随者 + */ unfollow(name?: string): void /** 数值操作 */ @@ -1383,24 +1410,24 @@ declare class maps { getFgMapArray(floorId?: string, noCache?: boolean): number[][] /** - * 判定背景层的一个位置是什么,主要用于滑冰(167) - * @example core.getBgNumber(core.status.hero.loc.x, core.status.hero.loc.y); // 判断主角脚下的背景层图块的数字 - * @param x 横坐标 - * @param y 纵坐标 + * 判定背景层的一个位置是什么 + * @example core.getBgNumber(); // 判断主角脚下的背景层图块的数字 + * @param x 横坐标,不填为当前勇士坐标 + * @param y 纵坐标,不填为当前勇士坐标 * @param floorId 地图id,不填视为当前地图 - * @param 可选,true表示不使用缓存 + * @param 可选,true表示不使用缓存而强制重算 */ - getBgNumber(x: number, y: number, floorId?: string, noCache?: boolean): number + getBgNumber(x?: number, y?: number, floorId?: string, noCache?: boolean): number /** * 判定前景层的一个位置是什么 - * @example core.getFgNumber(core.status.hero.loc.x, core.status.hero.loc.y); // 判断主角脚下的前景层图块的数字 - * @param x 横坐标 - * @param y 纵坐标 + * @example core.getFgNumber(); // 判断主角脚下的前景层图块的数字 + * @param x 横坐标,不填为当前勇士坐标 + * @param y 纵坐标,不填为当前勇士坐标 * @param floorId 地图id,不填视为当前地图 - * @param 可选,true表示不使用缓存 + * @param 可选,true表示不使用缓存而强制重算 */ - getFgNumber(x: number, y: number, floorId?: string, noCache?: boolean): number + getFgNumber(x?: number, y?: number, floorId?: string, noCache?: boolean): number /** * 可通行性判定 @@ -1425,7 +1452,7 @@ declare class maps { canMoveHero(x?: number, y?: number, direction?: direction, floorId?: string): boolean /** - * 能否瞬移到某点,并求出节约的步数。此函数会无视可通行图块的script属性,如需使用该属性请手动禁止瞬移 + * 能否瞬移到某点,并求出节约的步数。 * @example core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角 * @param destX 目标点的横坐标 * @param destY 目标点的纵坐标 @@ -1444,8 +1471,8 @@ declare class maps { /** * 地图重绘 - * @example core.drawMap(); // 重绘当前地图,常用于更改贴图后的刷新 - * @param floorId 地图id,建议省略 + * @example core.drawMap(); // 重绘当前地图,常用于更改贴图后或自动元件的刷新 + * @param floorId 地图id,省略表示当前楼层 * @param callback 重绘完毕后的回调函数,可选 */ drawMap(floorId?: string, callback?: () => void): void @@ -1537,7 +1564,7 @@ declare class maps { showBlock(x: number, y: number, floorId?: string): void /** - * 隐藏(显示或隐藏的)图块,此函数不会被任何事件指令【直接】调用 + * 隐藏一个图块,对应于「隐藏事件」且不删除 * @example core.hideBlock(0, 0); // 隐藏地图左上角的图块 * @param x 横坐标 * @param y 纵坐标 @@ -1546,7 +1573,7 @@ declare class maps { hideBlock(x: number, y: number, floorId?: string): void /** - * 尝试删除一个图块,此函数会被打怪开门捡道具、“隐藏事件”指令和“移动/跳跃事件”指令的起点直接调用。 + * 删除一个图块,对应于「隐藏事件」并同时删除 * @example core.removeBlock(0, 0); // 尝试删除地图左上角的图块 * @param x 横坐标 * @param y 纵坐标 @@ -1610,7 +1637,7 @@ declare class maps { * @example core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格,用时半秒,再花半秒淡出 * @param x 起点的横坐标 * @param y 起点的纵坐标 - * @param steps 步伐数组,前进和后退用于带朝向的npc + * @param steps 步伐数组 * @param time 单步和淡出用时,单位为毫秒。不填视为半秒 * @param keep 是否不淡出,true表示不淡出 * @param callback 移动或淡出后的回调函数,可选 @@ -1618,7 +1645,7 @@ declare class maps { moveBlock(x: number, y: number, steps: step[], time?: number, keep?: boolean, callback?: () => void): void /** - * 跳跃图块 + * 跳跃图块;从V2.7开始不再有音效 * @example core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出 * @param sx 起点的横坐标 * @param sy 起点的纵坐标 @@ -1632,10 +1659,11 @@ declare class maps { /** * 播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数 - * @example core.drawAnimate('attack', core.nextX(), core.nextY(), core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒 + * @example core.drawAnimate('attack', core.nextX(), core.nextY(), false, core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒 * @param name 动画文件名,不含后缀 * @param x 绝对横坐标 * @param y 绝对纵坐标 + * @param alignWindow 是否是相对窗口的坐标 * @param callback 动画停止后的回调函数,可选 * @returns 一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数) */ @@ -1695,7 +1723,7 @@ declare class maps { /** 某个点是否存在楼梯 */ stairExists(x?: number, y?: number, floorId?: string): boolean - /** 当前位置是否在楼梯边 */ + /** 当前位置是否在楼梯边;在楼传平面塔模式下对箭头也有效 */ nearStair(): boolean /** 某个点是否存在(指定的)怪物 */ @@ -1850,7 +1878,7 @@ declare class items { /** * 设置某种道具的持有量 - * @example core.setItem('shoes') // 没收绿鞋,重新启用passNet触发器 + * @example core.setItem('yellowKey', 3) // 设置黄钥匙为3把 * @param itemId 道具id * @param itemNum 新的持有量,可选,自然数,默认为0 */ @@ -1882,8 +1910,8 @@ declare class items { canEquip(equipId: string, hint: boolean): boolean /** - * 尝试穿上某件装备并提示 - * @example core.loadEquip('sword5') // 尝试装备上神圣剑,无回调 + * 尝试穿上某件背包里的装备并提示 + * @example core.loadEquip('sword5') // 尝试装备上背包里的神圣剑,无回调 * @param equipId 装备id * @param callback 穿戴成功或失败后的回调函数 */ @@ -1958,9 +1986,10 @@ declare class ui { * 在某个画布上绘制一个描黑边的文字 * @param text 要绘制的文本 * @param style 绘制的样式 + * @param strokeStyle 绘制的描边颜色 * @param font 绘制的字体 */ - fillBoldText(name: CtxRefer, text: string, x: number, y: number, style: string, font: string): void + fillBoldText(name: CtxRefer, text: string, x: number, y: number, style: string, strokeStyle: string, font: string): void /** * 绘制一个矩形。style可选为绘制样式 @@ -1981,13 +2010,7 @@ declare class ui { * 动态创建一个画布。name为要创建的画布名,如果已存在则会直接取用当前存在的。 * x,y为创建的画布相对窗口左上角的像素坐标,width,height为创建的长宽。 * zIndex为创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。 - * 返回创建的画布的context,也可以通过core.dymCanvas[name]调用。 - * @param name - * @param x - * @param y - * @param width - * @param height - * @param zIndex + * 返回创建的画布的context,也可以通过core.dymCanvas[name]调用 */ createCanvas(name: string, x: number, y: number, width: number, height: number, zIndex: number): CanvasRenderingContext2D @@ -2061,7 +2084,7 @@ declare class ui { /** 设置某个canvas的baseline */ setTextBaseline(name: string | CanvasRenderingContext2D, baseline: any): void - /** 字符串自动换行的分割 */ + /** 字符串自动换行的分割;具有标点禁则功能 */ splitLines(name: string | CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string): void /** 在某个canvas上绘制一个图标 */ @@ -2073,7 +2096,12 @@ declare class ui { /** 清空UI层内容 */ clearUI(): void - /** 左上角绘制一段提示 */ + /** + * 左上角绘制一段提示 + * @param text 要提示的文字内容,支持 ${} 语法 + * @param id 要绘制的图标ID + * @param frame 要绘制图标的第几帧 + */ drawTip(text: string, id?: string, frame?: number): void /** 清除提示内容 */ @@ -2332,7 +2360,7 @@ declare class utils { * @param color 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1 * @returns 该颜色的字符串表示 */ - arrayToRGB(color: [number, number, number, number]): string + arrayToRGBA(color: [number, number, number, number]): string /** * 录像一压,其结果会被再次base64压缩 @@ -2369,7 +2397,6 @@ declare class utils { /** * 判定array是不是一个数组,以及element是否在该数组中。 - * @example core.inArray(core.material.enemys.greenSlime.special, 1); // 判定绿头怪除先攻外还有无其他特殊属性 * @param array 可能的数组,不为数组或不填将导致返回值为false * @param element 待查找的元素 * @returns 如果array为数组且具有element这项,就返回true,否则返回false @@ -2535,7 +2562,7 @@ declare class utils { getCookie(name: string): string /** - * 转向某方向 + * 计算应当转向某个方向 * @param turn 转向的方向 * @param direction 当前方向 */