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 当前方向
*/