diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60839c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +_saves/ +_server/config.json \ No newline at end of file diff --git a/_saves/.exported b/_saves/.exported deleted file mode 100644 index 56a6051..0000000 --- a/_saves/.exported +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/_saves/Eustia_autoSave b/_saves/Eustia_autoSave deleted file mode 100644 index 2a3d507..0000000 --- a/_saves/Eustia_autoSave +++ /dev/null @@ -1 +0,0 @@ -N4IgZgNg9lBOCSATEAuEBnALrApjzADAIwgA0IAFjrFKqAJYC2AhgOY6qXVQB0A7jgBGABzIhmAOybNMHFGGYR0OchOaM5IAMLMmYiADdURchWEsAHqgCct66dEoiBF+RZrLqALQmQ75qgE5DIA1sauIIg4YOFBflExKHHownjISW5QEjgAnoHkOBaOcTgAjgCu9OY4EpioANoAuuT0sozodCAAxllYkpgdKKCCMGFO5JB5TgC+5JgwSnSzIGWVwoOg6HxwiCQzy9BdnYj0uF2Y9Fmc5aLkVigArORTzsuQbBsgrTiMACL4uggqGw5RUIHKygAQvgBDUADL0VgUOooEFggD66OUOEQmOMAHYAGwEawADgATOSACxxTGwSS49EE4lkyk04K4ZiDeqgDyaAA65SpOAIgkFDy6VPJYhY6wa2l0jAoUA0IEas156gFQpFYvKEqlMuYcpQ9RAACt6OVWOVJGqNSA+ZxBcLReLJdK3MbuSAANIAFQAavbSJrVWhBfjyYTyZHyWASF6TWaA4GAGLS9Whx1a53lKMxuMJo3JkCsKAQRAhXIhsPa116g2evze+WCegUCHlWhZut513Md2GpM+y3MKCYSSsWs58MgF0iwf6j0ln3oKgSVgSAzK1W92f1xdD5uytcUejb3ccfdOiP56Ox+/Fkfyy048cz2/z++Fp+JlullguD4MQYhAXghDNjaU5dBQU5iNBm6wVOzYWPQ45oVOoF3OhUCYZuBCobh+GsAAzJ+uYoBI5QQBAL6miAOT0BUJA3pR1G0fRZpMRUmYOreHF0QBPo8eU5FseGglcYxzFChRkk0UJp7yqJDzyXIUnCSpsmEupqCacpDGifielUYp0miaSpkGa2RmydY1nmVpdksQQ9rNBgIRVKgChKGCcGwOktLogFiBaBWcB4mguDIOQmLfIwAASF6YFFTRxeiEA4MwBg4HCUBdFFwDLJiBj0Og3yMp04EgXsaLLIIMJ4BIACCmCTl0IS/DIARmZxICYswOD0GlHmYic6DMIIWVVUMGDYBBoGmvURCkQ8zRNOqbwVtAAiwNyHlYDgJq+H0FxYPQXSfPMk4QP6TByOSDxEEQUpRjwhJ2C91hPN05SwLA93hkQDxUtYPCkXYUNQ4SDj5CAggyJgWXw4wWQ1hkKxFPDiPtVl3UsOw8PCFA5VZATbByCUFjYMwFNE5jaO5b8pw4OcEBTHEiISHAOAAMqyCaySTrAKKElSDykTwVLTMsoWcKu1ULbVnSyg0QQa6Qmva1ruv1D4pAG0bJgG0ExuGyblsWxbzQa1t5A0OUsicL6UAZloVKsAAvGIBiKKCGzLLl+2XBIebWDgpGIOKggPAQkbMNY0flNYhHx/qpKg+6BBgIK1iEkQMTkDa9DpCA5LMIghKEog1iFYgYBgFS6JUqSifooIVKEmA6JgIgU0EDgNJV3gYgXMD+KkficfWKRBBSi40xAA== \ No newline at end of file diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js index 1c16b25..ee517af 100644 --- a/_server/CodeMirror/defs.js +++ b/_server/CodeMirror/defs.js @@ -1,4130 +1,4526 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ { "!name": "browser", - "Node": { + Node: { "!type": "fn()", - "prototype": { - "nextSibling": { + prototype: { + nextSibling: { "!type": "+Element", - "!doc": "返回紧接其父节点的childNodes列表中指定节点之后的节点;如果指定节点是该列表中的最后一个节点,则返回null.", + "!doc": + "返回紧接其父节点的childNodes列表中指定节点之后的节点;如果指定节点是该列表中的最后一个节点,则返回null.", }, - "previousSibling": { + previousSibling: { "!type": "+Element", - "!doc": "返回紧接其父节点的childNodes列表中指定节点之前的节点,如果指定节点是该列表中的第一个节点,则返回null.", + "!doc": + "返回紧接其父节点的childNodes列表中指定节点之前的节点,如果指定节点是该列表中的第一个节点,则返回null.", }, - "lastChild": { + lastChild: { "!type": "+Element", - "!doc": "返回节点的最后一个孩子." + "!doc": "返回节点的最后一个孩子.", }, - "firstChild": { + firstChild: { "!type": "+Element", - "!doc": "返回树中该节点的第一个子节点;如果该节点为无子节点,则返回null.如果该节点是Document,则返回其直接子节点列表中的第一个节点.", + "!doc": + "返回树中该节点的第一个子节点;如果该节点为无子节点,则返回null.如果该节点是Document,则返回其直接子节点列表中的第一个节点.", }, - "childNodes": { + childNodes: { "!type": "+NodeList", - "!doc": "返回给定元素的子节点的集合." + "!doc": "返回给定元素的子节点的集合.", }, - "parentNode": { + parentNode: { "!type": "+Element", - "!doc": "返回DOM树中指定节点的父级." + "!doc": "返回DOM树中指定节点的父级.", }, - "tagName": { + tagName: { "!type": "string", - "!doc": "将当前节点的名称作为字符串返回." + "!doc": "将当前节点的名称作为字符串返回.", }, - "insertBefore": { + insertBefore: { "!type": "fn(newElt: +Element, before: +Element) -> +Element", "!doc": "将指定的节点插入到参考元素之前,作为当前节点的子级.", }, - "removeChild": { + removeChild: { "!type": "fn(oldNode: +Element) -> +Element", "!doc": "从DOM中删除一个子节点.返回已删除的节点.", }, - "appendChild": { + appendChild: { "!type": "fn(newNode: +Element) -> +Element", - "!doc": "将一个节点添加到指定父节点的子节点列表的末尾.如果该节点已经存在,则将其从当前父节点中删除,然后添加到新的父节点中.", + "!doc": + "将一个节点添加到指定父节点的子节点列表的末尾.如果该节点已经存在,则将其从当前父节点中删除,然后添加到新的父节点中.", }, - "cloneNode": { + cloneNode: { "!type": "fn(deep: bool) -> +Element", - "!doc": "返回在其上调用此方法的节点的副本." + "!doc": "返回在其上调用此方法的节点的副本.", }, - "addEventListener": { + addEventListener: { "!type": "fn(type: string, listener: fn(e: +Event), capture: bool)", - "!doc": "在单个目标上注册单个事件侦听器.事件目标可以是文档中的单个元素,文档本身,窗口或XMLHttpRequest.", + "!doc": + "在单个目标上注册单个事件侦听器.事件目标可以是文档中的单个元素,文档本身,窗口或XMLHttpRequest.", }, - "removeEventListener": { + removeEventListener: { "!type": "fn(type: string, listener: fn(), capture: bool)", "!doc": "允许从事件目标中删除事件侦听器.", }, - "innerText": { + innerText: { "!type": "string", - "!doc": "获取或设置节点及其后代的文本内容." - } - }, - "!doc": "节点是一个接口,许多DOM类型都从该接口继承,并允许类似地对待(或测试)这些各种类型.", - }, - "Element": { - "!type": "fn()", - "prototype": { - "!proto": "Node.prototype", - "getAttribute": { - "!type": "fn(name: string) -> string", - "!doc": "返回指定元素上的命名属性的值.如果命名属性不存在,则返回的值将为null或\" \"(空字符串).", + "!doc": "获取或设置节点及其后代的文本内容.", }, - "setAttribute": { + }, + "!doc": + "节点是一个接口,许多DOM类型都从该接口继承,并允许类似地对待(或测试)这些各种类型.", + }, + Element: { + "!type": "fn()", + prototype: { + "!proto": "Node.prototype", + getAttribute: { + "!type": "fn(name: string) -> string", + "!doc": + '返回指定元素上的命名属性的值.如果命名属性不存在,则返回的值将为null或" "(空字符串).', + }, + setAttribute: { "!type": "fn(name: string, value: string)", "!doc": "在指定元素上添加新属性或更改现有属性的值.", }, - "removeAttribute": { + removeAttribute: { "!type": "fn(name: string)", "!doc": "从指定元素中删除属性.", }, - "getElementsByTagName": { + getElementsByTagName: { "!type": "fn(tagName: string) -> +NodeList", - "!doc": "返回具有给定标签名的元素列表.搜索指定元素下面的子树,不包括元素本身.返回的列表是活动的,这意味着它将自动使用DOM树进行更新.因此,无需使用相同的元素和参数多次调用element.getElementsByTagName." + "!doc": + "返回具有给定标签名的元素列表.搜索指定元素下面的子树,不包括元素本身.返回的列表是活动的,这意味着它将自动使用DOM树进行更新.因此,无需使用相同的元素和参数多次调用element.getElementsByTagName.", }, - "getElementsByClassName": { + getElementsByClassName: { "!type": "fn(name: string) -> +NodeList", - "!doc": "返回具有所有给定类名称的一组元素.在文档对象上调用时,将搜索整个文档,包括根节点.您还可以在任何元素上调用getElementsByClassName;它将仅返回元素,它们是具有给定类名的指定根元素的后代." + "!doc": + "返回具有所有给定类名称的一组元素.在文档对象上调用时,将搜索整个文档,包括根节点.您还可以在任何元素上调用getElementsByClassName;它将仅返回元素,它们是具有给定类名的指定根元素的后代.", }, - "children": { + children: { "!type": "+HTMLCollection", - "!doc": "返回给定元素的子元素的集合." + "!doc": "返回给定元素的子元素的集合.", }, - "className": { + className: { "!type": "string", "!doc": "获取并设置指定元素的class属性的值.", }, - "style": { - "cssText": "string", - "alignmentBaseline": "string", - "background": "string", - "backgroundAttachment": "string", - "backgroundClip": "string", - "backgroundColor": "string", - "backgroundImage": "string", - "backgroundOrigin": "string", - "backgroundPosition": "string", - "backgroundPositionX": "string", - "backgroundPositionY": "string", - "backgroundRepeat": "string", - "backgroundRepeatX": "string", - "backgroundRepeatY": "string", - "backgroundSize": "string", - "baselineShift": "string", - "border": "string", - "borderBottom": "string", - "borderBottomColor": "string", - "borderBottomLeftRadius": "string", - "borderBottomRightRadius": "string", - "borderBottomStyle": "string", - "borderBottomWidth": "string", - "borderCollapse": "string", - "borderColor": "string", - "borderImage": "string", - "borderImageOutset": "string", - "borderImageRepeat": "string", - "borderImageSlice": "string", - "borderImageSource": "string", - "borderImageWidth": "string", - "borderLeft": "string", - "borderLeftColor": "string", - "borderLeftStyle": "string", - "borderLeftWidth": "string", - "borderRadius": "string", - "borderRight": "string", - "borderRightColor": "string", - "borderRightStyle": "string", - "borderRightWidth": "string", - "borderSpacing": "string", - "borderStyle": "string", - "borderTop": "string", - "borderTopColor": "string", - "borderTopLeftRadius": "string", - "borderTopRightRadius": "string", - "borderTopStyle": "string", - "borderTopWidth": "string", - "borderWidth": "string", - "bottom": "string", - "boxShadow": "string", - "boxSizing": "string", - "captionSide": "string", - "clear": "string", - "clip": "string", - "clipPath": "string", - "clipRule": "string", - "color": "string", - "colorInterpolation": "string", - "colorInterpolationFilters": "string", - "colorProfile": "string", - "colorRendering": "string", - "content": "string", - "counterIncrement": "string", - "counterReset": "string", - "cursor": "string", - "direction": "string", - "display": "string", - "dominantBaseline": "string", - "emptyCells": "string", - "enableBackground": "string", - "fill": "string", - "fillOpacity": "string", - "fillRule": "string", - "filter": "string", - "float": "string", - "floodColor": "string", - "floodOpacity": "string", - "font": "string", - "fontFamily": "string", - "fontSize": "string", - "fontStretch": "string", - "fontStyle": "string", - "fontVariant": "string", - "fontWeight": "string", - "glyphOrientationHorizontal": "string", - "glyphOrientationVertical": "string", - "height": "string", - "imageRendering": "string", - "kerning": "string", - "left": "string", - "letterSpacing": "string", - "lightingColor": "string", - "lineHeight": "string", - "listStyle": "string", - "listStyleImage": "string", - "listStylePosition": "string", - "listStyleType": "string", - "margin": "string", - "marginBottom": "string", - "marginLeft": "string", - "marginRight": "string", - "marginTop": "string", - "marker": "string", - "markerEnd": "string", - "markerMid": "string", - "markerStart": "string", - "mask": "string", - "maxHeight": "string", - "maxWidth": "string", - "minHeight": "string", - "minWidth": "string", - "opacity": "string", - "orphans": "string", - "outline": "string", - "outlineColor": "string", - "outlineOffset": "string", - "outlineStyle": "string", - "outlineWidth": "string", - "overflow": "string", - "overflowWrap": "string", - "overflowX": "string", - "overflowY": "string", - "padding": "string", - "paddingBottom": "string", - "paddingLeft": "string", - "paddingRight": "string", - "paddingTop": "string", - "page": "string", - "pageBreakAfter": "string", - "pageBreakBefore": "string", - "pageBreakInside": "string", - "pointerEvents": "string", - "position": "string", - "quotes": "string", - "resize": "string", - "right": "string", - "shapeRendering": "string", - "size": "string", - "speak": "string", - "src": "string", - "stopColor": "string", - "stopOpacity": "string", - "stroke": "string", - "strokeDasharray": "string", - "strokeDashoffset": "string", - "strokeLinecap": "string", - "strokeLinejoin": "string", - "strokeMiterlimit": "string", - "strokeOpacity": "string", - "strokeWidth": "string", - "tabSize": "string", - "tableLayout": "string", - "textAlign": "string", - "textAnchor": "string", - "textDecoration": "string", - "textIndent": "string", - "textLineThrough": "string", - "textLineThroughColor": "string", - "textLineThroughMode": "string", - "textLineThroughStyle": "string", - "textLineThroughWidth": "string", - "textOverflow": "string", - "textOverline": "string", - "textOverlineColor": "string", - "textOverlineMode": "string", - "textOverlineStyle": "string", - "textOverlineWidth": "string", - "textRendering": "string", - "textShadow": "string", - "textTransform": "string", - "textUnderline": "string", - "textUnderlineColor": "string", - "textUnderlineMode": "string", - "textUnderlineStyle": "string", - "textUnderlineWidth": "string", - "top": "string", - "unicodeBidi": "string", - "unicodeRange": "string", - "vectorEffect": "string", - "verticalAlign": "string", - "visibility": "string", - "whiteSpace": "string", - "width": "string", - "wordBreak": "string", - "wordSpacing": "string", - "wordWrap": "string", - "writingMode": "string", - "zIndex": "string", - "zoom": "string", - "!doc": "返回一个表示元素的style属性的对象." + style: { + cssText: "string", + alignmentBaseline: "string", + background: "string", + backgroundAttachment: "string", + backgroundClip: "string", + backgroundColor: "string", + backgroundImage: "string", + backgroundOrigin: "string", + backgroundPosition: "string", + backgroundPositionX: "string", + backgroundPositionY: "string", + backgroundRepeat: "string", + backgroundRepeatX: "string", + backgroundRepeatY: "string", + backgroundSize: "string", + baselineShift: "string", + border: "string", + borderBottom: "string", + borderBottomColor: "string", + borderBottomLeftRadius: "string", + borderBottomRightRadius: "string", + borderBottomStyle: "string", + borderBottomWidth: "string", + borderCollapse: "string", + borderColor: "string", + borderImage: "string", + borderImageOutset: "string", + borderImageRepeat: "string", + borderImageSlice: "string", + borderImageSource: "string", + borderImageWidth: "string", + borderLeft: "string", + borderLeftColor: "string", + borderLeftStyle: "string", + borderLeftWidth: "string", + borderRadius: "string", + borderRight: "string", + borderRightColor: "string", + borderRightStyle: "string", + borderRightWidth: "string", + borderSpacing: "string", + borderStyle: "string", + borderTop: "string", + borderTopColor: "string", + borderTopLeftRadius: "string", + borderTopRightRadius: "string", + borderTopStyle: "string", + borderTopWidth: "string", + borderWidth: "string", + bottom: "string", + boxShadow: "string", + boxSizing: "string", + captionSide: "string", + clear: "string", + clip: "string", + clipPath: "string", + clipRule: "string", + color: "string", + colorInterpolation: "string", + colorInterpolationFilters: "string", + colorProfile: "string", + colorRendering: "string", + content: "string", + counterIncrement: "string", + counterReset: "string", + cursor: "string", + direction: "string", + display: "string", + dominantBaseline: "string", + emptyCells: "string", + enableBackground: "string", + fill: "string", + fillOpacity: "string", + fillRule: "string", + filter: "string", + float: "string", + floodColor: "string", + floodOpacity: "string", + font: "string", + fontFamily: "string", + fontSize: "string", + fontStretch: "string", + fontStyle: "string", + fontVariant: "string", + fontWeight: "string", + glyphOrientationHorizontal: "string", + glyphOrientationVertical: "string", + height: "string", + imageRendering: "string", + kerning: "string", + left: "string", + letterSpacing: "string", + lightingColor: "string", + lineHeight: "string", + listStyle: "string", + listStyleImage: "string", + listStylePosition: "string", + listStyleType: "string", + margin: "string", + marginBottom: "string", + marginLeft: "string", + marginRight: "string", + marginTop: "string", + marker: "string", + markerEnd: "string", + markerMid: "string", + markerStart: "string", + mask: "string", + maxHeight: "string", + maxWidth: "string", + minHeight: "string", + minWidth: "string", + opacity: "string", + orphans: "string", + outline: "string", + outlineColor: "string", + outlineOffset: "string", + outlineStyle: "string", + outlineWidth: "string", + overflow: "string", + overflowWrap: "string", + overflowX: "string", + overflowY: "string", + padding: "string", + paddingBottom: "string", + paddingLeft: "string", + paddingRight: "string", + paddingTop: "string", + page: "string", + pageBreakAfter: "string", + pageBreakBefore: "string", + pageBreakInside: "string", + pointerEvents: "string", + position: "string", + quotes: "string", + resize: "string", + right: "string", + shapeRendering: "string", + size: "string", + speak: "string", + src: "string", + stopColor: "string", + stopOpacity: "string", + stroke: "string", + strokeDasharray: "string", + strokeDashoffset: "string", + strokeLinecap: "string", + strokeLinejoin: "string", + strokeMiterlimit: "string", + strokeOpacity: "string", + strokeWidth: "string", + tabSize: "string", + tableLayout: "string", + textAlign: "string", + textAnchor: "string", + textDecoration: "string", + textIndent: "string", + textLineThrough: "string", + textLineThroughColor: "string", + textLineThroughMode: "string", + textLineThroughStyle: "string", + textLineThroughWidth: "string", + textOverflow: "string", + textOverline: "string", + textOverlineColor: "string", + textOverlineMode: "string", + textOverlineStyle: "string", + textOverlineWidth: "string", + textRendering: "string", + textShadow: "string", + textTransform: "string", + textUnderline: "string", + textUnderlineColor: "string", + textUnderlineMode: "string", + textUnderlineStyle: "string", + textUnderlineWidth: "string", + top: "string", + unicodeBidi: "string", + unicodeRange: "string", + vectorEffect: "string", + verticalAlign: "string", + visibility: "string", + whiteSpace: "string", + width: "string", + wordBreak: "string", + wordSpacing: "string", + wordWrap: "string", + writingMode: "string", + zIndex: "string", + zoom: "string", + "!doc": "返回一个表示元素的style属性的对象.", }, - "classList": { + classList: { "!type": "+DOMTokenList", - "!doc": "返回元素的class属性的标记列表." + "!doc": "返回元素的class属性的标记列表.", }, - "title": { + title: { "!type": "string", - "!doc": " \"\u5efa\u7acb\u5f53\u9f20\u6807\u60ac\u505c\u5728\u663e\u793a\u7684\u8282\u70b9\u4e0a\u65f6\u5728\"\u5de5\u5177\u63d0\u793a\"\u5f39\u51fa\u7a97\u53e3\u4e2d\u663e\u793a\u7684\u6587\u672c.\"," + "!doc": + ' "\u5efa\u7acb\u5f53\u9f20\u6807\u60ac\u505c\u5728\u663e\u793a\u7684\u8282\u70b9\u4e0a\u65f6\u5728"\u5de5\u5177\u63d0\u793a"\u5f39\u51fa\u7a97\u53e3\u4e2d\u663e\u793a\u7684\u6587\u672c.",', }, - "width": { + width: { "!type": "number", - "!doc": "返回元素的布局宽度." + "!doc": "返回元素的布局宽度.", }, - "height": { + height: { "!type": "number", - "!doc": "元素相对于元素的offsetParent的高度." + "!doc": "元素相对于元素的offsetParent的高度.", }, - "getContext": { + getContext: { "!type": "fn(id: string) -> CanvasRenderingContext2D", - "!doc": " DOM画布元素公开了HTMLCanvasElement接口,该接口提供了用于操纵画布元素的布局和表示的属性和方法.HTMLCanvasElement接口继承了元素对象接口的属性和方法.", + "!doc": + " DOM画布元素公开了HTMLCanvasElement接口,该接口提供了用于操纵画布元素的布局和表示的属性和方法.HTMLCanvasElement接口继承了元素对象接口的属性和方法.", }, - "innerHTML": { + innerHTML: { "!type": "string", "!doc": "设置或获取描述元素后代的HTML语法.", - } + }, }, "!doc": "表示HTML或XML文档中的元素.", }, - "Document": { + Document: { "!type": "fn()", - "prototype": { + prototype: { "!proto": "Node.prototype", - "height": { + height: { "!type": "number", "!doc": "返回当前文档的<body>元素的高度.", }, - "width": { + width: { "!type": "number", "!doc": "以像素为单位返回当前文档的<body>元素的宽度.", }, - "body": { + body: { "!type": "+Element", "!doc": "返回当前文档的<body>或<frameset>节点.", }, - "cookie": { + cookie: { "!type": "string", "!doc": "获取并设置与当前文档关联的cookie.", }, - "URL": "string", - "title": { + URL: "string", + title: { "!type": "string", - "!doc": "获取或设置文档的标题." + "!doc": "获取或设置文档的标题.", }, - "getElementById": { + getElementById: { "!type": "fn(id: string) -> +Element", - "!doc": "通过元素ID返回对该元素的引用." + "!doc": "通过元素ID返回对该元素的引用.", }, - "getElementsByTagName": { + getElementsByTagName: { "!type": "fn(tagName: string) -> +NodeList", - "!doc": "返回具有给定标签名称的元素的NodeList.将搜索整个文档,包括根节点.返回的NodeList处于活动状态,这意味着它会自动更新自身以与DOM树保持同步,而无需再次调用document.getElementsByTagName." + "!doc": + "返回具有给定标签名称的元素的NodeList.将搜索整个文档,包括根节点.返回的NodeList处于活动状态,这意味着它会自动更新自身以与DOM树保持同步,而无需再次调用document.getElementsByTagName.", }, - "getElementsByName": { + getElementsByName: { "!type": "fn(name: string) -> +HTMLCollection", "!doc": "返回HTML文档中具有给定名称的元素列表.", }, - "getElementsByClassName": "Element.prototype.getElementsByClassName" + getElementsByClassName: "Element.prototype.getElementsByClassName", }, - "!doc": "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如<body>和<table>之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素)." + "!doc": + "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如<body>和<table>之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素).", }, - "document": { + document: { "!type": "+Document", - "!doc": "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如<body>和<table>之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素)." + "!doc": + "浏览器中加载的每个网页都有其自己的文档对象.此对象用作网页内容(DOM树,包括诸如<body>和<table>之类的元素)的入口点,并提供文档的全局功能(例如获取页面的URL和在文档中创建新元素).", }, - "Event": { + Event: { "!type": "fn()", - "prototype": { - "stopPropagation": { + prototype: { + stopPropagation: { "!type": "fn()", - "!doc": "防止当前事件进一步传播." + "!doc": "防止当前事件进一步传播.", }, - "preventDefault": { + preventDefault: { "!type": "fn()", - "!doc": "如果可以取消事件,则取消该事件,而不停止事件的进一步传播." + "!doc": "如果可以取消事件,则取消该事件,而不停止事件的进一步传播.", }, - "stopImmediatePropagation": { + stopImmediatePropagation: { "!type": "fn()", - "!doc": "防止同一事件的其他侦听器被调用." + "!doc": "防止同一事件的其他侦听器被调用.", }, - "type": { + type: { "!type": "string", - "!doc": "返回包含事件类型的字符串." + "!doc": "返回包含事件类型的字符串.", }, - "target": { + target: { "!type": "+Element", - "!doc": " EventTarget是由对象实现的DOM接口,这些对象可以接收DOM事件并具有侦听器.最常见的EventTarget是DOM元素,尽管其他对象也可以是EventTarget,例如文档,窗口,XMLHttpRequest,和别的." + "!doc": + " EventTarget是由对象实现的DOM接口,这些对象可以接收DOM事件并具有侦听器.最常见的EventTarget是DOM元素,尽管其他对象也可以是EventTarget,例如文档,窗口,XMLHttpRequest,和别的.", }, - "clientX": { + clientX: { "!type": "number", - "!doc": "返回事件发生的应用程序客户区域内的水平坐标(与页面内的坐标相反).例如,单击客户区域左上角将始终显示clientX值为0的鼠标事件,无论页面是否水平滚动." + "!doc": + "返回事件发生的应用程序客户区域内的水平坐标(与页面内的坐标相反).例如,单击客户区域左上角将始终显示clientX值为0的鼠标事件,无论页面是否水平滚动.", }, - "clientY": { + clientY: { "!type": "number", - "!doc": "返回事件发生在应用程序客户区中的垂直坐标(与页面中的坐标相反).例如,单击客户区左上角将始终显示不管页面是否垂直滚动,clientY值为0的鼠标事件." + "!doc": + "返回事件发生在应用程序客户区中的垂直坐标(与页面中的坐标相反).例如,单击客户区左上角将始终显示不管页面是否垂直滚动,clientY值为0的鼠标事件.", }, - "keyCode": { + keyCode: { "!type": "number", - "!doc": "返回按键事件中的非字符键或任何其他类型的键盘事件中的任何键的Unicode值.", + "!doc": + "返回按键事件中的非字符键或任何其他类型的键盘事件中的任何键的Unicode值.", }, - "charCode": { + charCode: { "!type": "number", - "!doc": "返回在按键事件期间按下的字符键的Unicode值." + "!doc": "返回在按键事件期间按下的字符键的Unicode值.", }, - "which": { + which: { "!type": "number", - "!doc": "返回所按下键的数字keyCode或所按下字母数字键的字符代码(charCode)." + "!doc": + "返回所按下键的数字keyCode或所按下字母数字键的字符代码(charCode).", }, - "button": { + button: { "!type": "number", - "!doc": "指示导致事件的鼠标按钮." + "!doc": "指示导致事件的鼠标按钮.", }, - "shiftKey": { + shiftKey: { "!type": "bool", "!doc": "指示事件触发时是否按下SHIFT键.", }, - "ctrlKey": { + ctrlKey: { "!type": "bool", "!doc": "指示事件触发时是否按下了CTRL键.", }, - "altKey": { + altKey: { "!type": "bool", "!doc": "指示事件触发时是否按下ALT键.", - } - } + }, + }, }, - "Storage": { - "length": { + Storage: { + length: { "!type": "number", - "!doc": "存储接口的length只读属性返回一个整数,该整数表示存储在存储对象中的数据项的数量.", + "!doc": + "存储接口的length只读属性返回一个整数,该整数表示存储在存储对象中的数据项的数量.", }, - "setItem": { + setItem: { "!type": "fn(name: string, value: string)", - "!doc": "存储接口的setItem()方法在传递键名称和值时,会将该键添加到存储中,或者更新该键的值(如果已存在).", + "!doc": + "存储接口的setItem()方法在传递键名称和值时,会将该键添加到存储中,或者更新该键的值(如果已存在).", }, - "getItem": { + getItem: { "!type": "fn(name: string) -> string", "!doc": "存储接口的getItem()方法在传递键名时将返回该键的值.", }, - "key": { + key: { "!type": "fn(index: number) -> string", - "!doc": "存储接口的key()方法传递数字n时,返回存储中第n个键的名称.键的顺序是用户代理定义的,因此您不应依赖它." + "!doc": + "存储接口的key()方法传递数字n时,返回存储中第n个键的名称.键的顺序是用户代理定义的,因此您不应依赖它.", }, - "removeItem": { + removeItem: { "!type": "fn(key: string)", "!doc": "存储接口的removeItem()方法在传递了键名后,将从存储中删除该键.", }, - "clear": { + clear: { "!type": "fn()", - "!doc": "存储接口的clear()方法在被调用时将从存储中清空所有键." - } + "!doc": "存储接口的clear()方法在被调用时将从存储中清空所有键.", + }, }, - "localStorage": { + localStorage: { "!type": "Storage", - "!doc": " localStorage属性允许您访问本地存储对象.localStorage与sessionStorage类似.唯一的区别是,虽然存储在localStorage中的数据没有到期时间,但是浏览会话时存储在sessionStorage中的数据将被清除.结束-也就是说,当浏览器关闭时.\ n \ n请注意,存储在localStorage或sessionStorage中的数据特定于页面协议." + "!doc": + " localStorage属性允许您访问本地存储对象.localStorage与sessionStorage类似.唯一的区别是,虽然存储在localStorage中的数据没有到期时间,但是浏览会话时存储在sessionStorage中的数据将被清除.结束-也就是说,当浏览器关闭时. n n请注意,存储在localStorage或sessionStorage中的数据特定于页面协议.", }, - "console": { - "assert": { + console: { + assert: { "!type": "fn(assertion: bool, text: string)", "!doc": "如果断言为false,则将错误消息写入控制台.", }, - "error": { + error: { "!type": "fn(...msg: ?)", "!doc": "将错误消息输出到Web控制台.", }, - "info": { + info: { "!type": "fn(...msg: ?)", "!doc": "将参考消息输出到Web控制台.", }, - "log": { + log: { "!type": "fn(...msg: ?)", "!doc": "将消息输出到Web控制台.", }, - "time": { + time: { "!type": "fn(label: string)", "!doc": "启动计时器,您可以使用该计时器来跟踪操作需要多长时间.", }, - "timeEnd": { + timeEnd: { "!type": "fn(label: string)", "!doc": "停止以前通过调用console.time()启动的计时器.", }, - "trace": { + trace: { "!type": "fn()", "!doc": "将堆栈跟踪输出到Web控制台.", }, - "warn": { + warn: { "!type": "fn(...msg: ?)", "!doc": "将警告消息输出到Web控制台.", }, - "!doc": "控制台对象提供对浏览器调试控制台的访问.其工作方式的细节因浏览器而异,但实际上提供了一组事实上的功能.", + "!doc": + "控制台对象提供对浏览器调试控制台的访问.其工作方式的细节因浏览器而异,但实际上提供了一组事实上的功能.", }, - "window": { + window: { "!type": "<top>", "!doc": "窗口对象代表一个包含DOM文档的窗口.", }, - "self": { + self: { "!type": "<top>", "!doc": "将对象引用返回到窗口对象.", }, - "devicePixelRatio": "number", - "requestAnimationFrame": { + devicePixelRatio: "number", + requestAnimationFrame: { "!type": "fn(callback: fn(timestamp: number)) -> number", - "!doc": " Window.requestAnimationFrame()方法告诉浏览器您希望执行动画,并请求浏览器在下一次重绘之前调用指定的函数来更新动画.该方法将回调作为参数在重新粉刷之前被调用." + "!doc": + " Window.requestAnimationFrame()方法告诉浏览器您希望执行动画,并请求浏览器在下一次重绘之前调用指定的函数来更新动画.该方法将回调作为参数在重新粉刷之前被调用.", }, - "cancelAnimationFrame": { + cancelAnimationFrame: { "!type": "fn(number)n", "!doc": "取消先前安排的动画帧请求.", }, - "alert": { + alert: { "!type": "fn(message: string)", - "!doc": "显示具有指定内容和确定按钮的警报对话框." + "!doc": "显示具有指定内容和确定按钮的警报对话框.", }, - "confirm": { + confirm: { "!type": "fn(message: string) -> bool", "!doc": "显示带有消息和两个按钮(确定和取消)的模式对话框.", }, - "prompt": { + prompt: { "!type": "fn(message: string, value: string) -> string", "!doc": "显示一个对话框,提示用户输入一些文本.", }, - "setTimeout": { + setTimeout: { "!type": "fn(f: fn(), ms: number) -> number", - "!doc": "在指定的延迟后调用函数或执行代码段." + "!doc": "在指定的延迟后调用函数或执行代码段.", }, - "clearTimeout": { + clearTimeout: { "!type": "fn(timeout: number)", "!doc": "清除window.setTimeout()设置的延迟.", }, - "setInterval": { + setInterval: { "!type": "fn(f: fn(), ms: number) -> number", - "!doc": "反复调用一个函数或执行代码段,每次调用该函数之间有固定的时间延迟.", + "!doc": + "反复调用一个函数或执行代码段,每次调用该函数之间有固定的时间延迟.", }, - "clearInterval": { + clearInterval: { "!type": "fn(interval: number)", "!doc": "取消使用setInterval设置的重复操作.", }, - "atob": { + atob: { "!type": "fn(encoded: string) -> string", - "!doc": "解码使用base-64编码编码的数据字符串." + "!doc": "解码使用base-64编码编码的数据字符串.", }, - "btoa": { + btoa: { "!type": "fn(data: string) -> string", "!doc": "从一串二进制数据创建一个base-64编码的ASCII字符串.", }, - "getComputedStyle": { + getComputedStyle: { "!type": "fn(node: +Element, pseudo?: string) -> Element.prototype.style", "!doc": "给出元素的所有CSS属性的最终使用值.", }, - "CanvasRenderingContext2D": { - "canvas": "+Element", - "width": "number", - "height": "number", - "commit": "fn()", - "save": "fn()", - "restore": "fn()", - "currentTransform": "?", - "scale": "fn(x: number, y: number)", - "rotate": "fn(angle: number)", - "translate": "fn(x: number, y: number)", - "transform": "fn(a: number, b: number, c: number, d: number, e: number, f: number)", - "setTransform": "fn(a: number, b: number, c: number, d: number, e: number, f: number)", - "resetTransform": "fn()", - "globalAlpha": "number", - "globalCompositeOperation": "string", - "imageSmoothingEnabled": "bool", - "strokeStyle": "string", - "fillStyle": "string", - "createLinearGradient": "fn(x0: number, y0: number, x1: number, y1: number) -> ?", - "createPattern": "fn(image: ?, repetition: string) -> ?", - "shadowOffsetX": "number", - "shadowOffsetY": "number", - "shadowBlur": "number", - "shadowColor": "string", - "clearRect": "fn(x: number, y: number, w: number, h: number)", - "fillRect": "fn(x: number, y: number, w: number, h: number)", - "strokeRect": "fn(x: number, y: number, w: number, h: number)", - "fillRule": "string", - "fill": "fn()", - "beginPath": "fn()", - "stroke": "fn()", - "clip": "fn()", - "resetClip": "fn()", - "fillText": "fn(text: string, x: number, y: number, maxWidth: number)", - "strokeText": "fn(text: string, x: number, y: number, maxWidth: number)", - "measureText": "fn(text: string) -> ?", - "drawImage": "fn(image: ?, dx: number, dy: number)", - "createImageData": "fn(sw: number, sh: number) -> ?", - "getImageData": "fn(sx: number, sy: number, sw: number, sh: number) -> ?", - "putImageData": "fn(imagedata: ?, dx: number, dy: number)", - "lineWidth": "number", - "lineCap": "string", - "lineJoin": "string", - "miterLimit": "number", - "setLineDash": "fn(segments: [number])", - "getLineDash": "fn() -> [number]", - "lineDashOffset": "number", - "font": "string", - "textAlign": "string", - "textBaseline": "string", - "direction": "string", - "closePath": "fn()", - "moveTo": "fn(x: number, y: number)", - "lineTo": "fn(x: number, y: number)", - "quadraticCurveTo": "fn(cpx: number, cpy: number, x: number, y: number)", - "bezierCurveTo": "fn(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number)", - "arcTo": "fn(x1: number, y1: number, x2: number, y2: number, radius: number)", - "rect": "fn(x: number, y: number, w: number, h: number)", - "arc": "fn(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: bool)", - "ellipse": "fn(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: bool)" - } + CanvasRenderingContext2D: { + canvas: "+Element", + width: "number", + height: "number", + commit: "fn()", + save: "fn()", + restore: "fn()", + currentTransform: "?", + scale: "fn(x: number, y: number)", + rotate: "fn(angle: number)", + translate: "fn(x: number, y: number)", + transform: + "fn(a: number, b: number, c: number, d: number, e: number, f: number)", + setTransform: + "fn(a: number, b: number, c: number, d: number, e: number, f: number)", + resetTransform: "fn()", + globalAlpha: "number", + globalCompositeOperation: "string", + imageSmoothingEnabled: "bool", + strokeStyle: "string", + fillStyle: "string", + createLinearGradient: + "fn(x0: number, y0: number, x1: number, y1: number) -> ?", + createPattern: "fn(image: ?, repetition: string) -> ?", + shadowOffsetX: "number", + shadowOffsetY: "number", + shadowBlur: "number", + shadowColor: "string", + clearRect: "fn(x: number, y: number, w: number, h: number)", + fillRect: "fn(x: number, y: number, w: number, h: number)", + strokeRect: "fn(x: number, y: number, w: number, h: number)", + fillRule: "string", + fill: "fn()", + beginPath: "fn()", + stroke: "fn()", + clip: "fn()", + resetClip: "fn()", + fillText: "fn(text: string, x: number, y: number, maxWidth: number)", + strokeText: "fn(text: string, x: number, y: number, maxWidth: number)", + measureText: "fn(text: string) -> ?", + drawImage: "fn(image: ?, dx: number, dy: number)", + createImageData: "fn(sw: number, sh: number) -> ?", + getImageData: "fn(sx: number, sy: number, sw: number, sh: number) -> ?", + putImageData: "fn(imagedata: ?, dx: number, dy: number)", + lineWidth: "number", + lineCap: "string", + lineJoin: "string", + miterLimit: "number", + setLineDash: "fn(segments: [number])", + getLineDash: "fn() -> [number]", + lineDashOffset: "number", + font: "string", + textAlign: "string", + textBaseline: "string", + direction: "string", + closePath: "fn()", + moveTo: "fn(x: number, y: number)", + lineTo: "fn(x: number, y: number)", + quadraticCurveTo: "fn(cpx: number, cpy: number, x: number, y: number)", + bezierCurveTo: + "fn(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number)", + arcTo: + "fn(x1: number, y1: number, x2: number, y2: number, radius: number)", + rect: "fn(x: number, y: number, w: number, h: number)", + arc: "fn(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: bool)", + ellipse: + "fn(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise: bool)", + }, }, { "!name": "ecmascript", - "Infinity": { + Infinity: { "!type": "number", - "!doc": "代表无穷大的数值." + "!doc": "代表无穷大的数值.", }, - "undefined": { + undefined: { "!type": "?", "!doc": "该值未定义.", }, - "NaN": { + NaN: { "!type": "number", - "!doc": "代表非数字的值." + "!doc": "代表非数字的值.", }, - "Object": { + Object: { "!type": "fn()", - "create": { + create: { "!type": "fn(proto: ?) -> !custom:Object_create", "!doc": "使用指定的原型对象和属性创建一个新对象.", }, - "defineProperty": { - "!type": "fn(obj: ?, prop: string, desc: propertyDescriptor) -> !custom:Object_defineProperty", - "!doc": "直接在对象上定义新属性,或修改对象上的现有属性,然后返回对象.如果想了解如何将Object.defineProperty方法与类似二进制标志的语法一起使用,请参阅本文." + defineProperty: { + "!type": + "fn(obj: ?, prop: string, desc: propertyDescriptor) -> !custom:Object_defineProperty", + "!doc": + "直接在对象上定义新属性,或修改对象上的现有属性,然后返回对象.如果想了解如何将Object.defineProperty方法与类似二进制标志的语法一起使用,请参阅本文.", }, - "keys": { + keys: { "!type": "fn(obj: ?) -> [string]", - "!doc": "返回一个给定对象自己的可枚举属性的数组,其顺序与for-in循环所提供的顺序相同(不同之处在于for-in循环也枚举了原型链中的属性). " + "!doc": + "返回一个给定对象自己的可枚举属性的数组,其顺序与for-in循环所提供的顺序相同(不同之处在于for-in循环也枚举了原型链中的属性). ", }, - "assign": { + assign: { "!type": "fn(target: ?, source: ?, source?: ?) -> !0", "!effects": ["copy !1 !0", "copy !2 !0", "copy !3 !0"], - "!doc": " Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.,", + "!doc": + " Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.,", }, - "prototype": { + prototype: { "!stdProto": "Object", - "toString": { + toString: { "!type": "fn() -> string", - "!doc": "返回表示对象的字符串." + "!doc": "返回表示对象的字符串.", }, - "hasOwnProperty": { + hasOwnProperty: { "!type": "fn(prop: string) -> bool", "!doc": "返回一个布尔值,指示对象是否具有指定的属性.", - } + }, }, }, - "Function": { + Function: { "!type": "fn(body: string) -> fn()", - "prototype": { + prototype: { "!stdProto": "Function", - "apply": { + apply: { "!type": "fn(this: ?, args: [?])", - "!effects": [ - "call and return !this this=!0 !1.<i> !1.<i> !1.<i>" - ], - "!doc": "调用具有给定值的函数,并以数组(或类似对象的数组)形式提供参数.", + "!effects": ["call and return !this this=!0 !1.<i> !1.<i> !1.<i>"], + "!doc": + "调用具有给定值的函数,并以数组(或类似对象的数组)形式提供参数.", }, - "call": { + call: { "!type": "fn(this: ?, args?: ?) -> !this.!ret", - "!effects": [ - "call and return !this this=!0 !1 !2 !3 !4" - ], + "!effects": ["call and return !this this=!0 !1 !2 !3 !4"], "!doc": "调用具有给定值和单独提供的参数的函数.", }, - "bind": { + bind: { "!type": "fn(this: ?, args?: ?) -> !custom:Function_bind", - "!doc": "创建一个新函数,该函数在被调用时将其this关键字设置为提供的值,并在调用新函数时提供给定的参数序列.", + "!doc": + "创建一个新函数,该函数在被调用时将其this关键字设置为提供的值,并在调用新函数时提供给定的参数序列.", }, - "prototype": "?" + prototype: "?", }, }, - "Array": { + Array: { "!type": "fn(size: number) -> !custom:Array_ctor", - "isArray": { + isArray: { "!type": "fn(value: ?) -> bool", "!doc": "如果对象是数组,则返回true,否则返回false.", }, - "from": { - "!type": "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> ?, thisArg?: ?) -> [!0.<i>]", - "!effects": [ - "call !1 this=!2 !0.<i> number" - ], - "!doc": " Array.from()方法从类似数组或可迭代的对象创建一个新的Array实例.,", + from: { + "!type": + "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> ?, thisArg?: ?) -> [!0.<i>]", + "!effects": ["call !1 this=!2 !0.<i> number"], + "!doc": + " Array.from()方法从类似数组或可迭代的对象创建一个新的Array实例.,", }, - "of": { + of: { "!type": "fn(elementN: ?) -> [!0]", - "!doc": " Array.of()方法创建一个新的Array实例,该实例具有可变数量的参数,而不考虑参数的数量或类型.,", + "!doc": + " Array.of()方法创建一个新的Array实例,该实例具有可变数量的参数,而不考虑参数的数量或类型.,", }, - "prototype": { + prototype: { "!stdProto": "Array", - "length": { + length: { "!type": "number", "!doc": "一个无符号的32位整数,指定数组中的元素数.", }, - "concat": { + concat: { "!type": "fn(other: [?]) -> !this", "!doc": "返回一个新数组,该数组由该数组与其他数组和/或值组成.", }, - "join": { + join: { "!type": "fn(separator?: string) -> string", - "!doc": "将数组的所有元素连接到字符串中." + "!doc": "将数组的所有元素连接到字符串中.", }, - "splice": { + splice: { "!type": "fn(pos: number, amount: number, newelt?: ?) -> [?]", "!doc": "更改数组的内容,在删除旧元素的同时添加新元素.", }, - "pop": { + pop: { "!type": "fn() -> !this.<i>", "!doc": "从数组中删除最后一个元素并返回该元素.", }, - "push": { + push: { "!type": "fn(newelt: ?) -> number", - "!effects": [ - "propagate !0 !this.<i>" - ], + "!effects": ["propagate !0 !this.<i>"], "!doc": "通过添加给定元素并返回数组的新长度来更改数组.", }, - "shift": { + shift: { "!type": "fn() -> !this.<i>", "!doc": "从数组中删除第一个元素并返回该元素.此方法更改数组的长度.", }, - "unshift": { + unshift: { "!type": "fn(newelt: ?) -> number", - "!effects": [ - "propagate !0 !this.<i>" - ], + "!effects": ["propagate !0 !this.<i>"], "!doc": "将一个或多个元素添加到数组的开头,并返回数组的新长度.", }, - "slice": { + slice: { "!type": "fn(from?: number, to?: number) -> !this", - "!doc": "返回数组一部分的浅表副本." + "!doc": "返回数组一部分的浅表副本.", }, - "reverse": { + reverse: { "!type": "fn()", - "!doc": "就地反转数组.第一个数组元素变为最后一个,而最后一个数组变为第一个.", + "!doc": + "就地反转数组.第一个数组元素变为最后一个,而最后一个数组变为第一个.", }, - "sort": { + sort: { "!type": "fn(compare?: fn(a: ?, b: ?) -> number)", - "!effects": [ - "call !0 !this.<i> !this.<i>" - ], - "!doc": "将数组中的元素排序并返回数组." + "!effects": ["call !0 !this.<i> !this.<i>"], + "!doc": "将数组中的元素排序并返回数组.", }, - "indexOf": { + indexOf: { "!type": "fn(elt: ?, from?: number) -> number", - "!doc": "返回在数组中可以找到给定元素的第一个索引;如果不存在,则返回-1.", + "!doc": + "返回在数组中可以找到给定元素的第一个索引;如果不存在,则返回-1.", }, - "lastIndexOf": { + lastIndexOf: { "!type": "fn(elt: ?, from?: number) -> number", - "!doc": "返回在数组中找到给定元素的最后一个索引,如果不存在则返回-1.从fromIndex开始向后搜索数组.", + "!doc": + "返回在数组中找到给定元素的最后一个索引,如果不存在则返回-1.从fromIndex开始向后搜索数组.", }, - "filter": { - "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> !this", - "!effects": [ - "call !0 this=!1 !this.<i> number !this" - ], + filter: { + "!type": + "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> !this", + "!effects": ["call !0 this=!1 !this.<i> number !this"], "!doc": "创建一个新数组,其中包含所有通过提供的功能实现的测试的元素.", }, - "forEach": { + forEach: { "!type": "fn(f: fn(elt: ?, i: number, array: +Array), context?: ?)", - "!effects": [ - "call !0 this=!1 !this.<i> number !this" - ], - "!doc": "每个数组元素执行一次提供的功能." + "!effects": ["call !0 this=!1 !this.<i> number !this"], + "!doc": "每个数组元素执行一次提供的功能.", }, - "map": { - "!type": "fn(f: fn(elt: ?, i: number, array: +Array) -> ?, context?: ?) -> [!0.!ret]", - "!effects": [ - "call !0 this=!1 !this.<i> number !this" - ], + map: { + "!type": + "fn(f: fn(elt: ?, i: number, array: +Array) -> ?, context?: ?) -> [!0.!ret]", + "!effects": ["call !0 this=!1 !this.<i> number !this"], "!doc": "创建一个新数组,其结果是对该数组中的每个元素调用提供的函数.", }, - "reduce": { - "!type": "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", - "!effects": [ - "call !0 !1 !this.<i> number !this" - ], - "!doc": "对一个累加器和数组的每个值(从左到右)应用一个函数,以将其减小为单个值.", + reduce: { + "!type": + "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", + "!effects": ["call !0 !1 !this.<i> number !this"], + "!doc": + "对一个累加器和数组的每个值(从左到右)应用一个函数,以将其减小为单个值.", }, - "fill": { + fill: { "!type": "fn(value: ?, start?: number, end?: number) -> !this", - "!doc": " fill()方法使用静态值填充数组的所有元素,从开始索引到结束索引.,", + "!doc": + " fill()方法使用静态值填充数组的所有元素,从开始索引到结束索引.,", }, - "find": { - "!type": "fn(callback: fn(element: ?, index: number, array: [?]) -> bool, thisArg?: ?) -> !this.<i>", + find: { + "!type": + "fn(callback: fn(element: ?, index: number, array: [?]) -> bool, thisArg?: ?) -> !this.<i>", "!effects": ["call !0 this=!2 !this.<i> number"], - "!doc": "如果数组中的元素满足提供的测试功能,则find()方法将在数组中返回一个值.否则,返回undefined.,", + "!doc": + "如果数组中的元素满足提供的测试功能,则find()方法将在数组中返回一个值.否则,返回undefined.,", }, - "findIndex": { - "!type": "fn(callback: fn(element: ?, index: number, array: [?]), thisArg?: ?) -> number", + findIndex: { + "!type": + "fn(callback: fn(element: ?, index: number, array: [?]), thisArg?: ?) -> number", "!effects": ["call !0 this=!2 !this.<i> number"], - "!doc": "如果数组中的元素满足提供的测试功能,则findIndex()方法将返回数组中的索引.否则返回-1.,", + "!doc": + "如果数组中的元素满足提供的测试功能,则findIndex()方法将返回数组中的索引.否则返回-1.,", }, - "keys": { + keys: { "!type": "fn() -> +iter[:t=number]", - "!doc": " keys()方法返回一个新的数组迭代器,其中包含数组中每个索引的键.,", + "!doc": + " keys()方法返回一个新的数组迭代器,其中包含数组中每个索引的键.,", }, - "values": { + values: { "!type": "fn() -> +iter[:t=!this.<i>]", - "!doc": " values()方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的值.,", + "!doc": + " values()方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的值.,", }, - "includes": { + includes: { "!type": "fn(value: ?, fromIndex?: number) -> bool", "!doc": "确定数组是否包含某个元素,并根据需要返回true或false.,", - } + }, }, }, - "String": { + String: { "!type": "fn(value: ?) -> string", - "prototype": { + prototype: { "!stdProto": "String", - "length": { + length: { "!type": "number", - "!doc": "表示字符串的长度." + "!doc": "表示字符串的长度.", }, "<i>": "string", - "charAt": { + charAt: { "!type": "fn(i: number) -> string", "!doc": "从字符串中返回指定的字符.", }, - "charCodeAt": { + charCodeAt: { "!type": "fn(i: number) -> number", - "!doc": "返回给定索引处字符的数字Unicode值(Unicode代码点> 0x10000除外).", + "!doc": + "返回给定索引处字符的数字Unicode值(Unicode代码点> 0x10000除外).", }, - "indexOf": { + indexOf: { "!type": "fn(char: string, from?: number) -> number", - "!doc": "返回指定值首次出现的调用String对象中的索引,从fromIndex开始搜索,\ n如果未找到该值,则返回-1.", + "!doc": + "返回指定值首次出现的调用String对象中的索引,从fromIndex开始搜索, n如果未找到该值,则返回-1.", }, - "lastIndexOf": { + lastIndexOf: { "!type": "fn(char: string, from?: number) -> number", - "!doc": "返回指定值最后一次出现的调用String对象内的索引,如果未找到则返回-1.从fromIndex开始向后搜索调用字符串.", + "!doc": + "返回指定值最后一次出现的调用String对象内的索引,如果未找到则返回-1.从fromIndex开始向后搜索调用字符串.", }, - "substring": { + substring: { "!type": "fn(from: number, to?: number) -> string", - "!doc": "返回一个索引与另一个索引之间或字符串末尾的字符串子集.<br/>from为起始位置,to为终止位置.", + "!doc": + "返回一个索引与另一个索引之间或字符串末尾的字符串子集.<br/>from为起始位置,to为终止位置.", }, - "substr": { + substr: { "!type": "fn(from: number, length?: number) -> string", - "!doc": "以指定的字符数返回从指定位置开始的字符串中的字符.<br/>from为起始位置,length为长度", + "!doc": + "以指定的字符数返回从指定位置开始的字符串中的字符.<br/>from为起始位置,length为长度", }, - "slice": { + slice: { "!type": "fn(from: number, to?: number) -> string", "!doc": "提取字符串的一部分并返回新的字符串.", }, - "padStart": { + padStart: { "!type": "fn(targetLength: number, padString?: string) -> string", - "!doc": "用另一个字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", + "!doc": + "用另一个字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", }, - "padEnd": { + padEnd: { "!type": "fn(targetLength: number, padString?: string) -> string", - "!doc": "用给定的字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", + "!doc": + "用给定的字符串(如果需要,重复)填充当前字符串,以使结果字符串达到给定的长度.", }, - "trim": { + trim: { "!type": "fn() -> string", "!doc": "从字符串的两端删除空格.", }, - "trimStart": { + trimStart: { "!type": "fn() -> string", "!doc": "从字符串的开头删除空格.", }, - "trimEnd": { + trimEnd: { "!type": "fn() -> string", "!doc": "从字符串末尾删除空格.", }, - "toUpperCase": { + toUpperCase: { "!type": "fn() -> string", - "!doc": "返回转换为大写的调用字符串值." + "!doc": "返回转换为大写的调用字符串值.", }, - "toLowerCase": { + toLowerCase: { "!type": "fn() -> string", - "!doc": "返回转换为小写的调用字符串值." + "!doc": "返回转换为小写的调用字符串值.", }, - "split": { + split: { "!type": "fn(pattern?: string|+RegExp, limit?: number) -> [string]", "!doc": "通过将字符串分成子字符串,将String对象拆分为字符串数组.", }, - "concat": { + concat: { "!type": "fn(other: string) -> string", - "!doc": "将两个或多个字符串的文本合并,并返回一个新字符串." + "!doc": "将两个或多个字符串的文本合并,并返回一个新字符串.", }, - "match": { + match: { "!type": "fn(pattern: +RegExp) -> [string]", "!doc": "用于将字符串与正则表达式匹配时用于检索匹配.", }, - "replace": { + replace: { "!type": "fn(pattern: string|+RegExp, replacement: string) -> string", - "!doc": "返回一个新字符串,该字符串的某个或所有匹配项都由替换项替换.该模式可以是字符串或RegExp,并且替换项可以是字符串或每个匹配项将调用的函数. " + "!doc": + "返回一个新字符串,该字符串的某个或所有匹配项都由替换项替换.该模式可以是字符串或RegExp,并且替换项可以是字符串或每个匹配项将调用的函数. ", }, - "endsWith": { + endsWith: { "!type": "fn(searchString: string, position?: number) -> bool", - "!doc": " endsWith()方法确定一个字符串是否以另一个字符串的字符结尾,并根据需要返回true或false.,", + "!doc": + " endsWith()方法确定一个字符串是否以另一个字符串的字符结尾,并根据需要返回true或false.,", }, - "startsWith": { + startsWith: { "!type": "fn(searchString: string, position?: number) -> bool", - "!doc": " startsWith()方法确定一个字符串是否以另一个字符串的字符开头,并根据需要返回true或false.,", - } + "!doc": + " startsWith()方法确定一个字符串是否以另一个字符串的字符开头,并根据需要返回true或false.,", + }, }, }, - "Number": { + Number: { "!type": "fn(value: ?) -> number", - "MAX_VALUE": { + MAX_VALUE: { "!type": "number", - "!doc": " JavaScript中可表示的最大数值." + "!doc": " JavaScript中可表示的最大数值.", }, - "MIN_VALUE": { + MIN_VALUE: { "!type": "number", - "!doc": " JavaScript中可表示的最小正数值." + "!doc": " JavaScript中可表示的最小正数值.", }, - "POSITIVE_INFINITY": { + POSITIVE_INFINITY: { "!type": "number", - "!doc": "代表正无穷大值的值." + "!doc": "代表正无穷大值的值.", }, - "NEGATIVE_INFINITY": { + NEGATIVE_INFINITY: { "!type": "number", - "!doc": "代表负无穷大值的值." + "!doc": "代表负无穷大值的值.", }, - "prototype": { + prototype: { "!stdProto": "Number", - "toString": { + toString: { "!type": "fn(radix?: number) -> string", - "!doc": "返回代表指定Number对象的字符串" + "!doc": "返回代表指定Number对象的字符串", }, - "toFixed": { + toFixed: { "!type": "fn(digits: number) -> string", - "!doc": "使用定点符号格式化数字" + "!doc": "使用定点符号格式化数字", }, - "toExponential": { + toExponential: { "!type": "fn(digits: number) -> string", - "!doc": "返回以指数表示形式表示Number对象的字符串" + "!doc": "返回以指数表示形式表示Number对象的字符串", }, - "toPrecision": { + toPrecision: { "!type": "fn(digits: number) -> string", "!doc": " toPrecision()方法返回一个字符串,该数字表示指定精度的数字.", - } + }, }, - "EPSILON": { + EPSILON: { "!type": "number", - "!doc": " Number.EPSILON属性表示一个数值与可以表示为Number的最小值之间的差异.,", + "!doc": + " Number.EPSILON属性表示一个数值与可以表示为Number的最小值之间的差异.,", }, - "MAX_SAFE_INTEGER": { + MAX_SAFE_INTEGER: { "!type": "number", - "!doc": " Number.MAX_SAFE_INTEGER常量表示JavaScript中的最大安全整数(2 ^ 53-1).,", + "!doc": + " Number.MAX_SAFE_INTEGER常量表示JavaScript中的最大安全整数(2 ^ 53-1).,", }, - "MIN_SAFE_INTEGER": { + MIN_SAFE_INTEGER: { "!type": "number", - "!doc": " Number.MIN_SAFE_INTEGER常量表示JavaScript(-(2 ^ 53-1))中的最小安全整数.,", + "!doc": + " Number.MIN_SAFE_INTEGER常量表示JavaScript(-(2 ^ 53-1))中的最小安全整数.,", }, - "isFinite": { + isFinite: { "!type": "fn(testValue: ?) -> bool", "!doc": " Number.isFinite()方法确定传递的值是否为有限值.,", }, - "isInteger": { + isInteger: { "!type": "fn(testValue: ?) -> bool", "!doc": " Number.isInteger()方法确定传递的值是否为整数.,", }, - "isNaN": { + isNaN: { "!type": "fn(testValue: ?) -> bool", - "!doc": " Number.isNaN()方法确定传递的值是否为NaN.原始全局isNaN()的更可靠的版本.,", + "!doc": + " Number.isNaN()方法确定传递的值是否为NaN.原始全局isNaN()的更可靠的版本.,", }, - "isSafeInteger": { + isSafeInteger: { "!type": "fn(testValue: ?) -> bool", - "!doc": " Number.isSafeInteger()方法确定所提供的值是否是一个安全整数的数字.安全整数是该数字的整数.", + "!doc": + " Number.isSafeInteger()方法确定所提供的值是否是一个安全整数的数字.安全整数是该数字的整数.", }, - "parseFloat": { + parseFloat: { "!type": "fn(string: string) -> number", "!doc": " Number.parseFloat()方法解析字符串参数并返回浮点数.,", }, - "parseInt": { + parseInt: { "!type": "fn(string: string, radix?: number) -> number", - "!doc": " Number.parseInt()方法解析字符串参数并返回指定基数或基数的整数.,", + "!doc": + " Number.parseInt()方法解析字符串参数并返回指定基数或基数的整数.,", }, }, - "Boolean": { + Boolean: { "!type": "fn(value: ?) -> bool", - "prototype": { - "!stdProto": "Boolean" + prototype: { + "!stdProto": "Boolean", }, }, - "abstract": "?", - "arguments": "?", - "boolean": "?", - "break": "?", - "byte": "?", - "case": "?", - "catch": "?", - "char": "?", - "const": "?", - "continue": "?", - "debugger": "?", - "default": "?", - "delete": "?", - "do": "?", - "double": "?", - "else": "?", - "eval": "?", - "false": "bool", - "final": "?", - "finally": "?", - "float": "?", - "for": "?", - "function": "?", - "goto": "?", - "if": "?", - "implements": "?", - "in": "?", - "instanceof": "?", - "int": "?", - "interface": "?", - "long": "?", - "native": "?", - "new": "?", - "null": "?", - "package": "?", - "private": "?", - "protected": "?", - "public": "?", - "return": "?", - "short": "?", - "static": "?", - "switch": "?", - "synchronized": "?", - "this": "?", - "throw": "?", - "throws": "?", - "transient": "?", - "true": "bool", - "try": "?", - "typeof": "?", - "var": "?", - "void": "?", - "volatile": "?", - "while": "?", - "with": "?", - "yield": "?", - "RegExp": { + abstract: "?", + arguments: "?", + boolean: "?", + break: "?", + byte: "?", + case: "?", + catch: "?", + char: "?", + const: "?", + continue: "?", + debugger: "?", + default: "?", + delete: "?", + do: "?", + double: "?", + else: "?", + eval: "?", + false: "bool", + final: "?", + finally: "?", + float: "?", + for: "?", + function: "?", + goto: "?", + if: "?", + implements: "?", + in: "?", + instanceof: "?", + int: "?", + interface: "?", + long: "?", + native: "?", + new: "?", + null: "?", + package: "?", + private: "?", + protected: "?", + public: "?", + return: "?", + short: "?", + static: "?", + switch: "?", + synchronized: "?", + this: "?", + throw: "?", + throws: "?", + transient: "?", + true: "bool", + try: "?", + typeof: "?", + var: "?", + void: "?", + volatile: "?", + while: "?", + with: "?", + yield: "?", + RegExp: { "!type": "fn(source: string, flags?: string)", - "prototype": { + prototype: { "!stdProto": "RegExp", - "exec": { + exec: { "!type": "fn(input: string) -> [string]", "!doc": "搜索指定字符串中的匹配项.返回结果数组,或者为null.", }, - "test": { + test: { "!type": "fn(input: string) -> bool", "!doc": "执行正则表达式和指定字符串之间的匹配搜索.返回true或false.", - } + }, }, "!doc": "创建正则表达式对象以将文本与模式匹配.", }, - "parseInt": { + parseInt: { "!type": "fn(string: string, radix?: number) -> number", - "!doc": "解析字符串参数并返回指定基数或基数的整数." + "!doc": "解析字符串参数并返回指定基数或基数的整数.", }, - "parseFloat": { + parseFloat: { "!type": "fn(string: string) -> number", - "!doc": "解析字符串参数并返回浮点数." + "!doc": "解析字符串参数并返回浮点数.", }, - "isNaN": { + isNaN: { "!type": "fn(value: number) -> bool", - "!doc": "确定值是否为NaN.请注意,此函数已损坏.您可能对ECMAScript 6 Number.isNaN感兴趣.", + "!doc": + "确定值是否为NaN.请注意,此函数已损坏.您可能对ECMAScript 6 Number.isNaN感兴趣.", }, - "isFinite": { + isFinite: { "!type": "fn(value: number) -> bool", - "!doc": "确定传递的值是否为有限数字." + "!doc": "确定传递的值是否为有限数字.", }, - "eval": { + eval: { "!type": "fn(code: string) -> ?", - "!doc": "评估以字符串形式表示的JavaScript代码." + "!doc": "评估以字符串形式表示的JavaScript代码.", }, - "encodeURI": { + encodeURI: { "!type": "fn(uri: string) -> string", - "!doc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)(对于字符而言将仅是四个转义序列由两个\"代理\"字符组成).", + "!doc": + '通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)(对于字符而言将仅是四个转义序列由两个"代理"字符组成).', }, - "encodeURIComponent": { + encodeURIComponent: { "!type": "fn(uri: string) -> string", - "!doc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)组件(对于由两个\"代理\"字符组成的字符).", + "!doc": + '通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来编码统一资源标识符(URI)组件(对于由两个"代理"字符组成的字符).', }, - "decodeURI": { + decodeURI: { "!type": "fn(uri: string) -> string", "!doc": "解码以前由encodeURI或类似例程创建的统一资源标识符(URI).", }, - "decodeURIComponent": { + decodeURIComponent: { "!type": "fn(uri: string) -> string", - "!doc": "解码以前由encodeURIComponent或类似例程创建的统一资源标识符(URI)组件.", + "!doc": + "解码以前由encodeURIComponent或类似例程创建的统一资源标识符(URI)组件.", }, - "Math": { - "E": { + Math: { + E: { "!type": "number", - "!doc": "自然对数的底数,e约为2.718." + "!doc": "自然对数的底数,e约为2.718.", }, - "LN2": { + LN2: { "!type": "number", - "!doc": " 2的自然对数,大约为0.693." + "!doc": " 2的自然对数,大约为0.693.", }, - "LN10": { + LN10: { "!type": "number", - "!doc": " 10的自然对数,大约为2.302." + "!doc": " 10的自然对数,大约为2.302.", }, - "LOG2E": { + LOG2E: { "!type": "number", "!doc": " E的以2为底的对数(大约1.442).", }, - "LOG10E": { + LOG10E: { "!type": "number", - "!doc": " E的以10为底的对数(约0.434)." + "!doc": " E的以10为底的对数(约0.434).", }, - "SQRT1_2": { + SQRT1_2: { "!type": "number", - "!doc": " 1/2的平方根;等效于2的平方根上的1,大约为0.707." + "!doc": " 1/2的平方根;等效于2的平方根上的1,大约为0.707.", }, - "SQRT2": { + SQRT2: { "!type": "number", - "!doc": " 2的平方根,大约为1.414." + "!doc": " 2的平方根,大约为1.414.", }, - "PI": { + PI: { "!type": "number", - "!doc": "圆的周长与其直径之比,大约为3.14159." + "!doc": "圆的周长与其直径之比,大约为3.14159.", }, - "abs": { + abs: { "!type": "fn(number) -> number", - "!doc": "返回数字的绝对值." + "!doc": "返回数字的绝对值.", }, - "cos": { + cos: { "!type": "fn(number) -> number", - "!doc": "返回数字的余弦." + "!doc": "返回数字的余弦.", }, - "sin": { + sin: { "!type": "fn(number) -> number", - "!doc": "返回数字的正弦." + "!doc": "返回数字的正弦.", }, - "tan": { + tan: { "!type": "fn(number) -> number", - "!doc": "返回数字的正切值." + "!doc": "返回数字的正切值.", }, - "acos": { + acos: { "!type": "fn(number) -> number", - "!doc": "返回数字的反余弦(以弧度为单位)." + "!doc": "返回数字的反余弦(以弧度为单位).", }, - "asin": { + asin: { "!type": "fn(number) -> number", - "!doc": "返回数字的反正弦(以弧度为单位)." + "!doc": "返回数字的反正弦(以弧度为单位).", }, - "atan": { + atan: { "!type": "fn(number) -> number", - "!doc": "返回数字的反正切(以弧度为单位)." + "!doc": "返回数字的反正切(以弧度为单位).", }, - "atan2": { + atan2: { "!type": "fn(y: number, x: number) -> number", - "!doc": "返回其参数商的反正切值." + "!doc": "返回其参数商的反正切值.", }, - "ceil": { + ceil: { "!type": "fn(number) -> number", - "!doc": "返回大于或等于数字的最小整数." + "!doc": "返回大于或等于数字的最小整数.", }, - "floor": { + floor: { "!type": "fn(number) -> number", - "!doc": "返回小于或等于数字的最大整数." + "!doc": "返回小于或等于数字的最大整数.", }, - "round": { + round: { "!type": "fn(number) -> number", - "!doc": "返回四舍五入到最接近整数的数字的值." + "!doc": "返回四舍五入到最接近整数的数字的值.", }, - "exp": { + exp: { "!type": "fn(number) -> number", - "!doc": "返回E ^ x,其中x是自变量,E是欧拉常数,自然对数的底." + "!doc": "返回E ^ x,其中x是自变量,E是欧拉常数,自然对数的底.", }, - "log": { + log: { "!type": "fn(number) -> number", "!doc": "返回数字的自然对数(以E为底).", }, - "sqrt": { + sqrt: { "!type": "fn(number) -> number", - "!doc": "返回数字的平方根." + "!doc": "返回数字的平方根.", }, - "pow": { + pow: { "!type": "fn(number, number) -> number", - "!doc": "将基数返回指数幂,即baseexponent." + "!doc": "将基数返回指数幂,即baseexponent.", }, - "max": { + max: { "!type": "fn(number, number) -> number", - "!doc": "返回零个或多个数字中的最大值." + "!doc": "返回零个或多个数字中的最大值.", }, - "min": { + min: { "!type": "fn(number, number) -> number", - "!doc": "返回零个或多个数字中的最小值." + "!doc": "返回零个或多个数字中的最小值.", }, - "random": { + random: { "!type": "fn() -> number", - "!doc": "返回一个浮点伪随机数,范围为[0,1),即从0(包括)到不包括1(排除),然后您可以缩放到所需的值范围." + "!doc": + "返回一个浮点伪随机数,范围为[0,1),即从0(包括)到不包括1(排除),然后您可以缩放到所需的值范围.", }, - "log10": { + log10: { "!type": "fn(x: number) -> number", "!doc": " Math.log10()函数返回数字的以10为底的对数.", }, - "log2": { + log2: { "!type": "fn(x: number) -> number", "!doc": " Math.log2()函数返回数字的以2为底的对数.", }, - "sign": { + sign: { "!type": "fn(x: number) -> number", "!doc": " Math.sign()函数返回数字的符号,指示数字是正数,负数还是零.,", }, - "trunc": { + trunc: { "!type": "fn(x: number) -> number", - "!doc": " Math.trunc()函数通过删除任何小数位来返回数字的整数部分.它不舍入任何数字.该函数可以用floor()和ceil()函数表示: ,", + "!doc": + " Math.trunc()函数通过删除任何小数位来返回数字的整数部分.它不舍入任何数字.该函数可以用floor()和ceil()函数表示: ,", }, "!doc": "一个内置对象,具有用于数学常数和函数的属性和方法.", }, - "JSON": { - "parse": { - "!type": "fn(json: string, reviver?: fn(key: string, value: ?) -> ?) -> ?", + JSON: { + parse: { + "!type": + "fn(json: string, reviver?: fn(key: string, value: ?) -> ?) -> ?", "!doc": "将字符串解析为JSON,可以选择转换解析产生的值.", }, - "stringify": { - "!type": "fn(value: ?, replacer?: fn(key: string, value: ?) -> ?, space?: string|number) -> string", - "!doc": "将值转换为JSON,如果指定了replacer函数,则可以选择替换值,如果指定了replacer数组,则可以选择仅包括指定的属性.", + stringify: { + "!type": + "fn(value: ?, replacer?: fn(key: string, value: ?) -> ?, space?: string|number) -> string", + "!doc": + "将值转换为JSON,如果指定了replacer函数,则可以选择替换值,如果指定了replacer数组,则可以选择仅包括指定的属性.", }, - "!doc": " JSON(JavaScript对象表示法)是一种数据交换格式.尽管它不是严格的子集,但它非常类似于JavaScript语法的子集.(有关详细信息,请参见JavaScript参考中的JSON.)在编写任何类型的基于JavaScript的应用程序(包括网站和浏览器扩展程序)时非常有用.例如,您可以将JSON格式的用户信息存储在cookie中,或者可以将扩展名首选项以JSON形式存储在字符串值的浏览器首选项中." - } + "!doc": + " JSON(JavaScript对象表示法)是一种数据交换格式.尽管它不是严格的子集,但它非常类似于JavaScript语法的子集.(有关详细信息,请参见JavaScript参考中的JSON.)在编写任何类型的基于JavaScript的应用程序(包括网站和浏览器扩展程序)时非常有用.例如,您可以将JSON格式的用户信息存储在cookie中,或者可以将扩展名首选项以JSON形式存储在字符串值的浏览器首选项中.", + }, }, { "!name": "core", "!define": { - "image": { + image: { "!doc": "图片信息", - "width": "number", - "height": "number", - "src": "string" + width: "number", + height: "number", + src: "string", }, - "audio": { + audio: { "!doc": "音乐音效信息", - "currentTime": "number", - "play": "fn()", - "pause": "fn()", - "paused": "bool", - "duration": "number", - "volume": "number", + currentTime: "number", + play: "fn()", + pause: "fn()", + paused: "bool", + duration: "number", + volume: "number", }, - "flag": { + flag: { "!doc": "当前变量", - "hard": { + hard: { "!type": "number", - "!doc": "当前难度编号" + "!doc": "当前难度编号", }, - "hatred": { + hatred: { "!type": "number", - "!doc": "当前仇恨值" + "!doc": "当前仇恨值", }, - "poison": { + poison: { "!type": "bool", - "!doc": "是否处于中毒状态" + "!doc": "是否处于中毒状态", }, - "weak": { + weak: { "!type": "number", - "!doc": "是否处于衰弱状态" + "!doc": "是否处于衰弱状态", }, - "curse": { + curse: { "!type": "number", - "!doc": "是否处于诅咒状态" + "!doc": "是否处于诅咒状态", }, - "no_zone": { + no_zone: { "!type": "bool", - "!doc": "无视领域伤害" + "!doc": "无视领域伤害", }, - "no_repulse": { + no_repulse: { "!type": "bool", - "!doc": "无视阻击伤害" + "!doc": "无视阻击伤害", }, - "no_lasel": { + no_lasel: { "!type": "bool", - "!doc": "无视激光伤害" + "!doc": "无视激光伤害", }, - "no_ambush": { + no_ambush: { "!type": "bool", - "!doc": "无视捕捉" + "!doc": "无视捕捉", }, - "__bgm__": { + __bgm__: { "!type": "string", - "!doc": "背景音乐" + "!doc": "背景音乐", }, - "__weather__": { - "!doc": "天气" + __weather__: { + "!doc": "天气", }, - "__color__": { - "!doc": "色调" + __color__: { + "!doc": "色调", }, - "__volume__": { + __volume__: { "!type": "number", - "!doc": "音量" + "!doc": "音量", }, - "skill": { + skill: { "!type": "number", - "!doc": "当前开启的技能编号" + "!doc": "当前开启的技能编号", }, - "skillName": { + skillName: { "!type": "string", - "!doc": "当前开启的技能名" + "!doc": "当前开启的技能名", }, - "input": { + input: { "!type": "string|number", - "!doc": "等待用户输入后的存放值" + "!doc": "等待用户输入后的存放值", }, - "type": { + type: { "!type": "number", - "!doc": "等待用户操作后获得的操作类型" + "!doc": "等待用户操作后获得的操作类型", }, - "keycode": { + keycode: { "!type": "number", - "!doc": "等待用户操作后用户按键的键值" + "!doc": "等待用户操作后用户按键的键值", }, - "x": { + x: { "!type": "number", - "!doc": "等待用户操作后用户点击的网格横坐标" + "!doc": "等待用户操作后用户点击的网格横坐标", }, - "y": { + y: { "!type": "number", - "!doc": "等待用户操作后用户点击的网格纵坐标" + "!doc": "等待用户操作后用户点击的网格纵坐标", }, - "px": { + px: { "!type": "number", - "!doc": "等待用户操作后用户点击的像素横坐标" + "!doc": "等待用户操作后用户点击的像素横坐标", }, - "py": { + py: { "!type": "number", - "!doc": "等待用户操作后用户点击的像素纵坐标" + "!doc": "等待用户操作后用户点击的像素纵坐标", }, - "__visited__": { - "!doc": "当前访问过的楼层" + __visited__: { + "!doc": "当前访问过的楼层", }, - "__leaveLoc__": { - "!doc": "每个楼层的离开位置,用于楼传平面塔模式" + __leaveLoc__: { + "!doc": "每个楼层的离开位置,用于楼传平面塔模式", }, - "cannotMoveDirectly": { + cannotMoveDirectly: { "!type": "bool", - "!doc": "当前是否全局不可瞬移" + "!doc": "当前是否全局不可瞬移", }, }, - "hero": { + hero: { "!doc": "勇士当前属性", - "image": { + image: { "!type": "string", - "!doc": "行走图" + "!doc": "行走图", }, - "animate": { + animate: { "!type": "bool", - "!doc": "是否开启帧动画" + "!doc": "是否开启帧动画", }, - "name": { + name: { "!type": "string", - "!doc": "勇士名" + "!doc": "勇士名", }, - "lv": { + lv: { "!type": "number", - "!doc": "勇士等级" + "!doc": "勇士等级", }, - "hpmax": { + hpmax: { "!type": "number", - "!doc": "勇士生命上限" + "!doc": "勇士生命上限", }, - "hp": { + hp: { "!type": "number", - "!doc": "勇士当前生命值" + "!doc": "勇士当前生命值", }, - "atk": { + atk: { "!type": "number", - "!doc": "勇士当前攻击力" + "!doc": "勇士当前攻击力", }, - "def": { + def: { "!type": "number", - "!doc": "勇士当前防御力" + "!doc": "勇士当前防御力", }, - "manamax": { + manamax: { "!type": "number", - "!doc": "勇士当前魔力上限,负数无效" + "!doc": "勇士当前魔力上限,负数无效", }, - "mana": { + mana: { "!type": "number", - "!doc": "勇士当前魔力值" + "!doc": "勇士当前魔力值", }, - "mdef": { + mdef: { "!type": "number", - "!doc": "勇士当前护盾值" + "!doc": "勇士当前护盾值", }, - "money": { + money: { "!type": "number", - "!doc": "勇士当前金币" + "!doc": "勇士当前金币", }, - "exp": { + exp: { "!type": "number", - "!doc": "勇士当前经验" + "!doc": "勇士当前经验", }, - "equipment": { + equipment: { "!type": "[string]", - "!doc": "勇士当前装备" + "!doc": "勇士当前装备", }, - "items": { + items: { "!doc": "勇士当前道具", - "constants": { - "!doc": "永久道具" + constants: { + "!doc": "永久道具", }, - "tools": { + tools: { "!doc": "消耗道具", - "yellowKey": { + yellowKey: { "!type": "number", - "!doc": "黄钥匙个数" + "!doc": "黄钥匙个数", }, - "blueKey": { + blueKey: { "!type": "number", - "!doc": "蓝钥匙个数" + "!doc": "蓝钥匙个数", }, - "redKey": { + redKey: { "!type": "number", - "!doc": "红钥匙个数" + "!doc": "红钥匙个数", }, - "greenKey": { + greenKey: { "!type": "number", - "!doc": "绿钥匙个数" + "!doc": "绿钥匙个数", }, - "steelKey": { + steelKey: { "!type": "number", - "!doc": "铁门钥匙个数" + "!doc": "铁门钥匙个数", }, }, - "equips": { - "!doc": "在背包中未装备上的装备" + equips: { + "!doc": "在背包中未装备上的装备", }, }, - "loc": { + loc: { "!doc": "勇士当前坐标和朝向", - "x": "number", - "y": "number", - "direction": { + x: "number", + y: "number", + direction: { "!doc": "朝向,只能为 up,down,left,right 之一", - "!type": "string" + "!type": "string", }, }, - "flags": { + flags: { "!type": "flag", - "!doc": "当前游戏中用到的变量" + "!doc": "当前游戏中用到的变量", }, - "followers": { + followers: { "!type": "[?]", - "!doc": "跟随者信息" + "!doc": "跟随者信息", }, - "steps": { + steps: { "!type": "number", - "!doc": "当前步数" - } + "!doc": "当前步数", + }, }, - "block": { + block: { "!doc": "地图图块信息", - "x": { + x: { "!type": "number", - "!doc": "图块的x坐标" + "!doc": "图块的x坐标", }, - "y": { + y: { "!type": "number", - "!doc": "图块的y坐标" + "!doc": "图块的y坐标", }, - "id": { + id: { "!type": "number", - "!doc": "图块的数字" + "!doc": "图块的数字", }, - "event": { + event: { "!doc": "图块上的事件信息", - "id": { + id: { "!type": "string", - "!doc": "图块的ID" + "!doc": "图块的ID", }, - "cls": { + cls: { "!type": "string", - "!doc": "图块的类别,一般为所在图片名去掉后缀" + "!doc": "图块的类别,一般为所在图片名去掉后缀", }, - "disabled": { + disabled: { "!type": "bool", - "!doc": "启用状态" - } - } + "!doc": "启用状态", + }, + }, }, - "blockInfo": { + blockInfo: { "!doc": "图块的更多信息", - "animate": { + animate: { "!type": "number", - "!doc": "动画帧数" + "!doc": "动画帧数", }, - "cls": { + cls: { "!type": "string", - "!doc": "图块类别" + "!doc": "图块类别", }, - "faceIds": { + faceIds: { "!doc": "行走图朝向", - "up": "string", - "down": "string", - "left": "string", - "right": "string" + up: "string", + down: "string", + left: "string", + right: "string", }, - "height": { + height: { "!type": "number", - "!doc": "图块高度" + "!doc": "图块高度", }, - "id": { + id: { "!type": "string", - "!doc": "图块ID" + "!doc": "图块ID", }, - "image": { + image: { "!type": "image", - "!doc": "图块所在的图片" + "!doc": "图块所在的图片", }, - "name": { + name: { "!type": "string", - "!doc": "图块名称" + "!doc": "图块名称", }, - "number": { + number: { "!type": "number", - "!doc": "图块使用的数字" + "!doc": "图块使用的数字", }, - "posX": { + posX: { "!type": "number", - "!doc": "图块在图片上的横坐标" + "!doc": "图块在图片上的横坐标", }, - "posY": { + posY: { "!type": "number", - "!doc": "图块在图片上的纵坐标" + "!doc": "图块在图片上的纵坐标", }, }, - "enemy": { + enemy: { "!doc": "怪物信息", - "id": { + id: { "!type": "string", - "!doc": "怪物ID" + "!doc": "怪物ID", }, - "name": { + name: { "!type": "string", - "!doc": "怪物名称" + "!doc": "怪物名称", }, - "displayIdInBook": { + displayIdInBook: { "!type": "string", - "!doc": "在怪物手册映射ID" + "!doc": "在怪物手册映射ID", }, - "hp": { + hp: { "!type": "number", - "!doc": "怪物生命值" + "!doc": "怪物生命值", }, - "atk": { + atk: { "!type": "number", - "!doc": "怪物攻击" + "!doc": "怪物攻击", }, - "def": { + def: { "!type": "number", - "!doc": "怪物防御" + "!doc": "怪物防御", }, - "money": { + money: { "!type": "number", - "!doc": "怪物金币" + "!doc": "怪物金币", }, - "exp": { + exp: { "!type": "number", - "!doc": "怪物经验" + "!doc": "怪物经验", }, - "special": { + special: { "!type": "[number]", - "!doc": "怪物特殊属性" + "!doc": "怪物特殊属性", }, - "point": { + point: { "!type": "number", - "!doc": "怪物加点" + "!doc": "怪物加点", }, - "value": { + value: { "!type": "number", - "!doc": "怪物特殊属性值:阻激夹域伤害值;吸血比例;光环增加生命比例" + "!doc": "怪物特殊属性值:阻激夹域伤害值;吸血比例;光环增加生命比例", }, - "zoneSquare": { + zoneSquare: { "!type": "bool", - "!doc": "领域怪是否九宫格伤害;区域光环是否九宫格范围" + "!doc": "领域怪是否九宫格伤害;区域光环是否九宫格范围", }, - "range": { + range: { "!type": "number", - "!doc": "领域伤害的范围;区域光环范围" + "!doc": "领域伤害的范围;区域光环范围", }, - "notBomb": { + notBomb: { "!type": "bool", - "!doc": "怪物不可炸" + "!doc": "怪物不可炸", }, - "n": { + n: { "!type": "number", - "!doc": "多连击的连击数;净化比例" + "!doc": "多连击的连击数;净化比例", }, - "add": { + add: { "!type": "bool", - "!doc": "吸血是否加到自身;光环是否叠加" + "!doc": "吸血是否加到自身;光环是否叠加", }, - "atkValue": { + atkValue: { "!type": "number", - "!doc": "反击比例;退化扣除攻击;光环增加攻击;" + "!doc": "反击比例;退化扣除攻击;光环增加攻击;", }, - "defValue": { + defValue: { "!type": "number", - "!doc": "破甲比例;退化扣除防御;光环增加防御" + "!doc": "破甲比例;退化扣除防御;光环增加防御", }, - "damage": { + damage: { "!type": "number", - "!doc": "固伤值" + "!doc": "固伤值", }, }, - "item": { + item: { "!doc": "道具信息", - "id": { + id: { "!type": "string", - "!doc": "道具ID" + "!doc": "道具ID", }, - "cls": { + cls: { "!type": "string", - "!doc": "道具类型" + "!doc": "道具类型", }, - "name": { + name: { "!type": "string", - "!doc": "道具名称" + "!doc": "道具名称", }, - "text": { + text: { "!type": "string", - "!doc": "道具描述" + "!doc": "道具描述", }, - "hideInToolbox": { + hideInToolbox: { "!type": "bool", - "!doc": "不显示在道具栏" + "!doc": "不显示在道具栏", }, - "equip": { + equip: { "!doc": "装备属性", - "type": { + type: { "!type": "number|string", - "!doc": "装备类型" + "!doc": "装备类型", }, - "animate": { + animate: { "!type": "string", - "!doc": "装备动画" + "!doc": "装备动画", }, - "value": { - "!doc": "数值加成" + value: { + "!doc": "数值加成", + }, + percentage: { + "!doc": "比例加成", }, - "percentage": { - "!doc": "比例加成" - } }, - "hideInReplay": { + hideInReplay: { "!type": "bool", - "!doc": "回放不绘制道具栏" + "!doc": "回放不绘制道具栏", }, }, - "floor": { + floor: { "!doc": "楼层信息", - "floorId": { + floorId: { "!type": "string", - "!doc": "楼层ID" + "!doc": "楼层ID", }, - "title": { + title: { "!type": "string", - "!doc": "楼层中文名" + "!doc": "楼层中文名", }, - "name": { + name: { "!type": "string", - "!doc": "状态栏显示值" + "!doc": "状态栏显示值", }, - "width": { + width: { "!type": "number", - "!doc": "地图宽" + "!doc": "地图宽", }, - "height": { + height: { "!type": "number", - "!doc": "地图高" + "!doc": "地图高", }, - "canFlyTo": { + canFlyTo: { "!type": "bool", - "!doc": "该楼是否可以楼传飞到" + "!doc": "该楼是否可以楼传飞到", }, - "canFlyFrom": { + canFlyFrom: { "!type": "bool", - "!doc": "该楼是否可以楼传飞出" + "!doc": "该楼是否可以楼传飞出", }, - "canUseQuickShop": { + canUseQuickShop: { "!type": "bool", - "!doc": "该楼是否可快捷商店" + "!doc": "该楼是否可快捷商店", }, - "cannotViewMap": { + cannotViewMap: { "!type": "bool", - "!doc": "该层是否不允许被浏览地图看到,也不统计" + "!doc": "该层是否不允许被浏览地图看到,也不统计", }, - "cannotMoveDirectly": { + cannotMoveDirectly: { "!type": "bool", - "!doc": "该层是否不允许瞬间移动" + "!doc": "该层是否不允许瞬间移动", }, - "upFloor": { + upFloor: { "!type": "[number]", - "!doc": "上楼点" + "!doc": "上楼点", }, - "downFloor": { + downFloor: { "!type": "[number]", - "!doc": "下楼点" + "!doc": "下楼点", }, - "flyPoint": { + flyPoint: { "!type": "[number]", - "!doc": "楼传落点" + "!doc": "楼传落点", }, - "color": { - "!doc": "楼层色调" + color: { + "!doc": "楼层色调", }, - "weather": { - "!doc": "楼层天气" + weather: { + "!doc": "楼层天气", }, - "bgm": { + bgm: { "!type": "string", - "!doc": "楼层背景音乐" + "!doc": "楼层背景音乐", }, - "ratio": { + ratio: { "!type": "number", - "!doc": "宝石/血瓶效果" + "!doc": "宝石/血瓶效果", }, - "map": { + map: { "!type": "[[number]]", - "!doc": "地图数据" + "!doc": "地图数据", }, - "blocks": { + blocks: { "!type": "[block]", - "!doc": "本层图块信息" - } + "!doc": "本层图块信息", + }, }, - "animate": { + animate: { "!doc": "动画信息", - "se": { + se: { "!type": "string", - "!doc": "动画音效" - } - } + "!doc": "动画音效", + }, + }, }, - "core": { + core: { "!doc": "核心游戏控制", - "__SIZE__": { + __SIZE__: { "!type": "number", - "!doc": "窗口宽度,为13或15" + "!doc": "窗口宽度,为13或15", }, - "__PIXELS__": { + __PIXELS__: { "!type": "number", - "!doc": "窗口像素宽度,为416或480" + "!doc": "窗口像素宽度,为416或480", }, - "__HALF_SIZE__": { + __HALF_SIZE__: { "!type": "number", - "!doc": "窗口宽度的一半,为6或7" + "!doc": "窗口宽度的一半,为6或7", }, - "floorIds": { + floorIds: { "!type": "[string]", - "!doc": "全部楼层ID列表" + "!doc": "全部楼层ID列表", }, - "floors": { - "!doc": "全部楼层信息" + floors: { + "!doc": "全部楼层信息", }, - "floorPartitions": { + floorPartitions: { "!type": "[[string]]", - "!doc": "楼层分区信息" + "!doc": "楼层分区信息", }, - "material": { + material: { "!doc": "游戏所用到的资源", - "animates": { - "!doc": "注册的动画" + animates: { + "!doc": "注册的动画", }, - "images": { - "!doc": "注册的图片" + images: { + "!doc": "注册的图片", }, - "bgms": { - "!doc": "注册的背景音乐" + bgms: { + "!doc": "注册的背景音乐", }, - "sounds": { - "!doc": "注册的音效" + sounds: { + "!doc": "注册的音效", }, - "enemys": { + enemys: { "!doc": "怪物定义", }, - "items": { - "!doc": "道具定义" - } + items: { + "!doc": "道具定义", + }, }, - "timeout": { - "!doc": "当前异步事件句柄" + timeout: { + "!doc": "当前异步事件句柄", }, - "interval": { - "!doc": "当前异步事件延时" + interval: { + "!doc": "当前异步事件延时", }, - "animateFrame": { - "!doc": "当前各个帧动画" + animateFrame: { + "!doc": "当前各个帧动画", }, - "musicStatus": { + musicStatus: { "!doc": "音乐音效状态", - "bgmStatus": { + bgmStatus: { "!type": "bool", - "!doc": "是否播放BGM" + "!doc": "是否播放BGM", }, - "soundStatus": { + soundStatus: { "!type": "bool", - "!doc": "是否播放SE" + "!doc": "是否播放SE", }, - "playingBgm": { + playingBgm: { "!type": "string", - "!doc": "正在播放的bgm" + "!doc": "正在播放的bgm", }, - "lastBgm": { + lastBgm: { "!type": "string", - "!doc": "上次播放的bgm" + "!doc": "上次播放的bgm", }, - "playingSounds": { - "!doc": "正在播放的SE" + playingSounds: { + "!doc": "正在播放的SE", }, - "volume": { + volume: { "!type": "number", - "!doc": "当前bgm音量" - } + "!doc": "当前bgm音量", + }, }, - "platform": { + platform: { "!doc": "平台信息", - "isPC": "bool", - "isAndroid": "bool", - "isIOS": "bool", + isPC: "bool", + isAndroid: "bool", + isIOS: "bool", }, - "domStyle": { + domStyle: { "!doc": "界面样式", - "scale": { + scale: { "!type": "number", "!doc": "当前界面放缩比例", }, - "ratio": { + ratio: { "!type": "number", - "!doc": "高清UI放缩比例" + "!doc": "高清UI放缩比例", }, - "hdCanvas": { + hdCanvas: { "!type": "[string]", - "!doc": "高清UI的系统画布" + "!doc": "高清UI的系统画布", }, - "availableScale": { + availableScale: { "!type": "[number]", - "!doc": "当前界面支持的放缩比例" + "!doc": "当前界面支持的放缩比例", }, - "isVertical": { + isVertical: { "!type": "bool", - "!doc": "当前是否是竖屏" + "!doc": "当前是否是竖屏", }, - "showStatusBar": { + showStatusBar: { "!type": "bool", - "!doc": "当前是否显示状态栏" + "!doc": "当前是否显示状态栏", }, - "toolbarBtn": { + toolbarBtn: { "!type": "bool", - "!doc": "当前工具栏是否是1-8的按钮" + "!doc": "当前工具栏是否是1-8的按钮", }, }, - "bigmap": { + bigmap: { "!doc": "大地图信息", - "canvas": { + canvas: { "!type": "[string]", - "!doc": "大地图的画布" + "!doc": "大地图的画布", }, - "width": { + width: { "!type": "number", - "!doc": "大地图高度" + "!doc": "大地图高度", }, - "height": { + height: { "!type": "number", - "!doc": "大地图宽度" + "!doc": "大地图宽度", }, - "offsetX": { + offsetX: { "!type": "number", - "!doc": "大地图视角横向偏移量" + "!doc": "大地图视角横向偏移量", }, - "offsetY": { + offsetY: { "!type": "number", - "!doc": "大地图视角纵向偏移量" + "!doc": "大地图视角纵向偏移量", }, - "posX": { + posX: { "!type": "number", - "!doc": "大地图视角横向基准格" + "!doc": "大地图视角横向基准格", }, - "posY": { + posY: { "!type": "number", - "!doc": "大地图视角纵向基准格" + "!doc": "大地图视角纵向基准格", }, - "v2": { + v2: { "!type": "bool", - "!doc": "是否是新版大地图绘制方式" + "!doc": "是否是新版大地图绘制方式", }, - "threshold": { + threshold: { "!type": "number", - "!doc": "新版大地图绘制方式的分界线" + "!doc": "新版大地图绘制方式的分界线", }, - "extend": { + extend: { "!type": "number", - "!doc": "新版大地图模式下向每一侧额外计算的数量" + "!doc": "新版大地图模式下向每一侧额外计算的数量", }, - "scale": { + scale: { "!type": "number", - "!doc": "缩略图的比例放缩" + "!doc": "缩略图的比例放缩", }, - "tempCanvas": { + tempCanvas: { "!type": "CanvasRenderingContext2D", - "!doc": "临时画布" - } + "!doc": "临时画布", + }, }, - "saves": { - "!doc": "当前存档信息" + saves: { + "!doc": "当前存档信息", }, - "dymCanvas": { - "!doc": "各个自定义画布" + dymCanvas: { + "!doc": "各个自定义画布", }, - "statusBar": { - "!doc": "状态栏信息" + statusBar: { + "!doc": "状态栏信息", }, - "canvas": { - "!doc": "系统画布" + canvas: { + "!doc": "系统画布", }, - "flags": { - "!doc": "系统开关" + flags: { + "!doc": "系统开关", }, - "values": { - "!doc": "全局数值,如毒衰效果" + values: { + "!doc": "全局数值,如毒衰效果", }, - "firstData": { - "!doc": "初始属性,如出生点" + firstData: { + "!doc": "初始属性,如出生点", }, - "status": { + status: { "!doc": "状态信息", - "hero": { + hero: { "!type": "hero", - "!doc": "勇士信息" + "!doc": "勇士信息", }, - "automaticRoute": { - "!doc": "自动寻路信息" + automaticRoute: { + "!doc": "自动寻路信息", }, - "bgmaps": { - "!doc": "各地图背景层" + bgmaps: { + "!doc": "各地图背景层", }, - "fgmaps": { - "!doc": "各地图前景层" + fgmaps: { + "!doc": "各地图前景层", }, - "mapBlockObjs": { - "!doc": "以<位置,block>存放的各地图图块信息" + mapBlockObjs: { + "!doc": "以<位置,block>存放的各地图图块信息", }, - "boxAnimateObjs": { - "!doc": "(手册和剧情文本的)帧动画对象" + boxAnimateObjs: { + "!doc": "(手册和剧情文本的)帧动画对象", }, - "checkBlock": { + checkBlock: { "!doc": "阻激夹域捕捉信息", - "damage": { - "!doc": "每个点的伤害信息" + damage: { + "!doc": "每个点的伤害信息", }, - "type": { - "!doc": "每个点的伤害类型" + type: { + "!doc": "每个点的伤害类型", }, - "repluse": { - "!doc": "每个点的阻击信息" + repluse: { + "!doc": "每个点的阻击信息", }, - "ambush": { - "!doc": "每个点的捕捉信息" + ambush: { + "!doc": "每个点的捕捉信息", }, - "needCache": { + needCache: { "!type": "bool", - "!doc": "该楼层是否需要计算缓存" + "!doc": "该楼层是否需要计算缓存", }, - "cache": { - "!doc": "每个点的光环缓存" + cache: { + "!doc": "每个点的光环缓存", }, }, - "damage": { + damage: { "!doc": "每个点的显伤信息", }, - "ctrlDown": { + ctrlDown: { "!type": "bool", - "!doc": "Ctrl键是否被按下" + "!doc": "Ctrl键是否被按下", }, - "curtainColor": { - "!doc": "当前画面色调" + curtainColor: { + "!doc": "当前画面色调", }, - "event": { + event: { "!doc": "当前事件", - "data": { - "!doc": "事件信息,如坐标等" + data: { + "!doc": "事件信息,如坐标等", }, - "id": { + id: { "!type": "string", - "!doc": "事件类型,如选择项/确认框" + "!doc": "事件类型,如选择项/确认框", }, - "interval": { + interval: { "!type": "number", - "!doc": "打字机效果的定时器" + "!doc": "打字机效果的定时器", }, - "selection": { + selection: { "!type": "number", - "!doc": "选择项和确认框的当前选中项" + "!doc": "选择项和确认框的当前选中项", + }, + ui: { + "!doc": "当前事件的界面信息,如楼传/手册/SL", }, - "ui": { - "!doc": "当前事件的界面信息,如楼传/手册/SL" - } }, - "floorAnimateObjs": { - "!doc": "楼层贴图的帧动画" + floorAnimateObjs: { + "!doc": "楼层贴图的帧动画", }, - "floorId": { + floorId: { "!type": "string", - "!doc": "当前楼层ID" + "!doc": "当前楼层ID", }, - "gameOver": { + gameOver: { "!type": "bool", - "!doc": "游戏是否已结束" + "!doc": "游戏是否已结束", }, - "globalAnimateObjs": { - "!doc": "各全局动画" + globalAnimateObjs: { + "!doc": "各全局动画", }, - "globalAnimateStatus": { + globalAnimateStatus: { "!type": "number", - "!doc": "全局动画的帧状态" + "!doc": "全局动画的帧状态", }, - "globalAttribute": { - "!doc": "全局css属性" + globalAttribute: { + "!doc": "全局css属性", }, - "hard": { + hard: { "!type": "string", - "!doc": "状态栏一角的难度名" + "!doc": "状态栏一角的难度名", }, - "downTime": { + downTime: { "!type": "number", - "!doc": "方向键已按下的时间" + "!doc": "方向键已按下的时间", }, - "heroCenter": { + heroCenter: { "!doc": "勇士中心像素坐标", - "px": { + px: { "!type": "number", - "!doc": "勇士中心的横坐标" + "!doc": "勇士中心的横坐标", }, - "py": { + py: { "!type": "number", - "!doc": "勇士中心的纵坐标" + "!doc": "勇士中心的纵坐标", }, }, - "heroMoving": { + heroMoving: { "!type": "number", - "!doc": "勇士行走的状态值" + "!doc": "勇士行走的状态值", }, - "heroStop": { + heroStop: { "!type": "bool", - "!doc": "勇士是否已停下" + "!doc": "勇士是否已停下", }, - "holdingKeys": { + holdingKeys: { "!type": "[number]", - "!doc": "当前按下的键" + "!doc": "当前按下的键", }, - "id2number": { - "!doc": "图块ID到数字的对应关系" + id2number: { + "!doc": "图块ID到数字的对应关系", }, - "lockControl": { + lockControl: { "!type": "bool", - "!doc": "当前是否是锁定操作状态" + "!doc": "当前是否是锁定操作状态", }, - "maps": { - "!doc": "当前各地图信息" + maps: { + "!doc": "当前各地图信息", }, - "number2Block": { - "!doc": "数字到图块对象的对应关系" + number2Block: { + "!doc": "数字到图块对象的对应关系", }, - "played": { + played: { "!type": "bool", - "!doc": "当前是否游戏中(不包括标题画面和录像回放)" + "!doc": "当前是否游戏中(不包括标题画面和录像回放)", }, - "replay": { + replay: { "!doc": "当前录像回放信息", - "animate": { + animate: { "!type": "bool", - "!doc": "回放是否正处于动画中" + "!doc": "回放是否正处于动画中", }, - "pausing": { + pausing: { "!type": "bool", - "!doc": "回放是否暂停中" + "!doc": "回放是否暂停中", }, - "replaying": { + replaying: { "!type": "bool", - "!doc": "当前是否回放中" + "!doc": "当前是否回放中", }, - "save": { + save: { "!type": "[]", - "!doc": "录像中的存档" + "!doc": "录像中的存档", }, - "speed": { + speed: { "!type": "number", - "!doc": "回放速度" + "!doc": "回放速度", }, - "steps": { + steps: { "!type": "number", - "!doc": "回放步数" + "!doc": "回放步数", }, - "toReplay": { + toReplay: { "!type": "[string]", - "!doc": "待回放的列表" + "!doc": "待回放的列表", }, - "totalList": { + totalList: { "!type": "[string]", - "!doc": "回放总列表" - } + "!doc": "回放总列表", + }, }, - "route": { + route: { "!type": "[string]", - "!doc": "当前录像内容" + "!doc": "当前录像内容", }, - "shops": { - "!doc": "全局商店列表" + shops: { + "!doc": "全局商店列表", }, - "textAttribute": { - "!doc": "当前剧情文本属性" + textAttribute: { + "!doc": "当前剧情文本属性", }, - "thisMap": { + thisMap: { "!type": "floor", - "!doc": "当前地图信息" - } + "!doc": "当前地图信息", + }, }, - "init": { + init: { "!doc": "初始化core", - "!type": "fn(coreData: ?, callback: fn())" + "!type": "fn(coreData: ?, callback: fn())", }, - "doFunc": { + doFunc: { "!doc": "执行一个函数;如果函数名是字符串则转发到插件中", - "!type": "fn(func: name|fn(), _this?: ?)" + "!type": "fn(func: name|fn(), _this?: ?)", }, - "control": { - "!doc": "负责整个游戏的核心控制系统,分为如下几个部分:<br/>- requestAnimationFrame相关<br/>- 标题界面,开始和重新开始游戏<br/>- 自动寻路和人物行走相关<br/>- 画布、位置、阻激夹域、显伤等相关<br/>- 录像的回放相关<br/>- 存读档,自动存档,同步存档等相关<br/>- 人物属性和状态、位置、变量等相关<br/>- 天气、色调、音乐和音效的播放<br/>- 状态栏和工具栏相关<br/>- 界面resize相关", - "showStatusBar": { + control: { + "!doc": + "负责整个游戏的核心控制系统,分为如下几个部分:<br/>- requestAnimationFrame相关<br/>- 标题界面,开始和重新开始游戏<br/>- 自动寻路和人物行走相关<br/>- 画布、位置、阻激夹域、显伤等相关<br/>- 录像的回放相关<br/>- 存读档,自动存档,同步存档等相关<br/>- 人物属性和状态、位置、变量等相关<br/>- 天气、色调、音乐和音效的播放<br/>- 状态栏和工具栏相关<br/>- 界面resize相关", + showStatusBar: { "!doc": "显示状态栏", - "!type": "fn()" + "!type": "fn()", }, - "startReplay": { + startReplay: { "!doc": "开始播放录像", - "!type": "fn(list: [string])" + "!type": "fn(list: [string])", }, - "triggerReplay": { + triggerReplay: { "!doc": "播放或暂停录像回放", - "!type": "fn()" + "!type": "fn()", }, - "screenFlash": { - "!doc": "画面闪烁<br/>例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过<br/>color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填<br/>time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去<br/>times: 闪烁的总次数,不填或填0都视为1<br/>moveMode: 渐变方式<br/>callback: 闪烁全部完毕后的回调函数,可选", - "!type": "fn(color: [number], time: number, times?: number, moveMode?: string, callback?: fn())" + screenFlash: { + "!doc": + "画面闪烁<br/>例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过<br/>color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填<br/>time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去<br/>times: 闪烁的总次数,不填或填0都视为1<br/>moveMode: 渐变方式<br/>callback: 闪烁全部完毕后的回调函数,可选", + "!type": + "fn(color: [number], time: number, times?: number, moveMode?: string, callback?: fn())", }, - "setCurtain": { - "!doc": "更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数<br/>例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒<br/>color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]<br/>time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)<br/>moveMode: 渐变方式<br/>callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction", - "!type": "fn(color?: [number], time?: number, moveMode?: string, callback?: fn())" + setCurtain: { + "!doc": + "更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数<br/>例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒<br/>color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]<br/>time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)<br/>moveMode: 渐变方式<br/>callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction", + "!type": + "fn(color?: [number], time?: number, moveMode?: string, callback?: fn())", }, - "updateDamage": { - "!doc": "注意!请勿使用该函数!请使用core.updateStatusBar()代替!!重算并绘制地图显伤<br/>例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)<br/>floorId: 地图id,不填视为当前地图。预览地图时填写<br/>ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层", - "!type": "fn(floorId?: string, ctx?: string|CanvasRenderingContext2D)" + updateDamage: { + "!doc": + "注意!请勿使用该函数!请使用core.updateStatusBar()代替!!重算并绘制地图显伤<br/>例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)<br/>floorId: 地图id,不填视为当前地图。预览地图时填写<br/>ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层", + "!type": + "fn(floorId?: string, ctx?: string|CanvasRenderingContext2D)", }, - "drawDamage": { + drawDamage: { "!doc": "仅绘制地图显伤", - "!type": "fn(string|CanvasRenderingContext2D)" + "!type": "fn(string|CanvasRenderingContext2D)", }, - "nextX": { - "!doc": "获取主角面前第n格的横坐标<br/>例如:core.closeDoor(core.nextX(), core.nextY(), 'yellowDoor', core.turnHero); // 在主角面前关上一扇黄门,然后主角顺时针旋转90°<br/>n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", - "!type": "fn(n?: number) -> number" + nextX: { + "!doc": + "获取主角面前第n格的横坐标<br/>例如:core.closeDoor(core.nextX(), core.nextY(), 'yellowDoor', core.turnHero); // 在主角面前关上一扇黄门,然后主角顺时针旋转90°<br/>n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", + "!type": "fn(n?: number) -> number", }, - "nextY": { - "!doc": "获取主角面前第n格的纵坐标<br/>例如:core.jumpHero(core.nextX(2), core.nextY(2)); // 主角向前跃过一格,即跳跃靴道具的使用效果<br/>n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", - "!type": "fn(n?: number) -> number" + nextY: { + "!doc": + "获取主角面前第n格的纵坐标<br/>例如:core.jumpHero(core.nextX(2), core.nextY(2)); // 主角向前跃过一格,即跳跃靴道具的使用效果<br/>n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1", + "!type": "fn(n?: number) -> number", }, - "clearContinueAutomaticRoute": { + clearContinueAutomaticRoute: { "!doc": "清空剩下的自动寻路列表", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "updateViewport": { + updateViewport: { "!doc": "更新大地图的可见区域", - "!type": "fn()" + "!type": "fn()", }, - "getMappedName": { + getMappedName: { "!doc": "获得映射文件名", - "!type": "fn(name: string) -> string" + "!type": "fn(name: string) -> string", }, - "addFlag": { - "!doc": "增减一个flag变量,等价于 core.setFlag(name, core.getFlag(name, 0) + value)<br/>例如:core.addFlag('hatred', 1); // 增加1点仇恨值<br/>name: 变量名,支持中文<br/>value: 变量的增量", - "!type": "fn(name: string, value: number)" + addFlag: { + "!doc": + "增减一个flag变量,等价于 core.setFlag(name, core.getFlag(name, 0) + value)<br/>例如:core.addFlag('hatred', 1); // 增加1点仇恨值<br/>name: 变量名,支持中文<br/>value: 变量的增量", + "!type": "fn(name: string, value: number)", }, - "setFlag": { - "!doc": "设置一个flag变量<br/>例如:core.setFlag('poison', true); // 令主角中毒<br/>name: 变量名,支持中文<br/>value: 变量的新值,不填或填null视为删除", - "!type": "fn(name: string, value: ?)" + setFlag: { + "!doc": + "设置一个flag变量<br/>例如:core.setFlag('poison', true); // 令主角中毒<br/>name: 变量名,支持中文<br/>value: 变量的新值,不填或填null视为删除", + "!type": "fn(name: string, value: ?)", }, - "playSound": { - "!doc": "播放一个音效<br/>sound: 音效名;可以使用文件别名。<br/>pitch: 播放的音调;可选,如果设置则为30-300之间的数值。<br/>callback: 可选,播放完毕后执行的回调函数。<br/>返回:一个数字,可用于core.stopSound的参数来只停止该音效。", - "!type": "fn(sound: string, pitch?: number, callback?: fn()) -> number" + playSound: { + "!doc": + "播放一个音效<br/>sound: 音效名;可以使用文件别名。<br/>pitch: 播放的音调;可选,如果设置则为30-300之间的数值。<br/>callback: 可选,播放完毕后执行的回调函数。<br/>返回:一个数字,可用于core.stopSound的参数来只停止该音效。", + "!type": + "fn(sound: string, pitch?: number, callback?: fn()) -> number", }, - "stopSound": { - "!doc": "停止播放音效。如果未指定id则停止所有音效,否则只停止指定的音效。", - "!type": "fn(id?: number)" + stopSound: { + "!doc": + "停止播放音效。如果未指定id则停止所有音效,否则只停止指定的音效。", + "!type": "fn(id?: number)", }, - "getPlayingSounds": { - "!doc": "获得当前正在播放的所有(指定)音效的id列表<br/>name: 音效名,可用别名;不填代表返回正在播放的全部音效<br/>返回值: 一个列表,每一项为一个正在播放的音效id;可用core.stopSound立刻停止播放", - "!type": "fn(name?: string) -> [number]" + getPlayingSounds: { + "!doc": + "获得当前正在播放的所有(指定)音效的id列表<br/>name: 音效名,可用别名;不填代表返回正在播放的全部音效<br/>返回值: 一个列表,每一项为一个正在播放的音效id;可用core.stopSound立刻停止播放", + "!type": "fn(name?: string) -> [number]", }, - "addGameCanvasTranslate": { + addGameCanvasTranslate: { "!doc": "加减画布偏移", - "!type": "fn(x?: number, y?: number)" + "!type": "fn(x?: number, y?: number)", }, - "addBuff": { - "!doc": "增减主角某个属性的百分比修正倍率,加减法叠加和抵消。等价于 core.setBuff(name, core.getBuff(name) + value)<br/>例如:core.addBuff('atk', -0.1); // 主角获得一层“攻击力减一成”的负面效果<br/>name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN<br/>value: 倍率的增量", - "!type": "fn(name: string, value: number)" + addBuff: { + "!doc": + "增减主角某个属性的百分比修正倍率,加减法叠加和抵消。等价于 core.setBuff(name, core.getBuff(name) + value)<br/>例如:core.addBuff('atk', -0.1); // 主角获得一层“攻击力减一成”的负面效果<br/>name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN<br/>value: 倍率的增量", + "!type": "fn(name: string, value: number)", }, - "drawHero": { - "!doc": "绘制主角和跟随者并重置视野到以主角为中心<br/>例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野<br/>status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。<br/>offset: 相对主角逻辑位置的偏移量,不填视为无偏移。<br/>frame: 绘制的第几帧", - "!type": "fn(status?: string, offset?: number, frame?: number)" + drawHero: { + "!doc": + "绘制主角和跟随者并重置视野到以主角为中心<br/>例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野<br/>status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。<br/>offset: 相对主角逻辑位置的偏移量,不填视为无偏移。<br/>frame: 绘制的第几帧", + "!type": "fn(status?: string, offset?: number, frame?: number)", }, - "pauseBgm": { + pauseBgm: { "!doc": "暂停背景音乐的播放", - "!type": "fn()" + "!type": "fn()", }, - "setBgmSpeed": { - "!doc": "设置背景音乐的播放速度和音调<br/>speed: 播放速度,必须为30-300中间的值。100为正常速度。<br/>usePitch: 是否同时改变音调(部分设备可能不支持)", - "!type": "fn(speed: number, usePitch?: bool)" + setBgmSpeed: { + "!doc": + "设置背景音乐的播放速度和音调<br/>speed: 播放速度,必须为30-300中间的值。100为正常速度。<br/>usePitch: 是否同时改变音调(部分设备可能不支持)", + "!type": "fn(speed: number, usePitch?: bool)", }, - "setReplaySpeed": { + setReplaySpeed: { "!doc": "设置播放速度", - "!type": "fn(speed: number)" + "!type": "fn(speed: number)", }, - "pauseReplay": { + pauseReplay: { "!doc": "暂停播放", - "!type": "fn()" + "!type": "fn()", }, - "doSL": { + doSL: { "!doc": "实际进行存读档事件", - "!type": "fn(id?: string, type?: string)" + "!type": "fn(id?: string, type?: string)", }, - "setStatus": { - "!doc": "设置主角的某个属性<br/>例如:core.setStatus('atk', 100); // 设置攻击力为100<br/>name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.setHeroLoc(name, value),其他的会直接对 core.status.hero[name] 赋值<br/>value: 属性的新值", - "!type": "fn(name: string, value: number)" + setStatus: { + "!doc": + "设置主角的某个属性<br/>例如:core.setStatus('atk', 100); // 设置攻击力为100<br/>name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.setHeroLoc(name, value),其他的会直接对 core.status.hero[name] 赋值<br/>value: 属性的新值", + "!type": "fn(name: string, value: number)", }, - "setAutomaticRoute": { - "!doc": "半自动寻路,用于鼠标或手指拖动<br/>例如:core.setAutomaticRoute(0, 0, [{direction: \"right\", x: 4, y: 9}, {direction: \"right\", x: 5, y: 9}]);<br/>destX: 鼠标或手指的起拖点横坐标<br/>destY: 鼠标或手指的起拖点纵坐标<br/>stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。", - "!type": "fn(destX: number, destY: number, stepPostfix: [{x: number, y: number, direction: string}])" + setAutomaticRoute: { + "!doc": + '半自动寻路,用于鼠标或手指拖动<br/>例如:core.setAutomaticRoute(0, 0, [{direction: "right", x: 4, y: 9}, {direction: "right", x: 5, y: 9}]);<br/>destX: 鼠标或手指的起拖点横坐标<br/>destY: 鼠标或手指的起拖点纵坐标<br/>stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。', + "!type": + "fn(destX: number, destY: number, stepPostfix: [{x: number, y: number, direction: string}])", }, - "setHeroOpacity": { + setHeroOpacity: { "!doc": "改变勇士的不透明度", - "!type": "fn(opacity?: number, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(opacity?: number, moveMode?: string, time?: number, callback?: fn())", }, - "gatherFollowers": { + gatherFollowers: { "!doc": "立刻聚集所有的跟随者", - "!type": "fn()" + "!type": "fn()", }, - "getStatus": { - "!doc": "读取主角的某个属性,不包括百分比修正<br/>例如:core.getStatus('atk'); // 读取主角的攻击力<br/>name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.getHeroLoc(name),其他的会直接读取 core.status.hero[name]", - "!type": "fn(name: string) -> number" + getStatus: { + "!doc": + "读取主角的某个属性,不包括百分比修正<br/>例如:core.getStatus('atk'); // 读取主角的攻击力<br/>name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.getHeroLoc(name),其他的会直接读取 core.status.hero[name]", + "!type": "fn(name: string) -> number", }, - "setHeroLoc": { - "!doc": "设置勇士位置<br/>值得注意的是,这句话虽然会使勇士改变位置,但并不会使界面重新绘制;<br/>如需立刻重新绘制地图还需调用:core.clearMap('hero'); core.drawHero(); 来对界面进行更新。<br/>例如:core.setHeroLoc('x', 5) // 将勇士当前位置的横坐标设置为5。<br/>name: 要设置的坐标属性<br/>value: 新值<br/>noGather: 是否聚集跟随者", - "!type": "fn(name: string, value: string|number, noGather?: bool)" + setHeroLoc: { + "!doc": + "设置勇士位置<br/>值得注意的是,这句话虽然会使勇士改变位置,但并不会使界面重新绘制;<br/>如需立刻重新绘制地图还需调用:core.clearMap('hero'); core.drawHero(); 来对界面进行更新。<br/>例如:core.setHeroLoc('x', 5) // 将勇士当前位置的横坐标设置为5。<br/>name: 要设置的坐标属性<br/>value: 新值<br/>noGather: 是否聚集跟随者", + "!type": "fn(name: string, value: string|number, noGather?: bool)", }, - "getLvName": { - "!doc": "根据级别的数字获取对应的名称,后者定义在全塔属性<br/>例如:core.getLvName(); // 获取主角当前级别的名称,如“下级佣兵”<br/>lv: 级别的数字,不填则视为主角当前的级别<br/>返回值:级别的名称,如果不存在就还是返回数字", - "!type": "fn(lv?: number) -> string|number" + getLvName: { + "!doc": + "根据级别的数字获取对应的名称,后者定义在全塔属性<br/>例如:core.getLvName(); // 获取主角当前级别的名称,如“下级佣兵”<br/>lv: 级别的数字,不填则视为主角当前的级别<br/>返回值:级别的名称,如果不存在就还是返回数字", + "!type": "fn(lv?: number) -> string|number", }, - "getNextLvUpNeed": { - "!doc": "获得下次升级需要的经验值。<br/>升级扣除模式下会返回经验差值;非扣除模式下会返回总共需要的经验值。<br/>如果无法进行下次升级,返回null。", - "!type": "fn() -> number" + getNextLvUpNeed: { + "!doc": + "获得下次升级需要的经验值。<br/>升级扣除模式下会返回经验差值;非扣除模式下会返回总共需要的经验值。<br/>如果无法进行下次升级,返回null。", + "!type": "fn() -> number", }, - "addStatus": { - "!doc": "增减主角的某个属性,等价于core.setStatus(name, core.getStatus(name) + value)<br/>例如:core.addStatus('atk', 100'); // 给主角攻击力加100<br/>name: 属性的英文名<br/>value: 属性的增量", - "!type": "fn(name: string, value: number)" + addStatus: { + "!doc": + "增减主角的某个属性,等价于core.setStatus(name, core.getStatus(name) + value)<br/>例如:core.addStatus('atk', 100'); // 给主角攻击力加100<br/>name: 属性的英文名<br/>value: 属性的增量", + "!type": "fn(name: string, value: number)", }, - "speedUpReplay": { + speedUpReplay: { "!doc": "加速播放", - "!type": "fn()" + "!type": "fn()", }, - "loadData": { + loadData: { "!doc": "从本地读档", - "!type": "fn(data?: ?, callback?: fn())" + "!type": "fn(data?: ?, callback?: fn())", }, - "debug": { - "!doc": "开启调试模式, 此模式下可以按Ctrl键进行穿墙, 并忽略一切事件。<br/>此模式下不可回放录像和上传成绩。", - "!type": "fn()" + debug: { + "!doc": + "开启调试模式, 此模式下可以按Ctrl键进行穿墙, 并忽略一切事件。<br/>此模式下不可回放录像和上传成绩。", + "!type": "fn()", }, - "moveOneStep": { - "!doc": "每移动一格后执行的事件<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(callback?: fn())" + moveOneStep: { + "!doc": + "每移动一格后执行的事件<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(callback?: fn())", }, - "clearStatus": { + clearStatus: { "!doc": "清除游戏状态和数据", - "!type": "fn()" + "!type": "fn()", }, - "updateFollowers": { + updateFollowers: { "!doc": "更新跟随者坐标", - "!type": "fn()" + "!type": "fn()", }, - "waitHeroToStop": { - "!doc": "等待主角停下<br/>例如:core.waitHeroToStop(core.vibrate); // 等待主角停下,然后视野左右抖动1秒<br/>callback: 主角停止后的回调函数", - "!type": "fn(callback?: fn())" + waitHeroToStop: { + "!doc": + "等待主角停下<br/>例如:core.waitHeroToStop(core.vibrate); // 等待主角停下,然后视野左右抖动1秒<br/>callback: 主角停止后的回调函数", + "!type": "fn(callback?: fn())", }, - "hideStatusBar": { + hideStatusBar: { "!doc": "隐藏状态栏<br/>showToolbox: 是否不隐藏竖屏工具栏", - "!type": "fn(showToolbox?: bool)" + "!type": "fn(showToolbox?: bool)", }, - "getBuff": { - "!doc": "读取主角某个属性的百分比修正倍率,初始值为1<br/>例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力<br/>name: 属性的英文名", - "!type": "fn(name: string) -> number" + getBuff: { + "!doc": + "读取主角某个属性的百分比修正倍率,初始值为1<br/>例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力<br/>name: 属性的英文名", + "!type": "fn(name: string) -> number", }, - "triggerDebuff": { - "!doc": "获得或移除毒衰咒效果<br/>action: 要获得还是移除,'get'为获得,'remove'为移除<br/>type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组", - "!type": "fn(action: string, type: string|[string])" + triggerDebuff: { + "!doc": + "获得或移除毒衰咒效果<br/>action: 要获得还是移除,'get'为获得,'remove'为移除<br/>type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组", + "!type": "fn(action: string, type: string|[string])", }, - "setToolbarButton": { + setToolbarButton: { "!doc": "改变工具栏为按钮1-8", - "!type": "fn(useButton?: bool)" + "!type": "fn(useButton?: bool)", }, - "getSaves": { + getSaves: { "!doc": "获得某些存档内容", - "!type": "fn(ids?: ?, callback?: fn())" + "!type": "fn(ids?: ?, callback?: fn())", }, - "replay": { + replay: { "!doc": "回放下一个操作", - "!type": "fn()" + "!type": "fn()", }, - "getStatusOrDefault": { + getStatusOrDefault: { "!doc": "从status中获得属性,如果不存在则从勇士属性中获取", - "!type": "fn(status?: ?, name?: string)" + "!type": "fn(status?: ?, name?: string)", }, - "unregisterReplayAction": { + unregisterReplayAction: { "!doc": "注销一个录像行为", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "unregisterWeather": { + unregisterWeather: { "!doc": "注销一个天气", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "setBuff": { - "!doc": "设置主角某个属性的百分比修正倍率,初始值为1,<br/>倍率存放在flag: '__'+name+'_buff__' 中<br/>例如:core.setBuff('atk', 0.5); // 主角能发挥出的攻击力减半<br/>name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN<br/>value: 新的百分比修正倍率,不填(效果上)视为1", - "!type": "fn(name: string, value: number)" + setBuff: { + "!doc": + "设置主角某个属性的百分比修正倍率,初始值为1,<br/>倍率存放在flag: '__'+name+'_buff__' 中<br/>例如:core.setBuff('atk', 0.5); // 主角能发挥出的攻击力减半<br/>name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN<br/>value: 新的百分比修正倍率,不填(效果上)视为1", + "!type": "fn(name: string, value: number)", }, - "continueAutomaticRoute": { + continueAutomaticRoute: { "!doc": "继续剩下的自动寻路操作", - "!type": "fn()" + "!type": "fn()", }, - "setAutoHeroMove": { - "!doc": "连续行走<br/>例如:core.setAutoHeroMove([{direction: \"up\", step: 1}, {direction: \"left\", step: 3}]); // 上左左左<br/>steps: 压缩的步伐数组,每项表示朝某方向走多少步", - "!type": "fn(steps: [?])" + setAutoHeroMove: { + "!doc": + '连续行走<br/>例如:core.setAutoHeroMove([{direction: "up", step: 1}, {direction: "left", step: 3}]); // 上左左左<br/>steps: 压缩的步伐数组,每项表示朝某方向走多少步', + "!type": "fn(steps: [?])", }, - "unregisterResize": { + unregisterResize: { "!doc": "注销一个resize函数", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "saveAndStopAutomaticRoute": { + saveAndStopAutomaticRoute: { "!doc": "保存剩下的寻路,并停止", - "!type": "fn()" + "!type": "fn()", }, - "hideStartAnimate": { - "!doc": "淡出标题画面<br/>例如:core.hideStartAnimate(core.startGame); // 淡出标题画面并开始新游戏,跳过难度选择<br/>callback: 标题画面完全淡出后的回调函数", - "!type": "fn(callback?: fn())" + hideStartAnimate: { + "!doc": + "淡出标题画面<br/>例如:core.hideStartAnimate(core.startGame); // 淡出标题画面并开始新游戏,跳过难度选择<br/>callback: 标题画面完全淡出后的回调函数", + "!type": "fn(callback?: fn())", }, - "getAllSaves": { + getAllSaves: { "!doc": "获得所有存档内容", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "updateHeroIcon": { + updateHeroIcon: { "!doc": "更新状态栏的勇士图标", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "setMusicBtn": { + setMusicBtn: { "!doc": "设置音乐图标的显隐状态", - "!type": "fn()" + "!type": "fn()", }, - "isPlaying": { + isPlaying: { "!doc": "游戏是否已经开始", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "triggerBgm": { + triggerBgm: { "!doc": "开启或关闭背景音乐的播放", - "!type": "fn()" + "!type": "fn()", }, - "moveHero": { - "!doc": "连续前进,不撞南墙不回头<br/>例如:core.moveHero(); // 连续前进<br/>direction: 可选,如果设置了就会先转身到该方向<br/>callback: 可选,如果设置了就只走一步<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(direction?: string, callback?: fn())" + moveHero: { + "!doc": + "连续前进,不撞南墙不回头<br/>例如:core.moveHero(); // 连续前进<br/>direction: 可选,如果设置了就会先转身到该方向<br/>callback: 可选,如果设置了就只走一步<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(direction?: string, callback?: fn())", }, - "getRealStatusOrDefault": { - "!doc": "从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取", - "!type": "fn(status?: ?, name?: string)" + getRealStatusOrDefault: { + "!doc": + "从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取", + "!type": "fn(status?: ?, name?: string)", }, - "getStatusLabel": { + getStatusLabel: { "!doc": "获得某个状态的名字,如atk->攻击,def->防御等", - "!type": "fn(name: string) -> string" + "!type": "fn(name: string) -> string", }, - "removeSave": { + removeSave: { "!doc": "删除某个存档", - "!type": "fn(index?: number, callback?: fn())" + "!type": "fn(index?: number, callback?: fn())", }, - "registerAnimationFrame": { - "!doc": "注册一个 animationFrame<br/>name: 名称,可用来作为注销使用<br/>needPlaying: 是否只在游戏运行时才执行(在标题界面不执行)<br/>func: 要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数", - "!type": "fn(name: string, needPlaying: bool, func?: fn(timestamp: number))" + registerAnimationFrame: { + "!doc": + "注册一个 animationFrame<br/>name: 名称,可用来作为注销使用<br/>needPlaying: 是否只在游戏运行时才执行(在标题界面不执行)<br/>func: 要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数", + "!type": + "fn(name: string, needPlaying: bool, func?: fn(timestamp: number))", }, - "getHeroLoc": { - "!doc": "读取主角的位置和/或朝向<br/>例如:core.getHeroLoc(); // 读取主角的位置和朝向<br/>name: 要读取横坐标还是纵坐标还是朝向还是都读取<br/>返回值:name ? core.status.hero.loc[name] : core.status.hero.loc", - "!type": "fn(name: string) -> string|number" + getHeroLoc: { + "!doc": + "读取主角的位置和/或朝向<br/>例如:core.getHeroLoc(); // 读取主角的位置和朝向<br/>name: 要读取横坐标还是纵坐标还是朝向还是都读取<br/>返回值:name ? core.status.hero.loc[name] : core.status.hero.loc", + "!type": "fn(name: string) -> string|number", }, - "stopAutomaticRoute": { + stopAutomaticRoute: { "!doc": "停止自动寻路操作", - "!type": "fn()" + "!type": "fn()", }, - "setWeather": { - "!doc": "设置天气,不计入存档。如需长期生效请使用core.events._action_setWeather()函数<br/>例如:core.setWeather('fog', 10); // 设置十级大雾天<br/>type: 新天气的类型,不填视为晴天<br/>level: 新天气(晴天除外)的级别,必须为不大于10的正整数,不填视为5", - "!type": "fn(type?: string, level?: number)" + setWeather: { + "!doc": + "设置天气,不计入存档。如需长期生效请使用core.events._action_setWeather()函数<br/>例如:core.setWeather('fog', 10); // 设置十级大雾天<br/>type: 新天气的类型,不填视为晴天<br/>level: 新天气(晴天除外)的级别,必须为不大于10的正整数,不填视为5", + "!type": "fn(type?: string, level?: number)", }, - "updateStatusBar": { - "!doc": "刷新状态栏和地图显伤<br/>doNotCheckAutoEvents: 是否不检查自动事件", - "!type": "fn(doNotCheckAutoEvents?: bool, immediate?: bool)" + updateStatusBar: { + "!doc": + "刷新状态栏和地图显伤<br/>doNotCheckAutoEvents: 是否不检查自动事件", + "!type": "fn(doNotCheckAutoEvents?: bool, immediate?: bool)", }, - "autosave": { + autosave: { "!doc": "自动存档", - "!type": "fn(removeLast?: bool)" + "!type": "fn(removeLast?: bool)", }, - "clearStatusBar": { + clearStatusBar: { "!doc": "清空状态栏", - "!type": "fn()" + "!type": "fn()", }, - "moveAction": { - "!doc": "尝试前进一步,如果面前不可被踏入就会直接触发该点事件<br/>请勿直接使用此函数,如有需要请使用「勇士前进一步或撞击」事件<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(callback?: fn())" + moveAction: { + "!doc": + "尝试前进一步,如果面前不可被踏入就会直接触发该点事件<br/>请勿直接使用此函数,如有需要请使用「勇士前进一步或撞击」事件<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(callback?: fn())", }, - "hasFlag": { - "!doc": "判定一个flag变量是否存在且不为false、0、''、null、undefined和NaN<br/>例如:core.hasFlag('poison'); // 判断主角当前是否中毒<br/>name: 变量名,支持中文<br/>此函数等价于 !!core.getFlag(name)", - "!type": "fn(name: string) -> bool" + hasFlag: { + "!doc": + "判定一个flag变量是否存在且不为false、0、''、null、undefined和NaN<br/>例如:core.hasFlag('poison'); // 判断主角当前是否中毒<br/>name: 变量名,支持中文<br/>此函数等价于 !!core.getFlag(name)", + "!type": "fn(name: string) -> bool", }, - "rewindReplay": { + rewindReplay: { "!doc": "回退到上一个录像节点", - "!type": "fn()" + "!type": "fn()", }, - "playBgm": { - "!doc": "播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__<br/>例如:core.playBgm('bgm.mp3', 30); // 播放bgm.mp3,并跳过前半分钟<br/>bgm: 背景音乐的文件名,支持全塔属性中映射前的中文名<br/>startTime: 跳过前多少秒,不填则不跳过", - "!type": "fn(bgm: string, startTime?: number)" + playBgm: { + "!doc": + "播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__<br/>例如:core.playBgm('bgm.mp3', 30); // 播放bgm.mp3,并跳过前半分钟<br/>bgm: 背景音乐的文件名,支持全塔属性中映射前的中文名<br/>startTime: 跳过前多少秒,不填则不跳过", + "!type": "fn(bgm: string, startTime?: number)", }, - "isReplaying": { + isReplaying: { "!doc": "是否正在播放录像", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "isMoving": { + isMoving: { "!doc": "当前是否正在移动", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "getSaveIndexes": { + getSaveIndexes: { "!doc": "获得所有存在存档的存档位", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "unlockControl": { + unlockControl: { "!doc": "解锁用户控制行为", - "!type": "fn()" + "!type": "fn()", }, - "syncSave": { + syncSave: { "!doc": "同步存档到服务器", - "!type": "fn(type?: string)" + "!type": "fn(type?: string)", }, - "removeFlag": { + removeFlag: { "!doc": "删除某个flag/变量", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "registerResize": { - "!doc": "注册一个resize函数<br/>name: 名称,可供注销使用<br/>func: 可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。", - "!type": "fn(name: string, func: fn(obj: ?))" + registerResize: { + "!doc": + "注册一个resize函数<br/>name: 名称,可供注销使用<br/>func: 可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。", + "!type": "fn(name: string, func: fn(obj: ?))", }, - "registerWeather": { - "!doc": "注册一个天气<br/>name: 要注册的天气名<br/>initFunc: 当切换到此天气时的初始化;接受level(天气等级)为参数;可用于创建多个节点(如初始化雪花)<br/>frameFunc: 每帧的天气效果变化;可接受timestamp(从页面加载完毕到当前所经过的时间)和level(天气等级)作为参数<br/>天气应当仅在weather层进行绘制,推荐使用core.animateFrame.weather.nodes用于节点信息。", - "!type": "fn(name: string, initFunc: fn(level: number), frameFunc?: fn(timestamp: number, level: number))" + registerWeather: { + "!doc": + "注册一个天气<br/>name: 要注册的天气名<br/>initFunc: 当切换到此天气时的初始化;接受level(天气等级)为参数;可用于创建多个节点(如初始化雪花)<br/>frameFunc: 每帧的天气效果变化;可接受timestamp(从页面加载完毕到当前所经过的时间)和level(天气等级)作为参数<br/>天气应当仅在weather层进行绘制,推荐使用core.animateFrame.weather.nodes用于节点信息。", + "!type": + "fn(name: string, initFunc: fn(level: number), frameFunc?: fn(timestamp: number, level: number))", }, - "stopReplay": { + stopReplay: { "!doc": "停止播放", - "!type": "fn(force?: bool)" + "!type": "fn(force?: bool)", }, - "turnHero": { - "!doc": "主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心<br/>例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果<br/>direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一", - "!type": "fn(direction?: string)" + turnHero: { + "!doc": + "主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心<br/>例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果<br/>direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一", + "!type": "fn(direction?: string)", }, - "resumeReplay": { + resumeReplay: { "!doc": "恢复播放", - "!type": "fn()" + "!type": "fn()", }, - "resize": { + resize: { "!doc": "屏幕分辨率改变后重新自适应", - "!type": "fn()" + "!type": "fn()", }, - "getSave": { + getSave: { "!doc": "获得某个存档内容", - "!type": "fn(index?: number, callback?: fn(data: ?))" + "!type": "fn(index?: number, callback?: fn(data: ?))", }, - "setViewport": { - "!doc": "设置视野范围<br/>px,py: 左上角相对大地图的像素坐标,不需要为32倍数", - "!type": "fn(px?: number, py?: number)" + setViewport: { + "!doc": + "设置视野范围<br/>px,py: 左上角相对大地图的像素坐标,不需要为32倍数", + "!type": "fn(px?: number, py?: number)", }, - "chooseReplayFile": { + chooseReplayFile: { "!doc": "选择录像文件", - "!type": "fn()" + "!type": "fn()", }, - "lockControl": { + lockControl: { "!doc": "锁定用户控制,常常用于事件处理", - "!type": "fn()" + "!type": "fn()", }, - "updateCheckBlock": { + updateCheckBlock: { "!doc": "更新领域、夹击、阻击的伤害地图", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "checkBlock": { + checkBlock: { "!doc": "检查并执行领域、夹击、阻击事件", - "!type": "fn()" + "!type": "fn()", }, - "clearAutomaticRouteNode": { + clearAutomaticRouteNode: { "!doc": "清除自动寻路路线", - "!type": "fn(x?: number, y?: number)" + "!type": "fn(x?: number, y?: number)", }, - "getFlag": { - "!doc": "读取一个flag变量<br/>name: 变量名,支持中文<br/>defaultValue: 当变量不存在时的返回值,可选(事件流中默认填0)。", - "!type": "fn(name: string, defaultValue?: ?)" + getFlag: { + "!doc": + "读取一个flag变量<br/>name: 变量名,支持中文<br/>defaultValue: 当变量不存在时的返回值,可选(事件流中默认填0)。", + "!type": "fn(name: string, defaultValue?: ?)", }, - "getNakedStatus": { + getNakedStatus: { "!doc": "获得勇士原始属性(无装备和衰弱影响)", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "nearHero": { - "!doc": "判定主角是否身处某个点的锯齿领域(取曼哈顿距离)<br/>例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域<br/>x: 领域的中心横坐标<br/>y: 领域的中心纵坐标<br/>n: 领域的半径,不填视为1", - "!type": "fn(x: number, y: number, n?: number) -> bool" + nearHero: { + "!doc": + "判定主角是否身处某个点的锯齿领域(取曼哈顿距离)<br/>例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域<br/>x: 领域的中心横坐标<br/>y: 领域的中心纵坐标<br/>n: 领域的半径,不填视为1", + "!type": "fn(x: number, y: number, n?: number) -> bool", }, - "stepReplay": { + stepReplay: { "!doc": "单步播放", - "!type": "fn()" + "!type": "fn()", }, - "hasSave": { + hasSave: { "!doc": "判断某个存档位是否存在存档", - "!type": "fn(index?: number) -> bool" + "!type": "fn(index?: number) -> bool", }, - "showStartAnimate": { - "!doc": "进入标题画面<br/>例如:core.showStartAnimate(); // 重启游戏但不重置bgm<br/>noAnimate: 可选,true表示不由黑屏淡入而是立即亮屏<br/>callback: 可选,完全亮屏后的回调函数", - "!type": "fn(noAnimate?: bool, callback?: fn())" + showStartAnimate: { + "!doc": + "进入标题画面<br/>例如:core.showStartAnimate(); // 重启游戏但不重置bgm<br/>noAnimate: 可选,true表示不由黑屏淡入而是立即亮屏<br/>callback: 可选,完全亮屏后的回调函数", + "!type": "fn(noAnimate?: bool, callback?: fn())", }, - "moveViewport": { + moveViewport: { "!doc": "移动视野范围", - "!type": "fn(x: number, y: number, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(x: number, y: number, moveMode?: string, time?: number, callback?: fn())", }, - "syncLoad": { + syncLoad: { "!doc": "从服务器加载存档", - "!type": "fn()" + "!type": "fn()", }, - "setHeroMoveInterval": { + setHeroMoveInterval: { "!doc": "设置行走的效果动画", - "!type": "fn(callback?: fn())" + "!type": "fn(callback?: fn())", }, - "registerReplayAction": { - "!doc": "注册一个录像行为<br/>name: 自定义名称,可用于注销使用<br/>func: 具体执行录像的函数,可为一个函数或插件中的函数名;<br/>需要接受一个action参数,代表录像回放时的下一个操作<br/>func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。", - "!type": "fn(name: string, func: fn(action?: string) -> bool)" + registerReplayAction: { + "!doc": + "注册一个录像行为<br/>name: 自定义名称,可用于注销使用<br/>func: 具体执行录像的函数,可为一个函数或插件中的函数名;<br/>需要接受一个action参数,代表录像回放时的下一个操作<br/>func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。", + "!type": "fn(name: string, func: fn(action?: string) -> bool)", }, - "checkAutosave": { + checkAutosave: { "!doc": "实际将自动存档写入存储", - "!type": "fn()" + "!type": "fn()", }, - "resumeBgm": { + resumeBgm: { "!doc": "恢复背景音乐的播放<br/>resumeTime: 从哪一秒开始恢复播放", - "!type": "fn(resumeTime?: number)" + "!type": "fn(resumeTime?: number)", }, - "setGameCanvasTranslate": { + setGameCanvasTranslate: { "!doc": "设置大地图的偏移量", - "!type": "fn(ctx: string|CanvasRenderingContext2D, x: number, y: number)" + "!type": + "fn(ctx: string|CanvasRenderingContext2D, x: number, y: number)", }, - "checkBgm": { + checkBgm: { "!doc": "检查bgm状态", - "!type": "fn()" + "!type": "fn()", }, - "setDisplayScale": { + setDisplayScale: { "!doc": "设置屏幕放缩", - "!type": "fn(delta: number)" + "!type": "fn(delta: number)", }, - "speedDownReplay": { + speedDownReplay: { "!doc": "减速播放", - "!type": "fn()" + "!type": "fn()", }, - "getRealStatus": { - "!doc": "计算主角的某个属性,包括百分比修正<br/>例如:core.getRealStatus('atk'); // 计算主角的攻击力,包括百分比修正。战斗使用的就是这个值<br/>name: 属性的英文名,请注意只能用于数值类属性哦,否则乘法会得到NaN", - "!type": "fn(name: string)" + getRealStatus: { + "!doc": + "计算主角的某个属性,包括百分比修正<br/>例如:core.getRealStatus('atk'); // 计算主角的攻击力,包括百分比修正。战斗使用的就是这个值<br/>name: 属性的英文名,请注意只能用于数值类属性哦,否则乘法会得到NaN", + "!type": "fn(name: string)", }, - "saveData": { + saveData: { "!doc": "存档到本地", - "!type": "fn()" + "!type": "fn()", }, - "unregisterAnimationFrame": { + unregisterAnimationFrame: { "!doc": "注销一个animationFrame", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "tryMoveDirectly": { - "!doc": "尝试瞬移,如果该点有图块/事件/阻激夹域捕则会瞬移到它旁边再走一步(不可踏入的话当然还是触发该点事件),这一步的方向优先和瞬移前主角的朝向一致<br/>例如:core.tryMoveDirectly(6, 0); // 尝试瞬移到地图顶部的正中央,以样板0层为例,实际效果是瞬移到了上楼梯下面一格然后向上走一步并触发上楼事件<br/>destX: 目标点的横坐标<br/>destY: 目标点的纵坐标", - "!type": "fn(destX: number, destY: number)" + tryMoveDirectly: { + "!doc": + "尝试瞬移,如果该点有图块/事件/阻激夹域捕则会瞬移到它旁边再走一步(不可踏入的话当然还是触发该点事件),这一步的方向优先和瞬移前主角的朝向一致<br/>例如:core.tryMoveDirectly(6, 0); // 尝试瞬移到地图顶部的正中央,以样板0层为例,实际效果是瞬移到了上楼梯下面一格然后向上走一步并触发上楼事件<br/>destX: 目标点的横坐标<br/>destY: 目标点的纵坐标", + "!type": "fn(destX: number, destY: number)", }, - "moveDirectly": { + moveDirectly: { "!doc": "瞬间移动", - "!type": "fn(destX?: number, destY?: number, ignoreSteps?: number)" + "!type": "fn(destX?: number, destY?: number, ignoreSteps?: number)", }, - "clearRouteFolding": { + clearRouteFolding: { "!doc": "清空录像折叠信息", - "!type": "fn()" + "!type": "fn()", }, - "checkRouteFolding": { + checkRouteFolding: { "!doc": "检查录像折叠信息", - "!type": "fn()" + "!type": "fn()", }, - "setSwitch": { + setSwitch: { "!doc": "设置某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string, value: ?)" + "!type": + "fn(x: number, y: number, floorId: string, name: string, value: ?)", }, - "getSwitch": { + getSwitch: { "!doc": "获得某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string, defaultValue?: ?)" + "!type": + "fn(x: number, y: number, floorId: string, name: string, defaultValue?: ?)", }, - "addSwitch": { + addSwitch: { "!doc": "增加某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string, value: number)" + "!type": + "fn(x: number, y: number, floorId: string, name: string, value: number)", }, - "removeSwitch": { + removeSwitch: { "!doc": "删除某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string)" + "!type": "fn(x: number, y: number, floorId: string, name: string)", }, - "removeSwitch": { + removeSwitch: { "!doc": "判定某个独立开关", - "!type": "fn(x: number, y: number, floorId: string, name: string) -> bool" - } + "!type": + "fn(x: number, y: number, floorId: string, name: string) -> bool", + }, }, - "icons": { + icons: { "!doc": "图标信息", - "getTilesetOffset": { + getTilesetOffset: { "!doc": "根据图块数字或ID获得所在的tileset和坐标信息", - "!type": "fn(id?: string) -> {image: ?, x: number, y: number}" + "!type": "fn(id?: string) -> {image: ?, x: number, y: number}", }, - "getClsFromId": { + getClsFromId: { "!doc": "根据ID获得其图标类型", - "!type": "fn(id?: string) -> string" + "!type": "fn(id?: string) -> string", }, - "getAllIconIds": { + getAllIconIds: { "!doc": "获得所有图标的ID", - "!type": "fn() -> [string]" + "!type": "fn() -> [string]", }, - "getIcons": { + getIcons: { "!doc": "获得所有图标类型", - "!type": "fn()" - } + "!type": "fn()", + }, }, - "items": { + items: { "!doc": "道具相关的函数", - "getEquip": { - "!doc": "检查主角某种类型的装备目前是什么<br/>例如:core.getEquip(1) // 主角目前装备了什么盾牌<br/>equipType: 装备类型,自然数<br/>返回值:装备id,null表示未穿戴", - "!type": "fn(equipType: number) -> string" + getEquip: { + "!doc": + "检查主角某种类型的装备目前是什么<br/>例如:core.getEquip(1) // 主角目前装备了什么盾牌<br/>equipType: 装备类型,自然数<br/>返回值:装备id,null表示未穿戴", + "!type": "fn(equipType: number) -> string", }, - "loadEquip": { - "!doc": "尝试穿上某件背包里面的装备并提示<br/>例如:core.loadEquip('sword5') // 尝试装备上背包里面的神圣剑,无回调<br/>equipId: 装备id<br/>callback: 穿戴成功或失败后的回调函数", - "!type": "fn(equipId: string, callback?: fn())" + loadEquip: { + "!doc": + "尝试穿上某件背包里面的装备并提示<br/>例如:core.loadEquip('sword5') // 尝试装备上背包里面的神圣剑,无回调<br/>equipId: 装备id<br/>callback: 穿戴成功或失败后的回调函数", + "!type": "fn(equipId: string, callback?: fn())", }, - "itemCount": { - "!doc": "统计某种道具的持有量<br/>例如:core.itemCount('yellowKey') // 持有多少把黄钥匙<br/>itemId: 道具id<br/>返回值:该种道具的持有量,不包括已穿戴的装备", - "!type": "fn(itemId: string) -> number" + itemCount: { + "!doc": + "统计某种道具的持有量<br/>例如:core.itemCount('yellowKey') // 持有多少把黄钥匙<br/>itemId: 道具id<br/>返回值:该种道具的持有量,不包括已穿戴的装备", + "!type": "fn(itemId: string) -> number", }, - "getItems": { + getItems: { "!doc": "获得所有道具", - "!type": "fn()" + "!type": "fn()", }, - "canUseItem": { - "!doc": "检查能否使用某种道具<br/>例如:core.canUseItem('pickaxe') // 能否使用破墙镐<br/>itemId: 道具id<br/>返回值:true表示可以使用", - "!type": "fn(itemId: string) -> bool" + canUseItem: { + "!doc": + "检查能否使用某种道具<br/>例如:core.canUseItem('pickaxe') // 能否使用破墙镐<br/>itemId: 道具id<br/>返回值:true表示可以使用", + "!type": "fn(itemId: string) -> bool", }, - "hasItem": { - "!doc": "检查主角是否持有某种道具(不包括已穿戴的装备)<br/>例如:core.hasItem('yellowKey') // 主角是否持有黄钥匙<br/>itemId: 道具id<br/>返回值:true表示持有", - "!type": "fn(itemId: string) -> bool" + hasItem: { + "!doc": + "检查主角是否持有某种道具(不包括已穿戴的装备)<br/>例如:core.hasItem('yellowKey') // 主角是否持有黄钥匙<br/>itemId: 道具id<br/>返回值:true表示持有", + "!type": "fn(itemId: string) -> bool", }, - "addItem": { - "!doc": "静默增减某种道具的持有量 不会更新游戏画面或是显示提示<br/>例如:core.addItem('yellowKey', -2) // 没收两把黄钥匙<br/>itemId: 道具id<br/>itemNum: 增加量,负数表示没收", - "!type": "fn(itemId: string, itemNum?: number)" + addItem: { + "!doc": + "静默增减某种道具的持有量 不会更新游戏画面或是显示提示<br/>例如:core.addItem('yellowKey', -2) // 没收两把黄钥匙<br/>itemId: 道具id<br/>itemNum: 增加量,负数表示没收", + "!type": "fn(itemId: string, itemNum?: number)", }, - "unloadEquip": { - "!doc": "脱下某个类型的装备<br/>例如:core.unloadEquip(1) // 卸下盾牌,无回调<br/>equipType: 装备类型编号,自然数<br/>callback: 卸下装备后的回调函数", - "!type": "fn(equipType: number, callback?: fn())" + unloadEquip: { + "!doc": + "脱下某个类型的装备<br/>例如:core.unloadEquip(1) // 卸下盾牌,无回调<br/>equipType: 装备类型编号,自然数<br/>callback: 卸下装备后的回调函数", + "!type": "fn(equipType: number, callback?: fn())", }, - "quickLoadEquip": { - "!doc": "快速换装<br/>例如:core.quickLoadEquip(1) // 快速换上1号套装<br/>index: 套装编号,自然数", - "!type": "fn(index: number)" + quickLoadEquip: { + "!doc": + "快速换装<br/>例如:core.quickLoadEquip(1) // 快速换上1号套装<br/>index: 套装编号,自然数", + "!type": "fn(index: number)", }, - "getItemEffect": { - "!doc": "即捡即用类的道具获得时的效果<br/>例如:core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果<br/>itemId: 道具id<br/>itemNum: 道具数量,可选,默认为1", - "!type": "fn(itemId: string, itemNum?: number)" + getItemEffect: { + "!doc": + "即捡即用类的道具获得时的效果<br/>例如:core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果<br/>itemId: 道具id<br/>itemNum: 道具数量,可选,默认为1", + "!type": "fn(itemId: string, itemNum?: number)", }, - "quickSaveEquip": { - "!doc": "保存当前套装<br/>例如:core.quickSaveEquip(1) // 将当前套装保存为1号套装<br/>index: 套装编号,自然数", - "!type": "fn(index: number)" + quickSaveEquip: { + "!doc": + "保存当前套装<br/>例如:core.quickSaveEquip(1) // 将当前套装保存为1号套装<br/>index: 套装编号,自然数", + "!type": "fn(index: number)", }, - "setItem": { - "!doc": "设置某种道具的持有量<br/>例如:core.setItem('yellowKey', 3) // 设置黄钥匙为3把<br/>itemId: 道具id<br/>itemNum: 新的持有量,可选,自然数,默认为0", - "!type": "fn(itemId: string, itemNum?: number)" + setItem: { + "!doc": + "设置某种道具的持有量<br/>例如:core.setItem('yellowKey', 3) // 设置黄钥匙为3把<br/>itemId: 道具id<br/>itemNum: 新的持有量,可选,自然数,默认为0", + "!type": "fn(itemId: string, itemNum?: number)", }, - "compareEquipment": { - "!doc": "比较两件(类型可不同)装备的优劣<br/>例如:core.compareEquipment('sword5', 'shield5') // 比较神圣剑和神圣盾的优劣<br/>compareEquipId: 装备甲的id<br/>beComparedEquipId: 装备乙的id<br/>返回值:两装备的各属性差,甲减乙,0省略", - "!type": "fn(compareEquipId: string, beComparedEquipId: string) -> {value: ?, percentage: ?}" + compareEquipment: { + "!doc": + "比较两件(类型可不同)装备的优劣<br/>例如:core.compareEquipment('sword5', 'shield5') // 比较神圣剑和神圣盾的优劣<br/>compareEquipId: 装备甲的id<br/>beComparedEquipId: 装备乙的id<br/>返回值:两装备的各属性差,甲减乙,0省略", + "!type": + "fn(compareEquipId: string, beComparedEquipId: string) -> {value: ?, percentage: ?}", }, - "removeItem": { + removeItem: { "!doc": "删除某个物品", - "!type": "fn(itemId?: string, itemNum?: number)" + "!type": "fn(itemId?: string, itemNum?: number)", }, - "getEquipTypeById": { - "!doc": "判定某件装备的类型<br/>例如:core.getEquipTypeById('shield5') // 1(盾牌)<br/>equipId: 装备id<br/>返回值:类型编号,自然数", - "!type": "fn(equipId: string) -> number" + getEquipTypeById: { + "!doc": + "判定某件装备的类型<br/>例如:core.getEquipTypeById('shield5') // 1(盾牌)<br/>equipId: 装备id<br/>返回值:类型编号,自然数", + "!type": "fn(equipId: string) -> number", }, - "getEquipTypeByName": { + getEquipTypeByName: { "!doc": "根据类型获得一个可用的装备孔", - "!type": "fn(name?: string)" + "!type": "fn(name?: string)", }, - "useItem": { - "!doc": "使用一个道具<br/>例如:core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调<br/>itemId: 道具id<br/>noRoute: 是否不计入录像,快捷键使用的请填true,否则可省略<br/>callback: 道具使用完毕或使用失败后的回调函数", - "!type": "fn(itemId: string, noRoute?: bool, callback?: fn())" + useItem: { + "!doc": + "使用一个道具<br/>例如:core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调<br/>itemId: 道具id<br/>noRoute: 是否不计入录像,快捷键使用的请填true,否则可省略<br/>callback: 道具使用完毕或使用失败后的回调函数", + "!type": "fn(itemId: string, noRoute?: bool, callback?: fn())", }, - "hasEquip": { - "!doc": "检查主角是否穿戴着某件装备<br/>例如:core.hasEquip('sword5') // 主角是否装备了神圣剑<br/>itemId: 装备id<br/>返回值:true表示已装备", - "!type": "fn(itemId: string) -> bool" + hasEquip: { + "!doc": + "检查主角是否穿戴着某件装备<br/>例如:core.hasEquip('sword5') // 主角是否装备了神圣剑<br/>itemId: 装备id<br/>返回值:true表示已装备", + "!type": "fn(itemId: string) -> bool", }, - "getItemEffectTip": { - "!doc": "即捡即用类的道具获得时的额外提示<br/>例如:core.getItemEffectTip(redPotion) // (获得 红血瓶)',生命+100'<br/>itemId: 道具id<br/>返回值:图块属性itemEffectTip的内容", - "!type": "fn(itemId: string) -> string" + getItemEffectTip: { + "!doc": + "即捡即用类的道具获得时的额外提示<br/>例如:core.getItemEffectTip(redPotion) // (获得 红血瓶)',生命+100'<br/>itemId: 道具id<br/>返回值:图块属性itemEffectTip的内容", + "!type": "fn(itemId: string) -> string", }, - "canEquip": { - "!doc": "检查能否穿上某件装备<br/>例如:core.canEquip('sword5', true) // 主角可以装备神圣剑吗,如果不能会有提示<br/>equipId: 装备id<br/>hint: 无法穿上时是否提示(比如是因为未持有还是别的什么原因)<br/>返回值:true表示可以穿上,false表示无法穿上", - "!type": "fn(equipId: string, hint?: bool) -> bool" + canEquip: { + "!doc": + "检查能否穿上某件装备<br/>例如:core.canEquip('sword5', true) // 主角可以装备神圣剑吗,如果不能会有提示<br/>equipId: 装备id<br/>hint: 无法穿上时是否提示(比如是因为未持有还是别的什么原因)<br/>返回值:true表示可以穿上,false表示无法穿上", + "!type": "fn(equipId: string, hint?: bool) -> bool", + }, + setEquip: { + "!doc": + "设置某个装备的属性并计入存档<br/>例如:core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300<br/>equipId: 装备id<br/>valueType: 增幅类型,只能是value(数值)或percentage(百分比)<br/>name: 要修改的属性名称,如atk<br/>value: 要修改到的属性数值<br/>operator: 操作符,可选,如+=表示在原始值上增加<br/>prefix: 独立开关前缀,一般不需要", + "!type": + "fn(equipId: string, valueType: string, name: string, value: ?, operator?: string, prefix?: string)", }, - "setEquip": { - "!doc": "设置某个装备的属性并计入存档<br/>例如:core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300<br/>equipId: 装备id<br/>valueType: 增幅类型,只能是value(数值)或percentage(百分比)<br/>name: 要修改的属性名称,如atk<br/>value: 要修改到的属性数值<br/>operator: 操作符,可选,如+=表示在原始值上增加<br/>prefix: 独立开关前缀,一般不需要", - "!type": "fn(equipId: string, valueType: string, name: string, value: ?, operator?: string, prefix?: string)" - } }, - "utils": { + utils: { "!doc": "工具函数库,里面有各个样板中使用到的工具函数。", - "scan": { + scan: { "!doc": "朝向到x,y映射", - "up": { - "x": "number", - "y": "number" + up: { + x: "number", + y: "number", }, - "down": { - "x": "number", - "y": "number" + down: { + x: "number", + y: "number", }, - "left": { - "x": "number", - "y": "number" + left: { + x: "number", + y: "number", + }, + right: { + x: "number", + y: "number", }, - "right": { - "x": "number", - "y": "number" - } }, - "applyEasing": { + applyEasing: { "!doc": "获得变速移动曲线", - "!type": "fn(mode?: string) -> fn(t: number) -> number" + "!type": "fn(mode?: string) -> fn(t: number) -> number", }, - "clamp": { - "!doc": "将x限定在[a,b]区间内,注意a和b可交换<br/>例如:core.clamp(1200, 1, 1000); // 1000<br/>x: 原始值,!x为true时x一律视为0<br/>a: 下限值,大于b将导致与b交换<br/>b: 上限值,小于a将导致与a交换", - "!type": "fn(x: number, a: number, b: number) -> number" + clamp: { + "!doc": + "将x限定在[a,b]区间内,注意a和b可交换<br/>例如:core.clamp(1200, 1, 1000); // 1000<br/>x: 原始值,!x为true时x一律视为0<br/>a: 下限值,大于b将导致与b交换<br/>b: 上限值,小于a将导致与a交换", + "!type": "fn(x: number, a: number, b: number) -> number", }, - "rand": { - "!doc": "不支持SL的随机数<br/>例如:1 + core.rand(6); // 随机生成一个小于7的正整数,模拟骰子的效果<br/>num: 填正数表示生成小于num的随机自然数,否则生成小于1的随机正数<br/>返回值:随机数,即使读档也不会改变结果", - "!type": "fn(num?: number) -> number" + rand: { + "!doc": + "不支持SL的随机数<br/>例如:1 + core.rand(6); // 随机生成一个小于7的正整数,模拟骰子的效果<br/>num: 填正数表示生成小于num的随机自然数,否则生成小于1的随机正数<br/>返回值:随机数,即使读档也不会改变结果", + "!type": "fn(num?: number) -> number", }, - "clone": { - "!doc": "深拷贝一个对象(函数将原样返回)<br/>例如:core.clone(core.status.hero, (name, value) => (name == 'items' || typeof value == 'number'), false); // 深拷贝主角的属性和道具<br/>data: 待拷贝对象<br/>filter: 过滤器,可选,表示data为数组或对象时拷贝哪些项或属性,true表示拷贝<br/>recursion: 过滤器是否递归,可选。true表示过滤器也被递归<br/>返回值:拷贝的结果,注意函数将原样返回", - "!type": "fn(data?: ?, filter?: fn(name: string, value: ?) -> bool, recursion?: bool)" + clone: { + "!doc": + "深拷贝一个对象(函数将原样返回)<br/>例如:core.clone(core.status.hero, (name, value) => (name == 'items' || typeof value == 'number'), false); // 深拷贝主角的属性和道具<br/>data: 待拷贝对象<br/>filter: 过滤器,可选,表示data为数组或对象时拷贝哪些项或属性,true表示拷贝<br/>recursion: 过滤器是否递归,可选。true表示过滤器也被递归<br/>返回值:拷贝的结果,注意函数将原样返回", + "!type": + "fn(data?: ?, filter?: fn(name: string, value: ?) -> bool, recursion?: bool)", }, - "cloneArray": { - "!doc": "深拷贝一个1D或2D数组对象<br/>例如:core.cloneArray(core.status.thisMap.map)", - "!type": "fn(data?: [number]|[[number]]) -> [number]|[[number]]" + cloneArray: { + "!doc": + "深拷贝一个1D或2D数组对象<br/>例如:core.cloneArray(core.status.thisMap.map)", + "!type": "fn(data?: [number]|[[number]]) -> [number]|[[number]]", }, - "setLocalForage": { + setLocalForage: { "!doc": "往数据库写入一段数据", - "!type": "fn(key: string, value?: ?, successCallback?: fn(), errorCallback?: fn())" + "!type": + "fn(key: string, value?: ?, successCallback?: fn(), errorCallback?: fn())", }, - "getGlobal": { - "!doc": "读取一个全局存储,适用于global:xxx,支持录像。<br/>例如:if (core.getGlobal('一周目已通关', false) === true) core.getItem('dagger'); // 二周目游戏进行到此处时会获得一把屠龙匕首<br/>key: 全局变量名称,支持中文<br/>defaultValue: 可选,当此全局变量不存在或值为null、undefined时,用此值代替<br/>返回值:全局变量的值", - "!type": "fn(key: string, defaultValue?: ?)" + getGlobal: { + "!doc": + "读取一个全局存储,适用于global:xxx,支持录像。<br/>例如:if (core.getGlobal('一周目已通关', false) === true) core.getItem('dagger'); // 二周目游戏进行到此处时会获得一把屠龙匕首<br/>key: 全局变量名称,支持中文<br/>defaultValue: 可选,当此全局变量不存在或值为null、undefined时,用此值代替<br/>返回值:全局变量的值", + "!type": "fn(key: string, defaultValue?: ?)", }, - "replaceText": { - "!doc": "将一段文字中的${}(表达式)进行替换。<br/>例如:core.replaceText('衬衫的价格是${status:hp}镑${item:yellowKey}便士。'); // 把主角的生命值和持有的黄钥匙数量代入这句话<br/>text: 模板字符串,可以使用${}计算js表达式,支持“状态、物品、变量、独立开关、全局存储、图块id、图块类型、敌人数据、装备id”等量参与运算<br/>返回值:替换完毕后的字符串", - "!type": "fn(text: string, prefix?: string) -> string" + replaceText: { + "!doc": + "将一段文字中的${}(表达式)进行替换。<br/>例如:core.replaceText('衬衫的价格是${status:hp}镑${item:yellowKey}便士。'); // 把主角的生命值和持有的黄钥匙数量代入这句话<br/>text: 模板字符串,可以使用${}计算js表达式,支持“状态、物品、变量、独立开关、全局存储、图块id、图块类型、敌人数据、装备id”等量参与运算<br/>返回值:替换完毕后的字符串", + "!type": "fn(text: string, prefix?: string) -> string", }, - "removeLocalStorage": { + removeLocalStorage: { "!doc": "移除本地存储", - "!type": "fn(key: string)" + "!type": "fn(key: string)", }, - "unzip": { + unzip: { "!doc": "解压一段内容", - "!type": "fn(blobOrUrl?: ?, success?: fn(data: ?), error?: fn(error: string), convertToText?: bool, onprogress?: fn(loaded: number, total: number))" + "!type": + "fn(blobOrUrl?: ?, success?: fn(data: ?), error?: fn(error: string), convertToText?: bool, onprogress?: fn(loaded: number, total: number))", }, - "formatTime": { + formatTime: { "!doc": "格式化时间", - "!type": "fn(time: number) -> string" + "!type": "fn(time: number) -> string", }, - "readFile": { - "!doc": "尝试请求读取一个本地文件内容 [异步]<br/>success: 成功后的回调<br/>error: 失败后的回调<br/>readType: 不设置则以文本读取,否则以DataUrl形式读取", - "!type": "fn(success?: fn(data: string), error?: fn(message: string), readType?: bool)" + readFile: { + "!doc": + "尝试请求读取一个本地文件内容 [异步]<br/>success: 成功后的回调<br/>error: 失败后的回调<br/>readType: 不设置则以文本读取,否则以DataUrl形式读取", + "!type": + "fn(success?: fn(data: string), error?: fn(message: string), readType?: bool)", }, - "readFileContent": { + readFileContent: { "!doc": "文件读取完毕后的内容处理 [异步]", - "!type": "fn(content: string)" + "!type": "fn(content: string)", }, - "formatDate": { + formatDate: { "!doc": "格式化日期为字符串", - "!type": "fn(date: ?) -> string" + "!type": "fn(date: ?) -> string", }, - "download": { - "!doc": "弹窗请求下载一个文本文件<br/>例如:core.download('route.txt', JSON.stringify(core.status.route)); // 弹窗请求下载录像<br/>filename: 文件名<br/>content: 文件内容", - "!type": "fn(filename: string, content: string)" + download: { + "!doc": + "弹窗请求下载一个文本文件<br/>例如:core.download('route.txt', JSON.stringify(core.status.route)); // 弹窗请求下载录像<br/>filename: 文件名<br/>content: 文件内容", + "!type": "fn(filename: string, content: string)", }, - "encodeBase64": { - "!doc": "base64加密<br/>例如:core.encodeBase64('abcd'); // 'YWJjZA=='<br/>str: 明文<br/>返回值:密文", - "!type": "fn(str: string) -> string" + encodeBase64: { + "!doc": + "base64加密<br/>例如:core.encodeBase64('abcd'); // 'YWJjZA=='<br/>str: 明文<br/>返回值:密文", + "!type": "fn(str: string) -> string", }, - "strlen": { - "!doc": "求字符串的国标码字节数,也可用于等宽字体下文本的宽度测算。请注意样板的默认字体Verdana不是等宽字体<br/>例如:core.strlen('无敌ad'); // 6<br/>str: 待测字符串<br/>返回值:字符串的国标码字节数,每个汉字为2,每个ASCII字符为1", - "!type": "fn(str: string) -> number" + strlen: { + "!doc": + "求字符串的国标码字节数,也可用于等宽字体下文本的宽度测算。请注意样板的默认字体Verdana不是等宽字体<br/>例如:core.strlen('无敌ad'); // 6<br/>str: 待测字符串<br/>返回值:字符串的国标码字节数,每个汉字为2,每个ASCII字符为1", + "!type": "fn(str: string) -> number", }, - "myprompt": { + myprompt: { "!doc": "让用户输入一段文字", - "!type": "fn(hint: string, value: string, callback?: fn(data?: string))" + "!type": + "fn(hint: string, value: string, callback?: fn(data?: string))", }, - "getCookie": { + getCookie: { "!doc": "访问浏览器cookie", - "!type": "fn(name: string) -> string" + "!type": "fn(name: string) -> string", }, - "decodeRoute": { - "!doc": "录像解压的最后一步,即一压的逆过程<br/>例如:core.decodeRoute(core.encodeRoute(core.status.route)); // 一压当前录像再解压-_-|<br/>route: 录像解压倒数第二步的结果,即一压的结果<br/>返回值:原始录像", - "!type": "fn(route: string) -> [string]" + decodeRoute: { + "!doc": + "录像解压的最后一步,即一压的逆过程<br/>例如:core.decodeRoute(core.encodeRoute(core.status.route)); // 一压当前录像再解压-_-|<br/>route: 录像解压倒数第二步的结果,即一压的结果<br/>返回值:原始录像", + "!type": "fn(route: string) -> [string]", }, - "formatDate2": { + formatDate2: { "!doc": "格式化日期为最简字符串", - "!type": "fn(date: ?) -> string" + "!type": "fn(date: ?) -> string", }, - "unshift": { - "!doc": "将b(可以是另一个数组)插入数组a的开头,此函数用于弥补a.unshift(b)中b只能是单项的不足。<br/>例如:core.unshift(todo, {type: 'unfollow'}); // 在事件指令数组todo的开头插入“取消所有跟随者”指令<br/>a: 原数组<br/>b: 待插入的新首项或前缀数组<br/>返回值:插入完毕后的新数组,它是改变原数组a本身得到的", - "!type": "fn(a: [?], b: ?) -> [?]" + unshift: { + "!doc": + "将b(可以是另一个数组)插入数组a的开头,此函数用于弥补a.unshift(b)中b只能是单项的不足。<br/>例如:core.unshift(todo, {type: 'unfollow'}); // 在事件指令数组todo的开头插入“取消所有跟随者”指令<br/>a: 原数组<br/>b: 待插入的新首项或前缀数组<br/>返回值:插入完毕后的新数组,它是改变原数组a本身得到的", + "!type": "fn(a: [?], b: ?) -> [?]", }, - "same": { - "!doc": "判定深层相等, 会逐层比较每个元素<br/>例如:core.same(['1', 2], ['1', 2]); // true", - "!type": "fn(a?: ?, b?: ?) -> bool" + same: { + "!doc": + "判定深层相等, 会逐层比较每个元素<br/>例如:core.same(['1', 2], ['1', 2]); // true", + "!type": "fn(a?: ?, b?: ?) -> bool", }, - "setTwoDigits": { + setTwoDigits: { "!doc": "两位数显示", - "!type": "fn(x: number) -> string" + "!type": "fn(x: number) -> string", }, - "splitImage": { - "!doc": "等比例切分一张图片<br/>例如:core.splitImage(core.material.images.images['npc48.png'], 32, 48); // 把npc48.png切分成若干32×48px的小人<br/>image: 图片名(支持映射前的中文名)或图片对象(参见上面的例子),获取不到时返回[]<br/>width: 子图的宽度,单位为像素。原图总宽度必须是其倍数,不填视为32<br/>height: 子图的高度,单位为像素。原图总高度必须是其倍数,不填视为正方形<br/>返回值:子图组成的数组,在原图中呈先行后列,从左到右、从上到下排列。", - "!type": "fn(image?: string|image, width?: number, height?: number) -> [image]" + splitImage: { + "!doc": + "等比例切分一张图片<br/>例如:core.splitImage(core.material.images.images['npc48.png'], 32, 48); // 把npc48.png切分成若干32×48px的小人<br/>image: 图片名(支持映射前的中文名)或图片对象(参见上面的例子),获取不到时返回[]<br/>width: 子图的宽度,单位为像素。原图总宽度必须是其倍数,不填视为32<br/>height: 子图的高度,单位为像素。原图总高度必须是其倍数,不填视为正方形<br/>返回值:子图组成的数组,在原图中呈先行后列,从左到右、从上到下排列。", + "!type": + "fn(image?: string|image, width?: number, height?: number) -> [image]", }, - "decompress": { + decompress: { "!doc": "解压缩一个数据", - "!type": "fn(value: ?)" + "!type": "fn(value: ?)", }, - "showWithAnimate": { + showWithAnimate: { "!doc": "动画显示某对象", - "!type": "fn(obj?: ?, speed?: number, callback?: fn())" + "!type": "fn(obj?: ?, speed?: number, callback?: fn())", }, - "subarray": { - "!doc": "判定一个数组是否为另一个数组的前缀,用于录像接续播放。请注意函数名没有大写字母<br/>例如:core.subarray(['ad', '米库', '小精灵', '小破草', '小艾'], ['ad', '米库', '小精灵']); // ['小破草', '小艾']<br/>a: 可能的母数组,不填或比b短将返回null<br/>b: 可能的前缀,不填或比a长将返回null<br/>返回值:如果b不是a的前缀将返回null,否则将返回a去掉此前缀后的剩余数组", - "!type": "fn(a?: [?], b?: [?]) -> [?]|null" + subarray: { + "!doc": + "判定一个数组是否为另一个数组的前缀,用于录像接续播放。请注意函数名没有大写字母<br/>例如:core.subarray(['ad', '米库', '小精灵', '小破草', '小艾'], ['ad', '米库', '小精灵']); // ['小破草', '小艾']<br/>a: 可能的母数组,不填或比b短将返回null<br/>b: 可能的前缀,不填或比a长将返回null<br/>返回值:如果b不是a的前缀将返回null,否则将返回a去掉此前缀后的剩余数组", + "!type": "fn(a?: [?], b?: [?]) -> [?]|null", }, - "turnDirection": { - "!doc": "计算应当转向某个方向<br/>turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种<br/>direction: 当前方向", - "!type": "fn(turn: string, direction?: string) -> string" + turnDirection: { + "!doc": + "计算应当转向某个方向<br/>turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种<br/>direction: 当前方向", + "!type": "fn(turn: string, direction?: string) -> string", }, - "myconfirm": { - "!doc": "显示确认框,类似core.drawConfirmBox(),但不打断事件流<br/>例如:core.myconfirm('重启游戏?', core.restart); // 弹窗询问玩家是否重启游戏<br/>hint: 弹窗的内容,支持 ${} 语法<br/>yesCallback: 确定后的回调函数<br/>noCallback: 取消后的回调函数,可选", - "!type": "fn(hint: string, yesCallback?: fn(), noCallback?: fn())" + myconfirm: { + "!doc": + "显示确认框,类似core.drawConfirmBox(),但不打断事件流<br/>例如:core.myconfirm('重启游戏?', core.restart); // 弹窗询问玩家是否重启游戏<br/>hint: 弹窗的内容,支持 ${} 语法<br/>yesCallback: 确定后的回调函数<br/>noCallback: 取消后的回调函数,可选", + "!type": "fn(hint: string, yesCallback?: fn(), noCallback?: fn())", }, - "calValue": { - "!doc": "计算一个表达式的值,支持status:xxx等的计算。<br/>例如:core.calValue('status:hp + status:def'); // 计算主角的生命值加防御力<br/>value: 待求值的表达式<br/>prefix: 独立开关前缀,一般可省略<br/>返回值:求出的值", - "!type": "fn(value: string, prefix?: string)" + calValue: { + "!doc": + "计算一个表达式的值,支持status:xxx等的计算。<br/>例如:core.calValue('status:hp + status:def'); // 计算主角的生命值加防御力<br/>value: 待求值的表达式<br/>prefix: 独立开关前缀,一般可省略<br/>返回值:求出的值", + "!type": "fn(value: string, prefix?: string)", }, - "encodeRoute": { - "!doc": "录像压缩缩<br/>例如:core.encodeRoute(core.status.route); // 压缩当前录像<br/>route: 原始录像,自定义内容(不予压缩,原样写入)必须由0-9A-Za-z和下划线、冒号组成,所以中文和数组需要用JSON.stringify预处理再base64压缩才能交由一压<br/>返回值:一压的结果", - "!type": "fn(route: [string]) -> string" + encodeRoute: { + "!doc": + "录像压缩缩<br/>例如:core.encodeRoute(core.status.route); // 压缩当前录像<br/>route: 原始录像,自定义内容(不予压缩,原样写入)必须由0-9A-Za-z和下划线、冒号组成,所以中文和数组需要用JSON.stringify预处理再base64压缩才能交由一压<br/>返回值:一压的结果", + "!type": "fn(route: [string]) -> string", }, - "decodeBase64": { - "!doc": "base64解密<br/>例如:core.decodeBase64('YWJjZA=='); // \"abcd\"<br/>str: 密文<br/>返回值:明文", - "!type": "fn(str: string) -> string" + decodeBase64: { + "!doc": + "base64解密<br/>例如:core.decodeBase64('YWJjZA=='); // \"abcd\"<br/>str: 密文<br/>返回值:明文", + "!type": "fn(str: string) -> string", }, - "http": { - "!doc": "发送一个HTTP请求 [异步]<br/>type: 请求类型,只能为GET或POST<br/>url: 目标地址<br/>formData: 如果是POST请求则为表单数据<br/>success: 成功后的回调<br/>error: 失败后的回调", - "!type": "fn(type: string, url: string, formData: ?, success?: fn(data: string), error?: fn(message: string), mimeType?: string, responseType?: string, onprogress?: fn(loaded: number, total: number))" + http: { + "!doc": + "发送一个HTTP请求 [异步]<br/>type: 请求类型,只能为GET或POST<br/>url: 目标地址<br/>formData: 如果是POST请求则为表单数据<br/>success: 成功后的回调<br/>error: 失败后的回调", + "!type": + "fn(type: string, url: string, formData: ?, success?: fn(data: string), error?: fn(message: string), mimeType?: string, responseType?: string, onprogress?: fn(loaded: number, total: number))", }, - "getGuid": { + getGuid: { "!doc": "获得或生成浏览器唯一的guid", - "!type": "fn() -> string" + "!type": "fn() -> string", }, - "getLocalStorage": { + getLocalStorage: { "!doc": "获得本地存储", - "!type": "fn(key: string, defaultValue?: ?)" + "!type": "fn(key: string, defaultValue?: ?)", }, - "arrayToRGB": { - "!doc": "颜色数组转字符串<br/>例如:core.arrayToRGB([102, 204, 255]); // \"#66ccff\"<br/>color: 一行三列的数组,必须为不大于255的自然数<br/>返回值:该颜色的#xxxxxx字符串表示", - "!type": "fn(color: [number]) -> string" + arrayToRGB: { + "!doc": + '颜色数组转字符串<br/>例如:core.arrayToRGB([102, 204, 255]); // "#66ccff"<br/>color: 一行三列的数组,必须为不大于255的自然数<br/>返回值:该颜色的#xxxxxx字符串表示', + "!type": "fn(color: [number]) -> string", }, - "arrayToRGBA": { - "!doc": "颜色数组转字符串<br/>例如:core.arrayToRGBA([102, 204, 255, 0.3]); // \"rgba(102,204,255,0.3)\"<br/>color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1<br/>返回值:该颜色的rgba(...)字符串表示", - "!type": "fn(color: [number]) -> string" + arrayToRGBA: { + "!doc": + '颜色数组转字符串<br/>例如:core.arrayToRGBA([102, 204, 255, 0.3]); // "rgba(102,204,255,0.3)"<br/>color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1<br/>返回值:该颜色的rgba(...)字符串表示', + "!type": "fn(color: [number]) -> string", }, - "formatBigNumber": { - "!doc": "大数字格式化,单位为10000的倍数(w,e,z,j,g),末尾四舍五入<br/>例如:core.formatBigNumber(123456789, false); // \"12346w\"<br/>x: 原数字<br/>onMap: 可选,true表示用于地图显伤,结果总字符数最多为5,否则最多为6<br/>返回值:格式化结果", - "!type": "fn(x: number, onMap?: bool) -> string" + formatBigNumber: { + "!doc": + '大数字格式化,单位为10000的倍数(w,e,z,j,g),末尾四舍五入<br/>例如:core.formatBigNumber(123456789, false); // "12346w"<br/>x: 原数字<br/>onMap: 可选,true表示用于地图显伤,结果总字符数最多为5,否则最多为6<br/>返回值:格式化结果', + "!type": "fn(x: number, onMap?: bool) -> string", }, - "removeLocalForage": { + removeLocalForage: { "!doc": "移除本地数据库的数据", - "!type": "fn(key: string, successCallback?: fn(), errorCallback?: fn())" + "!type": + "fn(key: string, successCallback?: fn(), errorCallback?: fn())", }, - "matchWildcard": { - "!doc": "通配符匹配,用于搜索图块等批量处理。<br/>例如:core.playSound(core.matchWildcard('*Key', itemId) ? 'item.mp3' : 'door.mp3'); // 判断捡到的是钥匙还是别的道具,从而播放不同的音效<br/>pattern: 模式串,每个星号表示任意多个(0个起)字符<br/>string: 待测串<br/>返回值:true表示匹配成功,false表示匹配失败", - "!type": "fn(pattern: string, string: string) -> bool" + matchWildcard: { + "!doc": + "通配符匹配,用于搜索图块等批量处理。<br/>例如:core.playSound(core.matchWildcard('*Key', itemId) ? 'item.opus' : 'door.opus'); // 判断捡到的是钥匙还是别的道具,从而播放不同的音效<br/>pattern: 模式串,每个星号表示任意多个(0个起)字符<br/>string: 待测串<br/>返回值:true表示匹配成功,false表示匹配失败", + "!type": "fn(pattern: string, string: string) -> bool", }, - "setLocalStorage": { + setLocalStorage: { "!doc": "设置本地存储", - "!type": "fn(key: string, value?: ?)" + "!type": "fn(key: string, value?: ?)", }, - "hideWithAnimate": { + hideWithAnimate: { "!doc": "动画使某对象消失", - "!type": "fn(obj?: ?, speed?: number, callback?: fn())" + "!type": "fn(obj?: ?, speed?: number, callback?: fn())", }, - "copy": { + copy: { "!doc": "尝试复制一段文本到剪切板。", - "!type": "fn(data: string) -> bool" + "!type": "fn(data: string) -> bool", }, - "isset": { - "!doc": "判断一个值是否不为null,undefined和NaN<br/>例如:core.isset(0/0); // false,因为0/0等于NaN<br/>v: 待测值,可选<br/>返回值:false表示待测值为null、undefined、NaN或未填写,true表示为其他值。", - "!type": "fn(v?: ?) -> bool" + isset: { + "!doc": + "判断一个值是否不为null,undefined和NaN<br/>例如:core.isset(0/0); // false,因为0/0等于NaN<br/>v: 待测值,可选<br/>返回值:false表示待测值为null、undefined、NaN或未填写,true表示为其他值。", + "!type": "fn(v?: ?) -> bool", }, - "replaceValue": { - "!doc": "对一个表达式中的特殊规则进行替换,如status:xxx等。<br/>例如:core.replaceValue('status:atk+item:yellowKey'); // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用<br/>value: 模板字符串,注意独立开关不会被替换<br/>返回值:替换完毕后的字符串", - "!type": "fn(value: string) -> string" + replaceValue: { + "!doc": + "对一个表达式中的特殊规则进行替换,如status:xxx等。<br/>例如:core.replaceValue('status:atk+item:yellowKey'); // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用<br/>value: 模板字符串,注意独立开关不会被替换<br/>返回值:替换完毕后的字符串", + "!type": "fn(value: string) -> string", }, - "getLocalForage": { + getLocalForage: { "!doc": "从本地数据库读出一段数据", - "!type": "fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())" + "!type": + "fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())", }, - "inArray": { - "!doc": "判定array是不是一个数组,以及element是否在该数组中。<br/>array: 可能的数组,不为数组或不填将导致返回值为false<br/>element: 待查找的元素<br/>返回值:如果array为数组且具有element这项,就返回true,否则返回false", - "!type": "fn(array?: ?, element?: ?) -> bool" + inArray: { + "!doc": + "判定array是不是一个数组,以及element是否在该数组中。<br/>array: 可能的数组,不为数组或不填将导致返回值为false<br/>element: 待查找的元素<br/>返回值:如果array为数组且具有element这项,就返回true,否则返回false", + "!type": "fn(array?: ?, element?: ?) -> bool", }, - "setGlobal": { - "!doc": "设置一个全局存储,适用于global:xxx,录像播放时将忽略此函数。<br/>例如:core.setBlobal('一周目已通关', true); // 设置全局存储“一周目已通关”为true,方便二周目游戏中的新要素。<br/>key: 全局变量名称,支持中文<br/>value: 全局变量的新值,不填或null表示清除此全局存储", - "!type": "fn(key: string, value?: ?)" + setGlobal: { + "!doc": + "设置一个全局存储,适用于global:xxx,录像播放时将忽略此函数。<br/>例如:core.setBlobal('一周目已通关', true); // 设置全局存储“一周目已通关”为true,方便二周目游戏中的新要素。<br/>key: 全局变量名称,支持中文<br/>value: 全局变量的新值,不填或null表示清除此全局存储", + "!type": "fn(key: string, value?: ?)", }, - "rand2": { - "!doc": "支持SL的随机数,并计入录像<br/>例如:1 + core.rand2(6); // 随机生成一个小于7的正整数,模拟骰子的效果<br/>num: 正整数,0或不填会被视为2147483648<br/>返回值:属于 [0, num) 的随机数", - "!type": "fn(num?: number) -> number" + rand2: { + "!doc": + "支持SL的随机数,并计入录像<br/>例如:1 + core.rand2(6); // 随机生成一个小于7的正整数,模拟骰子的效果<br/>num: 正整数,0或不填会被视为2147483648<br/>返回值:属于 [0, num) 的随机数", + "!type": "fn(num?: number) -> number", }, - "setStatusBarInnerHTML": { - "!doc": "填写非自绘状态栏<br/>例如:core.setStatusBarInnerHTML('hp', core.status.hero.hp, 'color: #66CCFF'); // 更新状态栏中的主角生命,使用加载画面的宣传色<br/>name: 状态栏项的名称,如'hp', 'atk', 'def'等。必须是core.statusBar中的一个合法项<br/>value: 要填写的内容,大数字会被格式化为至多6个字符,无中文的内容会被自动设为斜体<br/>css: 额外的css样式,可选。如更改颜色等", - "!type": "fn(name: string, value: ?, css?: string)" + setStatusBarInnerHTML: { + "!doc": + "填写非自绘状态栏<br/>例如:core.setStatusBarInnerHTML('hp', core.status.hero.hp, 'color: #66CCFF'); // 更新状态栏中的主角生命,使用加载画面的宣传色<br/>name: 状态栏项的名称,如'hp', 'atk', 'def'等。必须是core.statusBar中的一个合法项<br/>value: 要填写的内容,大数字会被格式化为至多6个字符,无中文的内容会被自动设为斜体<br/>css: 额外的css样式,可选。如更改颜色等", + "!type": "fn(name: string, value: ?, css?: string)", }, - "matchRegex": { + matchRegex: { "!doc": "是否满足正则表达式", - "!type": "fn(pattern: string, string: string) -> string" + "!type": "fn(pattern: string, string: string) -> string", }, - "push": { - "!doc": "将b(可以是另一个数组)插入数组a的末尾,此函数用于弥补a.push(b)中b只能是单项的不足。<br/>例如:core.push(todo, {type: 'unfollow'}); // 在事件指令数组todo的末尾插入“取消所有跟随者”指令<br/>a: 原数组<br/>b: 待插入的新末项或后缀数组<br/>返回值:插入完毕后的新数组,它是改变原数组a本身得到的", - "!type": "fn(a: [?], b: ?) -> [?]" + push: { + "!doc": + "将b(可以是另一个数组)插入数组a的末尾,此函数用于弥补a.push(b)中b只能是单项的不足。<br/>例如:core.push(todo, {type: 'unfollow'}); // 在事件指令数组todo的末尾插入“取消所有跟随者”指令<br/>a: 原数组<br/>b: 待插入的新末项或后缀数组<br/>返回值:插入完毕后的新数组,它是改变原数组a本身得到的", + "!type": "fn(a: [?], b: ?) -> [?]", }, - "formatSize": { + formatSize: { "!doc": "格式化文件大小", - "!type": "fn(size: number) -> string" - } + "!type": "fn(size: number) -> string", + }, }, - "actions": { + actions: { "!doc": "主要是处理一些和用户交互相关的内容。", - "onup": { + onup: { "!doc": "当点击(触摸)事件放开时", - "!type": "fn(loc: {x: number, y: number, size: number})" + "!type": "fn(loc: {x: number, y: number, size: number})", }, - "pressKey": { + pressKey: { "!doc": "按住某个键时", - "!type": "fn(keyCode: number)" + "!type": "fn(keyCode: number)", }, - "keyUp": { + keyUp: { "!doc": "根据放开键的code来执行一系列操作", - "!type": "fn(keyCode: number, altKey?: bool, fromReplay?: bool)" + "!type": "fn(keyCode: number, altKey?: bool, fromReplay?: bool)", }, - "ondown": { + ondown: { "!doc": "点击(触摸)事件按下时", - "!type": "fn(loc: {x: number, y: number, size: number})" + "!type": "fn(loc: {x: number, y: number, size: number})", }, - "registerAction": { - "!doc": "此函数将注册一个用户交互行为。<br/>action: 要注册的交互类型,如 ondown, onclick, keyDown 等等。<br/>name: 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。<br/>func: 执行函数。<br/>如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。<br/>priority: 优先级;优先级高的将会被执行。此项可不填,默认为0", - "!type": "fn(action: string, name: string, func: string|fn(params: ?), priority?: number)" + registerAction: { + "!doc": + "此函数将注册一个用户交互行为。<br/>action: 要注册的交互类型,如 ondown, onclick, keyDown 等等。<br/>name: 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。<br/>func: 执行函数。<br/>如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。<br/>priority: 优先级;优先级高的将会被执行。此项可不填,默认为0", + "!type": + "fn(action: string, name: string, func: string|fn(params: ?), priority?: number)", }, - "onkeyDown": { + onkeyDown: { "!doc": "按下某个键时", - "!type": "fn(e: Event)" + "!type": "fn(e: Event)", }, - "keyDown": { + keyDown: { "!doc": "根据按下键的code来执行一系列操作", - "!type": "fn(keyCode: number)" + "!type": "fn(keyCode: number)", }, - "onStatusBarClick": { + onStatusBarClick: { "!doc": "点击自绘状态栏时", - "!type": "fn(e?: Event)" + "!type": "fn(e?: Event)", }, - "longClick": { + longClick: { "!doc": "长按", - "!type": "fn(x: number, y: number, px: number, py: number, fromEvent?: bool)" + "!type": + "fn(x: number, y: number, px: number, py: number, fromEvent?: bool)", }, - "unregisterAction": { + unregisterAction: { "!doc": "注销一个用户交互行为", - "!type": "fn(action: string, name: string)" + "!type": "fn(action: string, name: string)", }, - "keyDownCtrl": { + keyDownCtrl: { "!doc": "长按Ctrl键时", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "onclick": { + onclick: { "!doc": "具体点击屏幕上(x,y)点时,执行的操作", - "!type": "fn(x: number, y: number, px: number, py: number, stepPostfix?: [?])" + "!type": + "fn(x: number, y: number, px: number, py: number, stepPostfix?: [?])", }, - "doRegisteredAction": { + doRegisteredAction: { "!doc": "执行一个用户交互行为", - "!type": "fn(action: string, params: ?)" + "!type": "fn(action: string, params: ?)", }, - "onkeyUp": { + onkeyUp: { "!doc": "放开某个键时", - "!type": "fn(e: Event)" + "!type": "fn(e: Event)", }, - "onmousewheel": { + onmousewheel: { "!doc": "滑动鼠标滚轮时的操作", - "!type": "fn(direct: number)" + "!type": "fn(direct: number)", }, - "onmove": { + onmove: { "!doc": "当在触摸屏上滑动时", - "!type": "fn(loc: {x: number, y: number, size: number})" - } + "!type": "fn(loc: {x: number, y: number, size: number})", + }, }, - "loader": { + loader: { "!doc": "资源加载相关的函数", - "loadImages": { + loadImages: { "!doc": "加载一系列图片", - "!type": "fn(dir: string, names: [string], toSave: ?, callback?: fn()) " + "!type": + "fn(dir: string, names: [string], toSave: ?, callback?: fn()) ", }, - "loadImagesFromZip": { + loadImagesFromZip: { "!doc": "从zip中加载一系列图片", - "!type": "fn(url: string, names: [string], toSave?: ?, onprogress?: ?, onfinished?: ?)" + "!type": + "fn(url: string, names: [string], toSave?: ?, onprogress?: ?, onfinished?: ?)", }, - "loadBgm": { + loadBgm: { "!doc": "加载一个bgm", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "loadOneMusic": { + loadOneMusic: { "!doc": "加载一个音乐或音效", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "freeBgm": { + freeBgm: { "!doc": "释放一个bgm的缓存", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "loadOneSound": { + loadOneSound: { "!doc": "加载一个音效", - "!type": "fn(name: string)" + "!type": "fn(name: string)", }, - "loadImage": { + loadImage: { "!doc": "加载某一张图片", - "!type": "fn(dir: name, imgName: name, callback?: fn())" - } + "!type": "fn(dir: name, imgName: name, callback?: fn())", + }, }, - "maps": { - "!doc": "负责一切和地图相关的处理内容,包括如下几个方面:<br/>- 地图的初始化,保存和读取,地图数组的生成<br/>- 是否可移动或瞬间移动的判定<br/>- 地图的绘制<br/>- 获得某个点的图块信息<br/>- 启用和禁用图块,改变图块 <br/>- 移动/跳跃图块,淡入淡出图块<br/>- 全局动画控制,动画的绘制", - "noPass": { - "!doc": "判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)<br/>例如:core.noPass(0, 0); // 判断地图左上角能否被踏入<br/>x: 目标点的横坐标<br/>y: 目标点的纵坐标<br/>floorId: 目标点所在的地图id,不填视为当前地图<br/>返回值:true表示可踏入", - "!type": "fn(x: number, y: number, floorId?: string) -> bool" + maps: { + "!doc": + "负责一切和地图相关的处理内容,包括如下几个方面:<br/>- 地图的初始化,保存和读取,地图数组的生成<br/>- 是否可移动或瞬间移动的判定<br/>- 地图的绘制<br/>- 获得某个点的图块信息<br/>- 启用和禁用图块,改变图块 <br/>- 移动/跳跃图块,淡入淡出图块<br/>- 全局动画控制,动画的绘制", + noPass: { + "!doc": + "判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)<br/>例如:core.noPass(0, 0); // 判断地图左上角能否被踏入<br/>x: 目标点的横坐标<br/>y: 目标点的纵坐标<br/>floorId: 目标点所在的地图id,不填视为当前地图<br/>返回值:true表示可踏入", + "!type": "fn(x: number, y: number, floorId?: string) -> bool", }, - "drawAnimate": { - "!doc": "播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数<br/>例如:core.drawAnimate('attack', core.nextX(), core.nextY(), false, core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒<br/>name: 动画文件名,不含后缀<br/>x: 横坐标<br/>y: 纵坐标<br/>alignWindow: 是否是相对窗口的坐标<br/>callback: 动画停止后的回调函数,可选<br/>返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", - "!type": "fn(name: string, x: number, y: number, alignWindow: bool, callback?: fn()) -> number" + drawAnimate: { + "!doc": + "播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数<br/>例如:core.drawAnimate('attack', core.nextX(), core.nextY(), false, core.vibrate); // 在主角面前一格播放普攻动画,动画停止后视野左右抖动1秒<br/>name: 动画文件名,不含后缀<br/>x: 横坐标<br/>y: 纵坐标<br/>alignWindow: 是否是相对窗口的坐标<br/>callback: 动画停止后的回调函数,可选<br/>返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", + "!type": + "fn(name: string, x: number, y: number, alignWindow: bool, callback?: fn()) -> number", }, - "drawHeroAnimate": { - "!doc": "播放跟随勇士的动画<br/>name: 动画名<br/>callback: 动画停止后的回调函数,可选<br/>返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", - "!type": "fn(name: string, callback?: fn()) -> number" + drawHeroAnimate: { + "!doc": + "播放跟随勇士的动画<br/>name: 动画名<br/>callback: 动画停止后的回调函数,可选<br/>返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)", + "!type": "fn(name: string, callback?: fn()) -> number", }, - "stopAnimate": { - "!doc": "立刻停止一个动画播放<br/>id: 播放动画的编号,即drawAnimate或drawHeroAnimate的返回值;不填视为所有动画br/>doCallback: 是否执行该动画的回调函数", - "!type": "fn(id?: number, doCallback?: bool)" + stopAnimate: { + "!doc": + "立刻停止一个动画播放<br/>id: 播放动画的编号,即drawAnimate或drawHeroAnimate的返回值;不填视为所有动画br/>doCallback: 是否执行该动画的回调函数", + "!type": "fn(id?: number, doCallback?: bool)", }, - "getPlayingAnimates": { - "!doc": "获得当前正在播放的所有(指定)动画的id列表<br/>name: 动画名;不填代表返回全部正在播放的动画<br/>返回值: 一个数组,每一项为一个正在播放的动画;可用core.stopAnimate停止播放。", - "!type": "fn(name?: string) -> [number]" + getPlayingAnimates: { + "!doc": + "获得当前正在播放的所有(指定)动画的id列表<br/>name: 动画名;不填代表返回全部正在播放的动画<br/>返回值: 一个数组,每一项为一个正在播放的动画;可用core.stopAnimate停止播放。", + "!type": "fn(name?: string) -> [number]", }, - "getBlockCls": { - "!doc": "判定某个点的图块类型<br/>例如:if(core.getBlockCls(x1, y1) != 'enemys' && core.getBlockCls(x2, y2) != 'enemy48') core.openDoor(x3, y3); // 另一个简单的机关门事件,打败或炸掉这一对不同身高的敌人就开门<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 隐藏点是否不返回null,true表示不返回null<br/>返回值:图块类型,即“地形、四帧动画、矮敌人、高敌人、道具、矮npc、高npc、自动元件、额外地形”之一", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string" + getBlockCls: { + "!doc": + "判定某个点的图块类型<br/>例如:if(core.getBlockCls(x1, y1) != 'enemys' && core.getBlockCls(x2, y2) != 'enemy48') core.openDoor(x3, y3); // 另一个简单的机关门事件,打败或炸掉这一对不同身高的敌人就开门<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 隐藏点是否不返回null,true表示不返回null<br/>返回值:图块类型,即“地形、四帧动画、矮敌人、高敌人、道具、矮npc、高npc、自动元件、额外地形”之一", + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string", }, - "drawMap": { - "!doc": "地图重绘<br/>例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新<br/>floorId: 地图id,可省略表示当前楼层<br/>callback: 重绘完毕后的回调函数,可选", - "!type": "fn(floorId?: string)" + drawMap: { + "!doc": + "地图重绘<br/>例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新<br/>floorId: 地图id,可省略表示当前楼层<br/>callback: 重绘完毕后的回调函数,可选", + "!type": "fn(floorId?: string)", }, - "nearStair": { + nearStair: { "!doc": "当前位置是否在楼梯边;在楼传平面塔模式下对箭头也有效", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "turnBlock": { + turnBlock: { "!doc": "事件转向", - "!type": "fn(direction?: string, x?: number, y?: number, floorId?: string)" + "!type": + "fn(direction?: string, x?: number, y?: number, floorId?: string)", }, - "getMapArray": { - "!doc": "生成事件层矩阵<br/>例如:core.getMapArray('MT0'); // 生成主塔0层的事件层矩阵,隐藏的图块视为0<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 可选,true表示隐藏的图块也会被表示出来<br/>返回值:事件层矩阵,注意对其阵元的访问是[y][x]", - "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" + getMapArray: { + "!doc": + "生成事件层矩阵<br/>例如:core.getMapArray('MT0'); // 生成主塔0层的事件层矩阵,隐藏的图块视为0<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 可选,true表示隐藏的图块也会被表示出来<br/>返回值:事件层矩阵,注意对其阵元的访问是[y][x]", + "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]", }, - "getMapNumber": { + getMapNumber: { "!doc": "获得事件层某个点的数字", - "!type": "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number" + "!type": + "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number", }, - "jumpBlock": { - "!doc": "跳跃图块;从V2.7开始不再有音效<br/>例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出<br/>sx: 起点的横坐标<br/>sy: 起点的纵坐标<br/>ex: 终点的横坐标<br/>ey: 终点的纵坐标<br/>time: 单步和淡出用时,单位为毫秒。不填视为半秒<br/>keep: 是否不淡出,true表示不淡出<br/>callback: 落地或淡出后的回调函数,可选", - "!type": "fn(sx: number, sy: number, ex: number, ey: number, time?: number, keep?: bool, callback?: fn())" + jumpBlock: { + "!doc": + "跳跃图块;从V2.7开始不再有音效<br/>例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出<br/>sx: 起点的横坐标<br/>sy: 起点的纵坐标<br/>ex: 终点的横坐标<br/>ey: 终点的纵坐标<br/>time: 单步和淡出用时,单位为毫秒。不填视为半秒<br/>keep: 是否不淡出,true表示不淡出<br/>callback: 落地或淡出后的回调函数,可选", + "!type": + "fn(sx: number, sy: number, ex: number, ey: number, time?: number, keep?: bool, callback?: fn())", }, - "replaceBlock": { - "!doc": "批量替换图块<br/>例如:core.replaceBlock(21, 22, core.floorIds); // 把游戏中地上当前所有的黄钥匙都变成蓝钥匙<br/>fromNumber: 旧图块的数字<br/>toNumber: 新图块的数字<br/>floorId: 地图id或其数组,不填视为当前地图", - "!type": "fn(fromNumber: number, toNumber: number, floorId?: string|[string])" + replaceBlock: { + "!doc": + "批量替换图块<br/>例如:core.replaceBlock(21, 22, core.floorIds); // 把游戏中地上当前所有的黄钥匙都变成蓝钥匙<br/>fromNumber: 旧图块的数字<br/>toNumber: 新图块的数字<br/>floorId: 地图id或其数组,不填视为当前地图", + "!type": + "fn(fromNumber: number, toNumber: number, floorId?: string|[string])", }, - "drawBlock": { + drawBlock: { "!doc": "绘制一个图块", - "!type": "fn(block?: block, animate?: number)" + "!type": "fn(block?: block, animate?: number)", }, - "resetMap": { + resetMap: { "!doc": "重置地图", - "!type": "fn(floorId?: string|[string])" + "!type": "fn(floorId?: string|[string])", }, - "animateSetBlock": { + animateSetBlock: { "!doc": "动画形式转变某点图块", - "!type": "fn(number: number|string, x: number, y: number, floorId?: string, time?: number, callback?: fn())" + "!type": + "fn(number: number|string, x: number, y: number, floorId?: string, time?: number, callback?: fn())", }, - "animateSetBlocks": { + animateSetBlocks: { "!doc": "动画形式同时转变若干点图块", - "!type": "fn(number: number|string, locs: [?], floorId?: string, time?: number, callback?: fn())" + "!type": + "fn(number: number|string, locs: [?], floorId?: string, time?: number, callback?: fn())", }, - "compressMap": { + compressMap: { "!doc": "压缩地图", - "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]" + "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]", }, - "enemyExists": { + enemyExists: { "!doc": "某个点是否存在(指定的)怪物", - "!type": "fn(x: number, y: number, id?: string, floorId?: string) -> bool" + "!type": + "fn(x: number, y: number, id?: string, floorId?: string) -> bool", }, - "npcExists": { + npcExists: { "!doc": "某个点是否存在NPC", - "!type": "fn(x: number, y: number, floorId?: string) -> bool" + "!type": "fn(x: number, y: number, floorId?: string) -> bool", }, - "getBlockByNumber": { + getBlockByNumber: { "!doc": "根据数字获得图块", - "!type": "fn(number: number) -> block" + "!type": "fn(number: number) -> block", }, - "removeBlock": { - "!doc": "删除一个图块,对应于「隐藏事件」并同时删除<br/>例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", - "!type": "fn(x: number, y: number, floorId?: string)" + removeBlock: { + "!doc": + "删除一个图块,对应于「隐藏事件」并同时删除<br/>例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", + "!type": "fn(x: number, y: number, floorId?: string)", }, - "hideBlock": { - "!doc": "隐藏一个图块,对应于「隐藏事件」且不删除<br/>例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", - "!type": "fn(x: number, y: number, floorId?: string)" + hideBlock: { + "!doc": + "隐藏一个图块,对应于「隐藏事件」且不删除<br/>例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", + "!type": "fn(x: number, y: number, floorId?: string)", }, - "removeBlockByIndex": { + removeBlockByIndex: { "!doc": "根据block的索引删除该块", - "!type": "fn(index: number, floorId?: string)" + "!type": "fn(index: number, floorId?: string)", }, - "stairExists": { + stairExists: { "!doc": "某个点是否存在楼梯", - "!type": "fn(x: number, y: number, floorId?: string) -> bool" + "!type": "fn(x: number, y: number, floorId?: string) -> bool", }, - "isMapBlockDisabled": { + isMapBlockDisabled: { "!doc": "某个点图块是否被强制启用或禁用", - "!type": "fn(floorId?: string, x?: number, y?: number, flags?: ?) -> bool" + "!type": + "fn(floorId?: string, x?: number, y?: number, flags?: ?) -> bool", }, - "setMapBlockDisabled": { + setMapBlockDisabled: { "!doc": "设置某个点图块的强制启用或禁用状态", - "!type": "fn(floorId?: string, x?: number, y?: number, disabled?: bool)" + "!type": + "fn(floorId?: string, x?: number, y?: number, disabled?: bool)", }, - "setBlockOpacity": { + setBlockOpacity: { "!doc": "设置某个点图块的不透明度", - "!type": "fn(opacity?: number, x?: number, y?: number, floorId?: string)" + "!type": + "fn(opacity?: number, x?: number, y?: number, floorId?: string)", }, - "setBlockFilter": { + setBlockFilter: { "!doc": "设置某个点图块的特效", - "!type": "fn(filter?: ?, x?: number, y?: number, floorId?: string)" + "!type": "fn(filter?: ?, x?: number, y?: number, floorId?: string)", }, - "decompressMap": { + decompressMap: { "!doc": "解压缩地图", - "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]" + "!type": "fn(mapArr: [[number]], floorId?: string) -> [[number]]", }, - "automaticRoute": { - "!doc": "自动寻路<br/>例如:core.automaticRoute(0, 0); // 自动寻路到地图左上角<br/>destX: 目标点的横坐标<br/>destY: 目标点的纵坐标<br/>返回值:每步走完后主角的loc属性组成的一维数组", - "!type": "fn(destX: number, destY: number) -> [{x: number, y: number, direction: string}]" + automaticRoute: { + "!doc": + "自动寻路<br/>例如:core.automaticRoute(0, 0); // 自动寻路到地图左上角<br/>destX: 目标点的横坐标<br/>destY: 目标点的纵坐标<br/>返回值:每步走完后主角的loc属性组成的一维数组", + "!type": + "fn(destX: number, destY: number) -> [{x: number, y: number, direction: string}]", }, - "resizeMap": { + resizeMap: { "!doc": "更改地图画布的尺寸", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "getFgNumber": { - "!doc": "判定某点的前景层的数字<br/>例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字<br/>x: 横坐标,不填为勇士坐标<br/>y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存而强制重算", - "!type": "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number" + getFgNumber: { + "!doc": + "判定某点的前景层的数字<br/>例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字<br/>x: 横坐标,不填为勇士坐标<br/>y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存而强制重算", + "!type": + "fn(x: number, y: number, floorId?: string, noCache?: bool) -> number", }, - "moveBlock": { - "!doc": "移动图块<br/>例如:core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格<br/>x: 起点的横坐标<br/>y: 起点的纵坐标<br/>steps: 步伐数组<br/>time: 单步和淡出用时,单位为毫秒。不填视为半秒<br/>keep: 是否不淡出,true表示不淡出<br/>callback: 移动或淡出后的回调函数,可选", - "!type": "fn(x: number, y: number, steps: [string], time?: number, keep?: bool, callback?: fn())" + moveBlock: { + "!doc": + "移动图块<br/>例如:core.moveBlock(0, 0, ['down']); // 令地图左上角的图块下移一格<br/>x: 起点的横坐标<br/>y: 起点的纵坐标<br/>steps: 步伐数组<br/>time: 单步和淡出用时,单位为毫秒。不填视为半秒<br/>keep: 是否不淡出,true表示不淡出<br/>callback: 移动或淡出后的回调函数,可选", + "!type": + "fn(x: number, y: number, steps: [string], time?: number, keep?: bool, callback?: fn())", }, - "getBgNumber": { - "!doc": "判定某点的背景层的数字<br/>例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字<br/>x: 横坐标,不填为勇士坐标<br/>y: 纵坐标,不填为勇士坐标<br/>floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存而强制重算", - "!type": "fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number" + getBgNumber: { + "!doc": + "判定某点的背景层的数字<br/>例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字<br/>x: 横坐标,不填为勇士坐标<br/>y: 纵坐标,不填为勇士坐标<br/>floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存而强制重算", + "!type": + "fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number", }, - "getIdOfThis": { + getIdOfThis: { "!doc": "获得当前事件点的ID", - "!type": "fn(id?: string) -> string" + "!type": "fn(id?: string) -> string", }, - "searchBlock": { - "!doc": "搜索图块, 支持通配符和正则表达式<br/>例如:core.searchBlock('*Door'); // 搜索当前地图的所有门<br/>id: 图块id,支持星号表示任意多个(0个起)字符<br/>floorId: 地图id或数组,不填视为当前地图<br/>showDisable: 隐藏点是否计入,true表示计入<br/>返回值:一个详尽的数组,一般只用到其长度", - "!type": "fn(id: string, floorId?: string|[string], showDisable?: bool) -> [{floorId: string, index: number, x: number, y: number, block: block}]" + searchBlock: { + "!doc": + "搜索图块, 支持通配符和正则表达式<br/>例如:core.searchBlock('*Door'); // 搜索当前地图的所有门<br/>id: 图块id,支持星号表示任意多个(0个起)字符<br/>floorId: 地图id或数组,不填视为当前地图<br/>showDisable: 隐藏点是否计入,true表示计入<br/>返回值:一个详尽的数组,一般只用到其长度", + "!type": + "fn(id: string, floorId?: string|[string], showDisable?: bool) -> [{floorId: string, index: number, x: number, y: number, block: block}]", }, - "searchBlockWithFilter": { - "!doc": "根据给定的筛选函数搜索全部满足条件的图块<br/>例如:core.searchBlockWithFilter(function (block) { return block.event.id.endsWith('Door'); }); // 搜索当前地图的所有门<br/>blockFilter: 筛选函数,可接受block输入,应当返回一个boolean值<br/>floorId: 地图id或数组,不填视为当前地图<br/>showDisable: 隐藏点是否计入,true表示计入<br/>返回值:一个详尽的数组", - "!type": "fn(blockFilter: fn(block: block) -> bool, floorId?: string|[string], showDisable?: bool): [{floorId: string, index: number, x: number, y: number, block: block}]" + searchBlockWithFilter: { + "!doc": + "根据给定的筛选函数搜索全部满足条件的图块<br/>例如:core.searchBlockWithFilter(function (block) { return block.event.id.endsWith('Door'); }); // 搜索当前地图的所有门<br/>blockFilter: 筛选函数,可接受block输入,应当返回一个boolean值<br/>floorId: 地图id或数组,不填视为当前地图<br/>showDisable: 隐藏点是否计入,true表示计入<br/>返回值:一个详尽的数组", + "!type": + "fn(blockFilter: fn(block: block) -> bool, floorId?: string|[string], showDisable?: bool): [{floorId: string, index: number, x: number, y: number, block: block}]", }, - "hideBgFgMap": { + hideBgFgMap: { "!doc": "隐藏前景/背景地图", - "!type": "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())" + "!type": + "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())", }, - "getBlockInfo": { - "!doc": "获得某个图块或素材的信息,包括ID,cls,图片,坐标,faceIds等等", - "!type": "fn(block?: number|string|block) -> blockInfo" + getBlockInfo: { + "!doc": + "获得某个图块或素材的信息,包括ID,cls,图片,坐标,faceIds等等", + "!type": "fn(block?: number|string|block) -> blockInfo", }, - "getFaceDownId": { - "!doc": "获得某个图块对应行走图朝向向下的那一项的id;如果不存在行走图绑定则返回自身id。", - "!type": "fn(block?: string|number|block) -> string" + getFaceDownId: { + "!doc": + "获得某个图块对应行走图朝向向下的那一项的id;如果不存在行走图绑定则返回自身id。", + "!type": "fn(block?: string|number|block) -> string", }, - "canMoveDirectlyArray": { + canMoveDirectlyArray: { "!doc": "获得某些点可否通行的信息", - "!type": "fn(locs?: [[number]])" + "!type": "fn(locs?: [[number]])", }, - "hideFloorImage": { + hideFloorImage: { "!doc": "隐藏一个楼层贴图", - "!type": "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())" + "!type": + "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())", }, - "extractBlocks": { + extractBlocks: { "!doc": "根据需求解析出blocks", - "!type": "fn(map?: ?)" + "!type": "fn(map?: ?)", }, - "extractBlocksForUI": { + extractBlocksForUI: { "!doc": "根据需求为UI解析出blocks", - "!type": "fn(map?: ?, flags?: ?)" + "!type": "fn(map?: ?, flags?: ?)", }, - "getBlockId": { - "!doc": "判定某个点的图块id<br/>例如:if(core.getBlockId(x1, y1) != 'greenSlime' && core.getBlockId(x2, y2) != 'redSlime') core.openDoor(x3, y3); // 一个简单的机关门事件,打败或炸掉这一对绿头怪和红头怪就开门<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 隐藏点是否不返回null,true表示不返回null<br/>返回值:图块id,该点无图块则返回null", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string" + getBlockId: { + "!doc": + "判定某个点的图块id<br/>例如:if(core.getBlockId(x1, y1) != 'greenSlime' && core.getBlockId(x2, y2) != 'redSlime') core.openDoor(x3, y3); // 一个简单的机关门事件,打败或炸掉这一对绿头怪和红头怪就开门<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 隐藏点是否不返回null,true表示不返回null<br/>返回值:图块id,该点无图块则返回null", + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string", }, - "getBlockNumber": { - "!doc": "判定某个点的图块数字<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 隐藏点是否不返回null,true表示不返回null<br/>返回值:图块数字,该点无图块则返回null", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> number" + getBlockNumber: { + "!doc": + "判定某个点的图块数字<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图<br/>showDisable: 隐藏点是否不返回null,true表示不返回null<br/>返回值:图块数字,该点无图块则返回null", + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> number", }, - "getBlockOpacity": { + getBlockOpacity: { "!doc": "获得某个点图块的不透明度", - "!type": "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> number" + "!type": + "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> number", }, - "getBlockFilter": { + getBlockFilter: { "!doc": "获得某个点图块的特效", - "!type": "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> ?" + "!type": + "fn(x?: number, y?: number, floorId?: string, showDisable?: bool) -> ?", }, - "loadFloor": { + loadFloor: { "!doc": "从文件或存档中加载某个楼层", - "!type": "fn(floorId?: string, map?: ?)" + "!type": "fn(floorId?: string, map?: ?)", }, - "generateMovableArray": { - "!doc": "可通行性判定<br/>例如:core.generateMovableArray(); // 判断当前地图主角从各点能向何方向移动<br/>floorId: 地图id,不填视为当前地图<br/>返回值:从各点可移动方向的三维数组", - "!type": "fn(floorId?: string) -> [[[string]]]" + generateMovableArray: { + "!doc": + "可通行性判定<br/>例如:core.generateMovableArray(); // 判断当前地图主角从各点能向何方向移动<br/>floorId: 地图id,不填视为当前地图<br/>返回值:从各点可移动方向的三维数组", + "!type": "fn(floorId?: string) -> [[[string]]]", }, - "terrainExists": { + terrainExists: { "!doc": "某个点是否存在(指定的)地形", - "!type": "fn(x: number, y: number, id?: string, floorId?: string) -> bool" + "!type": + "fn(x: number, y: number, id?: string, floorId?: string) -> bool", }, - "getBlockById": { + getBlockById: { "!doc": "根据ID获得图块", - "!type": "fn(id: string) -> block" + "!type": "fn(id: string) -> block", }, - "drawBg": { - "!doc": "绘制背景层(含贴图,其与背景层矩阵的绘制顺序可通过复写此函数来改变)<br/>例如:core.drawBg(); // 绘制当前地图的背景层<br/>floorId: 地图id,不填视为当前地图<br/>ctx: 某画布的ctx,用于绘制缩略图,一般不需要", - "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)" + drawBg: { + "!doc": + "绘制背景层(含贴图,其与背景层矩阵的绘制顺序可通过复写此函数来改变)<br/>例如:core.drawBg(); // 绘制当前地图的背景层<br/>floorId: 地图id,不填视为当前地图<br/>ctx: 某画布的ctx,用于绘制缩略图,一般不需要", + "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)", }, - "showBlock": { - "!doc": "显示(隐藏或显示的)图块,此函数将被“显示事件”指令和勾选了“不消失”的“移动/跳跃事件”指令(如阻击怪)的终点调用<br/>例如:core.showBlock(0, 0); // 显示地图左上角的图块<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", - "!type": "fn(x: number, y: number, floorId?: string)" + showBlock: { + "!doc": + "显示(隐藏或显示的)图块,此函数将被“显示事件”指令和勾选了“不消失”的“移动/跳跃事件”指令(如阻击怪)的终点调用<br/>例如:core.showBlock(0, 0); // 显示地图左上角的图块<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", + "!type": "fn(x: number, y: number, floorId?: string)", }, - "getMapBlocksObj": { + getMapBlocksObj: { "!doc": "以x,y的形式返回每个点的事件", - "!type": "fn(floorId?: string, noCache?: bool)" + "!type": "fn(floorId?: string, noCache?: bool)", }, - "removeGlobalAnimate": { + removeGlobalAnimate: { "!doc": "删除一个或所有全局动画", - "!type": "fn(x?: number, y?: number, name?: string)" + "!type": "fn(x?: number, y?: number, name?: string)", }, - "drawEvents": { - "!doc": "绘制事件层<br/>例如:core.drawEvents(); // 绘制当前地图的事件层<br/>floorId: 地图id,不填视为当前地图<br/>blocks: 一般不需要<br/>ctx: 某画布的ctx,用于绘制缩略图,一般不需要", - "!type": "fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)" + drawEvents: { + "!doc": + "绘制事件层<br/>例如:core.drawEvents(); // 绘制当前地图的事件层<br/>floorId: 地图id,不填视为当前地图<br/>blocks: 一般不需要<br/>ctx: 某画布的ctx,用于绘制缩略图,一般不需要", + "!type": + "fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)", }, - "canMoveDirectly": { - "!doc": "能否瞬移到某点,并求出节约的步数。<br/>例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角<br/>destX: 目标点的横坐标<br/>destY: 目标点的纵坐标<br/>返回值:正数表示节约的步数,-1表示不可瞬移", - "!type": "fn(destX: number, destY: number) -> number" + canMoveDirectly: { + "!doc": + "能否瞬移到某点,并求出节约的步数。<br/>例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角<br/>destX: 目标点的横坐标<br/>destY: 目标点的纵坐标<br/>返回值:正数表示节约的步数,-1表示不可瞬移", + "!type": "fn(destX: number, destY: number) -> number", }, - "saveMap": { + saveMap: { "!doc": "将当前地图重新变成数字,以便于存档", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "drawBoxAnimate": { + drawBoxAnimate: { "!doc": "绘制UI层的box动画", - "!type": "fn()" + "!type": "fn()", }, - "setBgFgBlock": { - "!doc": "转变图层块<br/>例如:core.setBgFgBlock('bg', 167, 6, 6); // 把当前地图背景层的中心块改为滑冰<br/>name: 背景还是前景<br/>number: 新图层块的数字(也支持纯数字字符串如'1')或id<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", - "!type": "fn(name: string, number: number|string, x: number, y: number, floorId?: string)" + setBgFgBlock: { + "!doc": + "转变图层块<br/>例如:core.setBgFgBlock('bg', 167, 6, 6); // 把当前地图背景层的中心块改为滑冰<br/>name: 背景还是前景<br/>number: 新图层块的数字(也支持纯数字字符串如'1')或id<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", + "!type": + "fn(name: string, number: number|string, x: number, y: number, floorId?: string)", }, - "drawFg": { - "!doc": "绘制前景层(含贴图,其与前景层矩阵的绘制顺序可通过复写此函数来改变)<br/>例如:core.drawFg(); // 绘制当前地图的前景层<br/>floorId: 地图id,不填视为当前地图<br/>ctx: 某画布的ctx,用于绘制缩略图,一般不需要", - "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)" + drawFg: { + "!doc": + "绘制前景层(含贴图,其与前景层矩阵的绘制顺序可通过复写此函数来改变)<br/>例如:core.drawFg(); // 绘制当前地图的前景层<br/>floorId: 地图id,不填视为当前地图<br/>ctx: 某画布的ctx,用于绘制缩略图,一般不需要", + "!type": "fn(floorId?: string, ctx?: CanvasRenderingContext2D)", }, - "getBlock": { + getBlock: { "!doc": "获得某个点的block", - "!type": "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> block" + "!type": + "fn(x: number, y: number, floorId?: string, showDisable?: bool) -> block", }, - "initBlock": { + initBlock: { "!doc": "初始化一个图块", - "!type": "fn(x: number, y: number, id: string|number, addInfo?: bool, eventFloor?: ?) -> block" + "!type": + "fn(x: number, y: number, id: string|number, addInfo?: bool, eventFloor?: ?) -> block", }, - "addGlobalAnimate": { + addGlobalAnimate: { "!doc": "添加一个全局动画", - "!type": "fn(block?: block)" + "!type": "fn(block?: block)", }, - "animateBlock": { + animateBlock: { "!doc": "显示/隐藏某个块时的动画效果", - "!type": "fn(loc?: [number]|[[number]], type?: string|number, time?: number, callback?: fn())" + "!type": + "fn(loc?: [number]|[[number]], type?: string|number, time?: number, callback?: fn())", }, - "loadMap": { + loadMap: { "!doc": "将存档中的地图信息重新读取出来", - "!type": "fn(data?: ?, floorId?: string, flags?: ?)" + "!type": "fn(data?: ?, floorId?: string, flags?: ?)", }, - "setBlock": { - "!doc": "转变图块<br/>例如:core.setBlock(1, 0, 0); // 把地图左上角变成黄墙<br/>number: 新图块的数字(也支持纯数字字符串如'1')或id<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", - "!type": "fn(number: number|string, x: number, y: number, floorId?: string)" + setBlock: { + "!doc": + "转变图块<br/>例如:core.setBlock(1, 0, 0); // 把地图左上角变成黄墙<br/>number: 新图块的数字(也支持纯数字字符串如'1')或id<br/>x: 横坐标<br/>y: 纵坐标<br/>floorId: 地图id,不填视为当前地图", + "!type": + "fn(number: number|string, x: number, y: number, floorId?: string)", }, - "getFgMapArray": { - "!doc": "生成前景层矩阵<br/>例如:core.getFgMapArray('MT0'); // 生成主塔0层的前景层矩阵,使用缓存<br/>floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存<br/>返回值:前景层矩阵,注意对其阵元的访问是[y][x]", - "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" + getFgMapArray: { + "!doc": + "生成前景层矩阵<br/>例如:core.getFgMapArray('MT0'); // 生成主塔0层的前景层矩阵,使用缓存<br/>floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存<br/>返回值:前景层矩阵,注意对其阵元的访问是[y][x]", + "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]", }, - "getBgMapArray": { - "!doc": "生成背景层矩阵<br/>例如:core.getBgMapArray('MT0'); // 生成主塔0层的背景层矩阵,使用缓存<br/>floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存<br/>返回值:背景层矩阵,注意对其阵元的访问是[y][x]", - "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]" + getBgMapArray: { + "!doc": + "生成背景层矩阵<br/>例如:core.getBgMapArray('MT0'); // 生成主塔0层的背景层矩阵,使用缓存<br/>floorId: 地图id,不填视为当前地图<br/>noCache: 可选,true表示不使用缓存<br/>返回值:背景层矩阵,注意对其阵元的访问是[y][x]", + "!type": "fn(floorId?: string, noCache?: bool) -> [[number]]", }, - "canMoveHero": { - "!doc": "单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响<br/>x: 起点横坐标,不填视为主角当前的<br/>y: 起点纵坐标,不填视为主角当前的<br/>direction: 移动的方向,不填视为主角面对的方向<br/>floorId: 地图id,不填视为当前地图", - "!type": "fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool" + canMoveHero: { + "!doc": + "单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响<br/>x: 起点横坐标,不填视为主角当前的<br/>y: 起点纵坐标,不填视为主角当前的<br/>direction: 移动的方向,不填视为主角面对的方向<br/>floorId: 地图id,不填视为当前地图", + "!type": + "fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool", }, - "drawThumbnail": { - "!doc": "绘制缩略图<br/>例如:core.drawThumbnail(); // 绘制当前地图的缩略图<br/>floorId: 地图id,不填视为当前地图<br/>blocks: 一般不需要<br/>options: 绘制信息,可选。可以增绘主角位置和朝向、采用不同于游戏中的主角行走图、增绘显伤、提供flags用于存读档,同时包含要绘制到的画布名或画布的ctx或还有其他信息,如起绘坐标、绘制大小、是否绘制全图、截取中心", - "!type": "fn(floorId?: string, blocks?: [block], options?: ?)" + drawThumbnail: { + "!doc": + "绘制缩略图<br/>例如:core.drawThumbnail(); // 绘制当前地图的缩略图<br/>floorId: 地图id,不填视为当前地图<br/>blocks: 一般不需要<br/>options: 绘制信息,可选。可以增绘主角位置和朝向、采用不同于游戏中的主角行走图、增绘显伤、提供flags用于存读档,同时包含要绘制到的画布名或画布的ctx或还有其他信息,如起绘坐标、绘制大小、是否绘制全图、截取中心", + "!type": "fn(floorId?: string, blocks?: [block], options?: ?)", }, - "hideBlockByIndex": { + hideBlockByIndex: { "!doc": "根据图块的索引来隐藏图块", - "!type": "fn(index?: number, floorId?: string)" + "!type": "fn(index?: number, floorId?: string)", }, - "getNumberById": { - "!doc": "根据图块id得到数字(地图矩阵中的值)<br/>例如:core.getNumberById('yellowWall'); // 1<br/>id: 图块id<br/>返回值:图块的数字,定义在project\\maps.js(请注意和project\\icons.js中的“图块索引”相区分!)", - "!type": "fn(id: string) -> number" + getNumberById: { + "!doc": + "根据图块id得到数字(地图矩阵中的值)<br/>例如:core.getNumberById('yellowWall'); // 1<br/>id: 图块id<br/>返回值:图块的数字,定义在project\\maps.js(请注意和project\\icons.js中的“图块索引”相区分!)", + "!type": "fn(id: string) -> number", }, - "removeBlockByIndexes": { + removeBlockByIndexes: { "!doc": "一次性删除多个block", - "!type": "fn(indexes?: [number], floorId?: string)" + "!type": "fn(indexes?: [number], floorId?: string)", }, - "hideBlockByIndexes": { + hideBlockByIndexes: { "!doc": "一次性隐藏多个block", - "!type": "fn(indexes?: [number], floorId?: string)" + "!type": "fn(indexes?: [number], floorId?: string)", }, - "generateGroundPattern": { + generateGroundPattern: { "!doc": "生成groundPattern", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "showBgFgMap": { + showBgFgMap: { "!doc": "显示前景/背景地图", - "!type": "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())" + "!type": + "fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())", }, - "showFloorImage": { + showFloorImage: { "!doc": "显示一个楼层贴图", - "!type": "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())" - } + "!type": + "fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())", + }, }, - "ui": { - "!doc": "负责一切UI界面的绘制。主要包括三个部分:<br/>- 设置某个画布的属性与在某个画布上绘制的相关API<br/>- 具体的某个UI界面的绘制<br/>- 动态创建画布相关的API", - "resizeCanvas": { + ui: { + "!doc": + "负责一切UI界面的绘制。主要包括三个部分:<br/>- 设置某个画布的属性与在某个画布上绘制的相关API<br/>- 具体的某个UI界面的绘制<br/>- 动态创建画布相关的API", + resizeCanvas: { "!doc": "重新设置一个自定义画布的大小", - "!type": "fn(name: string, x?: number, y?: number, styleOnly?: bool, isTempCanvas?: bool)" + "!type": + "fn(name: string, x?: number, y?: number, styleOnly?: bool, isTempCanvas?: bool)", }, - "deleteCanvas": { - "!doc": "删除一个自定义画布<br/>name: 画布名,也可以传入一个函数对所有画布进行筛选", - "!type": "fn(name: string|fn(name: string) -> bool)" + deleteCanvas: { + "!doc": + "删除一个自定义画布<br/>name: 画布名,也可以传入一个函数对所有画布进行筛选", + "!type": "fn(name: string|fn(name: string) -> bool)", }, - "deleteAllCanvas": { + deleteAllCanvas: { "!doc": "清空所有的自定义画布", - "!type": "fn()" + "!type": "fn()", }, - "drawIcon": { + drawIcon: { "!doc": "在某个canvas上绘制一个图标", - "!type": "fn(name: string|CanvasRenderingContext2D, id: string, x: number, y: number, w?: number, h?: number, frame?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, id: string, x: number, y: number, w?: number, h?: number, frame?: number)", }, - "drawFly": { + drawFly: { "!doc": "绘制楼层传送器", - "!type": "fn(page?: ?)" + "!type": "fn(page?: ?)", }, - "setOpacity": { - "!doc": "设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效<br/>如果仅想对接下来的绘制生效请使用setAlpha", - "!type": "fn(name: string|CanvasRenderingContext2D, opacity: number)" + setOpacity: { + "!doc": + "设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效<br/>如果仅想对接下来的绘制生效请使用setAlpha", + "!type": "fn(name: string|CanvasRenderingContext2D, opacity: number)", }, - "getTextContentHeight": { + getTextContentHeight: { "!doc": "获得某段文字的预计绘制高度;参数说明详见 drawTextContent", - "!type": "fn(content: string, config?: ?)" + "!type": "fn(content: string, config?: ?)", }, - "drawArrow": { + drawArrow: { "!doc": "在某个canvas上绘制一个箭头", - "!type": "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)", }, - "strokeEllipse": { + strokeEllipse: { "!doc": "在某个canvas上绘制一个椭圆的边框", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string, lineWidth?: number)", }, - "fillCircle": { + fillCircle: { "!doc": "在某个canvas上绘制一个圆", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, style?: string)", }, - "strokeRoundRect": { + strokeRoundRect: { "!doc": "在某个canvas上绘制一个圆角矩形的边框", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, lineWidth?: number, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, lineWidth?: number, angle?: number)", }, - "getContextByName": { - "!doc": "根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。<br/>也可以传画布的context自身,则返回自己。", - "!type": "fn(canvas: string|CanvasRenderingContext2D) -> CanvasRenderingContext2D" + getContextByName: { + "!doc": + "根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。<br/>也可以传画布的context自身,则返回自己。", + "!type": + "fn(canvas: string|CanvasRenderingContext2D) -> CanvasRenderingContext2D", }, - "drawImage": { - "!doc": "在一个画布上绘制图片<br/>后面的8个坐标参数与canvas的drawImage的八个参数完全相同。<br/>name: 可以是系统画布之一,也可以是任意自定义动态创建的画布名 画布名称或者画布的context<br/>image: 要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取;支持加':x',':y',':o'翻转),图片本身,或者一个画布。<br/>angle:旋转角度", + drawImage: { + "!doc": + "在一个画布上绘制图片<br/>后面的8个坐标参数与canvas的drawImage的八个参数完全相同。<br/>name: 可以是系统画布之一,也可以是任意自定义动态创建的画布名 画布名称或者画布的context<br/>image: 要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取;支持加':x',':y',':o'翻转),图片本身,或者一个画布。<br/>angle:旋转角度", "!url": "http://www.w3school.com.cn/html5/canvas_drawimage.asp", - "!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)" + "!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": "左上角绘制一段提示<br/>text: 要提示的字符串,支持${}语法<br/>id: 要绘制的图标ID<br/>frame: 要绘制该图标的第几帧", - "!type": "fn(text: string, id?: string, frame?: number)" + drawTip: { + "!doc": + "左上角绘制一段提示<br/>text: 要提示的字符串,支持${}语法<br/>id: 要绘制的图标ID<br/>frame: 要绘制该图标的第几帧", + "!type": "fn(text: string, id?: string, frame?: number)", }, - "drawBackground": { + drawBackground: { "!doc": "绘制一个背景图,可绘制winskin或纯色背景;支持小箭头绘制", - "!type": "fn(left: string, top: string, right: string, bottom: string, posInfo?: {px: number, py: number, direction: string})" + "!type": + "fn(left: string, top: string, right: string, bottom: string, posInfo?: {px: number, py: number, direction: string})", }, - "fillEllipse": { + fillEllipse: { "!doc": "在某个canvas上绘制一个椭圆", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string)", }, - "setFillStyle": { + setFillStyle: { "!doc": "设置某个canvas的绘制属性(如颜色等)", "!url": "https://www.w3school.com.cn/tags/canvas_fillstyle.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, style: string)", }, - "drawText": { + drawText: { "!doc": "地图中间绘制一段文字", - "!type": "fn(contents: string, callback?: fn())" + "!type": "fn(contents: string, callback?: fn())", }, - "drawConfirmBox": { - "!doc": "绘制一个确认框<br/>此项会打断事件流,如需不打断版本的请使用core.myconfirm()<br/>text: 要绘制的内容,支持 ${} 语法<br/>yesCallback: 点击确认后的回调<br/>noCallback: 点击取消后的回调", - "!type": "fn(text: string, yesCallback?: fn(), noCallback?: fn())" + drawConfirmBox: { + "!doc": + "绘制一个确认框<br/>此项会打断事件流,如需不打断版本的请使用core.myconfirm()<br/>text: 要绘制的内容,支持 ${} 语法<br/>yesCallback: 点击确认后的回调<br/>noCallback: 点击取消后的回调", + "!type": "fn(text: string, yesCallback?: fn(), noCallback?: fn())", }, - "drawUIEventSelector": { - "!doc": "自绘一个闪烁的选择光标<br/>code: 选择光标的编号,必填<br/>background: 要绘制的光标背景,必须是一个合法的WindowSkin<br/>x, y, w, h: 绘制的坐标和长宽<br/>z: 可选,光标的的z值", - "!type": "fn(code: number, background: string, x: number, y: number, w: number, h: number, z?: number)" + drawUIEventSelector: { + "!doc": + "自绘一个闪烁的选择光标<br/>code: 选择光标的编号,必填<br/>background: 要绘制的光标背景,必须是一个合法的WindowSkin<br/>x, y, w, h: 绘制的坐标和长宽<br/>z: 可选,光标的的z值", + "!type": + "fn(code: number, background: string, x: number, y: number, w: number, h: number, z?: number)", }, - "clearUIEventSelector": { - "!doc": "清除若干个自绘的选择光标<br/>codes: 清除的光标编号;可以是单个编号或编号数组;不填则清除所有光标", - "!type": "fn(codes?: number|[number])" + clearUIEventSelector: { + "!doc": + "清除若干个自绘的选择光标<br/>codes: 清除的光标编号;可以是单个编号或编号数组;不填则清除所有光标", + "!type": "fn(codes?: number|[number])", }, - "fillPolygon": { + fillPolygon: { "!doc": "在某个canvas上绘制一个多边形", - "!type": "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string)", }, - "fillText": { - "!doc": "在某个画布上绘制一段文字<br/>text: 要绘制的文本<br/>style: 绘制的样式<br/>font: 绘制的字体<br/>最大宽度,超过此宽度会自动放缩", + fillText: { + "!doc": + "在某个画布上绘制一段文字<br/>text: 要绘制的文本<br/>style: 绘制的样式<br/>font: 绘制的字体<br/>最大宽度,超过此宽度会自动放缩", "!url": "https://www.w3school.com.cn/tags/canvas_filltext.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)", }, - "setTextBaseline": { - "!doc": "设置某个canvas的基准线<br/>baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom", + setTextBaseline: { + "!doc": + "设置某个canvas的基准线<br/>baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom", "!url": "https://www.w3school.com.cn/tags/canvas_textbaseline.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, baseline: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, baseline: string)", }, - "loadCanvas": { + loadCanvas: { "!doc": "加载某个canvas状态", - "!type": "fn(name: string|CanvasRenderingContext2D)" + "!type": "fn(name: string|CanvasRenderingContext2D)", }, - "splitLines": { + splitLines: { "!doc": "字符串自动换行的分割", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)", }, - "setAlpha": { - "!doc": "设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容<br/>返回设置之前画布的不透明度<br/>如果需要修改画布本身的不透明度请使用setOpacity", + setAlpha: { + "!doc": + "设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容<br/>返回设置之前画布的不透明度<br/>如果需要修改画布本身的不透明度请使用setOpacity", "!url": "https://www.w3school.com.cn/tags/canvas_globalalpha.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, alpha: number) -> number" + "!type": + "fn(name: string|CanvasRenderingContext2D, alpha: number) -> number", }, - "setFilter": { + setFilter: { "!doc": "设置某个canvas接下来绘制的filter", - "!type": "fn(name: string|CanvasRenderingContext2D, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, style: string)", }, - "setLineWidth": { + setLineWidth: { "!doc": "设置某个canvas的线宽度", "!url": "https://www.w3school.com.cn/tags/canvas_linewidth.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, lineWidth: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, lineWidth: number)", }, - "drawTextBox": { + drawTextBox: { "!doc": "绘制一个对话框", - "!type": "fn(content: string, showAll?: bool)" + "!type": "fn(content: string, showAll?: bool)", }, - "relocateCanvas": { + relocateCanvas: { "!doc": "重新定位一个自定义画布", - "!type": "fn(name: string, x: number, y: number, useDelta: bool)" + "!type": "fn(name: string, x: number, y: number, useDelta: bool)", }, - "rotateCanvas": { - "!doc": "设置一个自定义画布的旋转角度<br/>centerX, centerY: 旋转中心(以屏幕像素为基准);不填视为图片正中心。", - "!type": "fn(name: string, angle: number, centerX?: number, centerY?: number)" + rotateCanvas: { + "!doc": + "设置一个自定义画布的旋转角度<br/>centerX, centerY: 旋转中心(以屏幕像素为基准);不填视为图片正中心。", + "!type": + "fn(name: string, angle: number, centerX?: number, centerY?: number)", }, - "closePanel": { + closePanel: { "!doc": "结束一切事件和绘制,关闭UI窗口,返回游戏进程", - "!type": "fn()" + "!type": "fn()", }, - "textImage": { + textImage: { "!doc": "文本图片化", - "!type": "fn(content: string, lineHeight?: number) -> image" + "!type": "fn(content: string, lineHeight?: number) -> image", }, - "drawStatusBar": { + drawStatusBar: { "!doc": "绘制状态栏", - "!type": "fn()" + "!type": "fn()", }, - "setStrokeStyle": { + setStrokeStyle: { "!doc": "设置某个canvas边框属性", "!url": "https://www.w3school.com.cn/tags/canvas_strokestyle.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, style: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, style: string)", }, - "clearUI": { + clearUI: { "!doc": "清空UI层内容", - "!type": "fn()" + "!type": "fn()", }, - "drawWindowSkin": { + drawWindowSkin: { "!doc": "绘制WindowSkin", - "!type": "fn(background: string, ctx: string|CanvasRenderingContext2D, x: number, y: number, w: string, h: string, direction?: string, px?: number, py?: number)" + "!type": + "fn(background: string, ctx: string|CanvasRenderingContext2D, x: number, y: number, w: string, h: string, direction?: string, px?: number, py?: number)", }, - "fillRect": { - "!doc": "绘制一个矩形。<br/>x,y: 绘制的坐标<br/>width,height: 绘制的长宽<br/>style: 绘制的样式<br/>angle: 旋转的角度,弧度制,如Math.PI/2代表90度", + fillRect: { + "!doc": + "绘制一个矩形。<br/>x,y: 绘制的坐标<br/>width,height: 绘制的长宽<br/>style: 绘制的样式<br/>angle: 旋转的角度,弧度制,如Math.PI/2代表90度", "!url": "https://www.w3school.com.cn/tags/canvas_fillrect.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, angle?: number)", }, - "drawScrollText": { + drawScrollText: { "!doc": "绘制滚动字幕", - "!type": "fn(content: string, time: number, lineHeight?: number, callback?: fn())" + "!type": + "fn(content: string, time: number, lineHeight?: number, callback?: fn())", }, - "strokePolygon": { + strokePolygon: { "!doc": "在某个canvas上绘制一个多边形的边框", - "!type": "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string, lineWidth?: number)", }, - "strokeCircle": { + strokeCircle: { "!doc": "在某个canvas上绘制一个圆的边框", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: ?, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: ?, style?: string, lineWidth?: number)", }, - "drawWaiting": { + drawWaiting: { "!doc": "绘制等待界面", - "!type": "fn(text: string)" + "!type": "fn(text: string)", }, - "setFont": { + setFont: { "!doc": "设置某个canvas的文字字体", "!url": "https://www.w3school.com.cn/tags/canvas_font.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, font: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, font: string)", }, - "drawChoices": { + drawChoices: { "!doc": "绘制一个选项界面", - "!type": "fn(content?: string, choices?: [?], width?: number, ctx?: string|CanvasRenderingContext2D)" + "!type": + "fn(content?: string, choices?: [?], width?: number, ctx?: string|CanvasRenderingContext2D)", }, - "setFontForMaxWidth": { + setFontForMaxWidth: { "!doc": "根据最大宽度自动缩小字体", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth: number, font?: ?) -> string" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, maxWidth: number, font?: ?) -> string", }, - "clearMap": { - "!doc": "清空某个画布图层<br/>name为画布名,可以是系统画布之一,也可以是任意自定义动态创建的画布名;还可以直接传画布的context本身。<br/>如果name也可以是'all',若为all则为清空所有系统画布。", + clearMap: { + "!doc": + "清空某个画布图层<br/>name为画布名,可以是系统画布之一,也可以是任意自定义动态创建的画布名;还可以直接传画布的context本身。<br/>如果name也可以是'all',若为all则为清空所有系统画布。", "!url": "https://www.w3school.com.cn/tags/canvas_clearrect.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number)", }, - "drawTextContent": { - "!doc": "绘制一段文字到某个画布上面<br/>ctx: 要绘制到的画布<br/>content: 要绘制的内容;转义字符不允许保留 \\t, \\b 和 \\f<br/>config: 绘制配置项,目前暂时包含如下内容(均为可选)<br/>left, top:起始点位置;maxWidth:单行最大宽度;color:默认颜色;align:左中右<br/>fontSize:字体大小;lineHeight:行高;time:打字机间隔;font:字体名<br/>返回值:绘制信息", - "!type": "fn(ctx: string|CanvasRenderingContext2D, content: string, config: ?)" + drawTextContent: { + "!doc": + "绘制一段文字到某个画布上面<br/>ctx: 要绘制到的画布<br/>content: 要绘制的内容;转义字符不允许保留 \\t, \\b 和 \\f<br/>config: 绘制配置项,目前暂时包含如下内容(均为可选)<br/>left, top:起始点位置;maxWidth:单行最大宽度;color:默认颜色;align:左中右<br/>fontSize:字体大小;lineHeight:行高;time:打字机间隔;font:字体名<br/>返回值:绘制信息", + "!type": + "fn(ctx: string|CanvasRenderingContext2D, content: string, config: ?)", }, - "calWidth": { + calWidth: { "!doc": "计算某段文字的宽度", "!url": "https://www.w3school.com.cn/tags/canvas_measuretext.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, font?: string) -> number" + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, font?: string) -> number", }, - "fillArc": { + fillArc: { "!doc": "在某个canvas上绘制一个扇形", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string)", }, - "strokeArc": { + strokeArc: { "!doc": "在某个canvas上绘制一段弧", "!url": "https://www.w3school.com.cn/tags/canvas_arc.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string, lineWidth?: number)", }, - "drawLine": { + drawLine: { "!doc": "在某个canvas上绘制一条线", "!url": "https://www.w3school.com.cn/tags/canvas_lineto.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)", }, - "drawPagination": { + drawPagination: { "!doc": "绘制分页", - "!type": "fn(page?: ?, totalPage?: ?, y?: number)" + "!type": "fn(page?: ?, totalPage?: ?, y?: number)", }, - "getToolboxItems": { + getToolboxItems: { "!doc": "获得所有应该在道具栏显示的某个类型道具", - "!type": "fn(cls: string) -> [string]" + "!type": "fn(cls: string) -> [string]", }, - "strokeRect": { - "!doc": "绘制一个矩形的边框<br/>style: 绘制的样式<br/>lineWidth: 线宽<br/>angle: 旋转角度,弧度制,如Math.PI/2为90度", + strokeRect: { + "!doc": + "绘制一个矩形的边框<br/>style: 绘制的样式<br/>lineWidth: 线宽<br/>angle: 旋转角度,弧度制,如Math.PI/2为90度", "!url": "https://www.w3school.com.cn/tags/canvas_strokerect.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, lineWidth?: number, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, lineWidth?: number, angle?: number)", }, - "drawBook": { + drawBook: { "!doc": "绘制怪物手册", - "!type": "fn(index?: ?)" + "!type": "fn(index?: ?)", }, - "fillRoundRect": { + fillRoundRect: { "!doc": "在某个canvas上绘制一个圆角矩形", - "!type": "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)" + "!type": + "fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)", }, - "fillBoldText": { - "!doc": "在某个画布上绘制一个描边文字<br/>text: 要绘制的文本<br/>style: 绘制的样式<br/>strokeStyle: 要绘制的描边颜色<br/>font: 绘制的字体<br/>maxWidth: 最大宽度,超过此宽度会自动放缩", - "!type": "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string, maxWidth?: number)" + fillBoldText: { + "!doc": + "在某个画布上绘制一个描边文字<br/>text: 要绘制的文本<br/>style: 绘制的样式<br/>strokeStyle: 要绘制的描边颜色<br/>font: 绘制的字体<br/>maxWidth: 最大宽度,超过此宽度会自动放缩", + "!type": + "fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string, maxWidth?: number)", }, - "saveCanvas": { + saveCanvas: { "!doc": "保存某个canvas状态", - "!type": "fn(name: string|CanvasRenderingContext2D)" + "!type": "fn(name: string|CanvasRenderingContext2D)", }, - "createCanvas": { - "!doc": "动态创建一个画布。<br/>name: 要创建的画布名,如果已存在则会直接取用当前存在的。<br/>x,y: 创建的画布相对窗口左上角的像素坐标<br/>width,height: 创建的长宽。<br/>zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。<br/>返回创建的画布的context,也可以通过core.dymCanvas[name]调用。", - "!type": "fn(name: string, x: number, y: number, width: number, height: number, zIndex: number) -> CanvasRenderingContext2D" + createCanvas: { + "!doc": + "动态创建一个画布。<br/>name: 要创建的画布名,如果已存在则会直接取用当前存在的。<br/>x,y: 创建的画布相对窗口左上角的像素坐标<br/>width,height: 创建的长宽。<br/>zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。<br/>返回创建的画布的context,也可以通过core.dymCanvas[name]调用。", + "!type": + "fn(name: string, x: number, y: number, width: number, height: number, zIndex: number) -> CanvasRenderingContext2D", }, - "setTextAlign": { + setTextAlign: { "!doc": "设置某个canvas的对齐", "!url": "https://www.w3school.com.cn/tags/canvas_textalign.asp", - "!type": "fn(name: string|CanvasRenderingContext2D, align: string)" + "!type": "fn(name: string|CanvasRenderingContext2D, align: string)", }, }, - "enemys": { + enemys: { "!doc": "定义了一系列和怪物相关的API函数。", - "getEnemys": { - "!doc": "获得所有怪物原始数据的一个副本。<br/>请使用core.material.enemys获得当前各项怪物属性。", - "!type": "fn()" + getEnemys: { + "!doc": + "获得所有怪物原始数据的一个副本。<br/>请使用core.material.enemys获得当前各项怪物属性。", + "!type": "fn()", }, - "getEnemyValue": { + getEnemyValue: { "!doc": "获得某个点上怪物的某个属性值", - "!type": "fn(enemy?: string|enemy, name: string, x?: number, y?: number, floorId?: string)" + "!type": + "fn(enemy?: string|enemy, name: string, x?: number, y?: number, floorId?: string)", }, - "getSpecials": { + getSpecials: { "!doc": "获得所有特殊属性的定义", - "!type": "fn() -> [[?]]" + "!type": "fn() -> [[?]]", }, - "getSpecialColor": { + getSpecialColor: { "!doc": "获得某个怪物所有特殊属性的颜色", - "!type": "fn(enemy: string|enemy) -> [string]" + "!type": "fn(enemy: string|enemy) -> [string]", }, - "getSpecialFlag": { - "!doc": "获得某个怪物所有特殊属性的额外标记。<br/><br/>例如,1为全图性技能,需要进行遍历全图(光环/支援等)", - "!type": "fn(enemy: string|enemy) -> number" + getSpecialFlag: { + "!doc": + "获得某个怪物所有特殊属性的额外标记。<br/><br/>例如,1为全图性技能,需要进行遍历全图(光环/支援等)", + "!type": "fn(enemy: string|enemy) -> number", }, - "getSpecialHint": { - "!doc": "获得某种敌人的某种特殊属性的介绍<br/>例如:core.getSpecialHint('bat', 1) // '先攻:怪物首先攻击'<br/>enemy: 敌人id或敌人对象,用于确定属性的具体数值,否则可选<br/>special: 属性编号,可以是该敌人没有的属性<br/>返回值:属性的介绍,以属性名加中文冒号开头", - "!type": "fn(enemy: string|enemy, special: number) -> string" + getSpecialHint: { + "!doc": + "获得某种敌人的某种特殊属性的介绍<br/>例如:core.getSpecialHint('bat', 1) // '先攻:怪物首先攻击'<br/>enemy: 敌人id或敌人对象,用于确定属性的具体数值,否则可选<br/>special: 属性编号,可以是该敌人没有的属性<br/>返回值:属性的介绍,以属性名加中文冒号开头", + "!type": "fn(enemy: string|enemy, special: number) -> string", }, - "getSpecialText": { - "!doc": "获得某种敌人的全部特殊属性名称<br/>例如:core.getSpecialText('greenSlime') // ['先攻', '3连击', '破甲', '反击']<br/>enemy: 敌人id或敌人对象,如core.material.enemys.greenSlime<br/>返回值:字符串数组", - "!type": "fn(enemy: string|enemy) -> [string]" + getSpecialText: { + "!doc": + "获得某种敌人的全部特殊属性名称<br/>例如:core.getSpecialText('greenSlime') // ['先攻', '3连击', '破甲', '反击']<br/>enemy: 敌人id或敌人对象,如core.material.enemys.greenSlime<br/>返回值:字符串数组", + "!type": "fn(enemy: string|enemy) -> [string]", }, - "hasSpecial": { - "!doc": "判定某种特殊属性的有无<br/>例如:core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性<br/>special: 敌人id或敌人对象或正整数数组或自然数<br/>test: 待检查的属性编号<br/>", - "!type": "fn(special: number|[number]|string|number, test: number) -> bool" + hasSpecial: { + "!doc": + "判定某种特殊属性的有无<br/>例如:core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性<br/>special: 敌人id或敌人对象或正整数数组或自然数<br/>test: 待检查的属性编号<br/>", + "!type": + "fn(special: number|[number]|string|number, test: number) -> bool", }, - "nextCriticals": { - "!doc": "获得某只敌人接下来的若干个临界及其减伤,算法基于useLoop开关选择回合法或二分法<br/>例如:core.nextCriticals('greenSlime', 9, 0, 0, 'MT0') // 绿头怪接下来的9个临界<br/>enemy: 敌人id或敌人对象<br/>number: 要计算的临界数量,可选,默认为1<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回:两列的二维数组,每行表示一个临界及其减伤", - "!type": "fn(enemy: string|enemy, number?: number, x?: number, y?: number, floorId?: string) -> [[number]]" + nextCriticals: { + "!doc": + "获得某只敌人接下来的若干个临界及其减伤,算法基于useLoop开关选择回合法或二分法<br/>例如:core.nextCriticals('greenSlime', 9, 0, 0, 'MT0') // 绿头怪接下来的9个临界<br/>enemy: 敌人id或敌人对象<br/>number: 要计算的临界数量,可选,默认为1<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回:两列的二维数组,每行表示一个临界及其减伤", + "!type": + "fn(enemy: string|enemy, number?: number, x?: number, y?: number, floorId?: string) -> [[number]]", }, - "getDefDamage": { - "!doc": "计算再加若干点防御能使某只敌人对主角的总伤害降低多少<br/>例如:core.getDefDamage('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少<br/>enemy: 敌人id或敌人对象<br/>k: 假设主角增加的防御力,可选,默认为1<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选", - "!type": "fn(enemy: string|enemy, k?: number, x?: number, y?: number, floorId?: string) -> number" + getDefDamage: { + "!doc": + "计算再加若干点防御能使某只敌人对主角的总伤害降低多少<br/>例如:core.getDefDamage('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少<br/>enemy: 敌人id或敌人对象<br/>k: 假设主角增加的防御力,可选,默认为1<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选", + "!type": + "fn(enemy: string|enemy, k?: number, x?: number, y?: number, floorId?: string) -> number", }, - "canBattle": { - "!doc": "判定主角当前能否打败某只敌人<br/>例如:core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)<br/>enemy: 敌人id或敌人对象<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:true表示可以打败,false表示无法打败", - "!type": "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> bool" + canBattle: { + "!doc": + "判定主角当前能否打败某只敌人<br/>例如:core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)<br/>enemy: 敌人id或敌人对象<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:true表示可以打败,false表示无法打败", + "!type": + "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> bool", }, - "getEnemyInfo": { - "!doc": "获得怪物真实属性<br/>hero: 可选,此时的勇士属性<br/>此函数将会计算包括坚固、模仿、光环等若干效果,将同时被怪物手册和伤害计算调用", - "!type": "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {hp: number, atk: number, def: number, money: number, exp: number, special: [number], point: number, guards: [?]}" + getEnemyInfo: { + "!doc": + "获得怪物真实属性<br/>hero: 可选,此时的勇士属性<br/>此函数将会计算包括坚固、模仿、光环等若干效果,将同时被怪物手册和伤害计算调用", + "!type": + "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {hp: number, atk: number, def: number, money: number, exp: number, special: [number], point: number, guards: [?]}", }, - "getDamageInfo": { - "!doc": "获得战斗伤害信息<br/>例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害<br/>enemy: 敌人id或敌人对象<br/>hero: 可选,此时的勇士属性<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:伤害计算信息,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", - "!type": "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {damage: number, per_damage: number, hero_per_damage: number, init_damage: number, mon_hp: number, mon_atk: number, mon_def: number, turn: number}" + getDamageInfo: { + "!doc": + "获得战斗伤害信息<br/>例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害<br/>enemy: 敌人id或敌人对象<br/>hero: 可选,此时的勇士属性<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:伤害计算信息,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", + "!type": + "fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {damage: number, per_damage: number, hero_per_damage: number, init_damage: number, mon_hp: number, mon_atk: number, mon_def: number, turn: number}", }, - "getDamage": { - "!doc": "获得某只敌人对主角的总伤害<br/>例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害<br/>enemy: 敌人id或敌人对象<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", - "!type": "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> number" + getDamage: { + "!doc": + "获得某只敌人对主角的总伤害<br/>例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害<br/>enemy: 敌人id或敌人对象<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null", + "!type": + "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> number", }, - "getDamageString": { - "!doc": "获得某只敌人的地图显伤,包括颜色<br/>例如:core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤<br/>enemy: 敌人id或敌人对象<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:damage: 表示伤害值或为'???',color: 形如'#RrGgBb'", - "!type": "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> {color: string, damage: string}" + getDamageString: { + "!doc": + "获得某只敌人的地图显伤,包括颜色<br/>例如:core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤<br/>enemy: 敌人id或敌人对象<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>floorId: 敌人所在的地图,可选<br/>返回值:damage: 表示伤害值或为'???',color: 形如'#RrGgBb'", + "!type": + "fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> {color: string, damage: string}", }, - "getCurrentEnemys": { - "!doc": "获得某张地图的敌人集合,用于手册绘制<br/>例如:core.getCurrentEnemys('MT0') // 主塔0层的敌人集合<br/>floorId: 地图id,可选<br/>返回值:敌人集合,按伤害升序排列,支持多朝向怪合并", - "!type": "fn(floorId?: string) -> [enemy]" + getCurrentEnemys: { + "!doc": + "获得某张地图的敌人集合,用于手册绘制<br/>例如:core.getCurrentEnemys('MT0') // 主塔0层的敌人集合<br/>floorId: 地图id,可选<br/>返回值:敌人集合,按伤害升序排列,支持多朝向怪合并", + "!type": "fn(floorId?: string) -> [enemy]", + }, + hasEnemyLeft: { + "!doc": + "检查某些楼层是否还有漏打的(某种)敌人<br/>例如:core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪<br/>enemyId: 敌人id,可选,null表示任意敌人<br/>floorId: 地图id或其数组,可选,不填为当前地图<br/>返回值:地图中是否还存在该种敌人", + "!type": "fn(enemyId?: string, floorId?: string|[string]) -> bool", }, - "hasEnemyLeft": { - "!doc": "检查某些楼层是否还有漏打的(某种)敌人<br/>例如:core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪<br/>enemyId: 敌人id,可选,null表示任意敌人<br/>floorId: 地图id或其数组,可选,不填为当前地图<br/>返回值:地图中是否还存在该种敌人", - "!type": "fn(enemyId?: string, floorId?: string|[string]) -> bool" - } }, - "events": { - "!doc": "events.js将处理所有和事件相关的操作,主要分为五个部分:<br/>- 游戏的开始和结束<br/>- 系统事件的处理<br/>- 自定义事件的处理<br/>- 点击状态栏图标所进行的操作<br/>- 一些具体事件的执行内容", - "afterChangeFloor": { + events: { + "!doc": + "events.js将处理所有和事件相关的操作,主要分为五个部分:<br/>- 游戏的开始和结束<br/>- 系统事件的处理<br/>- 自定义事件的处理<br/>- 点击状态栏图标所进行的操作<br/>- 一些具体事件的执行内容", + afterChangeFloor: { "!doc": "转换楼层结束的事件", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "popEventLoc": { + popEventLoc: { "!doc": "将当前点坐标入栈", - "!type": "fn()" + "!type": "fn()", }, - "afterOpenDoor": { + afterOpenDoor: { "!doc": "开一个门后触发的事件", - "!type": "fn(doorId?: string, x?: number, y?: number)" + "!type": "fn(doorId?: string, x?: number, y?: number)", }, - "checkLvUp": { + checkLvUp: { "!doc": "检查升级事件", - "!type": "fn()" + "!type": "fn()", }, - "insertAction": { - "!doc": "插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent<br/>例如:core.insertAction('一段文字'); // 插入一个显示文章<br/>action: 单个事件指令,或事件指令数组<br/>x: 新的当前点横坐标,可选<br/>y: 新的当前点纵坐标,可选<br/>callback: 新的回调函数,可选<br/>addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", - "!type": "fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" + insertAction: { + "!doc": + "插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent<br/>例如:core.insertAction('一段文字'); // 插入一个显示文章<br/>action: 单个事件指令,或事件指令数组<br/>x: 新的当前点横坐标,可选<br/>y: 新的当前点纵坐标,可选<br/>callback: 新的回调函数,可选<br/>addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", + "!type": + "fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)", }, - "unfollow": { + unfollow: { "!doc": "取消跟随<br/>name: 取消跟随的行走图,不填则取消全部跟随者", - "!type": "fn(name?: string)" + "!type": "fn(name?: string)", }, - "hasVisitedFloor": { + hasVisitedFloor: { "!doc": "是否到达过某个楼层", - "!type": "fn(floorId?: string) -> bool" + "!type": "fn(floorId?: string) -> bool", }, - "startEvents": { + startEvents: { "!doc": "开始执行一系列自定义事件", - "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())" + "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())", }, - "setHeroIcon": { - "!doc": "更改主角行走图<br/>例如:core.setHeroIcon('npc48.png', true); // 把主角从阳光变成样板0层左下角的小姐姐,但不立即刷新<br/>name: 新的行走图文件名,可以是全塔属性中映射前的中文名。映射后会被存入core.status.hero.image<br/>noDraw: true表示不立即刷新(刷新会导致大地图下视野重置到以主角为中心)", - "!type": "fn(name: string, noDraw?: bool)" + setHeroIcon: { + "!doc": + "更改主角行走图<br/>例如:core.setHeroIcon('npc48.png', true); // 把主角从阳光变成样板0层左下角的小姐姐,但不立即刷新<br/>name: 新的行走图文件名,可以是全塔属性中映射前的中文名。映射后会被存入core.status.hero.image<br/>noDraw: true表示不立即刷新(刷新会导致大地图下视野重置到以主角为中心)", + "!type": "fn(name: string, noDraw?: bool)", }, - "changingFloor": { + changingFloor: { "!doc": "楼层转换中", - "!type": "fn(floorId?: string, heroLoc?: {x: number, y: number, direction: string})" + "!type": + "fn(floorId?: string, heroLoc?: {x: number, y: number, direction: string})", }, - "setEvents": { + setEvents: { "!doc": "直接设置事件列表", - "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())" + "!type": "fn(list?: [?], x?: number, y?: number, callback?: fn())", }, - "setValue": { + setValue: { "!doc": "数值操作", - "!type": "fn(name: string, operator: string, value: ?, prefix?: string)" + "!type": + "fn(name: string, operator: string, value: ?, prefix?: string)", }, - "precompile": { + precompile: { "!doc": "预编辑事件", - "!type": "fn(data?: ?)" + "!type": "fn(data?: ?)", }, - "vibrate": { - "!doc": "视野抖动<br/>例如:core.vibrate(); // 视野抖动1秒<br/>direction: 抖动方向;可填 horizontal(左右),vertical(上下),diagonal1(左上右下),diagonal2(左下右上)<br/>time: 抖动时长<br/>speed: 抖动速度<br/>power: 抖动幅度<br/>callback: 抖动平息后的回调函数,可选", - "!type": "fn(direction?: string, time?: number, speed?: number, power?: number, callback?: fn())" + vibrate: { + "!doc": + "视野抖动<br/>例如:core.vibrate(); // 视野抖动1秒<br/>direction: 抖动方向;可填 horizontal(左右),vertical(上下),diagonal1(左上右下),diagonal2(左下右上)<br/>time: 抖动时长<br/>speed: 抖动速度<br/>power: 抖动幅度<br/>callback: 抖动平息后的回调函数,可选", + "!type": + "fn(direction?: string, time?: number, speed?: number, power?: number, callback?: fn())", }, - "confirmRestart": { + confirmRestart: { "!doc": "询问是否需要重新开始", - "!type": "fn()" + "!type": "fn()", }, - "battle": { - "!doc": "战斗,如果填写了坐标就会删除该点的敌人并触发战后事件<br/>例如:core.battle('greenSlime'); // 和从天而降的绿头怪战斗(如果打得过)<br/>id: 敌人id,必填<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>force: true表示强制战斗,可选<br/>callback: 回调函数,可选", - "!type": "fn(id: string, x?: number, y?: number, force?: bool, callback?: fn())" + battle: { + "!doc": + "战斗,如果填写了坐标就会删除该点的敌人并触发战后事件<br/>例如:core.battle('greenSlime'); // 和从天而降的绿头怪战斗(如果打得过)<br/>id: 敌人id,必填<br/>x: 敌人的横坐标,可选<br/>y: 敌人的纵坐标,可选<br/>force: true表示强制战斗,可选<br/>callback: 回调函数,可选", + "!type": + "fn(id: string, x?: number, y?: number, force?: bool, callback?: fn())", }, - "follow": { - "!doc": "跟随<br/>name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册", - "!type": "fn(name: string)" + follow: { + "!doc": + "跟随<br/>name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册", + "!type": "fn(name: string)", }, - "beforeBattle": { + beforeBattle: { "!doc": "战斗前触发的事件;返回false代表不进行战斗", - "!type": "fn(enemyId?: string, x?: number, y?: number) -> bool" + "!type": "fn(enemyId?: string, x?: number, y?: number) -> bool", }, - "registerEvent": { - "!doc": "注册一个自定义事件<br/>type: 事件类型<br/>func: 事件的处理函数,可接受(data, x, y, prefix)参数<br/>data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀", - "!type": "fn(type: string, func: fn(data: ?, x?: number, y?: number, prefix?: string))" + registerEvent: { + "!doc": + "注册一个自定义事件<br/>type: 事件类型<br/>func: 事件的处理函数,可接受(data, x, y, prefix)参数<br/>data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀", + "!type": + "fn(type: string, func: fn(data: ?, x?: number, y?: number, prefix?: string))", }, - "flyTo": { + flyTo: { "!doc": "飞往某一层", - "!type": "fn(toId?: string, callback?: fn()) -> bool" + "!type": "fn(toId?: string, callback?: fn()) -> bool", }, - "afterGetItem": { + afterGetItem: { "!doc": "获得一个道具后的事件", - "!type": "fn(id?: string, x?: number, y?: number, isGentleClick?: bool)" + "!type": + "fn(id?: string, x?: number, y?: number, isGentleClick?: bool)", }, - "doAction": { - "!doc": "执行下一个事件指令,常作为回调<br/>例如:core.setCurtain([0,0,0,1], null, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果", - "!type": "fn()" + doAction: { + "!doc": + "执行下一个事件指令,常作为回调<br/>例如:core.setCurtain([0,0,0,1], null, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果", + "!type": "fn()", }, - "openBook": { + openBook: { "!doc": "点击怪物手册时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "save": { + save: { "!doc": "点击存档按钮时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "load": { + load: { "!doc": "点击读档按钮时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "getNextItem": { - "!doc": "轻按获得面前的物品或周围唯一物品<br/>noRoute: 若为true则不计入录像", - "!type": "fn(noRoute?: bool)" + getNextItem: { + "!doc": + "轻按获得面前的物品或周围唯一物品<br/>noRoute: 若为true则不计入录像", + "!type": "fn(noRoute?: bool)", }, - "hasAsync": { + hasAsync: { "!doc": "当前是否有未处理完毕的异步事件(不包含动画和音效)", - "!type": "fn() -> bool" + "!type": "fn() -> bool", }, - "stopAsync": { + stopAsync: { "!doc": "立刻停止所有正在进行的异步事件", - "!type": "fn()" + "!type": "fn()", }, - "openEquipbox": { + openEquipbox: { "!doc": "点击装备栏时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "recoverEvents": { + recoverEvents: { "!doc": "恢复一个事件", - "!type": "fn(data?: ?)" + "!type": "fn(data?: ?)", }, - "setGlobalFlag": { - "!doc": "设置一个系统开关<br/>例如:core.setGlobalFlag('steelDoorWithoutKey', true); // 使全塔的所有铁门都不再需要钥匙就能打开<br/>name: 系统开关的英文名<br/>value: 开关的新值,您可以用!core.flags[name]简单地表示将此开关反转", - "!type": "fn(name: string, value: bool)" + setGlobalFlag: { + "!doc": + "设置一个系统开关<br/>例如:core.setGlobalFlag('steelDoorWithoutKey', true); // 使全塔的所有铁门都不再需要钥匙就能打开<br/>name: 系统开关的英文名<br/>value: 开关的新值,您可以用!core.flags[name]简单地表示将此开关反转", + "!type": "fn(name: string, value: bool)", }, - "moveImage": { - "!doc": "移动一张图片并/或改变其透明度<br/>例如:core.moveImage(1, null, 0.5); // 1秒内把1号图片变为50%透明<br/>code: 图片编号<br/>to: 新的左上角坐标,省略表示原地改变透明度<br/>opacityVal: 新的透明度,省略表示不变<br/>time: 移动用时,单位为毫秒。不填视为1秒<br/>callback: 图片移动完毕后的回调函数,可选", - "!type": "fn(code: number, to?: [number], opacityVal?: number, moveMode?: string, time?: number, callback?: fn())" + moveImage: { + "!doc": + "移动一张图片并/或改变其透明度<br/>例如:core.moveImage(1, null, 0.5); // 1秒内把1号图片变为50%透明<br/>code: 图片编号<br/>to: 新的左上角坐标,省略表示原地改变透明度<br/>opacityVal: 新的透明度,省略表示不变<br/>time: 移动用时,单位为毫秒。不填视为1秒<br/>callback: 图片移动完毕后的回调函数,可选", + "!type": + "fn(code: number, to?: [number], opacityVal?: number, moveMode?: string, time?: number, callback?: fn())", }, - "rotateImage": { - "!doc": "旋转一张图片<br/>code: 图片编号<br/>center: 旋转中心像素坐标(以屏幕为基准);不填视为图片本身中心<br/>angle: 旋转角度;正数为顺时针,负数为逆时针<br/>moveMode: 旋转模式<br/>time: 旋转用时,单位为毫秒。不填视为1秒<br/>callback: 图片旋转完毕后的回调函数,可选", - "!type": "fn(code: number, center?: [number], angle?: number, moveMode?: string, time?: number, callback?: fn())" + rotateImage: { + "!doc": + "旋转一张图片<br/>code: 图片编号<br/>center: 旋转中心像素坐标(以屏幕为基准);不填视为图片本身中心<br/>angle: 旋转角度;正数为顺时针,负数为逆时针<br/>moveMode: 旋转模式<br/>time: 旋转用时,单位为毫秒。不填视为1秒<br/>callback: 图片旋转完毕后的回调函数,可选", + "!type": + "fn(code: number, center?: [number], angle?: number, moveMode?: string, time?: number, callback?: fn())", }, - "scaleImage": { + scaleImage: { "!doc": "放缩一张图片", - "!type": "fn(code: number, center?: [number], scale?: number, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(code: number, center?: [number], scale?: number, moveMode?: string, time?: number, callback?: fn())", }, - "moveTextBox": { + moveTextBox: { "!doc": "移动对话框", - "!type": "fn(code: number, loc: [number], relative?: bool, moveMode?: string, time?: number, callback?: fn())" + "!type": + "fn(code: number, loc: [number], relative?: bool, moveMode?: string, time?: number, callback?: fn())", }, - "clearTextBox": { + clearTextBox: { "!doc": "清除对话框", - "!type": "fn(code: number)" + "!type": "fn(code: number)", }, - "openSettings": { + openSettings: { "!doc": "点击设置按钮时的操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "afterPushBox": { + afterPushBox: { "!doc": "推箱子后的事件", - "!type": "fn()" + "!type": "fn()", }, - "unregisterSystemEvent": { + unregisterSystemEvent: { "!doc": "注销一个系统事件", - "!type": "fn(type: string)" + "!type": "fn(type: string)", }, - "trigger": { - "!doc": "触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等<br/>callback: 执行完毕的回调函数<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(x?: number, y?: number, callback?: fn())" + trigger: { + "!doc": + "触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等<br/>callback: 执行完毕的回调函数<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(x?: number, y?: number, callback?: fn())", }, - "restart": { + restart: { "!doc": "重新开始游戏;此函数将回到标题页面", - "!type": "fn()" + "!type": "fn()", }, - "doEvent": { + doEvent: { "!doc": "执行一个自定义事件", - "!type": "fn(data?: ?, x?: number, y?: number, prefix?: string)" + "!type": "fn(data?: ?, x?: number, y?: number, prefix?: string)", }, - "win": { + win: { "!doc": "游戏获胜事件", - "!type": "fn(reason?: string, norank?: bool, noexit?: bool)" + "!type": "fn(reason?: string, norank?: bool, noexit?: bool)", }, - "setGlobalAttribute": { + setGlobalAttribute: { "!doc": "设置全塔属性", - "!type": "fn(name: string, value: string)" + "!type": "fn(name: string, value: string)", }, - "setNameMap": { + setNameMap: { "!doc": "设置文件别名", - "!type": "fn(name: string, value?: string)" + "!type": "fn(name: string, value?: string)", }, - "setTextAttribute": { + setTextAttribute: { "!doc": "设置剧情文本的属性", - "!type": "fn(data: ?)" + "!type": "fn(data: ?)", }, - "openToolbox": { + openToolbox: { "!doc": "点击工具栏时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "setVolume": { - "!doc": "调节bgm的音量<br/>例如:core.setVolume(0, 100, core.jumpHero); // 0.1秒内淡出bgm,然后主角原地跳跃半秒<br/>value: 新的音量,为0或不大于1的正数。注意系统设置中是这个值的平方根的十倍<br/>time: 渐变用时,单位为毫秒。不填或小于100毫秒都视为0<br/>callback: 渐变完成后的回调函数,可选", - "!type": "fn(value: number, time?: number, callback?: fn())" + setVolume: { + "!doc": + "调节bgm的音量<br/>例如:core.setVolume(0, 100, core.jumpHero); // 0.1秒内淡出bgm,然后主角原地跳跃半秒<br/>value: 新的音量,为0或不大于1的正数。注意系统设置中是这个值的平方根的十倍<br/>time: 渐变用时,单位为毫秒。不填或小于100毫秒都视为0<br/>callback: 渐变完成后的回调函数,可选", + "!type": "fn(value: number, time?: number, callback?: fn())", }, - "pushEventLoc": { + pushEventLoc: { "!doc": "将当前点坐标入栈", - "!type": "fn(x?: number, y?: number, floorId?: string) -> bool" + "!type": "fn(x?: number, y?: number, floorId?: string) -> bool", }, - "openKeyBoard": { + openKeyBoard: { "!doc": "点击虚拟键盘时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "insertCommonEvent": { - "!doc": "插入一个公共事件<br/>例如:core.insertCommonEvent('加点事件', [3]);<br/>name: 公共事件名;如果公共事件不存在则直接忽略<br/>args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...<br/>x: 新的当前点横坐标,可选<br/>y: 新的当前点纵坐标,可选<br/>callback: 新的回调函数,可选<br/>addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", - "!type": "fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)" + insertCommonEvent: { + "!doc": + "插入一个公共事件<br/>例如:core.insertCommonEvent('加点事件', [3]);<br/>name: 公共事件名;如果公共事件不存在则直接忽略<br/>args: 参数列表,为一个数组,将依次赋值给 flag:arg1, flag:arg2, ...<br/>x: 新的当前点横坐标,可选<br/>y: 新的当前点纵坐标,可选<br/>callback: 新的回调函数,可选<br/>addToLast: 插入的位置,true表示插入到末尾,否则插入到开头", + "!type": + "fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)", }, - "hideImage": { - "!doc": "隐藏一张图片<br/>例如:core.hideImage(1, 1000, core.jumpHero); // 1秒内淡出1号图片,然后主角原地跳跃半秒<br/>code: 图片编号<br/>time: 淡出时间,单位为毫秒<br/>callback: 图片完全消失后的回调函数,可选", - "!type": "fn(code: number, time?: number, callback?: fn())" + hideImage: { + "!doc": + "隐藏一张图片<br/>例如:core.hideImage(1, 1000, core.jumpHero); // 1秒内淡出1号图片,然后主角原地跳跃半秒<br/>code: 图片编号<br/>time: 淡出时间,单位为毫秒<br/>callback: 图片完全消失后的回调函数,可选", + "!type": "fn(code: number, time?: number, callback?: fn())", }, - "visitFloor": { + visitFloor: { "!doc": "到达某楼层", - "!type": "fn(floorId?: string)" + "!type": "fn(floorId?: string)", }, - "openQuickShop": { + openQuickShop: { "!doc": "点击快捷商店按钮时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", }, - "afterBattle": { + afterBattle: { "!doc": "战斗结束后触发的事件", - "!type": "fn(enemyId?: string, x?: number, y?: number)" + "!type": "fn(enemyId?: string, x?: number, y?: number)", }, - "pushBox": { + pushBox: { "!doc": "推箱子", - "!type": "fn(data?: ?)" + "!type": "fn(data?: ?)", }, - "autoEventExecuted": { + autoEventExecuted: { "!doc": "当前是否执行过某个自动事件", - "!type": "fn(symbol?: string, value?: ?) -> bool" + "!type": "fn(symbol?: string, value?: ?) -> bool", }, - "onSki": { + onSki: { "!doc": "当前是否在冰上", - "!type": "fn(number?: number) -> bool" + "!type": "fn(number?: number) -> bool", }, - "showImage": { - "!doc": "显示一张图片<br/>例如:core.showImage(1, core.material.images.images['winskin.png'], [0,0,128,128], [0,0,416,416], 0.5, 1000); // 裁剪winskin.png的最左边128×128px,放大到铺满整个视野,1秒内淡入到50%透明,编号为1<br/>code: 图片编号,为不大于50的正整数,加上100后就是对应画布层的z值,较大的会遮罩较小的,注意色调层的z值为125,UI层为140<br/>image: 图片文件名(可以是全塔属性中映射前的中文名)或图片对象(见上面的例子)<br/>sloc: 一行且至多四列的数组,表示从原图裁剪的左上角坐标和宽高,可选<br/>loc: 一行且至多四列的数组,表示图片在视野中的左上角坐标和宽高,可选<br/>opacityVal: 不透明度,为小于1的正数。不填视为1<br/>time: 淡入时间,单位为毫秒。不填视为0<br/>callback: 图片完全显示出来后的回调函数,可选", - "!type": "fn(code: number, image: string|image, sloc?: [number], loc?: [number], opacityVal?: number, time?: number, callback?: fn())" + showImage: { + "!doc": + "显示一张图片<br/>例如:core.showImage(1, core.material.images.images['winskin.png'], [0,0,128,128], [0,0,416,416], 0.5, 1000); // 裁剪winskin.png的最左边128×128px,放大到铺满整个视野,1秒内淡入到50%透明,编号为1<br/>code: 图片编号,为不大于50的正整数,加上100后就是对应画布层的z值,较大的会遮罩较小的,注意色调层的z值为125,UI层为140<br/>image: 图片文件名(可以是全塔属性中映射前的中文名)或图片对象(见上面的例子)<br/>sloc: 一行且至多四列的数组,表示从原图裁剪的左上角坐标和宽高,可选<br/>loc: 一行且至多四列的数组,表示图片在视野中的左上角坐标和宽高,可选<br/>opacityVal: 不透明度,为小于1的正数。不填视为1<br/>time: 淡入时间,单位为毫秒。不填视为0<br/>callback: 图片完全显示出来后的回调函数,可选", + "!type": + "fn(code: number, image: string|image, sloc?: [number], loc?: [number], opacityVal?: number, time?: number, callback?: fn())", }, - "getItem": { - "!doc": "获得道具并提示,如果填写了坐标就会删除该点的该道具<br/>例如:core.getItem('book'); // 获得敌人手册并提示<br/>id: 道具id,必填<br/>num: 获得的数量,不填视为1,填了就别填坐标了<br/>x: 道具的横坐标,可选<br/>y: 道具的纵坐标,可选<br/>callback: 回调函数,可选", - "!type": "fn(id: string, num?: number, x?: number, y?: number, callback?: fn())" + getItem: { + "!doc": + "获得道具并提示,如果填写了坐标就会删除该点的该道具<br/>例如:core.getItem('book'); // 获得敌人手册并提示<br/>id: 道具id,必填<br/>num: 获得的数量,不填视为1,填了就别填坐标了<br/>x: 道具的横坐标,可选<br/>y: 道具的纵坐标,可选<br/>callback: 回调函数,可选", + "!type": + "fn(id: string, num?: number, x?: number, y?: number, callback?: fn())", }, - "registerSystemEvent": { - "!doc": "注册一个系统事件<br/>type: 事件名<br/>func: 为事件的处理函数,可接受(data,callback)参数", - "!type": "fn(type: string, func: fn(data?: ?, callback?: fn()))" + registerSystemEvent: { + "!doc": + "注册一个系统事件<br/>type: 事件名<br/>func: 为事件的处理函数,可接受(data,callback)参数", + "!type": "fn(type: string, func: fn(data?: ?, callback?: fn()))", }, - "startGame": { - "!doc": "开始新游戏<br/>例如:core.startGame('咸鱼乱撞', 0, ''); // 开始一局咸鱼乱撞难度的新游戏,随机种子为0<br/>hard: 难度名,会显示在左下角(横屏)或右下角(竖屏)<br/>seed: 随机种子,相同的种子保证了录像的可重复性<br/>route: 经由base64压缩后的录像,用于从头开始的录像回放<br/>callback: 回调函数,可选", - "!type": "fn(hard: string, seed: number, route: string, callback?: fn())" + startGame: { + "!doc": + "开始新游戏<br/>例如:core.startGame('咸鱼乱撞', 0, ''); // 开始一局咸鱼乱撞难度的新游戏,随机种子为0<br/>hard: 难度名,会显示在左下角(横屏)或右下角(竖屏)<br/>seed: 随机种子,相同的种子保证了录像的可重复性<br/>route: 经由base64压缩后的录像,用于从头开始的录像回放<br/>callback: 回调函数,可选", + "!type": + "fn(hard: string, seed: number, route: string, callback?: fn())", }, - "doSystemEvent": { + doSystemEvent: { "!doc": "执行一个系统事件", - "!type": "fn(type: string, data?: ?, callback?: fn())" + "!type": "fn(type: string, data?: ?, callback?: fn())", }, - "resetGame": { + resetGame: { "!doc": "初始化游戏", - "!type": "fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)" + "!type": + "fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)", }, - "setFloorInfo": { - "!doc": "设置一项楼层属性并刷新状态栏<br/>例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果<br/>name: 要修改的属性名<br/>values: 属性的新值。<br/>floorId: 楼层id,不填视为当前层<br/>prefix: 独立开关前缀,一般不需要", - "!type": "fn(name: string, values: ?, floorId?: string, prefix?: string)" + setFloorInfo: { + "!doc": + "设置一项楼层属性并刷新状态栏<br/>例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果<br/>name: 要修改的属性名<br/>values: 属性的新值。<br/>floorId: 楼层id,不填视为当前层<br/>prefix: 独立开关前缀,一般不需要", + "!type": + "fn(name: string, values: ?, floorId?: string, prefix?: string)", }, - "openDoor": { - "!doc": "开门(包括三种基础墙)<br/>例如:core.openDoor(0, 0, true, core.jumpHero); // 打开左上角的门,需要钥匙,然后主角原地跳跃半秒<br/>x: 门的横坐标<br/>y: 门的纵坐标<br/>needKey: true表示需要钥匙,会导致机关门打不开<br/>callback: 门完全打开后或打不开时的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(x: number, y: number, needKey?: bool, callback?: fn())" + openDoor: { + "!doc": + "开门(包括三种基础墙)<br/>例如:core.openDoor(0, 0, true, core.jumpHero); // 打开左上角的门,需要钥匙,然后主角原地跳跃半秒<br/>x: 门的横坐标<br/>y: 门的纵坐标<br/>needKey: true表示需要钥匙,会导致机关门打不开<br/>callback: 门完全打开后或打不开时的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(x: number, y: number, needKey?: bool, callback?: fn())", }, - "setEnemy": { - "!doc": "设置一项敌人属性并计入存档<br/>例如:core.setEnemy('greenSlime', 'def', 0); // 把绿头怪的防御设为0<br/>id: 敌人id<br/>name: 属性的英文缩写<br/>value: 属性的新值,可选<br/>operator: 运算操作符如+=,可选<br/>prefix: 独立开关前缀,一般不需要,下同", - "!type": "fn(id: string, name: string, value: ?, operator?: string, prefix?: string)" + setEnemy: { + "!doc": + "设置一项敌人属性并计入存档<br/>例如:core.setEnemy('greenSlime', 'def', 0); // 把绿头怪的防御设为0<br/>id: 敌人id<br/>name: 属性的英文缩写<br/>value: 属性的新值,可选<br/>operator: 运算操作符如+=,可选<br/>prefix: 独立开关前缀,一般不需要,下同", + "!type": + "fn(id: string, name: string, value: ?, operator?: string, prefix?: string)", }, - "setEnemyOnPoint": { - "!doc": "设置某个点的敌人属性。如果该点不是怪物,则忽略此函数。<br/>例如:core.setEnemyOnPoint(3, 5, null, 'atk', 100, '+='); // 仅将(3,5)点怪物的攻击力加100。", - "!type": "fn(x: number, y: number, floorId?: string, name: string, value: ?, operator?: string, prefix?: string)" + setEnemyOnPoint: { + "!doc": + "设置某个点的敌人属性。如果该点不是怪物,则忽略此函数。<br/>例如:core.setEnemyOnPoint(3, 5, null, 'atk', 100, '+='); // 仅将(3,5)点怪物的攻击力加100。", + "!type": + "fn(x: number, y: number, floorId?: string, name: string, value: ?, operator?: string, prefix?: string)", }, - "resetEnemyOnPoint": { + resetEnemyOnPoint: { "!doc": "重置某个点的怪物属性", - "!type": "fn(x: number, y: number, floorId?: string)" + "!type": "fn(x: number, y: number, floorId?: string)", }, - "moveEnemyOnPoint": { + moveEnemyOnPoint: { "!doc": "将某个点已经设置的敌人属性移动到其他点", - "!type": "fn(fromX: number, fromY: number, toX: number, toY: number, floorId?: string)" + "!type": + "fn(fromX: number, fromY: number, toX: number, toY: number, floorId?: string)", }, - "autoEventExecuting": { + autoEventExecuting: { "!doc": "当前是否在执行某个自动事件", - "!type": "fn(symbol?: string, value?: ?) -> bool" + "!type": "fn(symbol?: string, value?: ?) -> bool", }, - "checkAutoEvents": { + checkAutoEvents: { "!doc": "检测自动事件", - "!type": "fn()" + "!type": "fn()", }, - "showGif": { - "!doc": "绘制一张动图或擦除所有动图<br/>例如:core.showGif(); // 擦除所有动图<br/>name: 动图文件名,可以是全塔属性中映射前的中文名<br/>x: 动图在视野中的左上角横坐标<br/>y: 动图在视野中的左上角纵坐标", - "!type": "fn(name?: string, x?: number, y?: number)" + showGif: { + "!doc": + "绘制一张动图或擦除所有动图<br/>例如:core.showGif(); // 擦除所有动图<br/>name: 动图文件名,可以是全塔属性中映射前的中文名<br/>x: 动图在视野中的左上角横坐标<br/>y: 动图在视野中的左上角纵坐标", + "!type": "fn(name?: string, x?: number, y?: number)", }, - "unregisterEvent": { + unregisterEvent: { "!doc": "注销一个自定义事件", - "!type": "fn(type: string)" + "!type": "fn(type: string)", }, - "jumpHero": { - "!doc": "主角跳跃,跳跃勇士。ex和ey为目标点的坐标,可以为null表示原地跳跃。time为总跳跃时间。<br/>例如:core.jumpHero(); // 主角原地跳跃半秒<br/>ex: 跳跃后的横坐标<br/>ey: 跳跃后的纵坐标<br/>time: 跳跃时长,单位为毫秒。不填视为半秒<br/>callback: 跳跃完毕后的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(ex?: number, ey?: number, time?: number, callback?: fn())" + jumpHero: { + "!doc": + "主角跳跃,跳跃勇士。ex和ey为目标点的坐标,可以为null表示原地跳跃。time为总跳跃时间。<br/>例如:core.jumpHero(); // 主角原地跳跃半秒<br/>ex: 跳跃后的横坐标<br/>ey: 跳跃后的纵坐标<br/>time: 跳跃时长,单位为毫秒。不填视为半秒<br/>callback: 跳跃完毕后的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": + "fn(ex?: number, ey?: number, time?: number, callback?: fn())", }, - "closeDoor": { - "!doc": "关门,目标点必须为空地<br/>例如:core.closeDoor(0, 0, 'yellowWall', core.jumpHero); // 在左上角关掉一堵黄墙,然后主角原地跳跃半秒<br/>x: 横坐标<br/>y: 纵坐标<br/>id: 门的id,也可以用三种基础墙<br/>callback: 门完全关上后的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(x: number, y: number, id: string, callback?: fn())" + closeDoor: { + "!doc": + "关门,目标点必须为空地<br/>例如:core.closeDoor(0, 0, 'yellowWall', core.jumpHero); // 在左上角关掉一堵黄墙,然后主角原地跳跃半秒<br/>x: 横坐标<br/>y: 纵坐标<br/>id: 门的id,也可以用三种基础墙<br/>callback: 门完全关上后的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(x: number, y: number, id: string, callback?: fn())", }, - "eventMoveHero": { - "!doc": "强制移动主角(包括后退),这个函数的作者已经看不懂这个函数了<br/>例如:core.eventMoveHero(['forward'], 125, core.jumpHero); // 主角强制前进一步,用时1/8秒,然后主角原地跳跃半秒<br/>steps: 步伐数组,注意后退时跟随者的行为会很难看<br/>time: 每步的用时,单位为毫秒。0或不填则取主角的移速,如果后者也不存在就取0.1秒<br/>callback: 移动完毕后的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(steps: [step], time?: number, callback?: fn())" + eventMoveHero: { + "!doc": + "强制移动主角(包括后退),这个函数的作者已经看不懂这个函数了<br/>例如:core.eventMoveHero(['forward'], 125, core.jumpHero); // 主角强制前进一步,用时1/8秒,然后主角原地跳跃半秒<br/>steps: 步伐数组,注意后退时跟随者的行为会很难看<br/>time: 每步的用时,单位为毫秒。0或不填则取主角的移速,如果后者也不存在就取0.1秒<br/>callback: 移动完毕后的回调函数,可选<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": "fn(steps: [step], time?: number, callback?: fn())", }, - "changeFloor": { - "!doc": "场景切换<br/>例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值<br/>floorId: 传送的目标地图id,可以填':before'和':next'分别表示楼下或楼上<br/>stair: 传送的位置<br/>heroLoc: 传送的坐标;会覆盖stair<br/>time: 传送的黑屏时间,单位为毫秒;不填为用户设置值<br/>callback: 传送的回调函数<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", - "!type": "fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())" + changeFloor: { + "!doc": + "场景切换<br/>例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值<br/>floorId: 传送的目标地图id,可以填':before'和':next'分别表示楼下或楼上<br/>stair: 传送的位置<br/>heroLoc: 传送的坐标;会覆盖stair<br/>time: 传送的黑屏时间,单位为毫秒;不填为用户设置值<br/>callback: 传送的回调函数<br/>【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】", + "!type": + "fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())", }, - "getCommonEvent": { + getCommonEvent: { "!doc": "获得一个公共事件", - "!type": "fn(name: string) -> [?]" + "!type": "fn(name: string) -> [?]", }, - "lose": { + lose: { "!doc": "游戏失败事件", - "!type": "fn(reason?: string)" + "!type": "fn(reason?: string)", }, - "gameOver": { - "!doc": "游戏结束<br/>例如:core.gameOver(); // 游戏失败<br/>ending: 结局名,省略表示失败<br/>fromReplay: true表示在播放录像,可选<br/>norank: true表示不计入榜单,可选", - "!type": "fn(ending?: string, fromReplay?: bool, norank?: bool)" + gameOver: { + "!doc": + "游戏结束<br/>例如:core.gameOver(); // 游戏失败<br/>ending: 结局名,省略表示失败<br/>fromReplay: true表示在播放录像,可选<br/>norank: true表示不计入榜单,可选", + "!type": "fn(ending?: string, fromReplay?: bool, norank?: bool)", }, - "useFly": { + useFly: { "!doc": "点击楼层传送器时的打开操作", - "!type": "fn(fromUserAction?: bool)" + "!type": "fn(fromUserAction?: bool)", + }, + tryUseItem: { + "!doc": + "尝试使用一个道具<br/>例如:core.tryUseItem('pickaxe'); // 尝试使用破墙镐<br/>itemId: 道具id,其中敌人手册、传送器和飞行器会被特殊处理", + "!type": "fn(itemId: string)", }, - "tryUseItem": { - "!doc": "尝试使用一个道具<br/>例如:core.tryUseItem('pickaxe'); // 尝试使用破墙镐<br/>itemId: 道具id,其中敌人手册、传送器和飞行器会被特殊处理", - "!type": "fn(itemId: string)" - } }, - "plugin": { + plugin: { "!doc": "插件编写中内置了一些常用的插件。", - "drawLight": { - "!doc": "绘制一段灯光效果<br/>name:必填,要绘制到的画布名;可以是一个系统画布,或者是个自定义画布;如果不存在则创建<br/>color:可选,只能是一个0~1之间的数,为不透明度的值。不填则默认为0.9。<br/>lights:可选,一个数组,定义了每个独立的灯光。其中每一项是三元组 [x,y,r] x和y分别为该灯光的横纵坐标,r为该灯光的半径。<br/>lightDec:可选,0到1之间,光从多少百分比才开始衰减(在此范围内保持全亮),不设置默认为0。比如lightDec为0.5代表,每个灯光部分内圈50%的范围全亮,50%以后才开始快速衰减。<br/>例如:core.plugin.drawLight('test', 0.2, [[25,11,46,0.1]]); // 创建一个test图层,不透明度0.2,其中在(25,11)点存在一个半径为46的灯光效果,灯光中心不透明度0.1。<br/>core.plugin.drawLight('test2', 0.9, [[25,11,46],[105,121,88],[301,221,106]]); // 创建test2图层,且存在三个灯光效果,分别是中心(25,11)半径46,中心(105,121)半径88,中心(301,221)半径106。", - "!type": "fn(name: string|CanvasRenderingContext2D, color?: number, lights?: [[number]], lightDec?: number)" + drawLight: { + "!doc": + "绘制一段灯光效果<br/>name:必填,要绘制到的画布名;可以是一个系统画布,或者是个自定义画布;如果不存在则创建<br/>color:可选,只能是一个0~1之间的数,为不透明度的值。不填则默认为0.9。<br/>lights:可选,一个数组,定义了每个独立的灯光。其中每一项是三元组 [x,y,r] x和y分别为该灯光的横纵坐标,r为该灯光的半径。<br/>lightDec:可选,0到1之间,光从多少百分比才开始衰减(在此范围内保持全亮),不设置默认为0。比如lightDec为0.5代表,每个灯光部分内圈50%的范围全亮,50%以后才开始快速衰减。<br/>例如:core.plugin.drawLight('test', 0.2, [[25,11,46,0.1]]); // 创建一个test图层,不透明度0.2,其中在(25,11)点存在一个半径为46的灯光效果,灯光中心不透明度0.1。<br/>core.plugin.drawLight('test2', 0.9, [[25,11,46],[105,121,88],[301,221,106]]); // 创建test2图层,且存在三个灯光效果,分别是中心(25,11)半径46,中心(105,121)半径88,中心(301,221)半径106。", + "!type": + "fn(name: string|CanvasRenderingContext2D, color?: number, lights?: [[number]], lightDec?: number)", }, - "openShop": { - "!doc": "打开一个全局商店<br/>shopId: 要开启的商店ID<br/>noRoute: 打开行为是否不计入录像", - "!type": "fn(shopId: string, noRoute?: bool)" + openShop: { + "!doc": + "打开一个全局商店<br/>shopId: 要开启的商店ID<br/>noRoute: 打开行为是否不计入录像", + "!type": "fn(shopId: string, noRoute?: bool)", }, - "isShopVisited": { + isShopVisited: { "!doc": "某个全局商店是否被访问过", - "!type": "fn(id: string) -> bool" + "!type": "fn(id: string) -> bool", }, - "listShopIds": { + listShopIds: { "!doc": "列出所有应当显示的快捷商店列表", - "!type": "fn() -> [string]" + "!type": "fn() -> [string]", }, - "canOpenShop": { + canOpenShop: { "!doc": "当前能否打开某个商店", - "!type": "fn(id: string) -> bool" + "!type": "fn(id: string) -> bool", }, - "setShopVisited": { + setShopVisited: { "!doc": "设置某个商店的访问状态", - "!type": "fn(id: string, visited?: bool)" + "!type": "fn(id: string, visited?: bool)", }, - "canUseQuickShop": { - "!doc": "当前能否使用某个快捷商店<br/>如果返回一个字符串,则代表不能,返回的字符串作为不能的提示;返回null表示可以使用", - "!type": "fn(id: string) -> string" + canUseQuickShop: { + "!doc": + "当前能否使用某个快捷商店<br/>如果返回一个字符串,则代表不能,返回的字符串作为不能的提示;返回null表示可以使用", + "!type": "fn(id: string) -> string", }, - "removeMaps": { - "!doc": "删除某一些楼层;删除后不会存入存档,不可浏览地图也不可飞到。<br/>fromId: 开始删除的楼层ID<br/>toId: 删除到的楼层编号;可选,不填则视为fromId<br/>例如:core.removeMaps(\"MT1\", \"MT300\") 删除MT1~MT300之间的全部层<br/>core.removeMaps(\"MT10\") 只删除MT10层", - "!type": "fn(fromId: string, toId?: string)" + removeMaps: { + "!doc": + '删除某一些楼层;删除后不会存入存档,不可浏览地图也不可飞到。<br/>fromId: 开始删除的楼层ID<br/>toId: 删除到的楼层编号;可选,不填则视为fromId<br/>例如:core.removeMaps("MT1", "MT300") 删除MT1~MT300之间的全部层<br/>core.removeMaps("MT10") 只删除MT10层', + "!type": "fn(fromId: string, toId?: string)", }, - "resumeMaps": { - "!doc": "恢复某一些被删除楼层。<br/>fromId: 开始恢复的楼层ID<br/>toId: 恢复到的楼层编号;可选,不填则视为fromId<br/>例如:core.resumeMaps(\"MT1\", \"MT300\") 恢复MT1~MT300之间的全部层<br/>core.resumeMaps(\"MT10\") 只删恢复MT10层", - "!type": "fn(fromId: string, toId?: string)" + resumeMaps: { + "!doc": + '恢复某一些被删除楼层。<br/>fromId: 开始恢复的楼层ID<br/>toId: 恢复到的楼层编号;可选,不填则视为fromId<br/>例如:core.resumeMaps("MT1", "MT300") 恢复MT1~MT300之间的全部层<br/>core.resumeMaps("MT10") 只删恢复MT10层', + "!type": "fn(fromId: string, toId?: string)", }, - "autoRemoveMaps": { + autoRemoveMaps: { "!doc": "根据楼层分区信息自动砍层与恢复", - "!type": "fn(floorId: string)" + "!type": "fn(floorId: string)", }, - "openItemShop": { + openItemShop: { "!doc": "打开一个道具商店", - "!type": "fn(itemShopId: string)" - } - } + "!type": "fn(itemShopId: string)", + }, + }, }, - "lzw_encode": { + lzw_encode: { "!doc": "LZW压缩算法", "!url": "https://gist.github.com/revolunet/843889", - "!type": "fn(s: string) -> string" + "!type": "fn(s: string) -> string", }, - "lzw_decode": { + lzw_decode: { "!doc": "LZW解压缩算法", "!url": "https://gist.github.com/revolunet/843889", - "!type": "fn(s: string) -> string" + "!type": "fn(s: string) -> string", }, - "hero": { + hero: { "!type": "heroStatus", "!doc": "勇士信息,为 core.status.hero 的简写", }, - "flags": { + flags: { "!type": "flag", "!doc": "游戏中用到的变量,为 core.status.hero.flags 的简写", - } - } -]; \ No newline at end of file + }, + }, +]; diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 10b3ad5..b4a2a2f 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -567,7 +567,7 @@ doorInfo_m /* doorInfo_m tooltip : 开门信息 -default : [160, 'door.mp3', 'door.mp3'] +default : [160, 'door.opus', 'door.opus'] helpUrl : /_docs/#/instruction EvalString_0 = EvalString_0 && (', "openSound": "' + EvalString_0 + '"'); EvalString_1 = EvalString_1 && (', "closeSound": "' + EvalString_1 + '"'); @@ -837,6 +837,14 @@ action | insert_1_s | insert_2_s | exit_s + | setanimate_s + | deleteanimate_s + | playanimate_s + | clearanimate_s + | animateloop_s + | animatemove_s + | animatereverse_s + | animatepause_s | setBlock_s | turnBlock_s | showFloorImg_s @@ -854,6 +862,8 @@ action | waitAsync_s | stopAsync_s | op_s + | setmusics_s + | introAndLoop_s | battle_s | battle_1_s | openDoor_s @@ -871,11 +881,11 @@ action | disableShop_s | follow_s | unfollow_s - | setanimate_s - | deleteanimate_s - | playanimate_s - | clearanimate_s | animate_s + | moveAnimate_s + | animateResize_s + | pauseAnimate_s + | remuseAnimate_s | animate_1_s | stopAnimate_s | vibrate_s @@ -903,6 +913,8 @@ action | resumeBgm_s | loadBgm_s | freeBgm_s + | drawbackground_s + | clearbackground_s | playSound_s | playSound_1_s | stopSound_s @@ -963,8 +975,7 @@ action | animationDrawable_s | over_s | overlist_s - | playStereo_s - | moveStereo_s + | cgtextList_s | pass_s ; @@ -1071,6 +1082,98 @@ if (block.isCollapsed() || !block.isEnabled() || pos || Int_0 || Bool_0) { return code+',\n'; */; + +animationDrawable_s + : '帧动画(剧情画面)' '总显示帧数' IntString '底色' ColorString? Colour '底色不透明度' IntString? BGNL?Newline + '图片序列(同一帧后面覆盖先前的,默认起始帧为0,结束帧为最后一帧)'BGNL?Newline + '(剪裁区域不填写为全图,绘制区域不填写为全画面)'BGNL?Newline + '(不透明度100为不透明,默认为不透明,结束不透明度默认与开始透明度相同)'BGNL?Newline + animationDrawableimage+? Newline + '音频序列(到达对应帧进行播放)'BGNL?Newline + animationDrawablesound+? Newline + + +/* animationDrawable_s +tooltip : animationDrawable:帧动画图片叠加 +helpUrl : /_docs/#/instruction +default : [30,"0, 0, 0",'rgb(0, 0, 0)',""] +allImages : ['EvalString_0'] +colour : this.imageColor +if (IntString_1&&(IntString_1 < 0||IntString_1>100)) throw new Error('透明度范围为0-100,0为透明,100为不透明,不填默认为不透明') + +ColorString_0 = ColorString_0 ? (', "color": ['+ColorString_0+']') : ''; +IntString_1 = IntString_1 ? (', "globalAlpha": '+IntString_1+'') : ''; +var imageList=animationDrawableimage_0?',"imageList": [\n'+animationDrawableimage_0.slice(0,-1)+'\n]':'' +var soundList=animationDrawablesound_0?',"soundList": [\n'+animationDrawablesound_0.slice(0,-1)+'\n]':'' +var code = '{"type": "animationDrawable", "allFarme": '+IntString_0+ColorString_0+IntString_1+imageList+soundList+'},\n'; +return code; +*/; + +animationDrawableList + : animationDrawableimage + | animationDrawablesound + | animationDrawabletextEmpty; + +animationDrawableimage + : '图片' EvalString? '起始帧' IntString? '起始不透明度' IntString? BGNL? Newline + '剪裁坐标cx' IntString? 'cy' IntString? '宽' IntString? '高' IntString? '绘制坐标x'IntString? 'y' IntString? '宽' IntString? '高' IntString?'角度'IntString? BGNL? Newline + '结束帧' IntString? '结束不透明度' IntString? '剪裁坐标cx' IntString? 'cy' IntString? '宽' IntString? '高' IntString? '绘制坐标x'IntString? 'y' IntString? '宽' IntString? '高' IntString?'角度'IntString? Newline +/* animationDrawableimage +tooltip : 帧动画图片列表 +helpUrl : /_docs/#/instruction +default : ["","","","","","","","","","","","","","","","","","","","","","",""] +colour : this.subColor +allImages : ['EvalString_0'] +if (IntString_1&&(IntString_1 < 0||IntString_1>100)) throw new Error('不透明度范围为0-100,0为透明,100为不透明,不填默认为不透明') +if (IntString_11&&(IntString_12 < 0||IntString_12>100)) throw new Error('不透明度范围为0-100,0为透明,100为不透明,不填默认为不透明') +IntString_0 = IntString_0 ? (', "beforefarme": '+IntString_0+'') : ''; +IntString_1 = IntString_1 ? (', "globalAlpha": '+IntString_1+'') : ''; +IntString_2 = IntString_2 ? (', "cx": '+IntString_2+'') : ''; +IntString_3 = IntString_3 ? (', "cy": '+IntString_3+'') : ''; +IntString_4 = IntString_4 ? (', "cw": '+IntString_4+'') : ''; +IntString_5 = IntString_5 ? (', "ch": '+IntString_5+'') : ''; +IntString_6 = IntString_6 ? (', "x": '+IntString_6+'') : ''; +IntString_7 = IntString_7 ? (', "y": '+IntString_7+'') : ''; +IntString_8 = IntString_8 ? (', "w": '+IntString_8+'') : ''; +IntString_9 = IntString_9 ? (', "h": '+IntString_9+'') : ''; + +IntString_10 = IntString_10 ? (', "angle": '+IntString_10+'') : ''; +IntString_11 = IntString_11 ? (', "afterfarme": '+IntString_11+'') : ''; +IntString_12 = IntString_12 ? (', "aglobalAlpha": '+IntString_12+'') : ''; +IntString_13 = IntString_13 ? (', "acx": '+IntString_13+'') : ''; +IntString_14 = IntString_14 ? (', "acy": '+IntString_14+'') : ''; +IntString_15 = IntString_15 ? (', "acw": '+IntString_15+'') : ''; +IntString_16 = IntString_16 ? (', "ach": '+IntString_16+'') : ''; +IntString_17 = IntString_17 ? (', "ax": '+IntString_17+'') : ''; +IntString_18 = IntString_18 ? (', "ay": '+IntString_18+'') : ''; +IntString_19 = IntString_19 ? (', "aw": '+IntString_19+'') : ''; +IntString_20 = IntString_20 ? (', "ah": '+IntString_20+'') : ''; +IntString_21 = IntString_21 ? (', "aangle": '+IntString_21+'') : ''; +return '{ "image":"'+EvalString_0+'"'+IntString_0+IntString_1+IntString_2+IntString_3+IntString_4+IntString_5+IntString_6+IntString_7+IntString_8+IntString_9+IntString_10+IntString_11+IntString_12+IntString_13+IntString_14+IntString_15+IntString_16+IntString_17+IntString_18+IntString_19+IntString_20+IntString_21+'},' +*/; + +animationDrawablesound + : '音效' EvalString? '起始帧' IntString '是否停止其他音效'Bool? Newline + +/* animationDrawablesound +tooltip : 帧动画配音 +helpUrl : /_docs/#/instruction +default : ["",0,false] +colour : this.subColor +allSounds : ['EvalString_0'] + +return '{ "sound":"'+EvalString_0+'","startfarme":'+IntString_0+',"stopbefore":'+Bool_0+'},' +*/; + +animationDrawabletextEmpty + : Newline + +/* animationDrawabletextEmpty +var code = []; +return code; +*/; + + over_s : '旁白文字' ':' EvalString BGNL? Newline '背景' EvalString? '回忆滤镜' Bool? '持续帧数' Int? '渐入渐出帧数' Int? '音频文件' EvalString? BGNL? Newline @@ -1123,22 +1226,32 @@ overtextEmpty var code = []; return code; */; +cgtextList_s + : '切换剧情文本库' EvalString Newline + + +/* cgtextList_s +tooltip : cgtextList:设置cg剧情文本库 +helpUrl : /_docs/#/instruction +default : ["chapter0"] +var code = '{"type": "cgtextList", "textList":"'+EvalString_0+'"},\n'; +return code; +*/; cgtext_s - : '背景' EvalString? '回忆滤镜' Bool? '移除对话框' Bool? '头像' EvalString?'名字' EvalString?'坐标PX' Number'打字间隔' Int? BGNL? Newline - '自动等待时长' Int '音频文件(需在全塔属性——使用音效注册)'EvalString? BGNL? Newline - EvalString? BGNL? Newline textcgDrawingList+? Newline + : '剧情cg文本 移除对话框' Bool? '剧情库序列' Int '头像' EvalString?'坐标PX' Number'打字间隔' Int? BGNL? Newline + '自动等待时长' Int BGNL? Newline + textcgDrawingList+? Newline /* cgtext_s tooltip : cgtext:显示一段包含cg的文字(剧情) helpUrl : /_docs/#/instruction -allImages : ['EvalString_0','EvalString_1'] -allSounds : ['EvalString_3'] -default : ["bg_5043.webp",false,"face_050445.webp",false,"菲奥奈",-300,0,2000,"","这句话显示在对话框内",[{ "name":"tati_050145a.webp" , "px": 100,"filter":false }]] -var head ='{ "name": "'+EvalString_1+'", "px": '+Number_0+' }' +allImages : ['EvalString_0'] +default : [false,0,"face_050445.webp",-300,0,2000,"","这句话显示在对话框内",[{ "name":"tati_050145a.webp" , "px": 100,"filter":false }]] +var head ='{ "name": "'+EvalString_0+'", "px": '+Number_0+' }' var list=',"bodyList": [\n'+textcgDrawingList_0.slice(0,-1)+'\n]' -var code = '{"type": "cgtext", "bg":"'+EvalString_0+'","memory":'+Bool_0+',"WindowSkin":'+Bool_1+',"head":'+head+' ,"name":"'+EvalString_2+'","time":'+Int_0+',"wait":'+Int_1+',"sound":"'+EvalString_3+'","text": "'+EvalString_4+'"'+list+' },\n'; +var code = '{"type": "cgtext","WindowSkin":'+Bool_0+',"head":'+head+' ,"index":"'+Int_0+'","time":'+Int_1+',"wait":'+Int_2+list+' },\n'; return code; */; textcgDrawingList @@ -1955,17 +2068,46 @@ var code = '{"type": "changebg", "img1": "'+EvalString_0+'","memory1":'+Bool_0+' return code; */; +drawbackground_s + : '绘制背景' EvalString? '回忆滤镜' Bool? Newline + + +/* drawbackground_s +tooltip : drawbackground 绘制剧情背景 +helpUrl : /_docs/#/instruction +default : ["",false] +colour : this.soundColor +allImages : ['EvalString_0'] +var code = '{"type": "drawbackground", "image": "'+EvalString_0+'","memory":'+Bool_0+'},\n'; +return code; +*/; + +clearbackground_s + : '清除cg背景' Newline + + +/* clearbackground_s +tooltip : clearbackground: 剧情背景清除 +helpUrl : /_docs/#/instruction +default : [] +colour : this.soundColor + +var code = '{"type": "clearbackground"},\n'; +return code; +*/; + drawWarning_s - : '警告坐标x' PosString 'y' PosString '文字大小'Int '警告内容' EvalString? '副标题' EvalString? '不播放音效' Bool? Newline + : '警告坐标x' PosString 'y' PosString '缩放倍率'EvalString '文字大小'Int '警告内容' EvalString? '副标题' EvalString? '不播放音效' Bool? Newline /* drawWarning_s tooltip : drawWarning: 绘制warning警告并拉进镜头,本事件为异步事件,下一事件将在3100ms后执行 helpUrl : /_docs/#/instruction -default : [0, 0,24,"这里是提示内容","绿色史莱姆",false] +default : [0, 0,2,24,"这里是提示内容","绿色史莱姆",false] colour : this.soundColor selectPoint : ["PosString_0", "PosString_1"] -var code = '{"type": "drawWarning", "x": '+PosString_0+', "y": '+PosString_1+',"size":'+Int_0+',"text": "'+EvalString_0+'", "text2": "'+EvalString_1+'", "warning": '+Bool_0+'},\n'; +if(!EvalString_1||!/^(0|([1-9][0-9]*))(\.[\d]+)?$/.test(EvalString_0))throw new Error("此项仅能填写小数或整数"); +var code = '{"type": "drawWarning", "x": '+PosString_0+', "y": '+PosString_1+',"large":'+EvalString_0+',"size":'+Int_0+',"text": "'+EvalString_1+'", "text2": "'+EvalString_2+'", "warning": '+Bool_0+'},\n'; return code; */; @@ -2230,6 +2372,69 @@ var code = '{"type": "vibrate", "direction": "'+Vibrate_List_0+'", "time": '+Int return code; */; +animate_s + : '显示动画' EvalString '位置' 'x' PosString? 'y' PosString? '相对窗口坐标' Bool '不等待执行完毕' Bool Newline + + +/* animate_s +tooltip : animate:显示动画,位置填hero或者1,2形式的位置,或者不填代表当前事件点 +helpUrl : /_docs/#/instruction +default : ["zone","","",false,false] +allAnimates : ['EvalString_0'] +material : ["./project/animates/", "EvalString_0"] +menu : [['选择位置', 'editor_blockly.selectPoint(block, ["PosString_0", "PosString_1"])']] +colour : this.soundColor +var loc = PosString_0&&PosString_1?(', "loc": ['+PosString_0+','+PosString_1+']'):''; +Bool_0 = Bool_0?', "alignWindow": true':''; +Bool_1 = Bool_1?', "async": true':''; +var code = '{"type": "animate", "name": "'+EvalString_0+'"'+loc+Bool_0+Bool_1+'},\n'; +return code; +*/; + +animate_1_s + : '显示动画并跟随角色' EvalString '不等待执行完毕' Bool Newline + + +/* animate_1_s +tooltip : animate:显示动画并跟随角色 +helpUrl : /_docs/#/instruction +default : ["zone",false] +allAnimates : ['EvalString_0'] +material : ["./project/animates/", "EvalString_0"] +colour : this.soundColor +Bool_0 = Bool_0?', "async": true':''; +var code = '{"type": "animate", "name": "'+EvalString_0+'", "loc": "hero"'+Bool_0+'},\n'; +return code; +*/; + + +animatereverse_s + : '调整正在播放的帧动画/特效 编号'IntString?'倒放'Bool'(不填编号为对所有正在进行的帧动画/特效进行操作)' + +/* animatereverse_s +tooltip : animatereverse:调整正在播放的帧动画(倒放) +helpUrl : /_docs/#/instruction +default : ["",false] +colour : this.imageColor +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : '' +var code = '{"type": "animatereverse"'+IntString_0+',"reverse":'+Bool_0+'},\n'; +return code; +*/; + +animatepause_s + : '调整正在播放的帧动画/特效 编号'IntString?'暂停'Bool'(不填编号为对所有正在进行的帧动画/特效进行操作)' + +/* animatepause_s +tooltip : animatereverse:调整正在播放的帧动画(暂停) +helpUrl : /_docs/#/instruction +default : ["",false] +colour : this.imageColor +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : '' +var code = '{"type": "animatepause"'+IntString_0+',"pause":'+Bool_0+'},\n'; +return code; +*/; + + setanimate_s : '新建 帧动画/特效' '名称' EvalString '参照点偏移像素x' IntString? 'y' IntString? '动画大小 宽' IntString '高' IntString '总帧数' IntString BGNL?Newline '图片序列(同一帧后面覆盖先前的,默认起始帧为0,结束帧为最后一帧)'BGNL?Newline @@ -2331,82 +2536,148 @@ return code; */; playanimate_s - : '播放 帧动画/特效' '名称' EvalString '像素x' IntString? 'y' IntString? '跟随勇士' Bool 'x方向缩放' EvalString? 'y方向缩放'EvalString? Newline + : '播放 帧动画/特效' '名称' EvalString '编号'IntString?'像素x' IntString? 'y' IntString? '跟随勇士' Bool 'x方向缩放' EvalString? 'y方向缩放'EvalString?'循环'Bool'倒放'Bool Newline /* playanimate_s tooltip : playanimate:播放帧动画,选择跟随勇士后x、y将失效改为勇士中心坐标 helpUrl : /_docs/#/instruction -default : ["zone","","",false,"",""] - +default : ["zone","","","",false,1,1,false,false] +previewBlock : true colour : this.imageColor -IntString_0 = IntString_0 ? (', "x": '+IntString_0+'') : ''; -IntString_1 = IntString_1 ? (', "y": '+IntString_1+'') : ''; +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : ''; +IntString_1 = IntString_1 ? (', "x": '+IntString_1+'') : ''; +IntString_2 = IntString_2 ? (', "y": '+IntString_2+'') : ''; if(EvalString_1&&!/^(0|([1-9][0-9]*))(\.[\d]+)?$/.test(EvalString_1))throw new Error("此项仅能填写小数、整数或不填"); if(EvalString_2&&!/^(0|([1-9][0-9]*))(\.[\d]+)?$/.test(EvalString_2))throw new Error("此项仅能填写小数、整数或不填"); EvalString_1 = EvalString_1 ? (', "scalex": '+EvalString_1+'') : ''; EvalString_2 = EvalString_2 ? (', "scaley": '+EvalString_2+'') : ''; -var code = '{"type": "playanimate", "name": "'+EvalString_0+'"'+IntString_0+IntString_1+',"hero":'+Bool_0+EvalString_1+EvalString_2+'},\n'; +var code = '{"type": "playanimate", "name": "'+EvalString_0+'"'+IntString_0+IntString_1+IntString_2+',"hero":'+Bool_0+EvalString_1+EvalString_2+',"loop":'+Bool_1+',"reverse":'+Bool_2+'},\n'; return code; */; clearanimate_s - : '清空正在播放的帧动画/特效' + : '停止正在播放的帧动画/特效 编号'IntString?'(不填编号为对所有正在进行的帧动画/特效进行操作)' /* clearanimate_s tooltip : clearanimate:清空正在播放的帧动画 helpUrl : /_docs/#/instruction - +default : [""] colour : this.imageColor - -var code = '{"type": "clearanimate"},\n'; +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : ''; +var code = '{"type": "clearanimate"'+IntString_0+'},\n'; return code; */; -animate_s - : '显示动画' EvalString '位置' 'x' PosString? 'y' PosString? '相对窗口坐标' Bool '不等待执行完毕' Bool Newline - +animateloop_s + : '调整正在播放的帧动画/特效 编号'IntString?'循环'Bool '(不填编号为对所有正在进行的帧动画/特效进行操作)' -/* animate_s -tooltip : animate:显示动画,位置填hero或者1,2形式的位置,或者不填代表当前事件点 +/* animateloop_s +tooltip : animateloop:调整正在播放的帧动画(循环) helpUrl : /_docs/#/instruction -default : ["zone","","",false,false] -allAnimates : ['EvalString_0'] -material : ["./project/animates/", "EvalString_0"] -menu : [['选择位置', 'editor_blockly.selectPoint(block, ["PosString_0", "PosString_1"])']] -colour : this.soundColor -var loc = PosString_0&&PosString_1?(', "loc": ['+PosString_0+','+PosString_1+']'):''; -Bool_0 = Bool_0?', "alignWindow": true':''; -Bool_1 = Bool_1?', "async": true':''; -var code = '{"type": "animate", "name": "'+EvalString_0+'"'+loc+Bool_0+Bool_1+'},\n'; +default : ["",false] +colour : this.imageColor +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : '' +var code = '{"type": "animateloop"'+IntString_0+',"loop":'+Bool_0+'},\n'; return code; */; -animate_1_s - : '显示动画并跟随角色' EvalString '不等待执行完毕' Bool Newline +animatemove_s + : '移动正在播放的帧动画/特效 编号'IntString'目标像素x'PosString'y'PosString Absolute_List'移动时长'PosString'移动模式'MoveMode2_List? '(仅可对有编号的非跟随勇士帧动画/特效使用)' + +/* animatemove_s +tooltip : animateloop:调整正在播放的帧动画(循环) +helpUrl : /_docs/#/instruction +default : [0,0,0,false,1000,''] +previewBlock : true +colour : this.imageColor +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : '' +MoveMode2_List_0=MoveMode2_List_0?(', "style": "'+MoveMode2_List_0+'"') : '' +var code = '{"type": "animatemove"'+IntString_0+',"px":'+PosString_0+',"py":'+PosString_1+',"relative":'+Absolute_List_0+',"time":'+PosString_2+MoveMode2_List_0+'},\n'; +return code; +*/; + + +moveAnimate_s + : '移动正在播放的帧动画/特效 编号'IntString'目标像素x'PosString'y'PosString Absolute_List'移动时长'PosString'移动模式'MoveMode2_List? '(仅可对有编号的非跟随勇士动画使用)' + +/* moveAnimate_s +tooltip : animateloop:调整正在播放的帧动画(循环) +helpUrl : /_docs/#/instruction +default : [0,0,0,false,1000,''] +previewBlock : true +colour : this.soundColor +IntString_0 = IntString_0 ? (', "id": '+IntString_0+'') : '' +MoveMode2_List_0=MoveMode2_List_0?(', "style": "'+MoveMode2_List_0+'"') : '' +var code = '{"type": "moveAnimate"'+IntString_0+',"px":'+PosString_0+',"py":'+PosString_1+',"relative":'+Absolute_List_0+',"time":'+PosString_2+MoveMode2_List_0+'},\n'; +return code; +*/; + + +animateResize_s + : '显示动画(60Fps)' EvalString '编号'PosString? '中心像素' 'x' PosString? 'y' PosString?'以勇士为中心' Bool'倒放' Bool'循环'Bool'不等待执行完毕' Bool Newline -/* animate_1_s -tooltip : animate:显示动画并跟随角色 +/* animateResize_s +tooltip : animateResize:显示动画并选择是否以勇士为中心及倒放(以勇士为中心时,中心像素坐标无效) helpUrl : /_docs/#/instruction -default : ["zone",false] +default : ["zone","","","",false,false,false,false] allAnimates : ['EvalString_0'] +previewBlock : true material : ["./project/animates/", "EvalString_0"] colour : this.soundColor -Bool_0 = Bool_0?', "async": true':''; -var code = '{"type": "animate", "name": "'+EvalString_0+'", "loc": "hero"'+Bool_0+'},\n'; + +PosString_0 = PosString_0?', "id":'+PosString_0:''; +Bool_0 = Bool_0?', "hero": true':''; +if(!Bool_0){ + if(PosString_1===""||PosString_2==="")throw new Error("中心像素坐标或以勇士为中心必须填写一项"); + + Bool_0=',"centerX":'+PosString_1+', "centerY":'+PosString_2 +} +if(Bool_2&&!Bool_3 )throw new Error("循环必须与不等待执行完毕同时开启,否则将陷入死循环") +Bool_1 = Bool_1?', "reverse": true':''; +Bool_2 = Bool_2?', "loop": true':''; +Bool_3 = Bool_3?', "async": true':''; +var code = '{"type": "animateResize", "name": "'+EvalString_0+'"'+PosString_0+Bool_0+Bool_1+Bool_2+Bool_3+'},\n'; +return code; +*/; + +pauseAnimate_s + : '暂停动画编号'PosString?'(不填写编号为暂停所有)' Newline + +/* pauseAnimate_s +tooltip : pauseAnimate:暂停动画(不填写编号为暂停所有) +helpUrl : /_docs/#/instruction +default : [''] +colour : this.soundColor +PosString_0 = PosString_0?', "id":'+PosString_0:''; +var code = '{"type": "pauseAnimate"'+PosString_0+'},\n'; +return code; +*/; + +remuseAnimate_s + : '继续动画编号'PosString?'(不填写编号为继续所有)' Newline + +/* remuseAnimate_s +tooltip : remuseAnimate:继续动画(不填写编号为继续所有) +helpUrl : /_docs/#/instruction +default : [''] +colour : this.soundColor +PosString_0 = PosString_0?', "id":'+PosString_0:''; +var code = '{"type": "remuseAnimate"'+PosString_0+'},\n'; return code; */; stopAnimate_s - : '停止所有动画' '执行动画回调' Bool Newline + : '停止动画编号'PosString?'(不填写编号为继续所有)' '执行动画回调' Bool Newline /* stopAnimate_s -tooltip : stopAnimate:停止所有动画 +tooltip : stopAnimate:停止动画(不填写编号为继续所有) helpUrl : /_docs/#/instruction -default : [false] -colour : this.imageColor +default : ["",false] +colour : this.soundColor +PosString_0 = PosString_0?', "id":'+PosString_0:''; Bool_0 = Bool_0?', "doCallback": true':''; -var code = '{"type": "stopAnimate"'+Bool_0+'},\n'; +var code = '{"type": "stopAnimate"'+PosString_0+Bool_0+'},\n'; return code; */; @@ -2612,6 +2883,23 @@ var code = '{"type": "setq"'+IdString_0+'},\n'; return code; */; +introAndLoop_s + : '前奏音乐文件'EvalString? '前奏音乐文件播放时长(可填小数,单位为秒)'EvalString'循环音乐文件'EvalString? Newline + +/* introAndLoop_s +tooltip : introAndLoop:设置任务目标楼层(显示在小地图) +helpUrl : /_docs/#/instruction +default : ["",1,""] +allBgms : ['EvalString_0','EvalString_2'] +colour :this.imageColor +if(EvalString_1&&!/^(0|([1-9][0-9]*))(\.[\d]+)?$/.test(EvalString_1))throw new Error("此项仅能填写小数或整数,单位为秒"); +EvalString_0 = EvalString_0 ? (', "intro": "'+EvalString_0+'"') : ''; +EvalString_1= EvalString_1 ? (', "time": '+EvalString_1+'') : ''; +EvalString_2 = EvalString_2 ? (', "loop": "'+EvalString_2+'"') : ''; +var code = '{"type": "introAndLoop"'+EvalString_0+EvalString_1+EvalString_2+'},\n'; +return code; +*/; + setcgs_s : 'cg回廊获取cg 文件名'EvalString?'不填为清空cg获取记录' Newline @@ -2621,12 +2909,26 @@ tooltip : setcgs:cg回廊中的cg获取 helpUrl : /_docs/#/instruction default : [""] allImages : ['EvalString_0'] -colour : this.imageColor +colour : this.soundColor EvalString_0 = EvalString_0 ? (', "img": "'+EvalString_0+'"') : ''; var code = '{"type": "setcgs"'+EvalString_0+'},\n'; return code; */; +setmusics_s + : '音乐鉴赏music 文件名'EvalString?'不填为清空music获取记录' Newline + +/* setmusics_s +tooltip : setmusics:音乐鉴赏中的隐藏music获取 +helpUrl : /_docs/#/instruction +default : [""] +allBgms : ['EvalString_0'] +colour : this.soundColor +EvalString_0 = EvalString_0 ? (', "bgm": "'+EvalString_0+'"') : ''; +var code = '{"type": "setmusics"'+EvalString_0+'},\n'; +return code; +*/; + scaleImage_s : '图片放缩' '图片编号' NInt '中心点像素' 'x' PosString? 'y' PosString? '移动方式' MoveMode_List BGNL? '放缩比例' Number '动画时间' Int '不等待执行完毕' Bool Newline @@ -2647,95 +2949,6 @@ return code; */; -animationDrawable_s - : '帧动画' '总显示帧数' IntString '底色' ColorString? Colour '底色不透明度' IntString? BGNL?Newline - '图片序列(同一帧后面覆盖先前的,默认起始帧为0,结束帧为最后一帧)'BGNL?Newline - '(剪裁区域不填写为全图,绘制区域不填写为全画面)'BGNL?Newline - '(不透明度100为不透明,默认为不透明,结束不透明度默认与开始透明度相同)'BGNL?Newline - animationDrawableimage+? Newline - '音频序列(到达对应帧进行播放)'BGNL?Newline - animationDrawablesound+? Newline - - -/* animationDrawable_s -tooltip : animationDrawable:帧动画图片叠加 -helpUrl : /_docs/#/instruction -default : [30,"0, 0, 0",'rgb(0, 0, 0)',""] -allImages : ['EvalString_0'] -colour : this.imageColor -if (IntString_1&&(IntString_1 < 0||IntString_1>100)) throw new Error('透明度范围为0-100,0为透明,100为不透明,不填默认为不透明') - -ColorString_0 = ColorString_0 ? (', "color": ['+ColorString_0+']') : ''; -IntString_1 = IntString_1 ? (', "globalAlpha": '+IntString_1+'') : ''; -var imageList=animationDrawableimage_0?',"imageList": [\n'+animationDrawableimage_0.slice(0,-1)+'\n]':'' -var soundList=animationDrawablesound_0?',"soundList": [\n'+animationDrawablesound_0.slice(0,-1)+'\n]':'' -var code = '{"type": "animationDrawable", "allFarme": '+IntString_0+ColorString_0+IntString_1+imageList+soundList+'},\n'; -return code; -*/; - -animationDrawableList - : animationDrawableimage - | animationDrawablesound - | animationDrawabletextEmpty; - -animationDrawableimage - : '图片' EvalString? '起始帧' IntString? '起始不透明度' IntString? BGNL? Newline - '剪裁坐标cx' IntString? 'cy' IntString? '宽' IntString? '高' IntString? '绘制坐标x'IntString? 'y' IntString? '宽' IntString? '高' IntString? BGNL? Newline - '结束帧' IntString? '结束不透明度' IntString? '剪裁坐标cx' IntString? 'cy' IntString? '宽' IntString? '高' IntString? '绘制坐标x'IntString? 'y' IntString? '宽' IntString? '高' IntString? Newline -/* animationDrawableimage -tooltip : 帧动画图片列表 -helpUrl : /_docs/#/instruction -default : ["","","","","","","","","","","","","","","","","","","","",""] -colour : this.subColor -allImages : ['EvalString_0'] -if (IntString_1&&(IntString_1 < 0||IntString_1>100)) throw new Error('不透明度范围为0-100,0为透明,100为不透明,不填默认为不透明') -if (IntString_11&&(IntString_11 < 0||IntString_11>100)) throw new Error('不透明度范围为0-100,0为透明,100为不透明,不填默认为不透明') -IntString_0 = IntString_0 ? (', "beforefarme": '+IntString_0+'') : ''; -IntString_1 = IntString_1 ? (', "globalAlpha": '+IntString_1+'') : ''; -IntString_2 = IntString_2 ? (', "cx": '+IntString_2+'') : ''; -IntString_3 = IntString_3 ? (', "cy": '+IntString_3+'') : ''; -IntString_4 = IntString_4 ? (', "cw": '+IntString_4+'') : ''; -IntString_5 = IntString_5 ? (', "ch": '+IntString_5+'') : ''; -IntString_6 = IntString_6 ? (', "x": '+IntString_6+'') : ''; -IntString_7 = IntString_7 ? (', "y": '+IntString_7+'') : ''; -IntString_8 = IntString_8 ? (', "w": '+IntString_8+'') : ''; -IntString_9 = IntString_9 ? (', "h": '+IntString_9+'') : ''; - -IntString_10 = IntString_10 ? (', "afterfarme": '+IntString_10+'') : ''; -IntString_11 = IntString_11 ? (', "aglobalAlpha": '+IntString_11+'') : ''; -IntString_12 = IntString_12 ? (', "acx": '+IntString_12+'') : ''; -IntString_13 = IntString_13 ? (', "acy": '+IntString_13+'') : ''; -IntString_14 = IntString_14 ? (', "acw": '+IntString_14+'') : ''; -IntString_15 = IntString_15 ? (', "ach": '+IntString_15+'') : ''; -IntString_16 = IntString_16 ? (', "ax": '+IntString_16+'') : ''; -IntString_17 = IntString_17 ? (', "ay": '+IntString_17+'') : ''; -IntString_18 = IntString_18 ? (', "aw": '+IntString_18+'') : ''; -IntString_19 = IntString_19 ? (', "ah": '+IntString_19+'') : ''; - -return '{ "image":"'+EvalString_0+'"'+IntString_0+IntString_1+IntString_2+IntString_3+IntString_4+IntString_5+IntString_6+IntString_7+IntString_8+IntString_9+IntString_10+IntString_11+IntString_12+IntString_13+IntString_14+IntString_15+IntString_16+IntString_17+IntString_18+IntString_19+'},' -*/; - -animationDrawablesound - : '音效' EvalString? '起始帧' IntString '是否停止其他音效'Bool? Newline - -/* animationDrawablesound -tooltip : 帧动画配音 -helpUrl : /_docs/#/instruction -default : ["",0,false] -colour : this.subColor -allSounds : ['EvalString_0'] - -return '{ "sound":"'+EvalString_0+'","startfarme":'+IntString_0+',"stopbefore":'+Bool_0+'},' -*/; - -animationDrawabletextEmpty - : Newline - -/* animationDrawabletextEmpty -var code = []; -return code; -*/; - setCurtain_0_s : '更改画面色调' ColorString Colour '动画时间' IntString? BGNL? Newline '渐变方式' MoveMode_List '持续到下一个本事件' Bool '不等待执行完毕' Bool Newline @@ -2787,7 +3000,7 @@ return code; */; setWeather_s - : '更改天气' Weather_List '强度' Int '持续到下个本事件' Bool Newline + : '更改天气' Weather_List '强度' Int Newline /* setWeather_s @@ -2796,8 +3009,8 @@ helpUrl : /_docs/#/instruction default : [null,1,true] colour : this.soundColor if(Int_0<1 || Int_0>10) throw new Error('天气的强度等级, 在1-10之间'); -Bool_0 = Bool_0 ? ', "keep": true' : '' -var code = '{"type": "setWeather", "name": "'+Weather_List_0+'", "level": '+Int_0+Bool_0+'},\n'; + +var code = '{"type": "setWeather", "name": "'+Weather_List_0+'", "level": '+Int_0+'},\n'; if(Weather_List_0===''||Weather_List_0==='null'||Weather_List_0==null)code = '{"type": "setWeather"},\n'; return code; */; @@ -3045,38 +3258,7 @@ var code = '{"type": "playSound", "name": "'+EvalString_0+'"'+Bool_0+IntString_0 return code; */; -playStereo_s - : '播放音效(立体音)' EvalString '左声道音量' Int '右声道音量' Int '启用立体音' Bool? Newline - -/* playStereo_s -tooltip : playSound: 播放音效(立体音) -helpUrl : /_docs/#/instruction -default : ["item.mp3",1,1,true] -colour : this.imageColor -allSounds : ['EvalString_0'] -material : ["./project/sounds/", "EvalString_0"] - -var code = '{"type": "playStereo", "name": "'+EvalString_0+'", "left": '+Int_0+', "right": '+Int_1+', "split": '+Bool_0+'},\n'; -return code; -*/; - -moveStereo_s - : '播放渐变音效(立体音)' EvalString '左声道音量' Int '右声道音量' Int '启用立体音' Bool? BGNL? Newline - '左声道目标音量' Int '右声道目标音量' Int '渐变时长'Int Newline - - -/* moveStereo_s -tooltip : playSound: 播放渐变音效(立体音) -helpUrl : /_docs/#/instruction -default : ["item.mp3",1,1,true,10,10,1000] -colour : this.imageColor -allSounds : ['EvalString_0'] -material : ["./project/sounds/", "EvalString_0"] - -var code = '{"type": "moveStereo", "name": "'+EvalString_0+'", "left": '+Int_0+', "right": '+Int_1+', "split": '+Bool_0+', "leftTo": '+Int_2+', "rightTo": '+Int_3+', "time": '+Int_4+'},\n'; -return code; -*/; playSound_1_s : '播放系统音效' NameMap_List '停止之前音效' Bool? '音调' IntString? '等待播放完毕' Bool? Newline @@ -4517,6 +4699,10 @@ B_0_List B_1_List : '不改变'|'设为粗体'|'取消粗体' /*B_1_List ['null','true','false']*/; + +Absolute_List + :'绝对模式'|'相对模式' + /*Absolute_List ['false','true']*/; Bg_Fg_List : '背景层'|'前景层' @@ -4612,8 +4798,8 @@ IdString ; FixedId_List - : '生命'|'生命上限'|'攻击'|'防御'|'护盾'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'护盾增益' - /*FixedId_List ['status:hp','status:hpmax','status:atk','status:def','status:mdef','item:yellowKey','item:blueKey','item:redKey','status:money','status:exp','status:mana','status:manamax','status:x','status:y','status:direction','buff:atk','buff:def','buff:mdef']*/; + : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'法抗比例'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'法强增益'|'魔攻增益'|'法抗增益'|'护盾增益' + /*FixedId_List ['status:hp','status:hpmax','status:atk','status:def','status:spell','status:matk','status:mhp','status:mdef','item:yellowKey','item:blueKey','item:redKey','status:money','status:exp','status:mana','status:manamax','status:x','status:y','status:direction','buff:atk','buff:def','buff:spell','buff:matk','buff:mdef','buff:mhp']*/; Id_List : '变量' | '状态' | '物品' | '增益' | '独立开关' | '临时变量' |'全局存储' @@ -4628,8 +4814,8 @@ EnemyPoint_List /*EnemyPoint_List ['hp','atk','def','money','exp','point','name']*/; Equip_List - : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔力'|'魔力上限'|'速度' - /*Equip_List ['hp','hpmax','atk','def','mdef','mana','manamax','speed']*/; + : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'法抗百分比'|'魔力'|'魔力上限'|'速度' + /*Equip_List ['hp','hpmax','atk','def','spell','matk','mhp','mdef','mana','manamax','speed']*/; Key_List : '黄钥匙'|'蓝钥匙'|'红钥匙'|'绿钥匙'|'铁门钥匙' @@ -4647,6 +4833,10 @@ MoveMode_List : '匀速移动'|'缓入快出'|'快入缓出'|'缓入缓出'|'随机' /*MoveMode_List ['', 'easeIn', 'easeOut', 'easeInOut', 'random']*/; +MoveMode2_List + : '匀速移动'|'慢-快'|'快-慢'|'慢-快-慢'|'快-慢-快' + /*MoveMode2_List ['', 'in', 'out', 'in-out', 'center']*/; + NameMap_List : '确定'|'取消'|'操作失败'|'光标移动'|'打开界面'|'读档'|'存档'|'获得道具'|'回血'|'宝石'|'炸弹'|'飞行器'|'开关门'|'上下楼'|'跳跃'|'破墙镐'|'破冰镐'|'阻激夹域'|'穿脱装备'|'商店' /*NameMap_List ['确定','取消','操作失败','光标移动','打开界面','读档','存档','获得道具','回血','宝石','炸弹','飞行器','开关门','上下楼','跳跃','破墙镐','破冰镐','阻激夹域','穿脱装备','商店']*/; diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 06c2081..9c9fd92 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -542,6 +542,12 @@ MotaActionParser = function () { ); } break; + case "cgtextList": + this.next = MotaActionBlocks["cgtextList_s"].xmlText([ + data.textList, + this.next, + ]); + break; case "cgtext": // cg对话框 var buildcgDrawing = function (obj) { obj = MotaActionFunctions.processcgDrawing(obj || []); @@ -560,16 +566,12 @@ MotaActionParser = function () { return res; }; this.next = MotaActionBlocks["cgtext_s"].xmlText([ - data.bg, - data.memory, data.WindowSkin, + data.index, data.head.name, - data.name || "", data.head.px || -300, data.time, data.wait, - data.sound, - data.text, buildcgDrawing(data.bodyList), this.next, ]); @@ -620,6 +622,20 @@ MotaActionParser = function () { case "setcgs": this.next = MotaActionBlocks["setcgs_s"].xmlText([data.img, this.next]); break; + case "setmusics": + this.next = MotaActionBlocks["setmusics_s"].xmlText([ + data.bgm, + this.next, + ]); + break; + case "introAndLoop": + this.next = MotaActionBlocks["introAndLoop_s"].xmlText([ + data.intro, + data.time, + data.loop, + this.next, + ]); + break; case "comment": // 注释 this.next = MotaActionBlocks["comment_s"].xmlText([ this.EvalString_Multi(data.text), @@ -713,141 +729,7 @@ MotaActionParser = function () { this.next, ]); break; - case "setanimate": - var buildanimateDrawableimage = function (obj) { - obj = MotaActionFunctions.processanimateDrawableimage(obj || []); - var res = null; - for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { - res = MotaActionBlocks["animateDrawableimage"].xmlText([ - one[0], - one[1], - one[2], - one[3], - one[4], - one[5], - one[6], - one[7], - one[8], - one[9], - one[10], - one[11], - one[12], - one[13], - one[14], - one[15], - one[16], - one[17], - one[18], - one[19], - one[20], - one[21], - one[22], - res, - ]); - } - return res; - }; - var buildanimateDrawablesound = function (obj) { - obj = MotaActionFunctions.processanimateDrawablesound(obj || []); - var res = null; - for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { - res = MotaActionBlocks["animateDrawablesound"].xmlText([ - one[0], - one[1], - one[2], - res, - ]); - } - return res; - }; - this.next = MotaActionBlocks["setanimate_s"].xmlText([ - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - buildanimateDrawableimage(data.imageList), - buildanimateDrawablesound(data.soundList), - this.next, - ]); - break; - case "clearanimate": - this.next = MotaActionBlocks["clearanimate_s"].xmlText([this.next]); - break; - case "deleteanimate": - this.next = MotaActionBlocks["deleteanimate_s"].xmlText([ - data.name, - this.next, - ]); - break; - case "playanimate": - this.next = MotaActionBlocks["playanimate_s"].xmlText([ - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley, - this.next, - ]); - break; - case "animationDrawable": - var buildanimationDrawableimage = function (obj) { - obj = MotaActionFunctions.processanimationDrawableimage(obj || []); - var res = null; - for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { - res = MotaActionBlocks["animationDrawableimage"].xmlText([ - one[0], - one[1], - one[2], - one[3], - one[4], - one[5], - one[6], - one[7], - one[8], - one[9], - one[10], - one[11], - one[12], - one[13], - one[14], - one[15], - one[16], - one[17], - one[18], - one[19], - one[20], - res, - ]); - } - return res; - }; - var buildanimationDrawablesound = function (obj) { - obj = MotaActionFunctions.processanimationDrawablesound(obj || []); - var res = null; - for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { - res = MotaActionBlocks["animationDrawablesound"].xmlText([ - one[0], - one[1], - one[2], - res, - ]); - } - return res; - }; - this.next = MotaActionBlocks["animationDrawable_s"].xmlText([ - data.allFarme, - data.color, - "rgba(" + data.color + ")", - data.globalAlpha, - buildanimationDrawableimage(data.imageList), - buildanimationDrawablesound(data.soundList), - this.next, - ]); - break; - + case "tip": this.next = MotaActionBlocks["tip_s"].xmlText([ data.text, @@ -1135,6 +1017,64 @@ MotaActionParser = function () { ]); } break; + case "animationDrawable": + var buildanimationDrawableimage = function (obj) { + obj = MotaActionFunctions.processanimationDrawableimage(obj || []); + var res = null; + for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { + res = MotaActionBlocks["animationDrawableimage"].xmlText([ + one[0], + one[1], + one[2], + one[3], + one[4], + one[5], + one[6], + one[7], + one[8], + one[9], + one[10], + one[11], + one[12], + one[13], + one[14], + one[15], + one[16], + one[17], + one[18], + one[19], + one[20], + one[21], + one[22], + res, + ]); + } + return res; + }; + var buildanimationDrawablesound = function (obj) { + obj = MotaActionFunctions.processanimationDrawablesound(obj || []); + var res = null; + for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { + res = MotaActionBlocks["animationDrawablesound"].xmlText([ + one[0], + one[1], + one[2], + res, + ]); + } + return res; + }; + this.next = MotaActionBlocks["animationDrawable_s"].xmlText([ + data.allFarme, + data.color, + "rgba(" + data.color + ")", + data.globalAlpha, + buildanimationDrawableimage(data.imageList), + buildanimationDrawablesound(data.soundList), + this.next, + ]); + break; + case "jumpHero": // 跳跃勇士 if (data.dxy) { this.next = MotaActionBlocks["jumpHero_1_s"].xmlText([ @@ -1219,12 +1159,161 @@ MotaActionParser = function () { ]); } break; + case "animateResize": // 停止所有动画 + this.next = MotaActionBlocks["animateResize_s"].xmlText([ + data.name, + data.id||"", + data.centerX||"", + data.centerY||"", + data.hero||false, + data.reverse||false, + data.loop||false, + data.async || false, + this.next, + ]); + break; + case "pauseAnimate": // 暂停所有动画 + this.next = MotaActionBlocks["pauseAnimate_s"].xmlText([ + data.id||"", + this.next, + ]); + break; + case "remuseAnimate": // 继续所有动画 + this.next = MotaActionBlocks["remuseAnimate_s"].xmlText([ + data.id||"", + this.next, + ]); + break; case "stopAnimate": // 停止所有动画 this.next = MotaActionBlocks["stopAnimate_s"].xmlText([ + data.id||"", data.doCallback || false, this.next, ]); break; + case "setanimate": + var buildanimateDrawableimage = function (obj) { + obj = MotaActionFunctions.processanimateDrawableimage(obj || []); + var res = null; + for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { + res = MotaActionBlocks["animateDrawableimage"].xmlText([ + one[0], + one[1], + one[2], + one[3], + one[4], + one[5], + one[6], + one[7], + one[8], + one[9], + one[10], + one[11], + one[12], + one[13], + one[14], + one[15], + one[16], + one[17], + one[18], + one[19], + one[20], + one[21], + one[22], + res, + ]); + } + return res; + }; + var buildanimateDrawablesound = function (obj) { + obj = MotaActionFunctions.processanimateDrawablesound(obj || []); + var res = null; + for (var ii = obj.length - 1, one; (one = obj[ii]); ii--) { + res = MotaActionBlocks["animateDrawablesound"].xmlText([ + one[0], + one[1], + one[2], + res, + ]); + } + return res; + }; + this.next = MotaActionBlocks["setanimate_s"].xmlText([ + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + buildanimateDrawableimage(data.imageList), + buildanimateDrawablesound(data.soundList), + this.next, + ]); + break; + case "clearanimate": + this.next = MotaActionBlocks["clearanimate_s"].xmlText([ + data.id||"", + this.next]); + break; + case "animateloop": + this.next = MotaActionBlocks["animateloop_s"].xmlText([ + data.id||"", + data.loop, + this.next]); + break; + case "animatemove": + this.next = MotaActionBlocks["animatemove_s"].xmlText([ + data.id||0, + data.px||0, + data.py||0, + data.relative, + data.time||0, + data.style||"", + this.next]); + break; + case "moveAnimate": + this.next = MotaActionBlocks["moveAnimate_s"].xmlText([ + data.id||0, + data.px||0, + data.py||0, + data.time||0, + data.relative, + data.style||"", + this.next]); + break; + + case "animatereverse": + this.next = MotaActionBlocks["animatereverse_s"].xmlText([ + data.id||"", + data.reverse, + this.next]); + break; + case "animatepause": + this.next = MotaActionBlocks["animatepause_s"].xmlText([ + data.id||"", + data.pause, + this.next]); + break; + case "deleteanimate": + this.next = MotaActionBlocks["deleteanimate_s"].xmlText([ + data.name, + this.next, + ]); + break; + case "playanimate": + this.next = MotaActionBlocks["playanimate_s"].xmlText([ + data.name, + data.id||"", + data.x, + data.y, + data.hero, + data.scalex||1, + data.scaley||1, + data.loop||false, + data.reverse||false, + this.next, + ]); + break; case "setViewport": // 设置视角 if (data.dxy) { this.next = MotaActionBlocks["setViewport_1_s"].xmlText([ @@ -1405,7 +1494,6 @@ MotaActionParser = function () { this.next = MotaActionBlocks["setWeather_s"].xmlText([ data.name, data.level || 1, - data.keep || false, this.next, ]); break; @@ -1506,27 +1594,6 @@ MotaActionParser = function () { ]); } break; - case "playStereo": - this.next = MotaActionBlocks["playStereo_s"].xmlText([ - data.name, - data.left, - data.right, - data.split || true, - this.next, - ]); - break; - case "moveStereo": - this.next = MotaActionBlocks["moveStereo_s"].xmlText([ - data.name, - data.left, - data.right, - data.split || true, - data.leftTo, - data.rightTo, - data.time, - this.next, - ]); - break; case "playSound": var knownItems = MotaActionBlocks["NameMap_List"].options.map(function ( one @@ -1996,7 +2063,7 @@ MotaActionParser = function () { this.next, ]); break; - case "changebg": // 等待多少毫秒 + case "changebg": // 改变背景 this.next = MotaActionBlocks["changebg_s"].xmlText([ data.img1 ?? "", data.memory1 ?? false, @@ -2007,6 +2074,18 @@ MotaActionParser = function () { this.next, ]); break; + case "drawbackground": // 绘制背景 + this.next = MotaActionBlocks["drawbackground_s"].xmlText([ + data.image ?? "", + data.memory ?? false, + this.next, + ]); + break; + case "clearbackground": // 清除背景 + this.next = MotaActionBlocks["clearbackground_s"].xmlText([ + this.next, + ]); + break; case "wait": // 等待用户操作 var case_waitList = null; if (data.data) { @@ -2107,6 +2186,7 @@ MotaActionParser = function () { this.next = MotaActionBlocks["drawWarning_s"].xmlText([ data.x, data.y, + data.large, data.size, data?.text, data?.text2, @@ -2916,56 +2996,7 @@ MotaActionParser = function () { }); return list; }; - MotaActionFunctions.processovertext = function (overList) { - var list = []; - overList.forEach(function (one) { - list.push([ - one.text, - one.sound, - one.time, - one.textColor, - one.boldColor, - one.font, - ]); - }); - return list; - }; - MotaActionFunctions.processanimationDrawableimage = function (overList) { - var list = []; - overList.forEach(function (one) { - list.push([ - one.image, - one.beforefarme, - one.globalAlpha, - one.cx, - one.cy, - one.cw, - one.ch, - one.x, - one.y, - one.w, - one.h, - one.afterfarme, - one.aglobalAlpha, - one.acx, - one.acy, - one.acw, - one.ach, - one.ax, - one.ay, - one.aw, - one.ah, - ]); - }); - return list; - }; - MotaActionFunctions.processanimationDrawablesound = function (overList) { - var list = []; - overList.forEach(function (one) { - list.push([one.sound, one.startfarme, one.stopbefore]); - }); - return list; - }; + MotaActionFunctions.processanimateDrawableimage = function (overList) { var list = []; overList.forEach(function (one) { @@ -3004,6 +3035,21 @@ MotaActionParser = function () { }); return list; }; + MotaActionFunctions.processovertext = function (overList) { + var list = []; + overList.forEach(function (one) { + list.push([ + one.text, + one.sound, + one.time, + one.textColor, + one.boldColor, + one.font, + ]); + }); + return list; + }; + MotaActionFunctions.processMultiLoc = function (EvalString_0, EvalString_1) { var floorstr = ""; if (EvalString_0 && EvalString_1) { @@ -3277,6 +3323,45 @@ MotaActionParser = function () { return str; }; + MotaActionFunctions.processanimationDrawableimage = function (overList) { + var list = []; + overList.forEach(function (one) { + list.push([ + one.image, + one.beforefarme, + one.globalAlpha, + one.cx, + one.cy, + one.cw, + one.ch, + one.x, + one.y, + one.w, + one.h, + one.angle, + one.afterfarme, + one.aglobalAlpha, + one.acx, + one.acy, + one.acw, + one.ach, + one.ax, + one.ay, + one.aw, + one.ah, + one.aangle + ]); + }); + return list; + }; + MotaActionFunctions.processanimationDrawablesound = function (overList) { + var list = []; + overList.forEach(function (one) { + list.push([one.sound, one.startfarme, one.stopbefore]); + }); + return list; + }; + MotaActionFunctions.replaceFromName = function (str) { if (!str || MotaActionFunctions.disableReplace) return str; var map = {}, diff --git a/_server/config.json b/_server/config.json deleted file mode 100644 index bdcb574..0000000 --- a/_server/config.json +++ /dev/null @@ -1 +0,0 @@ -{"viewportLoc":[0,0],"editorLastFloorId":"jiedao"} \ No newline at end of file diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 4f0f62d..a3433b1 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -354,6 +354,21 @@ editor_blockly = function () { editor.uievent.previewUI([{ type: "drawImage", image: obj.name, x: obj.loc[0], y: obj.loc[1] }]); } break; + case 'animateResize_s': // 显示动画 + if (obj.name && obj.centerX&&obj.centerY) { + editor.uievent.previewUI([{ type: "fillRect", x:obj.centerX-5, y: obj.centerY-5, width:10, height: 10, style:"#FF0000"}]); + } + break; + case 'playanimate_s': // 显示帧动画 + if (obj.name && obj.x&&obj.y) { + editor.uievent.previewUI([{ type: "fillRect", x:obj.x-5, y: obj.y-5, width:10, height: 10, style:"#FF0000"}]); + } + break; + case 'animatemove_s': // 移动帧动画 + + editor.uievent.previewUI([{ type: "fillRect", x:obj.px-5, y: obj.py-5, width:10, height: 10, style:"#FF0000"}]); + + break; case 'setCurtain_0_s': // 更改色调 if (obj.color) { editor.uievent.previewUI([{ type: "fillRect", x: 0, y: 0, width: core.__PIXELS__, height: core.__PIXELS__, style: obj.color }]); diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index 6c99618..b0f038c 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -132,8 +132,8 @@ editor_blocklyconfig = function () { MotaActionFunctions.actionParser.parse( { time: 160, - openSound: "door.mp3", - closeSound: "door.mp3", + openSound: "door.opus", + closeSound: "door.opus", keys: { yellowKey: 1, orangeKey: 1 }, }, "doorInfo" @@ -142,9 +142,9 @@ editor_blocklyconfig = function () { MotaActionBlocks["mainStyle_m"].xmlText(), MotaActionFunctions.actionParser.parse( { - 背景音乐: "bgm.mp3", - 确定: "confirm.mp3", - 攻击: "attack.mp3", + 背景音乐: "bgm.opus", + 确定: "confirm.opus", + 攻击: "attack.opus", 背景图: "bg.jpg", 领域: "zone", 文件名: "file.jpg", diff --git a/_server/table/comment.js b/_server/table/comment.js index f8660c0..98f7d1a 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -116,6 +116,14 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_lint": true, "_docs": "能否使用或装备", "_data": "当前能否使用或装备该道具,仅对cls不为items有效。null表示始终不可使用但可装备" + }, + "canBatchUse": { + "_leaf": true, + "_type": "textarea", + "_string": true, + "_lint": true, + "_docs": "能否批量使用", + "_data": "该道具是否允许批量使用,仅对cls为tools或constants有效,true表示可批量使用。建议同时勾选【回放不绘制道具栏】" } } }, @@ -192,7 +200,14 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "mdef": { "_leaf": true, "_type": "textarea", - "_data": "法抗(写为小数)" + "_docs": "法抗", + "_data": "百分数,如10为10%法抗,怪物受到勇士的法术伤害减免比例" + + }, + "spell": { + "_leaf": true, + "_type": "textarea", + "_data": "法强" }, "speed": { "_leaf": true, @@ -389,7 +404,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { } } }, - "enemys_template": { 'name': '新敌人', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'exp': 0, 'point': 0, 'special': [] }, + "enemys_template": { 'name': '新敌人', 'hp': 0, 'atk': 0, 'def': 0, 'mdef': 0, 'speed': 1, 'money': 0, 'exp': 0, 'point': 0, 'special': [] }, // --------------------------- 【图块属性】相关的表格配置 --------------------------- // diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js index 3a76bd7..17faa7f 100644 --- a/_server/table/data.comment.js +++ b/_server/table/data.comment.js @@ -264,10 +264,27 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_data": "防御" }, + "spell": { + "_leaf": true, + "_type": "textarea", + "_data": "法强", + }, "mdef": { "_leaf": true, "_type": "textarea", - "_data": "法强" + "_data": "法抗百分比", + }, + "matk": { + "_leaf": true, + "_type": "textarea", + "_data": "100为法强转化为等值魔攻", + "_docs": "魔攻比例" + }, + "mhp": { + "_leaf": true, + "_type": "textarea", + "_data": "100为法强转化为等值护盾", + "_docs": "护盾比例" }, "speed": { "_leaf": true, @@ -435,6 +452,12 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_docs": "绿宝石值", }, + "yellowGem": { + "_leaf": true, + "_type": "textarea", + "_docs": "黄宝石值", + }, + "redPotion": { "_leaf": true, "_type": "textarea", diff --git a/_server/table/plugins.comment.js b/_server/table/plugins.comment.js index a02e298..a9cb7a1 100644 --- a/_server/table/plugins.comment.js +++ b/_server/table/plugins.comment.js @@ -122,6 +122,18 @@ var plugins_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_range": "typeof(thiseval)=='string' || thiseval==null", "_data": "音乐鉴赏" + }, + "intro&loop": { + "_leaf": true, + "_type": "textarea", + "_range": "typeof(thiseval)=='string' || thiseval==null", + "_data": "背景音乐拼接" + }, + "scrollingText": { + "_leaf": true, + "_type": "textarea", + "_range": "typeof(thiseval)=='string' || thiseval==null", + "_data": "接收&发送在线留言" } } if (obj[key]) return obj[key]; diff --git a/index.html b/index.html index c49e005..a316bc3 100644 --- a/index.html +++ b/index.html @@ -47,6 +47,20 @@ startImageDiv.classList.add("startImageDivAnimation"); // 注释下面这句话以禁止单击立刻跳过开场动画 startImageBackgroundDiv.onclick = onAnimationEnd; + // 新增加载图片轮播逻辑 + const slides = document.querySelectorAll('.loading-slide'); + let currentSlide = 0; + + const slideInterval = setInterval(() => { + slides[currentSlide].classList.remove('active'); + currentSlide = (currentSlide + 1) % slides.length; + slides[currentSlide].classList.add('active'); + }, 3000); + + // 在加载完成时清除定时器 + window.addEventListener('load', () => { + clearInterval(slideInterval); + }); }; startImageLogo.onerror = function () {}; startImageLogo.src = "logo.png"; @@ -58,6 +72,14 @@ <img id="musicBtn" /> <div id="startPanel"> <div id="startTop"> + <!-- 新增图片展示区域 --> + <div id='startTopGallery'> + <img src='project/images/bg_1511.webp' class='loading-slide active' /> + <img src='project/images/bg_1521.webp' class='loading-slide'/> + <img src='project/images/bg_2011.webp' class='loading-slide'/> + <img src='project/images/bg_2521.webp' class='loading-slide'/> + <img src='project/images/bg_3026.webp' class='loading-slide'/> + </div> <div id="startTopProgressBar"> <div id="startTopProgress"></div> </div> diff --git a/libs/control.js b/libs/control.js index c6e4f30..93b4a0a 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1,4 +1,3 @@ - /* control.js:游戏主要逻辑控制 主要负责status相关内容,以及各种变量获取/存储 @@ -7,57 +6,93 @@ control.js:游戏主要逻辑控制 "use strict"; -function control () { - this._init(); +function control() { + this._init(); } control.prototype._init = function () { - this.controldata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.control; - this.renderFrameFuncs = []; - this.replayActions = []; - this.weathers = {}; - this.resizes = []; - this.noAutoEvents = true; - this.updateNextFrame = false; - // --- 注册系统的animationFrame - this.registerAnimationFrame("totalTime", false, this._animationFrame_totalTime); - this.registerAnimationFrame("autoSave", true, this._animationFrame_autoSave); - this.registerAnimationFrame("globalAnimate", true, this._animationFrame_globalAnimate); - this.registerAnimationFrame("animate", true, this._animationFrame_animate); - this.registerAnimationFrame("heroMoving", true, this._animationFrame_heroMoving); - this.registerAnimationFrame("weather", true, this._animationFrame_weather); - this.registerAnimationFrame("tip", true, this._animateFrame_tip); - this.registerAnimationFrame("parallelDo", false, this._animationFrame_parallelDo); - // --- 注册系统的天气 - this.registerWeather("rain", this._weather_rain, this._animationFrame_weather_rain); - this.registerWeather("snow", this._weather_snow, this._animationFrame_weather_snow); - this.registerWeather("fog", this._weather_fog, this.__animateFrame_weather_image); - this.registerWeather("cloud", this._weather_cloud, this.__animateFrame_weather_image); - this.registerWeather("sun", this._weather_sun, this._animationFrame_weather_sun); - // --- 注册系统的replay - this.registerReplayAction("move", this._replayAction_move); - this.registerReplayAction("item", this._replayAction_item); - this.registerReplayAction("equip", this._replayAction_equip); - this.registerReplayAction("unEquip", this._replayAction_unEquip); - this.registerReplayAction("saveEquip", this._replayAction_saveEquip); - this.registerReplayAction("loadEquip", this._replayAction_loadEquip); - this.registerReplayAction("fly", this._replayAction_fly); - this.registerReplayAction("shop", this._replayAction_shop); - this.registerReplayAction("turn", this._replayAction_turn); - this.registerReplayAction("getNext", this._replayAction_getNext); - this.registerReplayAction("moveDirectly", this._replayAction_moveDirectly); - this.registerReplayAction("key", this._replayAction_key); - this.registerReplayAction("click", this._replayAction_click); - this.registerReplayAction("ignoreInput", this._replayAction_ignoreInput); - this.registerReplayAction("no", this._replayAction_no); - // --- 注册系统的resize - this.registerResize("gameGroup", this._resize_gameGroup); - this.registerResize("canvas", this._resize_canvas); - this.registerResize("statusBar", this._resize_statusBar); - this.registerResize("status", this._resize_status); - this.registerResize("toolBar", this._resize_toolBar); - this.registerResize("tools", this._resize_tools); -} + this.controldata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.control; + this.renderFrameFuncs = []; + this.replayActions = []; + this.weathers = {}; + this.resizes = []; + this.noAutoEvents = true; + this.updateNextFrame = false; + // --- 注册系统的animationFrame + this.registerAnimationFrame( + "totalTime", + false, + this._animationFrame_totalTime + ); + this.registerAnimationFrame("autoSave", true, this._animationFrame_autoSave); + this.registerAnimationFrame( + "globalAnimate", + true, + this._animationFrame_globalAnimate + ); + this.registerAnimationFrame("animate", true, this._animationFrame_animate); + this.registerAnimationFrame( + "heroMoving", + true, + this._animationFrame_heroMoving + ); + this.registerAnimationFrame("weather", true, this._animationFrame_weather); + this.registerAnimationFrame("tip", true, this._animateFrame_tip); + this.registerAnimationFrame( + "parallelDo", + false, + this._animationFrame_parallelDo + ); + // --- 注册系统的天气 + this.registerWeather( + "rain", + this._weather_rain, + this._animationFrame_weather_rain + ); + this.registerWeather( + "snow", + this._weather_snow, + this._animationFrame_weather_snow + ); + this.registerWeather( + "fog", + this._weather_fog, + this.__animateFrame_weather_image + ); + this.registerWeather( + "cloud", + this._weather_cloud, + this.__animateFrame_weather_image + ); + this.registerWeather( + "sun", + this._weather_sun, + this._animationFrame_weather_sun + ); + // --- 注册系统的replay + this.registerReplayAction("move", this._replayAction_move); + this.registerReplayAction("item", this._replayAction_item); + this.registerReplayAction("equip", this._replayAction_equip); + this.registerReplayAction("unEquip", this._replayAction_unEquip); + this.registerReplayAction("saveEquip", this._replayAction_saveEquip); + this.registerReplayAction("loadEquip", this._replayAction_loadEquip); + this.registerReplayAction("fly", this._replayAction_fly); + this.registerReplayAction("shop", this._replayAction_shop); + this.registerReplayAction("turn", this._replayAction_turn); + this.registerReplayAction("getNext", this._replayAction_getNext); + this.registerReplayAction("moveDirectly", this._replayAction_moveDirectly); + this.registerReplayAction("key", this._replayAction_key); + this.registerReplayAction("click", this._replayAction_click); + this.registerReplayAction("ignoreInput", this._replayAction_ignoreInput); + this.registerReplayAction("no", this._replayAction_no); + // --- 注册系统的resize + this.registerResize("gameGroup", this._resize_gameGroup); + this.registerResize("canvas", this._resize_canvas); + this.registerResize("statusBar", this._resize_statusBar); + this.registerResize("status", this._resize_status); + this.registerResize("toolBar", this._resize_toolBar); + this.registerResize("tools", this._resize_tools); +}; // ------ requestAnimationFrame 相关 ------ // @@ -65,1542 +100,1938 @@ control.prototype._init = function () { // name:名称,可用来作为注销使用;needPlaying:是否只在游戏运行时才执行(在标题界面不执行) // func:要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数 control.prototype.registerAnimationFrame = function (name, needPlaying, func) { - this.unregisterAnimationFrame(name); - this.renderFrameFuncs.push({ name: name, needPlaying: needPlaying, func: func }); -} + this.unregisterAnimationFrame(name); + this.renderFrameFuncs.push({ + name: name, + needPlaying: needPlaying, + func: func, + }); +}; ////// 注销一个 animationFrame ////// control.prototype.unregisterAnimationFrame = function (name) { - this.renderFrameFuncs = this.renderFrameFuncs.filter(function (x) { return x.name != name; }); -} + this.renderFrameFuncs = this.renderFrameFuncs.filter(function (x) { + return x.name != name; + }); +}; ////// 设置requestAnimationFrame ////// control.prototype._setRequestAnimationFrame = function () { - this._checkRequestAnimationFrame(); - core.animateFrame.totalTime = Math.max(core.animateFrame.totalTime, core.getLocalStorage('totalTime', 0)); - var loop = function (timestamp) { - core.control.renderFrameFuncs.forEach(function (b) { - if (b.func) { - try { - if (core.isPlaying() || !b.needPlaying) - core.doFunc(b.func, core.control, timestamp); - } - catch (e) { - console.error(e); - console.error("ERROR in requestAnimationFrame[" + b.name + "]:已自动注销该项。"); - core.unregisterAnimationFrame(b.name); - } - } - }) - window.requestAnimationFrame(loop); - } + this._checkRequestAnimationFrame(); + core.animateFrame.totalTime = Math.max( + core.animateFrame.totalTime, + core.getLocalStorage("totalTime", 0) + ); + var loop = function (timestamp) { + core.control.renderFrameFuncs.forEach(function (b) { + if (b.func) { + try { + if (core.isPlaying() || !b.needPlaying) + core.doFunc(b.func, core.control, timestamp); + } catch (e) { + console.error(e); + console.error( + "ERROR in requestAnimationFrame[" + b.name + "]:已自动注销该项。" + ); + core.unregisterAnimationFrame(b.name); + } + } + }); window.requestAnimationFrame(loop); -} + }; + window.requestAnimationFrame(loop); +}; control.prototype._checkRequestAnimationFrame = function () { - (function () { - var lastTime = 0; - var vendors = ['webkit', 'moz']; - for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; - window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || // Webkit中此取消方法的名字变了 - window[vendors[x] + 'CancelRequestAnimationFrame']; - } + (function () { + var lastTime = 0; + var vendors = ["webkit", "moz"]; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = + window[vendors[x] + "RequestAnimationFrame"]; + window.cancelAnimationFrame = + window[vendors[x] + "CancelAnimationFrame"] || // Webkit中此取消方法的名字变了 + window[vendors[x] + "CancelRequestAnimationFrame"]; + } - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function (callback, element) { - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16.7 - (currTime - lastTime)); - var id = window.setTimeout(function () { - callback(currTime + timeToCall); - }, timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - } - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function (id) { - clearTimeout(id); - }; - } - }()); -} + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function (callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16.7 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; + } + })(); +}; control.prototype._animationFrame_totalTime = function (timestamp) { - core.animateFrame.totalTime += timestamp - core.animateFrame.totalTimeStart; - core.animateFrame.totalTimeStart = timestamp; - if (core.isPlaying()) { - core.status.hero.statistics.totalTime = core.animateFrame.totalTime; - core.status.hero.statistics.currTime += timestamp - (core.status.hero.statistics.start || timestamp); - core.status.hero.statistics.start = timestamp; - } -} + core.animateFrame.totalTime += timestamp - core.animateFrame.totalTimeStart; + core.animateFrame.totalTimeStart = timestamp; + if (core.isPlaying()) { + core.status.hero.statistics.totalTime = core.animateFrame.totalTime; + core.status.hero.statistics.currTime += + timestamp - (core.status.hero.statistics.start || timestamp); + core.status.hero.statistics.start = timestamp; + } +}; control.prototype._animationFrame_autoSave = function (timestamp) { - if (timestamp - core.saves.autosave.time <= 5000) return; - core.control.checkAutosave(); - core.saves.autosave.time = timestamp; -} + if (timestamp - core.saves.autosave.time <= 5000) return; + core.control.checkAutosave(); + core.saves.autosave.time = timestamp; +}; control.prototype._animationFrame_globalAnimate = function (timestamp) { - if (timestamp - core.animateFrame.globalTime <= core.values.animateSpeed) return; - core.status.globalAnimateStatus++; - if (core.status.floorId) { - // Global Animate - core.status.globalAnimateObjs.forEach(function (block) { - core.drawBlock(block, core.status.globalAnimateStatus); - }); + if (timestamp - core.animateFrame.globalTime <= core.values.animateSpeed) + return; + core.status.globalAnimateStatus++; + if (core.status.floorId) { + // Global Animate + core.status.globalAnimateObjs.forEach(function (block) { + core.drawBlock(block, core.status.globalAnimateStatus); + }); - // Global floor images - core.maps._drawFloorImages(core.status.floorId, core.canvas.bg, 'bg', core.status.floorAnimateObjs || [], core.status.globalAnimateStatus); - core.maps._drawFloorImages(core.status.floorId, core.canvas.fg, 'fg', core.status.floorAnimateObjs || [], core.status.globalAnimateStatus); + // Global floor images + core.maps._drawFloorImages( + core.status.floorId, + core.canvas.bg, + "bg", + core.status.floorAnimateObjs || [], + core.status.globalAnimateStatus + ); + core.maps._drawFloorImages( + core.status.floorId, + core.canvas.fg, + "fg", + core.status.floorAnimateObjs || [], + core.status.globalAnimateStatus + ); - // Global Autotile Animate - core.status.autotileAnimateObjs.forEach(function (block) { - core.maps._drawAutotileAnimate(block, core.status.globalAnimateStatus); - }); + // Global Autotile Animate + core.status.autotileAnimateObjs.forEach(function (block) { + core.maps._drawAutotileAnimate(block, core.status.globalAnimateStatus); + }); - // Global hero animate - if ((core.status.hero || {}).animate && core.status.heroMoving == 0 && main.mode == 'play' && !core.status.preview.enabled) { - core.drawHero('stop', null, core.status.globalAnimateStatus); - } + // Global hero animate + if ( + (core.status.hero || {}).animate && + core.status.heroMoving == 0 && + main.mode == "play" && + !core.status.preview.enabled + ) { + core.drawHero("stop", null, core.status.globalAnimateStatus); } - // Box animate - core.drawBoxAnimate(); - core.animateFrame.globalTime = timestamp; -} + } + // Box animate + core.drawBoxAnimate(); + core.animateFrame.globalTime = timestamp; +}; control.prototype._animationFrame_animate = function (timestamp) { - if (timestamp - core.animateFrame.animateTime < 50 || !core.status.animateObjs || core.status.animateObjs.length == 0) return; - core.clearMap('animate'); - // 更新帧 - for (var i = 0; i < core.status.animateObjs.length; i++) { - var obj = core.status.animateObjs[i]; - if (obj.index == obj.animate.frames.length) { - (function (callback) { - setTimeout(function () { - if (callback) callback(); - }); - })(obj.callback); - } + if ( + timestamp - core.animateFrame.animateTime < 50 || + !core.status.animateObjs || + core.status.animateObjs.length == 0 + ) + return; + core.clearMap("animate"); + // 更新帧 + for (var i = 0; i < core.status.animateObjs.length; i++) { + var obj = core.status.animateObjs[i]; + if (obj.index == obj.animate.frames.length) { + (function (callback) { + setTimeout(function () { + if (callback) callback(); + }); + })(obj.callback); } - core.status.animateObjs = core.status.animateObjs.filter(function (obj) { - return obj.index < obj.animate.frames.length; - }); - core.status.animateObjs.forEach(function (obj) { - if (obj.hero) { - core.maps._drawAnimateFrame('animate', obj.animate, core.status.heroCenter.px, core.status.heroCenter.py, obj.index++); - } else { - core.maps._drawAnimateFrame('animate', obj.animate, obj.centerX, obj.centerY, obj.index++); - } - }); - core.animateFrame.animateTime = timestamp; -} + } + core.status.animateObjs = core.status.animateObjs.filter(function (obj) { + return obj.index < obj.animate.frames.length; + }); + core.status.animateObjs.forEach(function (obj) { + if (obj.hero) { + core.maps._drawAnimateFrame( + "animate", + obj.animate, + core.status.heroCenter.px, + core.status.heroCenter.py, + obj.index++ + ); + } else { + core.maps._drawAnimateFrame( + "animate", + obj.animate, + obj.centerX, + obj.centerY, + obj.index++ + ); + } + }); + core.animateFrame.animateTime = timestamp; +}; control.prototype._animationFrame_heroMoving = function (timestamp) { - if (core.status.heroMoving <= 0) return; - // 换腿 - if (timestamp - core.animateFrame.moveTime > core.values.moveSpeed) { - core.animateFrame.leftLeg = !core.animateFrame.leftLeg; - core.animateFrame.moveTime = timestamp; - } - core.drawHero(core.animateFrame.leftLeg ? 'leftFoot' : 'rightFoot', 4 * core.status.heroMoving); -} + if (core.status.heroMoving <= 0) return; + // 换腿 + if (timestamp - core.animateFrame.moveTime > core.values.moveSpeed) { + core.animateFrame.leftLeg = !core.animateFrame.leftLeg; + core.animateFrame.moveTime = timestamp; + } + core.drawHero( + core.animateFrame.leftLeg ? "leftFoot" : "rightFoot", + 4 * core.status.heroMoving + ); +}; control.prototype._animationFrame_weather = function (timestamp) { - var weather = core.animateFrame.weather, type = weather.type; - if (!core.dymCanvas.weather || !core.control.weathers[type] || !core.control.weathers[type].frameFunc) return; - try { - core.doFunc(core.control.weathers[type].frameFunc, core.control, timestamp, core.animateFrame.weather.level); - } catch (e) { - console.error(e); - console.error("ERROR in weather[" + type + "]:已自动注销该项。"); - core.unregisterWeather(type); - } -} + var weather = core.animateFrame.weather, + type = weather.type; + if ( + !core.dymCanvas.weather || + !core.control.weathers[type] || + !core.control.weathers[type].frameFunc + ) + return; + try { + core.doFunc( + core.control.weathers[type].frameFunc, + core.control, + timestamp, + core.animateFrame.weather.level + ); + } catch (e) { + console.error(e); + console.error("ERROR in weather[" + type + "]:已自动注销该项。"); + core.unregisterWeather(type); + } +}; control.prototype._animationFrame_weather_rain = function (timestamp, level) { - if (timestamp - core.animateFrame.weather.time < 30) return; - var ctx = core.dymCanvas.weather, ox = core.bigmap.offsetX, oy = core.bigmap.offsetY; - core.clearMap('weather'); - ctx.strokeStyle = 'rgba(174,194,224,0.8)'; - ctx.lineWidth = 1; - ctx.lineCap = 'round'; + if (timestamp - core.animateFrame.weather.time < 30) return; + var ctx = core.dymCanvas.weather, + ox = core.bigmap.offsetX, + oy = core.bigmap.offsetY; + core.clearMap("weather"); + ctx.strokeStyle = "rgba(174,194,224,0.8)"; + ctx.lineWidth = 1; + ctx.lineCap = "round"; - core.animateFrame.weather.nodes.forEach(function (p) { - ctx.beginPath(); - ctx.moveTo(p.x - ox, p.y - oy); - ctx.lineTo(p.x + p.l * p.xs - ox, p.y + p.l * p.ys - oy); - ctx.stroke(); + core.animateFrame.weather.nodes.forEach(function (p) { + ctx.beginPath(); + ctx.moveTo(p.x - ox, p.y - oy); + ctx.lineTo(p.x + p.l * p.xs - ox, p.y + p.l * p.ys - oy); + ctx.stroke(); - p.x += p.xs; - p.y += p.ys; - if (p.x > core.bigmap.width * 32 || p.y > core.bigmap.height * 32) { - p.x = Math.random() * core.bigmap.width * 32; - p.y = -10; - } + p.x += p.xs; + p.y += p.ys; + if (p.x > core.bigmap.width * 32 || p.y > core.bigmap.height * 32) { + p.x = Math.random() * core.bigmap.width * 32; + p.y = -10; + } + }); - }); - - ctx.fill(); - core.animateFrame.weather.time = timestamp; -} + ctx.fill(); + core.animateFrame.weather.time = timestamp; +}; control.prototype._animationFrame_weather_snow = function (timestamp, level) { - if (timestamp - core.animateFrame.weather.time < 30) return; - var ctx = core.dymCanvas.weather, ox = core.bigmap.offsetX, oy = core.bigmap.offsetY; - core.clearMap('weather'); - ctx.fillStyle = "rgba(255, 255, 255, 0.8)"; - ctx.beginPath(); - core.animateFrame.weather.data = core.animateFrame.weather.data || 0; - core.animateFrame.weather.data += 0.01; + if (timestamp - core.animateFrame.weather.time < 30) return; + var ctx = core.dymCanvas.weather, + ox = core.bigmap.offsetX, + oy = core.bigmap.offsetY; + core.clearMap("weather"); + ctx.fillStyle = "rgba(255, 255, 255, 0.8)"; + ctx.beginPath(); + core.animateFrame.weather.data = core.animateFrame.weather.data || 0; + core.animateFrame.weather.data += 0.01; - var angle = core.animateFrame.weather.data; - core.animateFrame.weather.nodes.forEach(function (p) { - ctx.moveTo(p.x - ox, p.y - oy); - ctx.arc(p.x - ox, p.y - oy, p.r, 0, Math.PI * 2, true); - // update - p.x += Math.sin(angle) * core.animateFrame.weather.level; - p.y += Math.cos(angle + p.d) + 1 + p.r / 2; - if (p.x > core.bigmap.width * 32 + 5 || p.x < -5 || p.y > core.bigmap.height * 32) { - if (Math.random() > 1 / 3) { - p.x = Math.random() * core.bigmap.width * 32; - p.y = -10; - } - else { - if (Math.sin(angle) > 0) - p.x = -5; - else - p.x = core.bigmap.width * 32 + 5; - p.y = Math.random() * core.bigmap.height * 32; - } - } - }); - ctx.fill(); - core.animateFrame.weather.time = timestamp; -} + var angle = core.animateFrame.weather.data; + core.animateFrame.weather.nodes.forEach(function (p) { + ctx.moveTo(p.x - ox, p.y - oy); + ctx.arc(p.x - ox, p.y - oy, p.r, 0, Math.PI * 2, true); + // update + p.x += Math.sin(angle) * core.animateFrame.weather.level; + p.y += Math.cos(angle + p.d) + 1 + p.r / 2; + if ( + p.x > core.bigmap.width * 32 + 5 || + p.x < -5 || + p.y > core.bigmap.height * 32 + ) { + if (Math.random() > 1 / 3) { + p.x = Math.random() * core.bigmap.width * 32; + p.y = -10; + } else { + if (Math.sin(angle) > 0) p.x = -5; + else p.x = core.bigmap.width * 32 + 5; + p.y = Math.random() * core.bigmap.height * 32; + } + } + }); + ctx.fill(); + core.animateFrame.weather.time = timestamp; +}; control.prototype.__animateFrame_weather_image = function (timestamp, level) { - if (timestamp - core.animateFrame.weather.time < 30) return; - var node = core.animateFrame.weather.nodes[0]; - var image = node.image; - if (!image) return; - core.clearMap('weather'); - core.setAlpha('weather', node.level / 500); - var wind = 1.5; - var width = image.width, height = image.height; - node.x += node.dx * wind; - node.y += (2 * node.dy - 1) * wind; - if (node.x + 3 * width <= core._PX_) { - node.x += 4 * width; - while (node.x > 0) node.x -= width; + if (timestamp - core.animateFrame.weather.time < 30) return; + var node = core.animateFrame.weather.nodes[0]; + var image = node.image; + if (!image) return; + core.clearMap("weather"); + core.setAlpha("weather", node.level / 500); + var wind = 1.5; + var width = image.width, + height = image.height; + node.x += node.dx * wind; + node.y += (2 * node.dy - 1) * wind; + if (node.x + 3 * width <= core._PX_) { + node.x += 4 * width; + while (node.x > 0) node.x -= width; + } + node.dy += node.delta; + if (node.dy >= 1) { + node.delta = -0.001; + } else if (node.dy <= 0) { + node.delta = 0.001; + } + if (node.y + 3 * height <= core._PY_) { + node.y += 4 * height; + while (node.y > 0) node.y -= height; + } else if (node.y >= 0) { + node.y -= height; + } + for (var i = 0; i < 3; ++i) { + for (var j = 0; j < 3; ++j) { + if ( + node.x + (i + 1) * width <= 0 || + node.x + i * width >= core._PX_ || + node.y + (j + 1) * height <= 0 || + node.y + j * height >= core._PY_ + ) + continue; + core.drawImage("weather", image, node.x + i * width, node.y + j * height); } - node.dy += node.delta; - if (node.dy >= 1) { - node.delta = -0.001; - } else if (node.dy <= 0) { - node.delta = 0.001; - } - if (node.y + 3 * height <= core._PY_) { - node.y += 4 * height; - while (node.y > 0) node.y -= height; - } - else if (node.y >= 0) { - node.y -= height; - } - for (var i = 0; i < 3; ++i) { - for (var j = 0; j < 3; ++j) { - if (node.x + (i + 1) * width <= 0 || node.x + i * width >= core._PX_ - || node.y + (j + 1) * height <= 0 || node.y + j * height >= core._PY_) - continue; - core.drawImage('weather', image, node.x + i * width, node.y + j * height); - } - } - core.setAlpha('weather', 1); - core.animateFrame.weather.time = timestamp; -} + } + core.setAlpha("weather", 1); + core.animateFrame.weather.time = timestamp; +}; control.prototype._animationFrame_weather_sun = function (timestamp, level) { - if (timestamp - core.animateFrame.weather.time < 30) return; - var node = core.animateFrame.weather.nodes[0]; - var opacity = node.opacity + node.delta; - if (opacity > level / 10 + 0.3 || opacity < level / 10 - 0.3) - node.delta = -node.delta; - node.opacity = opacity; - core.setOpacity('weather', core.clamp(opacity, 0, 1)); - core.animateFrame.weather.time = timestamp; -} + if (timestamp - core.animateFrame.weather.time < 30) return; + var node = core.animateFrame.weather.nodes[0]; + var opacity = node.opacity + node.delta; + if (opacity > level / 10 + 0.3 || opacity < level / 10 - 0.3) + node.delta = -node.delta; + node.opacity = opacity; + core.setOpacity("weather", core.clamp(opacity, 0, 1)); + core.animateFrame.weather.time = timestamp; +}; control.prototype._animateFrame_tip = function (timestamp) { - if (core.animateFrame.tip == null) return; - var tip = core.animateFrame.tip; - if (timestamp - tip.time <= 30) return; - var delta = timestamp - tip.time; - tip.time = timestamp; + if (core.animateFrame.tip == null) return; + var tip = core.animateFrame.tip; + if (timestamp - tip.time <= 30) return; + var delta = timestamp - tip.time; + tip.time = timestamp; - core.setFont('data', "16px Arial"); - core.setTextAlign('data', 'left'); - core.clearMap('data', 0, 0, core._PX_, 50); - core.ui._drawTip_drawOne(tip); - if (tip.stage == 1) { - tip.opacity += 0.05; - if (tip.opacity >= 0.6) { - tip.stage = 2; - tip.displayTime = 0; - } - } else if (tip.stage == 2) { - tip.displayTime += delta; - if (tip.displayTime >= 1000) tip.stage = 3; - } else tip.opacity -= 0.05; - - if (tip.opacity <= 0) { - core.animateFrame.tip = null; + core.setFont("data", "16px Arial"); + core.setTextAlign("data", "left"); + core.clearMap("data", 0, 0, core._PX_, 50); + core.ui._drawTip_drawOne(tip); + if (tip.stage == 1) { + tip.opacity += 0.05; + if (tip.opacity >= 0.6) { + tip.stage = 2; + tip.displayTime = 0; } -} + } else if (tip.stage == 2) { + tip.displayTime += delta; + if (tip.displayTime >= 1000) tip.stage = 3; + } else tip.opacity -= 0.05; + + if (tip.opacity <= 0) { + core.animateFrame.tip = null; + } +}; control.prototype._animationFrame_parallelDo = function (timestamp) { - core.control.controldata.parallelDo(timestamp); -} + core.control.controldata.parallelDo(timestamp); +}; // ------ 标题界面的处理 ------ // ////// 显示游戏开始界面 ////// control.prototype.showStartAnimate = function (noAnimate, callback) { - this._showStartAnimate_resetDom(); - if (core.flags.startUsingCanvas || noAnimate) - return this._showStartAnimate_finished(core.flags.startUsingCanvas, callback); - core.hideWithAnimate(core.dom.startTop, 20, function () { - core.control._showStartAnimate_finished(false, callback); - }); -} + this._showStartAnimate_resetDom(); + if (core.flags.startUsingCanvas || noAnimate) + return this._showStartAnimate_finished( + core.flags.startUsingCanvas, + callback + ); + core.hideWithAnimate(core.dom.startTop, 20, function () { + core.control._showStartAnimate_finished(false, callback); + }); +}; control.prototype._showStartAnimate_resetDom = function () { - core.dom.startPanel.style.opacity = 1; - core.dom.startPanel.style.display = "block"; - core.dom.startTop.style.opacity = 1; - core.dom.startTop.style.display = "block"; - core.dom.startButtonGroup.style.display = 'none'; - core.dom.startButtons.style.display = 'block'; - core.dom.levelChooseButtons.style.display = 'none'; - core.status.played = false; - core.clearStatus(); - core.clearMap('all'); - core.dom.musicBtn.style.display = 'block'; - core.setMusicBtn(); - // 重置音量 - core.events.setVolume(1, 0); - core.updateStatusBar(); -} + core.dom.startPanel.style.opacity = 1; + core.dom.startPanel.style.display = "block"; + core.dom.startTop.style.opacity = 1; + core.dom.startTop.style.display = "block"; + core.dom.startButtonGroup.style.display = "none"; + core.dom.startButtons.style.display = "block"; + core.dom.levelChooseButtons.style.display = "none"; + core.status.played = false; + core.clearStatus(); + core.clearMap("all"); + core.dom.musicBtn.style.display = "block"; + core.setMusicBtn(); + // 重置音量 + core.events.setVolume(1, 0); + core.updateStatusBar(); +}; control.prototype._showStartAnimate_finished = function (start, callback) { - core.dom.startTop.style.display = 'none'; - core.dom.startButtonGroup.style.display = 'block'; - main.selectedButton = null; - main.selectButton(0); - if (start) core.startGame(); - if (callback) callback(); -} + core.dom.startTop.style.display = "none"; + core.dom.startButtonGroup.style.display = "block"; + main.selectedButton = null; + main.selectButton(0); + if (start) core.startGame(); + if (callback) callback(); +}; ////// 隐藏游戏开始界面 ////// control.prototype.hideStartAnimate = function (callback) { - core.hideWithAnimate(core.dom.startPanel, 20, callback); -} + core.hideWithAnimate(core.dom.startPanel, 20, callback); +}; ////// 游戏是否已经开始 ////// control.prototype.isPlaying = function () { - return core.status.played; -} + return core.status.played; +}; ////// 清除游戏状态和数据 ////// control.prototype.clearStatus = function () { - // 停止各个Timeout和Interval - for (var i in core.timeout) { - clearTimeout(core.timeout[i]); - core.timeout[i] = null; - } - for (var i in core.interval) { - clearInterval(core.interval[i]); - core.interval[i] = null; - } - core.status = {}; - core.clearStatusBar(); - core.deleteAllCanvas(); - core.status.played = false; -} + // 停止各个Timeout和Interval + for (var i in core.timeout) { + clearTimeout(core.timeout[i]); + core.timeout[i] = null; + } + for (var i in core.interval) { + clearInterval(core.interval[i]); + core.interval[i] = null; + } + core.status = {}; + core.clearStatusBar(); + core.deleteAllCanvas(); + core.status.played = false; +}; control.prototype._initStatistics = function (totalTime) { - if (!core.isset(core.status.hero.statistics)) - core.status.hero.statistics = { - 'totalTime': totalTime, - 'currTime': 0, - 'hp': 0, - "battle": 0, - 'money': 0, - 'exp': 0, - 'battleDamage': 0, - 'poisonDamage': 0, - 'extraDamage': 0, - 'moveDirectly': 0, - 'ignoreSteps': 0, - } -} + if (!core.isset(core.status.hero.statistics)) + core.status.hero.statistics = { + totalTime: totalTime, + currTime: 0, + hp: 0, + battle: 0, + money: 0, + exp: 0, + battleDamage: 0, + poisonDamage: 0, + extraDamage: 0, + moveDirectly: 0, + ignoreSteps: 0, + }; +}; // ------ 自动寻路,人物行走 ------ // ////// 清除自动寻路路线 ////// control.prototype.clearAutomaticRouteNode = function (x, y) { - core.clearMap('route', x * 32 + 5 - core.status.automaticRoute.offsetX, y * 32 + 5 - core.status.automaticRoute.offsetY, 27, 27); -} + core.clearMap( + "route", + x * 32 + 5 - core.status.automaticRoute.offsetX, + y * 32 + 5 - core.status.automaticRoute.offsetY, + 27, + 27 + ); +}; ////// 停止自动寻路操作 ////// control.prototype.stopAutomaticRoute = function () { - if (!core.status.played) return; - core.status.automaticRoute.autoHeroMove = false; - core.status.automaticRoute.autoStep = 0; - core.status.automaticRoute.destStep = 0; - core.status.automaticRoute.movedStep = 0; - core.status.automaticRoute.autoStepRoutes = []; - core.status.automaticRoute.destX = null; - core.status.automaticRoute.destY = null; - core.status.automaticRoute.lastDirection = null; - core.status.heroStop = true; - if (core.status.automaticRoute.moveStepBeforeStop.length == 0) - core.deleteCanvas('route'); -} + if (!core.status.played) return; + core.status.automaticRoute.autoHeroMove = false; + core.status.automaticRoute.autoStep = 0; + core.status.automaticRoute.destStep = 0; + core.status.automaticRoute.movedStep = 0; + core.status.automaticRoute.autoStepRoutes = []; + core.status.automaticRoute.destX = null; + core.status.automaticRoute.destY = null; + core.status.automaticRoute.lastDirection = null; + core.status.heroStop = true; + if (core.status.automaticRoute.moveStepBeforeStop.length == 0) + core.deleteCanvas("route"); +}; ////// 保存剩下的寻路,并停止 ////// control.prototype.saveAndStopAutomaticRoute = function () { - var automaticRoute = core.status.automaticRoute; - if (automaticRoute.moveStepBeforeStop.length == 0) { - automaticRoute.moveStepBeforeStop = automaticRoute.autoStepRoutes.slice(automaticRoute.autoStep - 1); - if (automaticRoute.moveStepBeforeStop.length >= 1) - automaticRoute.moveStepBeforeStop[0].step -= automaticRoute.movedStep; - } - this.stopAutomaticRoute(); -} + var automaticRoute = core.status.automaticRoute; + if (automaticRoute.moveStepBeforeStop.length == 0) { + automaticRoute.moveStepBeforeStop = automaticRoute.autoStepRoutes.slice( + automaticRoute.autoStep - 1 + ); + if (automaticRoute.moveStepBeforeStop.length >= 1) + automaticRoute.moveStepBeforeStop[0].step -= automaticRoute.movedStep; + } + this.stopAutomaticRoute(); +}; ////// 继续剩下的自动寻路操作 ////// control.prototype.continueAutomaticRoute = function () { - // 此函数只应由events.afterOpenDoor和events.afterBattle调用 - var moveStep = core.status.automaticRoute.moveStepBeforeStop; - //core.status.automaticRoute.moveStepBeforeStop = []; - if (moveStep.length === 0 || (moveStep.length === 1 && moveStep[0].step === 1)) { - core.status.automaticRoute.moveStepBeforeStop = []; - } - else { - core.setAutoHeroMove(moveStep); - } -} + // 此函数只应由events.afterOpenDoor和events.afterBattle调用 + var moveStep = core.status.automaticRoute.moveStepBeforeStop; + //core.status.automaticRoute.moveStepBeforeStop = []; + if ( + moveStep.length === 0 || + (moveStep.length === 1 && moveStep[0].step === 1) + ) { + core.status.automaticRoute.moveStepBeforeStop = []; + } else { + core.setAutoHeroMove(moveStep); + } +}; ////// 清空剩下的自动寻路列表 ////// control.prototype.clearContinueAutomaticRoute = function (callback) { - core.deleteCanvas('route'); - core.status.automaticRoute.moveStepBeforeStop = []; - if (callback) callback(); -} + core.deleteCanvas("route"); + core.status.automaticRoute.moveStepBeforeStop = []; + if (callback) callback(); +}; ////// 设置自动寻路路线 ////// control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { - if (!core.status.played || core.status.lockControl) return; - if (this._setAutomaticRoute_isMoving(destX, destY)) return; - if (this._setAutomaticRoute_isTurning(destX, destY, stepPostfix)) return; - if (this._setAutomaticRoute_clickMoveDirectly(destX, destY, stepPostfix)) return; - // 找寻自动寻路路线 - var moveStep = core.automaticRoute(destX, destY); - if (moveStep.length == 0 && (destX != core.status.hero.loc.x || destY != core.status.hero.loc.y || stepPostfix.length == 0)) - return; - moveStep = moveStep.concat(stepPostfix); - core.status.automaticRoute.destX = destX; - core.status.automaticRoute.destY = destY; - this._setAutomaticRoute_drawRoute(moveStep); - this._setAutomaticRoute_setAutoSteps(moveStep); - // 立刻移动 - core.setAutoHeroMove(); -} + if (!core.status.played || core.status.lockControl) return; + if (this._setAutomaticRoute_isMoving(destX, destY)) return; + if (this._setAutomaticRoute_isTurning(destX, destY, stepPostfix)) return; + if (this._setAutomaticRoute_clickMoveDirectly(destX, destY, stepPostfix)) + return; + // 找寻自动寻路路线 + var moveStep = core.automaticRoute(destX, destY); + if ( + moveStep.length == 0 && + (destX != core.status.hero.loc.x || + destY != core.status.hero.loc.y || + stepPostfix.length == 0) + ) + return; + moveStep = moveStep.concat(stepPostfix); + core.status.automaticRoute.destX = destX; + core.status.automaticRoute.destY = destY; + this._setAutomaticRoute_drawRoute(moveStep); + this._setAutomaticRoute_setAutoSteps(moveStep); + // 立刻移动 + core.setAutoHeroMove(); +}; control.prototype._setAutomaticRoute_isMoving = function (destX, destY) { - if (core.status.automaticRoute.autoHeroMove) { - var lastX = core.status.automaticRoute.destX, lastY = core.status.automaticRoute.destY; - core.stopAutomaticRoute(); - // 双击瞬移 - if (lastX == destX && lastY == destY) { - core.status.automaticRoute.moveDirectly = true; - setTimeout(function () { - if (core.status.automaticRoute.moveDirectly && core.status.heroMoving == 0) { - core.control.tryMoveDirectly(destX, destY); - } - core.status.automaticRoute.moveDirectly = false; - }, core.values.moveSpeed); + if (core.status.automaticRoute.autoHeroMove) { + var lastX = core.status.automaticRoute.destX, + lastY = core.status.automaticRoute.destY; + core.stopAutomaticRoute(); + // 双击瞬移 + if (lastX == destX && lastY == destY) { + core.status.automaticRoute.moveDirectly = true; + setTimeout(function () { + if ( + core.status.automaticRoute.moveDirectly && + core.status.heroMoving == 0 + ) { + core.control.tryMoveDirectly(destX, destY); } - return true; + core.status.automaticRoute.moveDirectly = false; + }, core.values.moveSpeed); } - return false; -} + return true; + } + return false; +}; -control.prototype._setAutomaticRoute_isTurning = function (destX, destY, stepPostfix) { - if (destX == core.status.hero.loc.x && destY == core.status.hero.loc.y && stepPostfix.length == 0) { - if (core.timeout.turnHeroTimeout == null) { - var routeLength = core.status.route.length; - core.timeout.turnHeroTimeout = setTimeout(function () { - if (core.status.route.length == routeLength) core.turnHero(); - clearTimeout(core.timeout.turnHeroTimeout); - core.timeout.turnHeroTimeout = null; - }, 250); - } - else { - clearTimeout(core.timeout.turnHeroTimeout); - core.timeout.turnHeroTimeout = null; - core.getNextItem(); - } - return true; +control.prototype._setAutomaticRoute_isTurning = function ( + destX, + destY, + stepPostfix +) { + if ( + destX == core.status.hero.loc.x && + destY == core.status.hero.loc.y && + stepPostfix.length == 0 + ) { + if (core.timeout.turnHeroTimeout == null) { + var routeLength = core.status.route.length; + core.timeout.turnHeroTimeout = setTimeout(function () { + if (core.status.route.length == routeLength) core.turnHero(); + clearTimeout(core.timeout.turnHeroTimeout); + core.timeout.turnHeroTimeout = null; + }, 250); + } else { + clearTimeout(core.timeout.turnHeroTimeout); + core.timeout.turnHeroTimeout = null; + core.getNextItem(); } - if (core.timeout.turnHeroTimeout != null) return true; - return false; -} + return true; + } + if (core.timeout.turnHeroTimeout != null) return true; + return false; +}; -control.prototype._setAutomaticRoute_clickMoveDirectly = function (destX, destY, stepPostfix) { - // 单击瞬间移动 - if (core.status.heroStop && core.status.heroMoving == 0) { - if (stepPostfix.length <= 1 && !core.hasFlag('__noClickMove__') && core.control.tryMoveDirectly(destX, destY)) - return true; - } - return false; -} +control.prototype._setAutomaticRoute_clickMoveDirectly = function ( + destX, + destY, + stepPostfix +) { + // 单击瞬间移动 + if (core.status.heroStop && core.status.heroMoving == 0) { + if ( + stepPostfix.length <= 1 && + !core.hasFlag("__noClickMove__") && + core.control.tryMoveDirectly(destX, destY) + ) + return true; + } + return false; +}; control.prototype._setAutomaticRoute_drawRoute = function (moveStep) { - // 计算绘制区域的宽高,并尽可能小的创建route层 - var sx = core.bigmap.width * 32, sy = core.bigmap.height * 32, dx = 0, dy = 0; - moveStep.forEach(function (t) { - sx = Math.min(sx, t.x * 32); dx = Math.max(dx, t.x * 32); - sy = Math.min(sy, t.y * 32); dy = Math.max(dy, t.y * 32); - }); - core.status.automaticRoute.offsetX = sx; - core.status.automaticRoute.offsetY = sy; - var ctx = core.createCanvas('route', sx - core.bigmap.offsetX, sy - core.bigmap.offsetY, dx - sx + 32, dy - sy + 32, 95); - ctx.fillStyle = '#bfbfbf'; - ctx.strokeStyle = '#bfbfbf'; - ctx.lineWidth = 8; - for (var m = 0; m < moveStep.length; m++) { - if (m == moveStep.length - 1) { - ctx.fillRect(moveStep[m].x * 32 + 10 - sx, moveStep[m].y * 32 + 10 - sy, 12, 12); - } - else { - ctx.beginPath(); - var cx = moveStep[m].x * 32 + 16 - sx, cy = moveStep[m].y * 32 + 16 - sy; - var currDir = moveStep[m].direction, nextDir = moveStep[m + 1].direction; - ctx.moveTo(cx - core.utils.scan[currDir].x * 11, cy - core.utils.scan[currDir].y * 11); - ctx.lineTo(cx, cy); - ctx.lineTo(cx + core.utils.scan[nextDir].x * 11, cy + core.utils.scan[nextDir].y * 11); - ctx.stroke(); - } + // 计算绘制区域的宽高,并尽可能小的创建route层 + var sx = core.bigmap.width * 32, + sy = core.bigmap.height * 32, + dx = 0, + dy = 0; + moveStep.forEach(function (t) { + sx = Math.min(sx, t.x * 32); + dx = Math.max(dx, t.x * 32); + sy = Math.min(sy, t.y * 32); + dy = Math.max(dy, t.y * 32); + }); + core.status.automaticRoute.offsetX = sx; + core.status.automaticRoute.offsetY = sy; + var ctx = core.createCanvas( + "route", + sx - core.bigmap.offsetX, + sy - core.bigmap.offsetY, + dx - sx + 32, + dy - sy + 32, + 95 + ); + ctx.fillStyle = "#bfbfbf"; + ctx.strokeStyle = "#bfbfbf"; + ctx.lineWidth = 8; + for (var m = 0; m < moveStep.length; m++) { + if (m == moveStep.length - 1) { + ctx.fillRect( + moveStep[m].x * 32 + 10 - sx, + moveStep[m].y * 32 + 10 - sy, + 12, + 12 + ); + } else { + ctx.beginPath(); + var cx = moveStep[m].x * 32 + 16 - sx, + cy = moveStep[m].y * 32 + 16 - sy; + var currDir = moveStep[m].direction, + nextDir = moveStep[m + 1].direction; + ctx.moveTo( + cx - core.utils.scan[currDir].x * 11, + cy - core.utils.scan[currDir].y * 11 + ); + ctx.lineTo(cx, cy); + ctx.lineTo( + cx + core.utils.scan[nextDir].x * 11, + cy + core.utils.scan[nextDir].y * 11 + ); + ctx.stroke(); } -} + } +}; control.prototype._setAutomaticRoute_setAutoSteps = function (moveStep) { - // 路线转autoStepRoutes - var step = 0, currStep = null; - moveStep.forEach(function (t) { - var dir = t.direction; - if (currStep == null || currStep == dir) - step++; - else { - core.status.automaticRoute.autoStepRoutes.push({ 'direction': currStep, 'step': step }); - step = 1; - } - currStep = dir; - }); - core.status.automaticRoute.autoStepRoutes.push({ 'direction': currStep, 'step': step }); -} + // 路线转autoStepRoutes + var step = 0, + currStep = null; + moveStep.forEach(function (t) { + var dir = t.direction; + if (currStep == null || currStep == dir) step++; + else { + core.status.automaticRoute.autoStepRoutes.push({ + direction: currStep, + step: step, + }); + step = 1; + } + currStep = dir; + }); + core.status.automaticRoute.autoStepRoutes.push({ + direction: currStep, + step: step, + }); +}; ////// 设置勇士的自动行走路线 ////// control.prototype.setAutoHeroMove = function (steps) { - steps = steps || core.status.automaticRoute.autoStepRoutes; - if (steps.length == 0) return; - core.status.automaticRoute.autoStepRoutes = steps; - core.status.automaticRoute.autoHeroMove = true; - core.status.automaticRoute.autoStep = 1; - core.status.automaticRoute.destStep = steps[0].step; - core.moveHero(steps[0].direction); -} + steps = steps || core.status.automaticRoute.autoStepRoutes; + if (steps.length == 0) return; + core.status.automaticRoute.autoStepRoutes = steps; + core.status.automaticRoute.autoHeroMove = true; + core.status.automaticRoute.autoStep = 1; + core.status.automaticRoute.destStep = steps[0].step; + core.moveHero(steps[0].direction); +}; ////// 设置行走的效果动画 ////// control.prototype.setHeroMoveInterval = function (callback) { - if (core.status.heroMoving > 0) return; - if (core.status.replay.speed == 24) { - if (callback) callback(); - return; + if (core.status.heroMoving > 0) return; + if (core.status.replay.speed == 24) { + if (callback) callback(); + return; + } + + core.status.heroMoving = 1; + + var toAdd = 1; + if (core.status.replay.speed > 3) toAdd = 2; + if (core.status.replay.speed > 6) toAdd = 4; + if (core.status.replay.speed > 12) toAdd = 8; + + core.interval.heroMoveInterval = window.setInterval(function () { + core.status.heroMoving += toAdd; + if (core.status.heroMoving >= 8) { + clearInterval(core.interval.heroMoveInterval); + core.status.heroMoving = 0; + if (callback) callback(); } - - core.status.heroMoving = 1; - - var toAdd = 1; - if (core.status.replay.speed > 3) toAdd = 2; - if (core.status.replay.speed > 6) toAdd = 4; - if (core.status.replay.speed > 12) toAdd = 8; - - core.interval.heroMoveInterval = window.setInterval(function () { - core.status.heroMoving += toAdd; - if (core.status.heroMoving >= 8) { - clearInterval(core.interval.heroMoveInterval); - core.status.heroMoving = 0; - if (callback) callback(); - } - }, core.values.moveSpeed / 8 * toAdd / core.status.replay.speed); -} + }, ((core.values.moveSpeed / 8) * toAdd) / core.status.replay.speed); +}; ////// 每移动一格后执行的事件 ////// control.prototype.moveOneStep = function (callback) { - return this.controldata.moveOneStep(callback); -} + return this.controldata.moveOneStep(callback); +}; ////// 实际每一步的行走过程 ////// control.prototype.moveAction = function (callback) { - if (core.status.heroMoving > 0) return; - var noPass = core.noPass(core.nextX(), core.nextY()), canMove = core.canMoveHero(); - // 下一个点如果不能走 - if (noPass || !canMove) return this._moveAction_noPass(canMove, callback); - this._moveAction_moving(callback); -} + if (core.status.heroMoving > 0) return; + var noPass = core.noPass(core.nextX(), core.nextY()), + canMove = core.canMoveHero(); + // 下一个点如果不能走 + if (noPass || !canMove) return this._moveAction_noPass(canMove, callback); + this._moveAction_moving(callback); +}; control.prototype._moveAction_noPass = function (canMove, callback) { - core.status.route.push(core.getHeroLoc('direction')); - core.status.automaticRoute.moveStepBeforeStop = []; - core.status.automaticRoute.lastDirection = core.getHeroLoc('direction'); - if (canMove) core.trigger(core.nextX(), core.nextY()); - core.drawHero(); + core.status.route.push(core.getHeroLoc("direction")); + core.status.automaticRoute.moveStepBeforeStop = []; + core.status.automaticRoute.lastDirection = core.getHeroLoc("direction"); + if (canMove) core.trigger(core.nextX(), core.nextY()); + core.drawHero(); - if (core.status.automaticRoute.moveStepBeforeStop.length == 0) { - core.clearContinueAutomaticRoute(); - core.stopAutomaticRoute(); - } - if (callback) callback(); -} + if (core.status.automaticRoute.moveStepBeforeStop.length == 0) { + core.clearContinueAutomaticRoute(); + core.stopAutomaticRoute(); + } + if (callback) callback(); +}; control.prototype._moveAction_moving = function (callback) { - core.setHeroMoveInterval(function () { - core.setHeroLoc('x', core.nextX(), true); - core.setHeroLoc('y', core.nextY(), true); + core.setHeroMoveInterval(function () { + core.setHeroLoc("x", core.nextX(), true); + core.setHeroLoc("y", core.nextY(), true); - var direction = core.getHeroLoc('direction'); - core.control._moveAction_popAutomaticRoute(); - core.status.route.push(direction); + var direction = core.getHeroLoc("direction"); + core.control._moveAction_popAutomaticRoute(); + core.status.route.push(direction); - core.moveOneStep(); - core.checkRouteFolding(); - if (callback) callback(); - }); -} + core.moveOneStep(); + core.checkRouteFolding(); + if (callback) callback(); + }); +}; control.prototype._moveAction_popAutomaticRoute = function () { - var automaticRoute = core.status.automaticRoute; - // 检查自动寻路是否被弹出 - if (automaticRoute.autoHeroMove) { - automaticRoute.movedStep++; - automaticRoute.lastDirection = core.getHeroLoc('direction'); - if (automaticRoute.destStep == automaticRoute.movedStep) { - if (automaticRoute.autoStep == automaticRoute.autoStepRoutes.length) { - core.clearContinueAutomaticRoute(); - core.stopAutomaticRoute(); - } - else { - automaticRoute.movedStep = 0; - automaticRoute.destStep = automaticRoute.autoStepRoutes[automaticRoute.autoStep].step; - core.setHeroLoc('direction', automaticRoute.autoStepRoutes[automaticRoute.autoStep].direction); - core.status.automaticRoute.autoStep++; - } - } + var automaticRoute = core.status.automaticRoute; + // 检查自动寻路是否被弹出 + if (automaticRoute.autoHeroMove) { + automaticRoute.movedStep++; + automaticRoute.lastDirection = core.getHeroLoc("direction"); + if (automaticRoute.destStep == automaticRoute.movedStep) { + if (automaticRoute.autoStep == automaticRoute.autoStepRoutes.length) { + core.clearContinueAutomaticRoute(); + core.stopAutomaticRoute(); + } else { + automaticRoute.movedStep = 0; + automaticRoute.destStep = + automaticRoute.autoStepRoutes[automaticRoute.autoStep].step; + core.setHeroLoc( + "direction", + automaticRoute.autoStepRoutes[automaticRoute.autoStep].direction + ); + core.status.automaticRoute.autoStep++; + } } -} + } +}; ////// 让勇士开始移动 ////// control.prototype.moveHero = function (direction, callback) { - // 如果正在移动,直接return - if (core.status.heroMoving != 0) return; - if (core.isset(direction)) - core.setHeroLoc('direction', direction); + // 如果正在移动,直接return + if (core.status.heroMoving != 0) return; + if (core.isset(direction)) core.setHeroLoc("direction", direction); - if (callback) return this.moveAction(callback); - this._moveHero_moving(); -} + if (callback) return this.moveAction(callback); + this._moveHero_moving(); +}; control.prototype._moveHero_moving = function () { - // ------ 我已经看不懂这个函数了,反正好用就行23333333 - core.status.heroStop = false; - core.status.automaticRoute.moveDirectly = false; - var move = function () { - if (!core.status.heroStop) { - if (core.hasFlag('debug') && core.status.ctrlDown) { - if (core.status.heroMoving != 0) return; - // 检测是否穿出去 - var nx = core.nextX(), ny = core.nextY(); - if (nx < 0 || nx >= core.bigmap.width || ny < 0 || ny >= core.bigmap.height) return; - core.eventMoveHero([core.getHeroLoc('direction')], core.values.moveSpeed, move); - } - else { - core.moveAction(); - setTimeout(move, 50); - } - } + // ------ 我已经看不懂这个函数了,反正好用就行23333333 + core.status.heroStop = false; + core.status.automaticRoute.moveDirectly = false; + var move = function () { + if (!core.status.heroStop) { + if (core.hasFlag("debug") && core.status.ctrlDown) { + if (core.status.heroMoving != 0) return; + // 检测是否穿出去 + var nx = core.nextX(), + ny = core.nextY(); + if ( + nx < 0 || + nx >= core.bigmap.width || + ny < 0 || + ny >= core.bigmap.height + ) + return; + core.eventMoveHero( + [core.getHeroLoc("direction")], + core.values.moveSpeed, + move + ); + } else { + core.moveAction(); + setTimeout(move, 50); + } } - move(); -} + }; + move(); +}; ////// 当前是否正在移动 ////// control.prototype.isMoving = function () { - return !core.status.heroStop || core.status.heroMoving > 0; -} + return !core.status.heroStop || core.status.heroMoving > 0; +}; ////// 停止勇士的一切行动,等待勇士行动结束后,再执行callback ////// control.prototype.waitHeroToStop = function (callback) { - var lastDirection = core.status.automaticRoute.lastDirection; - core.stopAutomaticRoute(); - core.clearContinueAutomaticRoute(); - if (callback) { - core.status.replay.animate = true; - core.lockControl(); - core.status.automaticRoute.moveDirectly = false; - setTimeout(function () { - core.status.replay.animate = false; - if (core.isset(lastDirection)) - core.setHeroLoc('direction', lastDirection); - core.drawHero(); - callback(); - }, core.status.replay.speed == 24 ? 1 : 30); - } -} + var lastDirection = core.status.automaticRoute.lastDirection; + core.stopAutomaticRoute(); + core.clearContinueAutomaticRoute(); + if (callback) { + core.status.replay.animate = true; + core.lockControl(); + core.status.automaticRoute.moveDirectly = false; + setTimeout( + function () { + core.status.replay.animate = false; + if (core.isset(lastDirection)) + core.setHeroLoc("direction", lastDirection); + core.drawHero(); + callback(); + }, + core.status.replay.speed == 24 ? 1 : 30 + ); + } +}; ////// 转向 ////// control.prototype.turnHero = function (direction) { - if (direction) { - core.setHeroLoc('direction', direction); - core.drawHero(); - core.status.route.push("turn:" + direction); - return; - } - core.setHeroLoc('direction', core.turnDirection(':right')); + if (direction) { + core.setHeroLoc("direction", direction); core.drawHero(); - core.status.route.push("turn"); - core.checkRouteFolding(); -} + core.status.route.push("turn:" + direction); + return; + } + core.setHeroLoc("direction", core.turnDirection(":right")); + core.drawHero(); + core.status.route.push("turn"); + core.checkRouteFolding(); +}; ////// 瞬间移动 ////// control.prototype.moveDirectly = function (destX, destY, ignoreSteps) { - return this.controldata.moveDirectly(destX, destY, ignoreSteps); -} + return this.controldata.moveDirectly(destX, destY, ignoreSteps); +}; ////// 尝试瞬间移动 ////// control.prototype.tryMoveDirectly = function (destX, destY) { - if (this.nearHero(destX, destY)) return false; - var canMoveArray = core.maps.generateMovableArray(); - var dirs = [[destX, destY], [destX - 1, destY, "right"], [destX, destY - 1, "down"], [destX, destY + 1, "up"], [destX + 1, destY, "left"]]; - var canMoveDirectlyArray = core.canMoveDirectlyArray(dirs, canMoveArray); + if (this.nearHero(destX, destY)) return false; + var canMoveArray = core.maps.generateMovableArray(); + var dirs = [ + [destX, destY], + [destX - 1, destY, "right"], + [destX, destY - 1, "down"], + [destX, destY + 1, "up"], + [destX + 1, destY, "left"], + ]; + var canMoveDirectlyArray = core.canMoveDirectlyArray(dirs, canMoveArray); - for (var i = 0; i < dirs.length; ++i) { - var d = dirs[i], dx = d[0], dy = d[1], dir = d[2]; - if (dx < 0 || dx >= core.bigmap.width || dy < 0 || dy >= core.bigmap.height) continue; - if (dir && !core.inArray(canMoveArray[dx][dy], dir)) continue; - if (canMoveDirectlyArray[i] < 0) continue; - if (core.control.moveDirectly(dx, dy, canMoveDirectlyArray[i])) { - if (dir) core.moveHero(dir, function () { }); - return true; - } + for (var i = 0; i < dirs.length; ++i) { + var d = dirs[i], + dx = d[0], + dy = d[1], + dir = d[2]; + if (dx < 0 || dx >= core.bigmap.width || dy < 0 || dy >= core.bigmap.height) + continue; + if (dir && !core.inArray(canMoveArray[dx][dy], dir)) continue; + if (canMoveDirectlyArray[i] < 0) continue; + if (core.control.moveDirectly(dx, dy, canMoveDirectlyArray[i])) { + if (dir) core.moveHero(dir, function () {}); + return true; } - return false; -} + } + return false; +}; ////// 绘制勇士 ////// control.prototype.drawHero = function (status, offset, frame) { - if (!core.isPlaying() || !core.status.floorId || core.status.gameOver) return; - var x = core.getHeroLoc('x'), y = core.getHeroLoc('y'), direction = core.getHeroLoc('direction'); - status = status || 'stop'; - if (!offset) offset = 0; + if (!core.isPlaying() || !core.status.floorId || core.status.gameOver) return; + var x = core.getHeroLoc("x"), + y = core.getHeroLoc("y"), + direction = core.getHeroLoc("direction"); + status = status || "stop"; + if (!offset) offset = 0; - var way = core.utils.scan2[direction]; - var dx = way.x, dy = way.y; - var offsetX = typeof offset == 'number' ? dx * offset : (offset.x || 0); - var offsetY = typeof offset == 'number' ? dy * offset : (offset.y || 0); - offset = { x: offsetX, y: offsetY, offset: offset }; + var way = core.utils.scan2[direction]; + var dx = way.x, + dy = way.y; + var offsetX = typeof offset == "number" ? dx * offset : offset.x || 0; + var offsetY = typeof offset == "number" ? dy * offset : offset.y || 0; + offset = { x: offsetX, y: offsetY, offset: offset }; - core.clearAutomaticRouteNode(x + dx, y + dy); - core.clearMap('hero'); - core.status.heroCenter.px = 32 * x + offsetX + 16; - core.status.heroCenter.py = 32 * y + offsetY + 32 - core.material.icons.hero.height / 2; + core.clearAutomaticRouteNode(x + dx, y + dy); + core.clearMap("hero"); + core.status.heroCenter.px = 32 * x + offsetX + 16; + core.status.heroCenter.py = + 32 * y + offsetY + 32 - core.material.icons.hero.height / 2; - // 重置hero层画布 - core.setGameCanvasTranslate('hero', 0, 0); - delete core.canvas.hero._px; - delete core.canvas.hero._py; - core.status.preview.enabled = false; - if (!core.hasFlag('__lockViewport__')) { - this._drawHero_updateViewport(x, y, offset); - } + // 重置hero层画布 + core.setGameCanvasTranslate("hero", 0, 0); + delete core.canvas.hero._px; + delete core.canvas.hero._py; + core.status.preview.enabled = false; + if (!core.hasFlag("__lockViewport__")) { + this._drawHero_updateViewport(x, y, offset); + } - this._drawHero_draw(direction, x, y, status, offset, frame); -} + this._drawHero_draw(direction, x, y, status, offset, frame); +}; control.prototype._drawHero_updateViewport = function (x, y, offset) { - core.bigmap.offsetX = core.clamp((x - core._HALF_WIDTH_) * 32 + offset.x, 0, Math.max(32 * core.bigmap.width - core._PX_, 0)); - core.bigmap.offsetY = core.clamp((y - core._HALF_HEIGHT_) * 32 + offset.y, 0, Math.max(32 * core.bigmap.height - core._PY_, 0)); - core.control.updateViewport(); -} + core.bigmap.offsetX = core.clamp( + (x - core._HALF_WIDTH_) * 32 + offset.x, + 0, + Math.max(32 * core.bigmap.width - core._PX_, 0) + ); + core.bigmap.offsetY = core.clamp( + (y - core._HALF_HEIGHT_) * 32 + offset.y, + 0, + Math.max(32 * core.bigmap.height - core._PY_, 0) + ); + core.control.updateViewport(); +}; -control.prototype._drawHero_draw = function (direction, x, y, status, offset, frame) { - offset = offset || { x: 0, y: 0, offset: 0, px: 0, py: 0 }; - var opacity = core.setAlpha('hero', core.getFlag('__heroOpacity__', 1)) - this._drawHero_getDrawObjs(direction, x, y, status, offset).forEach(function (block) { - core.drawImage('hero', block.img, (block.heroIcon[block.status] + (frame || 0)) % 4 * block.width, - block.heroIcon.loc * block.height, block.width, block.height, - block.posx + (32 - block.width) / 2, block.posy + 32 - block.height, block.width, block.height); - }); - core.setAlpha('hero', opacity); -} +control.prototype._drawHero_draw = function ( + direction, + x, + y, + status, + offset, + frame +) { + offset = offset || { x: 0, y: 0, offset: 0, px: 0, py: 0 }; + var opacity = core.setAlpha("hero", core.getFlag("__heroOpacity__", 1)); + this._drawHero_getDrawObjs(direction, x, y, status, offset).forEach(function ( + block + ) { + core.drawImage( + "hero", + block.img, + ((block.heroIcon[block.status] + (frame || 0)) % 4) * block.width, + block.heroIcon.loc * block.height, + block.width, + block.height, + block.posx + (32 - block.width) / 2, + block.posy + 32 - block.height, + block.width, + block.height + ); + }); + core.setAlpha("hero", opacity); +}; -control.prototype._drawHero_getDrawObjs = function (direction, x, y, status, offset) { - var heroIconArr = core.material.icons.hero, drawObjs = [], index = 0; - drawObjs.push({ - "img": core.material.images.hero, - "width": core.material.icons.hero.width || 32, - "height": core.material.icons.hero.height, - "heroIcon": heroIconArr[direction], - "posx": x * 32 - core.bigmap.offsetX + offset.x, - "posy": y * 32 - core.bigmap.offsetY + offset.y, - "status": status, - "index": index++, +control.prototype._drawHero_getDrawObjs = function ( + direction, + x, + y, + status, + offset +) { + var heroIconArr = core.material.icons.hero, + drawObjs = [], + index = 0; + drawObjs.push({ + img: core.material.images.hero, + width: core.material.icons.hero.width || 32, + height: core.material.icons.hero.height, + heroIcon: heroIconArr[direction], + posx: x * 32 - core.bigmap.offsetX + offset.x, + posy: y * 32 - core.bigmap.offsetY + offset.y, + status: status, + index: index++, + }); + if (typeof offset.offset == "number") { + core.status.hero.followers.forEach(function (t) { + drawObjs.push({ + img: core.material.images.images[t.name], + width: core.material.images.images[t.name].width / 4, + height: core.material.images.images[t.name].height / 4, + heroIcon: heroIconArr[t.direction], + posx: + 32 * t.x - + core.bigmap.offsetX + + (t.stop + ? 0 + : core.utils.scan2[t.direction].x * Math.abs(offset.offset)), + posy: + 32 * t.y - + core.bigmap.offsetY + + (t.stop + ? 0 + : core.utils.scan2[t.direction].y * Math.abs(offset.offset)), + status: t.stop ? "stop" : status, + index: index++, + }); }); - if (typeof offset.offset == 'number') { - core.status.hero.followers.forEach(function (t) { - drawObjs.push({ - "img": core.material.images.images[t.name], - "width": core.material.images.images[t.name].width / 4, - "height": core.material.images.images[t.name].height / 4, - "heroIcon": heroIconArr[t.direction], - "posx": 32 * t.x - core.bigmap.offsetX + (t.stop ? 0 : core.utils.scan2[t.direction].x * Math.abs(offset.offset)), - "posy": 32 * t.y - core.bigmap.offsetY + (t.stop ? 0 : core.utils.scan2[t.direction].y * Math.abs(offset.offset)), - "status": t.stop ? "stop" : status, - "index": index++ - }); - }); + } + return drawObjs.sort(function (a, b) { + return a.posy == b.posy ? b.index - a.index : a.posy - b.posy; + }); +}; + +control.prototype.setHeroOpacity = function ( + opacity, + moveMode, + time, + callback +) { + time = time || 0; + if (time == 0) { + core.setFlag("__heroOpacity__", opacity); + core.drawHero(); + if (callback) callback(); + return; + } + time /= Math.max(core.status.replay.speed, 1); + + var fromOpacity = core.getFlag("__heroOpacity__", 1); + var step = 0, + steps = parseInt(time / 10); + if (steps <= 0) steps = 1; + var moveFunc = core.applyEasing(moveMode); + + var animate = setInterval(function () { + step++; + core.setFlag( + "__heroOpacity__", + fromOpacity + (opacity - fromOpacity) * moveFunc(step / steps) + ); + core.drawHero(); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + if (callback) callback(); } - return drawObjs.sort(function (a, b) { - return a.posy == b.posy ? b.index - a.index : a.posy - b.posy; - }); -} + }, 10); -control.prototype.setHeroOpacity = function (opacity, moveMode, time, callback) { - time = time || 0; - if (time == 0) { - core.setFlag('__heroOpacity__', opacity); - core.drawHero(); - if (callback) callback(); - return; - } - time /= Math.max(core.status.replay.speed, 1) - - var fromOpacity = core.getFlag('__heroOpacity__', 1); - var step = 0, steps = parseInt(time / 10); - if (steps <= 0) steps = 1; - var moveFunc = core.applyEasing(moveMode); - - var animate = setInterval(function () { - step++; - core.setFlag('__heroOpacity__', fromOpacity + (opacity - fromOpacity) * moveFunc(step / steps)); - core.drawHero(); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, 10); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; // ------ 画布、位置、阻激夹域,显伤 ------ // ////// 设置画布偏移 control.prototype.setGameCanvasTranslate = function (canvas, x, y) { - var c = core.dom.gameCanvas[canvas]; - x = x * core.domStyle.scale; - y = y * core.domStyle.scale; - c.style.transform = 'translate(' + x + 'px,' + y + 'px)'; - c.style.webkitTransform = 'translate(' + x + 'px,' + y + 'px)'; - c.style.OTransform = 'translate(' + x + 'px,' + y + 'px)'; - c.style.MozTransform = 'translate(' + x + 'px,' + y + 'px)'; - if (main.mode === 'editor' && editor.isMobile) { - c.style.transform = 'translate(' + (x / core._PX_ * 96) + 'vw,' + (y / core._PY_ * 96) + 'vw)'; - c.style.webkitTransform = 'translate(' + (x / core._PX_ * 96) + 'vw,' + (y / core._PY_ * 96) + 'vw)'; - c.style.OTransform = 'translate(' + (x / core._PX_ * 96) + 'vw,' + (y / core._PY_ * 96) + 'vw)'; - c.style.MozTransform = 'translate(' + (x / core._PX_ * 96) + 'vw,' + (y / core._PY_ * 96) + 'vw)'; - } + var c = core.dom.gameCanvas[canvas]; + x = x * core.domStyle.scale; + y = y * core.domStyle.scale; + c.style.transform = "translate(" + x + "px," + y + "px)"; + c.style.webkitTransform = "translate(" + x + "px," + y + "px)"; + c.style.OTransform = "translate(" + x + "px," + y + "px)"; + c.style.MozTransform = "translate(" + x + "px," + y + "px)"; + if (main.mode === "editor" && editor.isMobile) { + c.style.transform = + "translate(" + + (x / core._PX_) * 96 + + "vw," + + (y / core._PY_) * 96 + + "vw)"; + c.style.webkitTransform = + "translate(" + + (x / core._PX_) * 96 + + "vw," + + (y / core._PY_) * 96 + + "vw)"; + c.style.OTransform = + "translate(" + + (x / core._PX_) * 96 + + "vw," + + (y / core._PY_) * 96 + + "vw)"; + c.style.MozTransform = + "translate(" + + (x / core._PX_) * 96 + + "vw," + + (y / core._PY_) * 96 + + "vw)"; + } }; ////// 加减画布偏移 control.prototype.addGameCanvasTranslate = function (x, y) { - for (var ii = 0, canvas; canvas = core.dom.gameCanvas[ii]; ii++) { - var id = canvas.getAttribute('id'); - if (id == 'ui' || id == 'data') continue; // UI层和data层不移动 - var offsetX = x, offsetY = y; - if (core.bigmap.canvas.indexOf(id) >= 0) { - if (core.bigmap.v2) { - offsetX -= (core.bigmap.offsetX - 32 * core.bigmap.posX) + 32; - offsetY -= (core.bigmap.offsetY - 32 * core.bigmap.posY) + 32; - } else { - offsetX -= core.bigmap.offsetX; - offsetY -= core.bigmap.offsetY; - } - } - core.control.setGameCanvasTranslate(id, offsetX, offsetY); + for (var ii = 0, canvas; (canvas = core.dom.gameCanvas[ii]); ii++) { + var id = canvas.getAttribute("id"); + if (id == "ui" || id == "data") continue; // UI层和data层不移动 + var offsetX = x, + offsetY = y; + if (core.bigmap.canvas.indexOf(id) >= 0) { + if (core.bigmap.v2) { + offsetX -= core.bigmap.offsetX - 32 * core.bigmap.posX + 32; + offsetY -= core.bigmap.offsetY - 32 * core.bigmap.posY + 32; + } else { + offsetX -= core.bigmap.offsetX; + offsetY -= core.bigmap.offsetY; + } } -} + core.control.setGameCanvasTranslate(id, offsetX, offsetY); + } +}; ////// 更新视野范围 ////// control.prototype.updateViewport = function () { - // 当前是否应该重绘? - if (core.bigmap.v2) { - if (core.bigmap.offsetX >= core.bigmap.posX * 32 + 32 - || core.bigmap.offsetX <= core.bigmap.posX * 32 - 32 - || core.bigmap.offsetY >= core.bigmap.posY * 32 + 32 - || core.bigmap.offsetY <= core.bigmap.posY * 32 - 32) { - core.bigmap.posX = parseInt(core.bigmap.offsetX / 32); - core.bigmap.posY = parseInt(core.bigmap.offsetY / 32); - core.redrawMap(); - } - } else { - core.bigmap.posX = core.bigmap.posY = 0; + // 当前是否应该重绘? + if (core.bigmap.v2) { + if ( + core.bigmap.offsetX >= core.bigmap.posX * 32 + 32 || + core.bigmap.offsetX <= core.bigmap.posX * 32 - 32 || + core.bigmap.offsetY >= core.bigmap.posY * 32 + 32 || + core.bigmap.offsetY <= core.bigmap.posY * 32 - 32 + ) { + core.bigmap.posX = parseInt(core.bigmap.offsetX / 32); + core.bigmap.posY = parseInt(core.bigmap.offsetY / 32); + core.redrawMap(); } - var offsetX = core.bigmap.v2 ? -(core.bigmap.offsetX - 32 * core.bigmap.posX) - 32 : -core.bigmap.offsetX; - var offsetY = core.bigmap.v2 ? -(core.bigmap.offsetY - 32 * core.bigmap.posY) - 32 : -core.bigmap.offsetY; + } else { + core.bigmap.posX = core.bigmap.posY = 0; + } + var offsetX = core.bigmap.v2 + ? -(core.bigmap.offsetX - 32 * core.bigmap.posX) - 32 + : -core.bigmap.offsetX; + var offsetY = core.bigmap.v2 + ? -(core.bigmap.offsetY - 32 * core.bigmap.posY) - 32 + : -core.bigmap.offsetY; - core.bigmap.canvas.forEach(function (cn) { - core.control.setGameCanvasTranslate(cn, offsetX, offsetY); - }); - // ------ 路线 - core.relocateCanvas('route', core.status.automaticRoute.offsetX - core.bigmap.offsetX, core.status.automaticRoute.offsetY - core.bigmap.offsetY); - // ------ 所有的大怪物也都需要重定位 - for (var one in core.dymCanvas) { - if (one.startsWith('_bigImage_')) { - var ox = core.dymCanvas[one].canvas.getAttribute('_ox'); - var oy = core.dymCanvas[one].canvas.getAttribute('_oy'); - if (ox != null && oy != null) { - core.relocateCanvas(one, parseInt(ox) - core.bigmap.offsetX, parseInt(oy) - core.bigmap.offsetY); - } - } + core.bigmap.canvas.forEach(function (cn) { + core.control.setGameCanvasTranslate(cn, offsetX, offsetY); + }); + // ------ 路线 + core.relocateCanvas( + "route", + core.status.automaticRoute.offsetX - core.bigmap.offsetX, + core.status.automaticRoute.offsetY - core.bigmap.offsetY + ); + // ------ 所有的大怪物也都需要重定位 + for (var one in core.dymCanvas) { + if (one.startsWith("_bigImage_")) { + var ox = core.dymCanvas[one].canvas.getAttribute("_ox"); + var oy = core.dymCanvas[one].canvas.getAttribute("_oy"); + if (ox != null && oy != null) { + core.relocateCanvas( + one, + parseInt(ox) - core.bigmap.offsetX, + parseInt(oy) - core.bigmap.offsetY + ); + } } - -} + } +}; ////// 设置视野范围 ////// control.prototype.setViewport = function (px, py) { - var originOffsetX = core.bigmap.offsetX, originOffsetY = core.bigmap.offsetY; - core.bigmap.offsetX = core.clamp(px, 0, 32 * core.bigmap.width - core._PX_); - core.bigmap.offsetY = core.clamp(py, 0, 32 * core.bigmap.height - core._PY_); - this.updateViewport(); - // ------ hero层也需要! - var px = parseFloat(core.canvas.hero._px) || 0; - var py = parseFloat(core.canvas.hero._py) || 0; - px += originOffsetX - core.bigmap.offsetX; - py += originOffsetY - core.bigmap.offsetY; - core.control.setGameCanvasTranslate('hero', px, py); - core.canvas.hero._px = px; - core.canvas.hero._py = py; -} + var originOffsetX = core.bigmap.offsetX, + originOffsetY = core.bigmap.offsetY; + core.bigmap.offsetX = core.clamp(px, 0, 32 * core.bigmap.width - core._PX_); + core.bigmap.offsetY = core.clamp(py, 0, 32 * core.bigmap.height - core._PY_); + this.updateViewport(); + // ------ hero层也需要! + var px = parseFloat(core.canvas.hero._px) || 0; + var py = parseFloat(core.canvas.hero._py) || 0; + px += originOffsetX - core.bigmap.offsetX; + py += originOffsetY - core.bigmap.offsetY; + core.control.setGameCanvasTranslate("hero", px, py); + core.canvas.hero._px = px; + core.canvas.hero._py = py; +}; ////// 移动视野范围 ////// control.prototype.moveViewport = function (x, y, moveMode, time, callback) { - time = time || 0; - time /= Math.max(core.status.replay.speed, 1) - var per_time = 10, step = 0, steps = parseInt(time / per_time); - if (steps <= 0) { - this.setViewport(32 * x, 32 * y); - if (callback) callback(); - return; + time = time || 0; + time /= Math.max(core.status.replay.speed, 1); + var per_time = 10, + step = 0, + steps = parseInt(time / per_time); + if (steps <= 0) { + this.setViewport(32 * x, 32 * y); + if (callback) callback(); + return; + } + var px = core.clamp(32 * x, 0, 32 * core.bigmap.width - core._PX_); + var py = core.clamp(32 * y, 0, 32 * core.bigmap.height - core._PY_); + var cx = core.bigmap.offsetX; + var cy = core.bigmap.offsetY; + var moveFunc = core.applyEasing(moveMode); + + var animate = window.setInterval(function () { + step++; + core.setViewport( + cx + moveFunc(step / steps) * (px - cx), + cy + moveFunc(step / steps) * (py - cy) + ); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + core.setViewport(px, py); + if (callback) callback(); } - var px = core.clamp(32 * x, 0, 32 * core.bigmap.width - core._PX_); - var py = core.clamp(32 * y, 0, 32 * core.bigmap.height - core._PY_); - var cx = core.bigmap.offsetX; - var cy = core.bigmap.offsetY; - var moveFunc = core.applyEasing(moveMode); + }, per_time); - var animate = window.setInterval(function () { - step++; - core.setViewport(cx + moveFunc(step / steps) * (px - cx), cy + moveFunc(step / steps) * (py - cy)); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - core.setViewport(px, py); - if (callback) callback(); - } - }, per_time); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; ////// 获得勇士面对位置的x坐标 ////// control.prototype.nextX = function (n) { - if (n == null) n = 1; - return core.getHeroLoc('x') + core.utils.scan[core.getHeroLoc('direction')].x * n; -} + if (n == null) n = 1; + return ( + core.getHeroLoc("x") + core.utils.scan[core.getHeroLoc("direction")].x * n + ); +}; ////// 获得勇士面对位置的y坐标 ////// control.prototype.nextY = function (n) { - if (n == null) n = 1; - return core.getHeroLoc('y') + core.utils.scan[core.getHeroLoc('direction')].y * n; -} + if (n == null) n = 1; + return ( + core.getHeroLoc("y") + core.utils.scan[core.getHeroLoc("direction")].y * n + ); +}; ////// 某个点是否在勇士旁边 ////// control.prototype.nearHero = function (x, y, n) { - if (n == null) n = 1; - return Math.abs(x - core.getHeroLoc('x')) + Math.abs(y - core.getHeroLoc('y')) <= n; -} + if (n == null) n = 1; + return ( + Math.abs(x - core.getHeroLoc("x")) + Math.abs(y - core.getHeroLoc("y")) <= n + ); +}; ////// 聚集跟随者 ////// control.prototype.gatherFollowers = function () { - var x = core.getHeroLoc('x'), y = core.getHeroLoc('y'), dir = core.getHeroLoc('direction'); - core.status.hero.followers.forEach(function (t) { - t.x = x; - t.y = y; - t.stop = true; - t.direction = dir; - }); -} + var x = core.getHeroLoc("x"), + y = core.getHeroLoc("y"), + dir = core.getHeroLoc("direction"); + core.status.hero.followers.forEach(function (t) { + t.x = x; + t.y = y; + t.stop = true; + t.direction = dir; + }); +}; ////// 更新跟随者坐标 ////// control.prototype.updateFollowers = function () { - core.status.hero.followers.forEach(function (t) { - if (!t.stop) { - t.x += core.utils.scan2[t.direction].x; - t.y += core.utils.scan2[t.direction].y; - } - }) + core.status.hero.followers.forEach(function (t) { + if (!t.stop) { + t.x += core.utils.scan2[t.direction].x; + t.y += core.utils.scan2[t.direction].y; + } + }); - var nowx = core.getHeroLoc('x'), nowy = core.getHeroLoc('y'); - core.status.hero.followers.forEach(function (t) { - t.stop = true; - var dx = nowx - t.x, dy = nowy - t.y; - for (var dir in core.utils.scan2) { - if (core.utils.scan2[dir].x == dx && core.utils.scan2[dir].y == dy) { - t.stop = false; - t.direction = dir; - } - } - nowx = t.x; nowy = t.y; - }) -} + var nowx = core.getHeroLoc("x"), + nowy = core.getHeroLoc("y"); + core.status.hero.followers.forEach(function (t) { + t.stop = true; + var dx = nowx - t.x, + dy = nowy - t.y; + for (var dir in core.utils.scan2) { + if (core.utils.scan2[dir].x == dx && core.utils.scan2[dir].y == dy) { + t.stop = false; + t.direction = dir; + } + } + nowx = t.x; + nowy = t.y; + }); +}; ////// 瞬移更新跟随者坐标 ////// control.prototype._moveDirectyFollowers = function (x, y) { - var route = core.automaticRoute(x, y); - if (route.length == 0) route = [{ x: x, y: y, direction: core.getHeroLoc('direction') }]; + var route = core.automaticRoute(x, y); + if (route.length == 0) + route = [{ x: x, y: y, direction: core.getHeroLoc("direction") }]; - var nowx = x, nowy = y; - for (var i = 0; i < core.status.hero.followers.length; ++i) { - var t = core.status.hero.followers[i]; - var index = route.length - i - 2; - if (index < 0) index = 0; - t.stop = true; - t.x = route[index].x; - t.y = route[index].y; - t.direction = route[index].direction; - var dx = nowx - t.x, dy = nowy - t.y; - for (var dir in core.utils.scan2) { - if (core.utils.scan2[dir].x == dx && core.utils.scan2[dir].y == dy) { - t.stop = false; - t.direction = dir; - } - } - nowx = t.x; nowy = t.y; + var nowx = x, + nowy = y; + for (var i = 0; i < core.status.hero.followers.length; ++i) { + var t = core.status.hero.followers[i]; + var index = route.length - i - 2; + if (index < 0) index = 0; + t.stop = true; + t.x = route[index].x; + t.y = route[index].y; + t.direction = route[index].direction; + var dx = nowx - t.x, + dy = nowy - t.y; + for (var dir in core.utils.scan2) { + if (core.utils.scan2[dir].x == dx && core.utils.scan2[dir].y == dy) { + t.stop = false; + t.direction = dir; + } } -} + nowx = t.x; + nowy = t.y; + } +}; ////// 更新领域、夹击、阻击的伤害地图 ////// control.prototype.updateCheckBlock = function (floorId) { - return this.controldata.updateCheckBlock(floorId); -} + return this.controldata.updateCheckBlock(floorId); +}; ////// 检查并执行领域、夹击、阻击事件 ////// control.prototype.checkBlock = function () { - var x = core.getHeroLoc('x'), y = core.getHeroLoc('y'), loc = x + "," + y; - var damage = core.status.checkBlock.damage[loc]; - if (damage) { - core.status.hero.hp -= damage; - var text = (Object.keys(core.status.checkBlock.type[loc] || {}).join(",")) || "伤害"; - core.drawTip("受到" + text + damage + "点"); - core.drawHeroAnimate("zone"); - this._checkBlock_disableQuickShop(); - core.status.hero.statistics.extraDamage += damage; - if (core.status.hero.hp <= 0) { - core.status.hero.hp = 0; - core.updateStatusBar(false, true); - core.events.lose(); - return; - } else { - core.updateStatusBar(false, true); - } + var x = core.getHeroLoc("x"), + y = core.getHeroLoc("y"), + loc = x + "," + y; + var damage = core.status.checkBlock.damage[loc]; + if (damage) { + core.status.hero.hp -= damage; + var text = + Object.keys(core.status.checkBlock.type[loc] || {}).join(",") || "伤害"; + core.drawTip("受到" + text + damage + "点"); + core.drawHeroAnimate("zone"); + this._checkBlock_disableQuickShop(); + core.status.hero.statistics.extraDamage += damage; + if (core.status.hero.hp <= 0) { + core.status.hero.hp = 0; + core.updateStatusBar(false, true); + core.events.lose(); + return; + } else { + core.updateStatusBar(false, true); } - this._checkBlock_ambush(core.status.checkBlock.ambush[loc]); - this._checkBlock_repulse(core.status.checkBlock.repulse[loc]); -} + } + this._checkBlock_ambush(core.status.checkBlock.ambush[loc]); + this._checkBlock_repulse(core.status.checkBlock.repulse[loc]); +}; control.prototype._checkBlock_disableQuickShop = function () { - // 禁用快捷商店 - if (core.flags.disableShopOnDamage) { - Object.keys(core.status.shops).forEach(function (shopId) { - core.setShopVisited(shopId, false); - }); - } -} + // 禁用快捷商店 + if (core.flags.disableShopOnDamage) { + Object.keys(core.status.shops).forEach(function (shopId) { + core.setShopVisited(shopId, false); + }); + } +}; ////// 阻击 ////// control.prototype._checkBlock_repulse = function (repulse) { - if (!repulse || repulse.length == 0) return; - var actions = []; - repulse.forEach(function (t) { - actions.push({ "type": "move", "loc": [t[0], t[1]], "steps": [t[3]], "time": 250, "keep": true, "async": true }); + if (!repulse || repulse.length == 0) return; + var actions = []; + repulse.forEach(function (t) { + actions.push({ + type: "move", + loc: [t[0], t[1]], + steps: [t[3]], + time: 250, + keep: true, + async: true, }); - actions.push({ "type": "waitAsync" }); - core.insertAction(actions); -} + }); + actions.push({ type: "waitAsync" }); + core.insertAction(actions); +}; ////// 捕捉 ////// control.prototype._checkBlock_ambush = function (ambush) { - if (!ambush || ambush.length == 0) return; - // 捕捉效果 - var actions = []; - ambush.forEach(function (t) { - actions.push({ "type": "move", "loc": [t[0], t[1]], "steps": [t[3]], "time": 250, "keep": false, "async": true }); + if (!ambush || ambush.length == 0) return; + // 捕捉效果 + var actions = []; + ambush.forEach(function (t) { + actions.push({ + type: "move", + loc: [t[0], t[1]], + steps: [t[3]], + time: 250, + keep: false, + async: true, }); - actions.push({ "type": "waitAsync" }); - // 强制战斗 - ambush.forEach(function (t) { - actions.push({ - "type": "function", "function": "function() { " + - "core.battle('" + t[2] + "', " + t[0] + "," + t[1] + ", true, core.doAction); " + - "}", "async": true - }); + }); + actions.push({ type: "waitAsync" }); + // 强制战斗 + ambush.forEach(function (t) { + actions.push({ + type: "function", + function: + "function() { " + + "core.battle('" + + t[2] + + "', " + + t[0] + + "," + + t[1] + + ", true, core.doAction); " + + "}", + async: true, }); - core.insertAction(actions); -} + }); + core.insertAction(actions); +}; ////// 更新全地图显伤 ////// control.prototype.updateDamage = function (floorId, ctx) { - floorId = floorId || core.status.floorId; - if (!floorId || core.status.gameOver || main.mode != 'play') return; - var onMap = ctx == null; + floorId = floorId || core.status.floorId; + if (!floorId || core.status.gameOver || main.mode != "play") return; + var onMap = ctx == null; - // 没有怪物手册 - if (!core.hasItem('book')) return; - core.status.damage.posX = core.bigmap.posX; - core.status.damage.posY = core.bigmap.posY; - if (!onMap) { - var width = core.floors[floorId].width, height = core.floors[floorId].height; - // 地图过大的缩略图不绘制显伤 - if (width * height > core.bigmap.threshold) return; - } - this._updateDamage_damage(floorId, onMap); - this._updateDamage_extraDamage(floorId, onMap); - this.drawDamage(ctx); -} + // 没有怪物手册 + if (!core.hasItem("book")) return; + core.status.damage.posX = core.bigmap.posX; + core.status.damage.posY = core.bigmap.posY; + if (!onMap) { + var width = core.floors[floorId].width, + height = core.floors[floorId].height; + // 地图过大的缩略图不绘制显伤 + if (width * height > core.bigmap.threshold) return; + } + this._updateDamage_damage(floorId, onMap); + this._updateDamage_extraDamage(floorId, onMap); + this.drawDamage(ctx); +}; control.prototype._updateDamage_damage = function (floorId, onMap) { - core.status.damage.data = []; - if (!core.flags.displayEnemyDamage && !core.flags.displayExtraDamage) return; + core.status.damage.data = []; + if (!core.flags.displayEnemyDamage && !core.flags.displayExtraDamage) return; - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - var x = block.x, y = block.y; + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + var x = block.x, + y = block.y; - // v2优化,只绘制范围内的部分 - if (onMap && core.bigmap.v2) { - if (x < core.bigmap.posX - core.bigmap.extend || x > core.bigmap.posX + core._WIDTH_ + core.bigmap.extend - || y < core.bigmap.posY - core.bigmap.extend || y > core.bigmap.posY + core._HEIGHT_ + core.bigmap.extend) { - return; - } - } + // v2优化,只绘制范围内的部分 + if (onMap && core.bigmap.v2) { + if ( + x < core.bigmap.posX - core.bigmap.extend || + x > core.bigmap.posX + core._WIDTH_ + core.bigmap.extend || + y < core.bigmap.posY - core.bigmap.extend || + y > core.bigmap.posY + core._HEIGHT_ + core.bigmap.extend + ) { + return; + } + } - if (!block.disable && block.event.cls.indexOf('enemy') == 0 && block.event.displayDamage !== false) { - if (core.flags.displayEnemyDamage) { - var damageString = core.enemys.getDamageString(block.event.id, x, y, floorId); - core.status.damage.data.push({ text: damageString.damage, px: 32 * x + 1, py: 32 * (y + 1) - 1, color: damageString.color }); - } - if (core.flags.displayCritical) { - var critical = core.enemys.nextCriticals(block.event.id, 1, x, y, floorId); - critical = core.formatBigNumber((critical[0] || [])[0], true); - if (critical == '???') critical = '?'; - core.status.damage.data.push({ text: critical, px: 32 * x + 1, py: 32 * (y + 1) - 11, color: '#FFFFFF' }); - } - } - }); -} + if ( + !block.disable && + block.event.cls.indexOf("enemy") == 0 && + block.event.displayDamage !== false + ) { + if (core.flags.displayEnemyDamage) { + var damageString = core.enemys.getDamageString( + block.event.id, + x, + y, + floorId + ); + core.status.damage.data.push({ + text: damageString.damage, + px: 32 * x + 1, + py: 32 * (y + 1) - 1, + color: damageString.color, + }); + } + if (core.flags.displayCritical) { + var critical = core.enemys.nextCriticals( + block.event.id, + 1, + x, + y, + floorId + ); + critical = core.formatBigNumber((critical[0] || [])[0], true); + if (critical == "???") critical = "?"; + core.status.damage.data.push({ + text: critical, + px: 32 * x + 1, + py: 32 * (y + 1) - 11, + color: "#FFFFFF", + }); + } + } + }); +}; control.prototype._updateDamage_extraDamage = function (floorId, onMap) { - core.status.damage.extraData = []; - if (!core.flags.displayExtraDamage) return; + core.status.damage.extraData = []; + if (!core.flags.displayExtraDamage) return; - var width = core.floors[floorId].width, height = core.floors[floorId].height; - var startX = onMap && core.bigmap.v2 ? Math.max(0, core.bigmap.posX - core.bigmap.extend) : 0; - var endX = onMap && core.bigmap.v2 ? Math.min(width, core.bigmap.posX + core._WIDTH_ + core.bigmap.extend + 1) : width; - var startY = onMap && core.bigmap.v2 ? Math.max(0, core.bigmap.posY - core.bigmap.extend) : 0; - var endY = onMap && core.bigmap.v2 ? Math.min(height, core.bigmap.posY + core._HEIGHT_ + core.bigmap.extend + 1) : height; + var width = core.floors[floorId].width, + height = core.floors[floorId].height; + var startX = + onMap && core.bigmap.v2 + ? Math.max(0, core.bigmap.posX - core.bigmap.extend) + : 0; + var endX = + onMap && core.bigmap.v2 + ? Math.min( + width, + core.bigmap.posX + core._WIDTH_ + core.bigmap.extend + 1 + ) + : width; + var startY = + onMap && core.bigmap.v2 + ? Math.max(0, core.bigmap.posY - core.bigmap.extend) + : 0; + var endY = + onMap && core.bigmap.v2 + ? Math.min( + height, + core.bigmap.posY + core._HEIGHT_ + core.bigmap.extend + 1 + ) + : height; - for (var x = startX; x < endX; x++) { - for (var y = startY; y < endY; y++) { - var alpha = 1; - if (core.noPass(x, y, floorId)) { - if (core.flags.extraDamageType == 2) alpha = 0; - else if (core.flags.extraDamageType == 1) alpha = 0.6; - } - var damage = core.status.checkBlock.damage[x + "," + y] || 0; - if (damage > 0) { // 该点伤害 - damage = core.formatBigNumber(damage, true); - core.status.damage.extraData.push({ text: damage, px: 32 * x + 16, py: 32 * (y + 1) - 14, color: '#ffaa33', alpha: alpha }); - } - else { // 检查捕捉 - if (core.status.checkBlock.ambush[x + "," + y]) { - core.status.damage.extraData.push({ text: '!', px: 32 * x + 16, py: 32 * (y + 1) - 14, color: '#ffaa33', alpha: alpha }); - } - } + for (var x = startX; x < endX; x++) { + for (var y = startY; y < endY; y++) { + var alpha = 1; + if (core.noPass(x, y, floorId)) { + if (core.flags.extraDamageType == 2) alpha = 0; + else if (core.flags.extraDamageType == 1) alpha = 0.6; + } + var damage = core.status.checkBlock.damage[x + "," + y] || 0; + if (damage > 0) { + // 该点伤害 + damage = core.formatBigNumber(damage, true); + core.status.damage.extraData.push({ + text: damage, + px: 32 * x + 16, + py: 32 * (y + 1) - 14, + color: "#ffaa33", + alpha: alpha, + }); + } else { + // 检查捕捉 + if (core.status.checkBlock.ambush[x + "," + y]) { + core.status.damage.extraData.push({ + text: "!", + px: 32 * x + 16, + py: 32 * (y + 1) - 14, + color: "#ffaa33", + alpha: alpha, + }); } + } } -} + } +}; ////// 重绘地图显伤 ////// control.prototype.drawDamage = function (ctx) { - if (core.status.gameOver || !core.status.damage || main.mode != 'play') return; - var onMap = false; - if (ctx == null) { - ctx = core.canvas.damage; - core.clearMap('damage'); - onMap = true; - } + if (core.status.gameOver || !core.status.damage || main.mode != "play") + return; + var onMap = false; + if (ctx == null) { + ctx = core.canvas.damage; + core.clearMap("damage"); + onMap = true; + } - if (onMap && core.bigmap.v2) { - // 检查是否需要重算... - if (Math.abs(core.bigmap.posX - core.status.damage.posX) >= core.bigmap.extend - 1 - || Math.abs(core.bigmap.posY - core.status.damage.posY) >= core.bigmap.extend - 1) { - return this.updateDamage(); - } + if (onMap && core.bigmap.v2) { + // 检查是否需要重算... + if ( + Math.abs(core.bigmap.posX - core.status.damage.posX) >= + core.bigmap.extend - 1 || + Math.abs(core.bigmap.posY - core.status.damage.posY) >= + core.bigmap.extend - 1 + ) { + return this.updateDamage(); } - return this._drawDamage_draw(ctx, onMap); -} + } + return this._drawDamage_draw(ctx, onMap); +}; control.prototype._drawDamage_draw = function (ctx, onMap) { - if (!core.hasItem('book')) return; + if (!core.hasItem("book")) return; - core.setFont(ctx, "bold 11px Arial"); - core.setTextAlign(ctx, 'left'); - core.status.damage.data.forEach(function (one) { - var px = one.px, py = one.py; - if (onMap && core.bigmap.v2) { - px -= core.bigmap.posX * 32; - py -= core.bigmap.posY * 32; - if (px < -32 * 2 || px > core._PX_ + 32 || py < -32 || py > core._PY_ + 32) - return; - } - core.fillBoldText(ctx, one.text, px, py, one.color); - }); + core.setFont(ctx, "bold 11px Arial"); + core.setTextAlign(ctx, "left"); + core.status.damage.data.forEach(function (one) { + var px = one.px, + py = one.py; + if (onMap && core.bigmap.v2) { + px -= core.bigmap.posX * 32; + py -= core.bigmap.posY * 32; + if ( + px < -32 * 2 || + px > core._PX_ + 32 || + py < -32 || + py > core._PY_ + 32 + ) + return; + } + core.fillBoldText(ctx, one.text, px, py, one.color); + }); - core.setTextAlign(ctx, 'center'); - core.status.damage.extraData.forEach(function (one) { - var px = one.px, py = one.py; - if (onMap && core.bigmap.v2) { - px -= core.bigmap.posX * 32; - py -= core.bigmap.posY * 32; - if (px < -32 || px > core._PX_ + 32 || py < -32 || py > core._PY_ + 32) - return; - } - var alpha = core.setAlpha(ctx, one.alpha); - core.fillBoldText(ctx, one.text, px, py, one.color); - core.setAlpha(ctx, alpha); - }); -} + core.setTextAlign(ctx, "center"); + core.status.damage.extraData.forEach(function (one) { + var px = one.px, + py = one.py; + if (onMap && core.bigmap.v2) { + px -= core.bigmap.posX * 32; + py -= core.bigmap.posY * 32; + if (px < -32 || px > core._PX_ + 32 || py < -32 || py > core._PY_ + 32) + return; + } + var alpha = core.setAlpha(ctx, one.alpha); + core.fillBoldText(ctx, one.text, px, py, one.color); + core.setAlpha(ctx, alpha); + }); +}; // ------ 录像相关 ------ // ////// 选择录像文件 ////// control.prototype.chooseReplayFile = function () { - core.readFile(function (obj) { - if (obj.name != core.firstData.name) return alert("存档和游戏不一致!"); - if (!obj.route) return alert("无效的录像!"); - var _replay = function () { - core.startGame(core.flags.startUsingCanvas ? '' : obj.hard || '', obj.seed, core.decodeRoute(obj.route)); - } - if (obj.version && obj.version != core.firstData.version) { - core.myconfirm("游戏版本不一致!\n你仍然想播放录像吗?", _replay); - return; - } - _replay(); - }, null, ".h5route"); -} + core.readFile( + function (obj) { + if (obj.name != core.firstData.name) return alert("存档和游戏不一致!"); + if (!obj.route) return alert("无效的录像!"); + var _replay = function () { + core.startGame( + core.flags.startUsingCanvas ? "" : obj.hard || "", + obj.seed, + core.decodeRoute(obj.route) + ); + }; + if (obj.version && obj.version != core.firstData.version) { + core.myconfirm("游戏版本不一致!\n你仍然想播放录像吗?", _replay); + return; + } + _replay(); + }, + null, + ".h5route" + ); +}; ////// 开始播放 ////// control.prototype.startReplay = function (list) { - if (!core.isPlaying()) return; - core.status.replay.replaying = true; - core.status.replay.pausing = true; - core.status.replay.failed = false; - core.status.replay.speed = 1.0; - core.status.replay.toReplay = core.cloneArray(list); - core.status.replay.totalList = core.status.route.concat(list); - core.status.replay.steps = 0; - core.status.replay.save = []; - core.createCanvas('replay', 0, core._PY_ - 40, core._PX_, 40, 199); - core.setOpacity('replay', 0.6); - this._replay_drawProgress(); - core.updateStatusBar(false, true); - core.drawTip("开始播放"); - this.replay(); -} + if (!core.isPlaying()) return; + core.status.replay.replaying = true; + core.status.replay.pausing = true; + core.status.replay.failed = false; + core.status.replay.speed = 1.0; + core.status.replay.toReplay = core.cloneArray(list); + core.status.replay.totalList = core.status.route.concat(list); + core.status.replay.steps = 0; + core.status.replay.save = []; + core.createCanvas("replay", 0, core._PY_ - 40, core._PX_, 40, 199); + core.setOpacity("replay", 0.6); + this._replay_drawProgress(); + core.updateStatusBar(false, true); + core.drawTip("开始播放"); + this.replay(); +}; ////// 更改播放状态 ////// control.prototype.triggerReplay = function () { - if (core.status.replay.pausing) this.resumeReplay(); - else this.pauseReplay(); -} + if (core.status.replay.pausing) this.resumeReplay(); + else this.pauseReplay(); +}; ////// 暂停播放 ////// control.prototype.pauseReplay = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - core.status.replay.pausing = true; - core.updateStatusBar(false, true); - core.drawTip("暂停播放"); -} + if (!core.isPlaying() || !core.isReplaying()) return; + core.status.replay.pausing = true; + core.updateStatusBar(false, true); + core.drawTip("暂停播放"); +}; ////// 恢复播放 ////// control.prototype.resumeReplay = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - core.status.replay.pausing = false; - core.updateStatusBar(false, true); - core.drawTip("恢复播放"); - core.replay(); -} + if (!core.isPlaying() || !core.isReplaying()) return; + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + core.status.replay.pausing = false; + core.updateStatusBar(false, true); + core.drawTip("恢复播放"); + core.replay(); +}; ////// 单步播放 ////// control.prototype.stepReplay = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - core.replay(true); -} + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + core.replay(true); +}; ////// 加速播放 ////// control.prototype.speedUpReplay = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - var speeds = [0.2, 0.5, 1, 2, 3, 6, 12, 24]; - for (var i = speeds.length - 2; i >= 0; i--) { - if (speeds[i] <= core.status.replay.speed) { - core.status.replay.speed = speeds[i + 1]; - break; - } + if (!core.isPlaying() || !core.isReplaying()) return; + var speeds = [0.2, 0.5, 1, 2, 3, 6, 12, 24]; + for (var i = speeds.length - 2; i >= 0; i--) { + if (speeds[i] <= core.status.replay.speed) { + core.status.replay.speed = speeds[i + 1]; + break; } - core.drawTip("x" + core.status.replay.speed + "倍"); -} + } + core.drawTip("x" + core.status.replay.speed + "倍"); +}; ////// 减速播放 ////// control.prototype.speedDownReplay = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - var speeds = [0.2, 0.5, 1, 2, 3, 6, 12, 24]; - for (var i = 1; i <= speeds.length; i++) { - if (speeds[i] >= core.status.replay.speed) { - core.status.replay.speed = speeds[i - 1]; - break; - } + if (!core.isPlaying() || !core.isReplaying()) return; + var speeds = [0.2, 0.5, 1, 2, 3, 6, 12, 24]; + for (var i = 1; i <= speeds.length; i++) { + if (speeds[i] >= core.status.replay.speed) { + core.status.replay.speed = speeds[i - 1]; + break; } - core.drawTip("x" + core.status.replay.speed + "倍"); -} + } + core.drawTip("x" + core.status.replay.speed + "倍"); +}; ////// 设置播放速度 ////// control.prototype.setReplaySpeed = function (speed) { - if (!core.isPlaying() || !core.isReplaying()) return; - core.status.replay.speed = speed; - core.drawTip("x" + core.status.replay.speed + "倍"); -} + if (!core.isPlaying() || !core.isReplaying()) return; + core.status.replay.speed = speed; + core.drawTip("x" + core.status.replay.speed + "倍"); +}; ////// 停止播放 ////// control.prototype.stopReplay = function (force) { - if (!core.isPlaying()) return; - if (!core.isReplaying() && !force) return; - core.status.replay.toReplay = []; - core.status.replay.totalList = []; - core.status.replay.replaying = false; - core.status.replay.pausing = false; - core.status.replay.failed = false; - core.status.replay.speed = 1.0; - core.status.replay.steps = 0; - core.status.replay.save = []; - core.deleteCanvas('replay'); - core.updateStatusBar(false, true); - core.drawTip("停止播放并恢复游戏"); -} + if (!core.isPlaying()) return; + if (!core.isReplaying() && !force) return; + core.status.replay.toReplay = []; + core.status.replay.totalList = []; + core.status.replay.replaying = false; + core.status.replay.pausing = false; + core.status.replay.failed = false; + core.status.replay.speed = 1.0; + core.status.replay.steps = 0; + core.status.replay.save = []; + core.deleteCanvas("replay"); + core.updateStatusBar(false, true); + core.drawTip("停止播放并恢复游戏"); +}; ////// 回退 ////// control.prototype.rewindReplay = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - if (core.status.replay.save.length == 0) { - core.playSound('操作失败'); - return core.drawTip("无法再回到上一个节点"); - } - var save = core.status.replay.save, data = save.pop(); - core.loadData(data.data, function () { - core.removeFlag('__fromLoad__'); - core.status.replay = { - "replaying": true, - "pausing": true, - "animate": false, - "toReplay": data.replay.toReplay, - "totalList": data.replay.totalList, - "speed": core.status.replay.speed, - "steps": data.replay.steps, - "save": save - } - core.createCanvas('replay', 0, core._PY_ - 40, core._PX_, 40, 199); - core.setOpacity('replay', 0.6); - core.control._replay_drawProgress(); - core.updateStatusBar(false, true); - core.drawTip("成功回退到上一个节点"); - }); -} + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + if (core.status.replay.save.length == 0) { + core.playSound("操作失败"); + return core.drawTip("无法再回到上一个节点"); + } + var save = core.status.replay.save, + data = save.pop(); + core.loadData(data.data, function () { + core.removeFlag("__fromLoad__"); + core.status.replay = { + replaying: true, + pausing: true, + animate: false, + toReplay: data.replay.toReplay, + totalList: data.replay.totalList, + speed: core.status.replay.speed, + steps: data.replay.steps, + save: save, + }; + core.createCanvas("replay", 0, core._PY_ - 40, core._PX_, 40, 199); + core.setOpacity("replay", 0.6); + core.control._replay_drawProgress(); + core.updateStatusBar(false, true); + core.drawTip("成功回退到上一个节点"); + }); +}; ////// 回放时存档 ////// control.prototype._replay_SL = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - if (core.hasFlag('__forbidSave__')) { - core.playSound('操作失败'); - return core.drawTip('当前禁止存档'); - } - this._replay_hideProgress(); + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + if (core.hasFlag("__forbidSave__")) { + core.playSound("操作失败"); + return core.drawTip("当前禁止存档"); + } + this._replay_hideProgress(); - core.lockControl(); - core.status.event.id = 'save'; - var saveIndex = core.saves.saveIndex; - var page = parseInt((saveIndex - 1) / 5), offset = saveIndex - 5 * page; + core.lockControl(); + core.status.event.id = "save"; + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 5), + offset = saveIndex - 5 * page; - core.ui._drawSLPanel(10 * page + offset); -} + core.ui._drawSLPanel(10 * page + offset); +}; ////// 回放时查看怪物手册 ////// control.prototype._replay_book = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || (core.status.event.id && core.status.event.id != 'viewMaps')) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - if (!core.hasItem('book')) { - core.playSound('操作失败'); - return core.drawTip('你没有' + core.material.items['book'].name, 'book'); - } - this._replay_hideProgress(); + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if ( + core.isMoving() || + core.status.replay.animate || + (core.status.event.id && core.status.event.id != "viewMaps") + ) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + if (!core.hasItem("book")) { + core.playSound("操作失败"); + return core.drawTip("你没有" + core.material.items["book"].name, "book"); + } + this._replay_hideProgress(); - // 从“浏览地图”页面打开 - if (core.status.event.id == 'viewMaps') - core.status.event.ui = core.status.event.data; + // 从“浏览地图”页面打开 + if (core.status.event.id == "viewMaps") + core.status.event.ui = core.status.event.data; - core.lockControl(); - core.status.event.id = 'book'; - core.useItem('book', true); -} + core.lockControl(); + core.status.event.id = "book"; + core.useItem("book", true); +}; ////// 回放录像时浏览地图 ////// control.prototype._replay_viewMap = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - this._replay_hideProgress(); + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + this._replay_hideProgress(); - core.lockControl(); - core.status.event.id = 'viewMaps'; - core.ui._drawViewMaps(); -} + core.lockControl(); + core.status.event.id = "viewMaps"; + core.ui._drawViewMaps(); +}; control.prototype._replay_toolbox = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - this._replay_hideProgress(); + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + this._replay_hideProgress(); - core.lockControl(); - core.status.event.id = 'toolbox'; - core.ui._drawToolbox(); -} + core.lockControl(); + core.status.event.id = "toolbox"; + core.ui._drawToolbox(); +}; control.prototype._replay_equipbox = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) { - core.playSound('操作失败'); - return core.drawTip("请先暂停录像"); - } - if (core.isMoving() || core.status.replay.animate || core.status.event.id) { - core.playSound('操作失败'); - return core.drawTip("请等待当前事件的处理结束"); - } - this._replay_hideProgress(); + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + this._replay_hideProgress(); - core.lockControl(); - core.status.event.id = 'equipbox'; - core.ui._drawEquipbox(); -} + core.lockControl(); + core.status.event.id = "equipbox"; + core.ui._drawEquipbox(); +}; ////// 是否正在播放录像 ////// control.prototype.isReplaying = function () { - return (core.status.replay || {}).replaying; -} + return (core.status.replay || {}).replaying; +}; ////// 回放 ////// control.prototype.replay = function (force) { - if (!core.isPlaying() || !core.isReplaying() - || core.status.replay.animate || core.status.event.id || core.status.replay.failed) return; - if (core.status.replay.pausing && !force) return; - this._replay_drawProgress(); - if (core.status.replay.toReplay.length == 0) - return this._replay_finished(); - this._replay_save(); - var action = core.status.replay.toReplay.shift(); - if (this._doReplayAction(action)) return; - this._replay_error(action); -} + if ( + !core.isPlaying() || + !core.isReplaying() || + core.status.replay.animate || + core.status.event.id || + core.status.replay.failed + ) + return; + if (core.status.replay.pausing && !force) return; + this._replay_drawProgress(); + if (core.status.replay.toReplay.length == 0) return this._replay_finished(); + this._replay_save(); + var action = core.status.replay.toReplay.shift(); + if (this._doReplayAction(action)) return; + this._replay_error(action); +}; ////// 注册一个录像行为 ////// // name:自定义名称,可用于注销使用 @@ -1608,1958 +2039,2394 @@ control.prototype.replay = function (force) { // 需要接受一个action参数,代表录像回放时的下一个操作 // func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。 control.prototype.registerReplayAction = function (name, func) { - this.unregisterReplayAction(name); - this.replayActions.push({ name: name, func: func }); -} + this.unregisterReplayAction(name); + this.replayActions.push({ name: name, func: func }); +}; ////// 注销一个录像行为 ////// control.prototype.unregisterReplayAction = function (name) { - this.replayActions = this.replayActions.filter(function (b) { return b.name != name; }); -} + this.replayActions = this.replayActions.filter(function (b) { + return b.name != name; + }); +}; ////// 执行录像行为,会在注册的函数中依次执行直到得到true为止 ////// control.prototype._doReplayAction = function (action) { - for (var i in this.replayActions) { - try { - if (core.doFunc(this.replayActions[i].func, this, action)) return true; - } catch (e) { - console.error(e); - console.error("ERROR in replayActions[" + this.replayActions[i].name + "]:已自动注销该项。"); - core.unregisterReplayAction(this.replayActions[i].name); - } + for (var i in this.replayActions) { + try { + if (core.doFunc(this.replayActions[i].func, this, action)) return true; + } catch (e) { + console.error(e); + console.error( + "ERROR in replayActions[" + + this.replayActions[i].name + + "]:已自动注销该项。" + ); + core.unregisterReplayAction(this.replayActions[i].name); } - return false; -} + } + return false; +}; control.prototype._replay_finished = function () { - core.status.replay.replaying = false; - core.status.replay.failed = false; - core.status.event.selection = 0; - var str = "录像播放完毕,你想退出播放吗?"; - if (core.status.route.length != core.status.replay.totalList.length - || core.subarray(core.status.route, core.status.replay.totalList) == null) { - str = "录像播放完毕,但记录不一致。\n请检查录像播放时的二次记录问题。\n你想退出播放吗?"; + core.status.replay.replaying = false; + core.status.replay.failed = false; + core.status.event.selection = 0; + var str = "录像播放完毕,你想退出播放吗?"; + if ( + core.status.route.length != core.status.replay.totalList.length || + core.subarray(core.status.route, core.status.replay.totalList) == null + ) { + str = + "录像播放完毕,但记录不一致。\n请检查录像播放时的二次记录问题。\n你想退出播放吗?"; + } + core.ui.drawConfirmBox( + str, + function () { + core.ui.closePanel(); + core.stopReplay(true); + }, + function () { + core.status.replay.replaying = true; + core.ui.closePanel(); + core.pauseReplay(); } - core.ui.drawConfirmBox(str, function () { - core.ui.closePanel(); - core.stopReplay(true); - }, function () { - core.status.replay.replaying = true; - core.ui.closePanel(); - core.pauseReplay(); - }); -} + ); +}; control.prototype._replay_save = function () { - core.status.replay.steps++; - if (core.status.replay.steps % 40 == 1) { - if (core.status.replay.save.length == 30) - core.status.replay.save.shift(); - core.status.replay.save.push({ - "data": core.saveData(), "replay": { - "totalList": core.cloneArray(core.status.replay.totalList), - "toReplay": core.cloneArray(core.status.replay.toReplay), - "steps": core.status.replay.steps - } - }); - } -} + core.status.replay.steps++; + if (core.status.replay.steps % 40 == 1) { + if (core.status.replay.save.length == 30) core.status.replay.save.shift(); + core.status.replay.save.push({ + data: core.saveData(), + replay: { + totalList: core.cloneArray(core.status.replay.totalList), + toReplay: core.cloneArray(core.status.replay.toReplay), + steps: core.status.replay.steps, + }, + }); + } +}; control.prototype._replay_error = function (action, callback) { - core.ui.closePanel(); - core.status.replay.replaying = false; - core.status.replay.failed = true; - var len = core.status.replay.toReplay.length; - var prevList = core.status.replay.totalList.slice(-len - 11, -len - 1); - var nextList = core.status.replay.toReplay.slice(0, 10); - console.log("录像文件出错,当前操作:" + action); - console.log("之前的10个操作是:\n" + prevList.toString()); - console.log("接下来10个操作是:\n" + nextList.toString()); - core.ui.drawConfirmBox("录像文件出错,你想回到上个节点吗?", function () { - core.status.replay.failed = false; - core.ui.closePanel(); - if (core.status.replay.save.length > 0) { - core.status.replay.replaying = true; - core.status.replay.pausing = true; - core.rewindReplay(); - } - else { - core.playSound('操作失败'); - core.stopReplay(true); - core.drawTip("无法回到上一个节点"); - if (callback) callback(); - } - }, function () { - core.status.replay.failed = false; - core.ui.closePanel(); + core.ui.closePanel(); + core.status.replay.replaying = false; + core.status.replay.failed = true; + var len = core.status.replay.toReplay.length; + var prevList = core.status.replay.totalList.slice(-len - 11, -len - 1); + var nextList = core.status.replay.toReplay.slice(0, 10); + console.log("录像文件出错,当前操作:" + action); + console.log("之前的10个操作是:\n" + prevList.toString()); + console.log("接下来10个操作是:\n" + nextList.toString()); + core.ui.drawConfirmBox( + "录像文件出错,你想回到上个节点吗?", + function () { + core.status.replay.failed = false; + core.ui.closePanel(); + if (core.status.replay.save.length > 0) { + core.status.replay.replaying = true; + core.status.replay.pausing = true; + core.rewindReplay(); + } else { + core.playSound("操作失败"); core.stopReplay(true); + core.drawTip("无法回到上一个节点"); if (callback) callback(); - }); -} + } + }, + function () { + core.status.replay.failed = false; + core.ui.closePanel(); + core.stopReplay(true); + if (callback) callback(); + } + ); +}; control.prototype._replay_hideProgress = function () { - if (core.dymCanvas.replay) core.dymCanvas.replay.canvas.style.display = 'none'; -} + if (core.dymCanvas.replay) + core.dymCanvas.replay.canvas.style.display = "none"; +}; control.prototype._replay_drawProgress = function () { - if (!core.dymCanvas.replay) return; - if (core.dymCanvas.replay.canvas.style.display == 'none') core.dymCanvas.replay.canvas.style.display = 'block'; - var total = core.status.replay.totalList.length, left = total - core.status.replay.toReplay.length; - var content = '播放进度:' + left + ' / ' + total + '(' + (left / total * 100).toFixed(2) + '%)'; - var width = 26 + core.calWidth('replay', content, "16px Arial"); - core.clearMap('replay'); - core.fillRect('replay', 0, 0, width, 40, '#000000'); - core.fillText('replay', content, 16, 27, '#FFFFFF'); -} + if (!core.dymCanvas.replay) return; + if (core.dymCanvas.replay.canvas.style.display == "none") + core.dymCanvas.replay.canvas.style.display = "block"; + var total = core.status.replay.totalList.length, + left = total - core.status.replay.toReplay.length; + var content = + "播放进度:" + + left + + " / " + + total + + "(" + + ((left / total) * 100).toFixed(2) + + "%)"; + var width = 26 + core.calWidth("replay", content, "16px Arial"); + core.clearMap("replay"); + core.fillRect("replay", 0, 0, width, 40, "#000000"); + core.fillText("replay", content, 16, 27, "#FFFFFF"); +}; control.prototype.__replay_getTimeout = function () { - if (core.status.replay.speed == 24) return 0; - return 750 / Math.max(1, core.status.replay.speed); -} + if (core.status.replay.speed == 24) return 0; + return 750 / Math.max(1, core.status.replay.speed); +}; control.prototype._replayAction_move = function (action) { - if (["up", "down", "left", "right"].indexOf(action) < 0) return false; - core.moveHero(action, core.replay); - return true; -} + if (["up", "down", "left", "right"].indexOf(action) < 0) return false; + core.moveHero(action, core.replay); + return true; +}; control.prototype._replayAction_item = function (action) { - if (action.indexOf("item:") != 0) return false; - var itemId = action.substring(5); - if (!core.canUseItem(itemId)) return false; - if (core.material.items[itemId].hideInReplay || core.status.replay.speed == 24) { - core.useItem(itemId, false, core.replay); - return true; - } - var tools = core.getToolboxItems('tools'), - constants = core.getToolboxItems('constants'); - var index, per = core._WIDTH_ - 1; - if ((index = tools.indexOf(itemId)) >= 0) { - core.status.event.data = { "toolsPage": Math.floor(index / per) + 1, "constantsPage": 1 }; - index = index % per; - } - else if ((index = constants.indexOf(itemId)) >= 0) { - core.status.event.data = { "toolsPage": 1, "constantsPage": Math.floor(index / per) + 1 }; - index = index % per + per; - } - if (index < 0) return false; - core.ui._drawToolbox(index); - setTimeout(function () { - core.ui.closePanel(); - core.useItem(itemId, false, core.replay); - }, core.control.__replay_getTimeout()); + if (action.indexOf("item:") != 0) return false; + var itemId = action.substring(5); + if (!core.canUseItem(itemId)) return false; + if ( + core.material.items[itemId].hideInReplay || + core.status.replay.speed == 24 + ) { + core.useItem(itemId, false, core.replay); return true; -} + } + var tools = core.getToolboxItems("tools"), + constants = core.getToolboxItems("constants"); + var index, + per = core._WIDTH_ - 1; + if ((index = tools.indexOf(itemId)) >= 0) { + core.status.event.data = { + toolsPage: Math.floor(index / per) + 1, + constantsPage: 1, + }; + index = index % per; + } else if ((index = constants.indexOf(itemId)) >= 0) { + core.status.event.data = { + toolsPage: 1, + constantsPage: Math.floor(index / per) + 1, + }; + index = (index % per) + per; + } + if (index < 0) return false; + core.ui._drawToolbox(index); + setTimeout(function () { + core.ui.closePanel(); + core.useItem(itemId, false, core.replay); + }, core.control.__replay_getTimeout()); + return true; +}; control.prototype._replayAction_equip = function (action) { - if (action.indexOf("equip:") != 0) return false; - var equipId = action.substring(6); - var ownEquipment = core.getToolboxItems('equips'); - var index = ownEquipment.indexOf(equipId), per = core._WIDTH_ - 1; - if (index < 0) { - core.removeFlag('__doNotCheckAutoEvents__'); - return false; - } + if (action.indexOf("equip:") != 0) return false; + var equipId = action.substring(6); + var ownEquipment = core.getToolboxItems("equips"); + var index = ownEquipment.indexOf(equipId), + per = core._WIDTH_ - 1; + if (index < 0) { + core.removeFlag("__doNotCheckAutoEvents__"); + return false; + } - var cb = function () { - var next = core.status.replay.toReplay[0] || ""; - if (!next.startsWith('equip:') && !next.startsWith('unEquip:')) { - core.removeFlag('__doNotCheckAutoEvents__'); - core.checkAutoEvents(); - } - core.replay(); + var cb = function () { + var next = core.status.replay.toReplay[0] || ""; + if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) { + core.removeFlag("__doNotCheckAutoEvents__"); + core.checkAutoEvents(); } - core.setFlag('__doNotCheckAutoEvents__', true); + core.replay(); + }; + core.setFlag("__doNotCheckAutoEvents__", true); - core.status.route.push(action); - if (core.material.items[equipId].hideInReplay || core.status.replay.speed == 24) { - core.loadEquip(equipId, cb); - return true; - } - core.status.event.data = { "page": Math.floor(index / per) + 1, "selectId": null }; - index = index % per + per; - core.ui._drawEquipbox(index); - setTimeout(function () { - core.ui.closePanel(); - core.loadEquip(equipId, cb); - }, core.control.__replay_getTimeout()); + core.status.route.push(action); + if ( + core.material.items[equipId].hideInReplay || + core.status.replay.speed == 24 + ) { + core.loadEquip(equipId, cb); return true; -} + } + core.status.event.data = { + page: Math.floor(index / per) + 1, + selectId: null, + }; + index = (index % per) + per; + core.ui._drawEquipbox(index); + setTimeout(function () { + core.ui.closePanel(); + core.loadEquip(equipId, cb); + }, core.control.__replay_getTimeout()); + return true; +}; control.prototype._replayAction_unEquip = function (action) { - if (action.indexOf("unEquip:") != 0) return false; - var equipType = parseInt(action.substring(8)); - if (!core.isset(equipType)) { - core.removeFlag('__doNotCheckAutoEvents__'); - return false; - } + if (action.indexOf("unEquip:") != 0) return false; + var equipType = parseInt(action.substring(8)); + if (!core.isset(equipType)) { + core.removeFlag("__doNotCheckAutoEvents__"); + return false; + } - var cb = function () { - var next = core.status.replay.toReplay[0] || ""; - if (!next.startsWith('equip:') && !next.startsWith('unEquip:')) { - core.removeFlag('__doNotCheckAutoEvents__'); - core.checkAutoEvents(); - } - core.replay(); + var cb = function () { + var next = core.status.replay.toReplay[0] || ""; + if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) { + core.removeFlag("__doNotCheckAutoEvents__"); + core.checkAutoEvents(); } - core.setFlag('__doNotCheckAutoEvents__', true); + core.replay(); + }; + core.setFlag("__doNotCheckAutoEvents__", true); - core.ui._drawEquipbox(equipType); - core.status.route.push(action); - if (core.status.replay.speed == 24) { - core.unloadEquip(equipType, cb); - return true; - } - setTimeout(function () { - core.ui.closePanel(); - core.unloadEquip(equipType, cb); - }, core.control.__replay_getTimeout()); + core.ui._drawEquipbox(equipType); + core.status.route.push(action); + if (core.status.replay.speed == 24) { + core.unloadEquip(equipType, cb); return true; -} + } + setTimeout(function () { + core.ui.closePanel(); + core.unloadEquip(equipType, cb); + }, core.control.__replay_getTimeout()); + return true; +}; control.prototype._replayAction_saveEquip = function (action) { - if (action.indexOf('saveEquip:') != 0) return false; - core.quickSaveEquip(parseInt(action.substring(10))); - core.replay(); - return true; -} + if (action.indexOf("saveEquip:") != 0) return false; + core.quickSaveEquip(parseInt(action.substring(10))); + core.replay(); + return true; +}; control.prototype._replayAction_loadEquip = function (action) { - if (action.indexOf('loadEquip:') != 0) return false; - core.quickLoadEquip(parseInt(action.substring(10))); - core.replay(); - return true; -} + if (action.indexOf("loadEquip:") != 0) return false; + core.quickLoadEquip(parseInt(action.substring(10))); + core.replay(); + return true; +}; control.prototype._replayAction_fly = function (action) { - if (action.indexOf("fly:") != 0) return false; - var floorId = action.substring(4); - var toIndex = core.floorIds.indexOf(floorId); - if (!core.canUseItem('fly') || (core.flags.flyNearStair && !core.nearStair())) return false; - core.ui.drawFly(toIndex); - if (core.status.replay.speed == 24) { - if (!core.flyTo(floorId, core.replay)) - core.control._replay_error(action); - return true; - } - setTimeout(function () { - if (!core.flyTo(floorId, core.replay)) - core.control._replay_error(action); - }, core.control.__replay_getTimeout()); + if (action.indexOf("fly:") != 0) return false; + var floorId = action.substring(4); + var toIndex = core.floorIds.indexOf(floorId); + if ( + !core.canUseItem("fly") || + (core.flags.flyNearStair && !core.nearStair() && !flags.canMoveFloor) + ) + return false; + core.ui.drawFly(toIndex); + if (core.status.replay.speed == 24) { + if (!core.flyTo(floorId, core.replay)) core.control._replay_error(action); return true; -} + } + setTimeout(function () { + if (!core.flyTo(floorId, core.replay)) core.control._replay_error(action); + }, core.control.__replay_getTimeout()); + return true; +}; control.prototype._replayAction_shop = function (action) { - if (action.indexOf("shop:") != 0) return false; - var shopId = action.substring(5); - if (core.canUseQuickShop(shopId) != null || !core.canOpenShop(shopId)) { - this._replay_error(shopId); - return true; - } - core.openShop(shopId, false); - core.replay(); + if (action.indexOf("shop:") != 0) return false; + var shopId = action.substring(5); + if (core.canUseQuickShop(shopId) != null || !core.canOpenShop(shopId)) { + this._replay_error(shopId); return true; -} + } + core.openShop(shopId, false); + core.replay(); + return true; +}; control.prototype._replayAction_turn = function (action) { - if (action != 'turn' && action.indexOf('turn:') != 0) return false; - if (action == 'turn') core.turnHero(); - else core.turnHero(action.substring(5)); - core.replay(); - return true; -} + if (action != "turn" && action.indexOf("turn:") != 0) return false; + if (action == "turn") core.turnHero(); + else core.turnHero(action.substring(5)); + core.replay(); + return true; +}; control.prototype._replayAction_getNext = function (action) { - if (action != "getNext") return false; - core.getNextItem(); - core.replay(); - return true; -} + if (action != "getNext") return false; + core.getNextItem(); + core.replay(); + return true; +}; control.prototype._replayAction_moveDirectly = function (action) { - if (action.indexOf("move:") != 0) return false; - // 忽略连续的瞬移事件;如果大地图某一边超过计算范围则不合并 - if (!core.hasFlag('poison') && core.status.thisMap.width < 2 * core.bigmap.extend + core._WIDTH_ - && core.status.thisMap.height < 2 * core.bigmap.extend + core._HEIGHT_) { - while (core.status.replay.toReplay.length > 0 && - core.status.replay.toReplay[0].indexOf('move:') == 0) { - core.status.route.push(action); - action = core.status.replay.toReplay.shift(); - } + if (action.indexOf("move:") != 0) return false; + // 忽略连续的瞬移事件;如果大地图某一边超过计算范围则不合并 + if ( + !core.hasFlag("poison") && + core.status.thisMap.width < 2 * core.bigmap.extend + core._WIDTH_ && + core.status.thisMap.height < 2 * core.bigmap.extend + core._HEIGHT_ + ) { + while ( + core.status.replay.toReplay.length > 0 && + core.status.replay.toReplay[0].indexOf("move:") == 0 + ) { + core.status.route.push(action); + action = core.status.replay.toReplay.shift(); } + } - var pos = action.substring(5).split(":"); - var x = parseInt(pos[0]), y = parseInt(pos[1]); - var nowx = core.getHeroLoc('x'), nowy = core.getHeroLoc('y'); - var ignoreSteps = core.canMoveDirectly(x, y); - if (!core.moveDirectly(x, y, ignoreSteps)) return false; - if (core.status.replay.speed == 24) { - core.replay(); - return true; - } - - core.ui.drawArrow('ui', 32 * nowx + 16 - core.bigmap.offsetX, 32 * nowy + 16 - core.bigmap.offsetY, - 32 * x + 16 - core.bigmap.offsetX, 32 * y + 16 - core.bigmap.offsetY, '#FF0000', 3); - var timeout = this.__replay_getTimeout(); - if (ignoreSteps < 10) timeout = timeout * ignoreSteps / 10; - setTimeout(function () { - core.clearMap('ui'); - core.replay(); - }, timeout); + var pos = action.substring(5).split(":"); + var x = parseInt(pos[0]), + y = parseInt(pos[1]); + var nowx = core.getHeroLoc("x"), + nowy = core.getHeroLoc("y"); + var ignoreSteps = core.canMoveDirectly(x, y); + if (!core.moveDirectly(x, y, ignoreSteps)) return false; + if (core.status.replay.speed == 24) { + core.replay(); return true; -} + } + + core.ui.drawArrow( + "ui", + 32 * nowx + 16 - core.bigmap.offsetX, + 32 * nowy + 16 - core.bigmap.offsetY, + 32 * x + 16 - core.bigmap.offsetX, + 32 * y + 16 - core.bigmap.offsetY, + "#FF0000", + 3 + ); + var timeout = this.__replay_getTimeout(); + if (ignoreSteps < 10) timeout = (timeout * ignoreSteps) / 10; + setTimeout(function () { + core.clearMap("ui"); + core.replay(); + }, timeout); + return true; +}; control.prototype._replayAction_key = function (action) { - if (action.indexOf("key:") != 0) return false; - core.actions.keyUp(parseInt(action.substring(4)), false, true); - core.replay(); - return true; -} + if (action.indexOf("key:") != 0) return false; + core.actions.keyUp(parseInt(action.substring(4)), false, true); + core.replay(); + return true; +}; control.prototype._replayAction_click = function (action) { - if (action.indexOf("click:") != 0) return false; - var p = action.split(":"); - if (p.length != 4) return false; - core.actions.doRegisteredAction("onStatusBarClick", parseInt(p[2]), parseInt(p[3]), parseInt(p[1])); - core.replay(); - return true; -} + if (action.indexOf("click:") != 0) return false; + var p = action.split(":"); + if (p.length != 4) return false; + core.actions.doRegisteredAction( + "onStatusBarClick", + parseInt(p[2]), + parseInt(p[3]), + parseInt(p[1]) + ); + core.replay(); + return true; +}; control.prototype._replayAction_ignoreInput = function (action) { - if (action.indexOf('input:') == 0 || action.indexOf('input2:') == 0 || action.indexOf('choices:') == 0 || action.indexOf('random:') == 0) { - console.warn('警告!录像播放中出现了未知的 ' + action + '!'); - core.replay(); - return true; - } - return false; -} - -control.prototype._replayAction_no = function (action) { - if (action != 'no') return false; - core.status.route.push(action); + if ( + action.indexOf("input:") == 0 || + action.indexOf("input2:") == 0 || + action.indexOf("choices:") == 0 || + action.indexOf("random:") == 0 + ) { + console.warn("警告!录像播放中出现了未知的 " + action + "!"); core.replay(); return true; -} + } + return false; +}; + +control.prototype._replayAction_no = function (action) { + if (action != "no") return false; + core.status.route.push(action); + core.replay(); + return true; +}; // ------ 存读档相关 ------ // ////// 自动存档 ////// control.prototype.autosave = function (removeLast) { - if (core.hasFlag('__forbidSave__')) return; - var x = null; - if (removeLast) { - x = core.status.route.pop(); - core.status.route.push("turn:" + core.getHeroLoc('direction')); + if (core.hasFlag("__forbidSave__")) return; + var x = null; + if (removeLast) { + x = core.status.route.pop(); + core.status.route.push("turn:" + core.getHeroLoc("direction")); + } + if (core.status.event.id == "action" && !removeLast) + // 事件中自动存档,读档后是否回到事件触发前 + core.setFlag("__events__", core.clone(core.status.event.data)); + if (core.saves.autosave.data == null) { + core.saves.autosave.data = []; + } + core.saves.autosave.data.splice(core.saves.autosave.now, 0, core.saveData()); + core.saves.autosave.now += 1; + if (core.saves.autosave.data.length > core.saves.autosave.max) { + if (core.saves.autosave.now < core.saves.autosave.max / 2) + core.saves.autosave.data.pop(); + else { + core.saves.autosave.data.shift(); + core.saves.autosave.now = core.saves.autosave.now - 1; } - if (core.status.event.id == 'action' && !removeLast) // 事件中自动存档,读档后是否回到事件触发前 - core.setFlag("__events__", core.clone(core.status.event.data)); - if (core.saves.autosave.data == null) { - core.saves.autosave.data = []; - } - core.saves.autosave.data.splice(core.saves.autosave.now, 0, core.saveData()); - core.saves.autosave.now += 1; - if (core.saves.autosave.data.length > core.saves.autosave.max) { - if (core.saves.autosave.now < core.saves.autosave.max / 2) - core.saves.autosave.data.pop(); - else { - core.saves.autosave.data.shift(); - core.saves.autosave.now = core.saves.autosave.now - 1; - } - } - core.saves.autosave.updated = true; - core.saves.ids[0] = true; - core.removeFlag("__events__"); - if (removeLast) { - core.status.route.pop(); - if (x) core.status.route.push(x); - } -} + } + core.saves.autosave.updated = true; + core.saves.ids[0] = true; + core.removeFlag("__events__"); + if (removeLast) { + core.status.route.pop(); + if (x) core.status.route.push(x); + } +}; /////// 实际进行自动存档 ////// control.prototype.checkAutosave = function () { - if (!core.animateFrame || !core.saves || !core.saves.autosave) return; - core.setLocalStorage('totalTime', core.animateFrame.totalTime); - var autosave = core.saves.autosave; - if (autosave.data == null || !autosave.updated || !autosave.storage) return; - autosave.updated = false; - if (autosave.data.length >= 1) { - core.setLocalForage("autoSave", autosave.data[autosave.now - 1]); - } -} + if (!core.animateFrame || !core.saves || !core.saves.autosave) return; + core.setLocalStorage("totalTime", core.animateFrame.totalTime); + var autosave = core.saves.autosave; + if (autosave.data == null || !autosave.updated || !autosave.storage) return; + autosave.updated = false; + if (autosave.data.length >= 1) { + core.setLocalForage("autoSave", autosave.data[autosave.now - 1]); + } +}; ////// 实际进行存读档事件 ////// control.prototype.doSL = function (id, type) { - switch (type) { - case 'save': this._doSL_save(id); break; - case 'load': this._doSL_load(id, this._doSL_load_afterGet); break; - case 'reload': this._doSL_reload(id, this._doSL_load_afterGet); break; - case 'replayLoad': this._doSL_load(id, this._doSL_replayLoad_afterGet); break; - case 'replayRemain': this._doSL_load(id, this._doSL_replayRemain_afterGet); break; - case 'replaySince': this._doSL_load(id, this._doSL_replaySince_afterGet); break; - } -} + switch (type) { + case "save": + this._doSL_save(id); + break; + case "load": + this._doSL_load(id, this._doSL_load_afterGet); + break; + case "reload": + this._doSL_reload(id, this._doSL_load_afterGet); + break; + case "replayLoad": + this._doSL_load(id, this._doSL_replayLoad_afterGet); + break; + case "replayRemain": + this._doSL_load(id, this._doSL_replayRemain_afterGet); + break; + case "replaySince": + this._doSL_load(id, this._doSL_replaySince_afterGet); + break; + } +}; control.prototype._doSL_save = function (id) { - if (id == 'autoSave') { - core.playSound('操作失败'); - return core.drawTip('不能覆盖自动存档!'); + if (id == "autoSave") { + core.playSound("操作失败"); + return core.drawTip("不能覆盖自动存档!"); + } + // 在事件中的存档 + if (core.status.event.interval != null) + core.setFlag("__events__", core.status.event.interval); + var data = core.saveData(); + if (core.isReplaying() && core.status.replay.toReplay.length > 0) { + data.__toReplay__ = core.encodeRoute(core.status.replay.toReplay); + } + core.setLocalForage( + "save" + id, + data, + function () { + core.saves.saveIndex = id; + core.setLocalStorage("saveIndex", core.saves.saveIndex); + // 恢复事件 + if (!core.events.recoverEvents(core.status.event.interval)) + core.ui.closePanel(); + core.playSound("存档"); + core.drawTip("存档成功!"); + }, + function (err) { + console.error(err); + alert("存档失败,错误信息:\n" + err); } - // 在事件中的存档 - if (core.status.event.interval != null) - core.setFlag("__events__", core.status.event.interval); - var data = core.saveData(); - if (core.isReplaying() && core.status.replay.toReplay.length > 0) { - data.__toReplay__ = core.encodeRoute(core.status.replay.toReplay); - } - core.setLocalForage("save" + id, data, function () { - core.saves.saveIndex = id; - core.setLocalStorage('saveIndex', core.saves.saveIndex); - // 恢复事件 - if (!core.events.recoverEvents(core.status.event.interval)) - core.ui.closePanel(); - core.playSound('存档'); - core.drawTip('存档成功!'); - }, function (err) { - console.error(err); - alert("存档失败,错误信息:\n" + err); - }); - core.removeFlag("__events__"); - return; -} + ); + core.removeFlag("__events__"); + return; +}; control.prototype._doSL_load = function (id, callback) { - if (id == 'autoSave' && core.saves.autosave.data != null) { - core.saves.autosave.now -= 1; - var data = core.saves.autosave.data.splice(core.saves.autosave.now, 1)[0]; - if (core.isPlaying() && !core.status.gameOver) { - core.control.autosave(0); - core.saves.autosave.now -= 1; - } - if (core.saves.autosave.now == 0) { - core.saves.autosave.data.unshift(core.clone(data)); - core.saves.autosave.now += 1; + if (id == "autoSave" && core.saves.autosave.data != null) { + core.saves.autosave.now -= 1; + var data = core.saves.autosave.data.splice(core.saves.autosave.now, 1)[0]; + if (core.isPlaying() && !core.status.gameOver) { + core.control.autosave(0); + core.saves.autosave.now -= 1; + } + if (core.saves.autosave.now == 0) { + core.saves.autosave.data.unshift(core.clone(data)); + core.saves.autosave.now += 1; + } + callback(id, data); + } else { + core.getLocalForage( + id == "autoSave" ? id : "save" + id, + null, + function (data) { + if (id == "autoSave" && data != null) { + core.saves.autosave.data = data; + if (!(core.saves.autosave.data instanceof Array)) { + core.saves.autosave.data = [core.saves.autosave.data]; + } + core.saves.autosave.now = core.saves.autosave.data.length; + return core.control._doSL_load(id, callback); } callback(id, data); - } - else { - core.getLocalForage(id == 'autoSave' ? id : "save" + id, null, function (data) { - if (id == 'autoSave' && data != null) { - core.saves.autosave.data = data; - if (!(core.saves.autosave.data instanceof Array)) { - core.saves.autosave.data = [core.saves.autosave.data]; - } - core.saves.autosave.now = core.saves.autosave.data.length; - return core.control._doSL_load(id, callback); - } - callback(id, data); - }, function (err) { - console.error(err); - alert("无效的存档"); - }) - } - return; -} + }, + function (err) { + console.error(err); + alert("无效的存档"); + } + ); + } + return; +}; control.prototype._doSL_reload = function (id, callback) { - if (core.saves.autosave.data != null && core.saves.autosave.now < core.saves.autosave.data.length) { - var data = core.saves.autosave.data.splice(core.saves.autosave.now, 1)[0]; - core.control.autosave(false); - callback(id, data); - } - return; -} + if ( + core.saves.autosave.data != null && + core.saves.autosave.now < core.saves.autosave.data.length + ) { + var data = core.saves.autosave.data.splice(core.saves.autosave.now, 1)[0]; + core.control.autosave(false); + callback(id, data); + } + return; +}; control.prototype._doSL_load_afterGet = function (id, data) { - if (!data) return alert("无效的存档"); - var _replay = function () { - core.startGame(data.hard, data.hero.flags.__seed__, core.decodeRoute(data.route)); - }; - if (data.version != core.firstData.version) { - core.myconfirm("存档版本不匹配!\n你想回放此存档的录像吗?\n可以随时停止录像播放以继续游戏。", _replay); - return; + if (!data) return alert("无效的存档"); + var _replay = function () { + core.startGame( + data.hard, + data.hero.flags.__seed__, + core.decodeRoute(data.route) + ); + }; + if (data.version != core.firstData.version) { + core.myconfirm( + "存档版本不匹配!\n你想回放此存档的录像吗?\n可以随时停止录像播放以继续游戏。", + _replay + ); + return; + } + if (data.hero.flags.__events__ && data.guid != core.getGuid()) { + core.myconfirm("此存档可能存在风险,你想要播放录像么?", _replay); + return; + } + core.ui.closePanel(); + core.loadData(data, function () { + core.removeFlag("__fromLoad__"); + core.drawTip("读档成功"); + if (id != "autoSave") { + core.saves.saveIndex = id; + core.setLocalStorage("saveIndex", core.saves.saveIndex); } - if (data.hero.flags.__events__ && data.guid != core.getGuid()) { - core.myconfirm("此存档可能存在风险,你想要播放录像么?", _replay); - return; - } - core.ui.closePanel(); - core.loadData(data, function () { - core.removeFlag('__fromLoad__'); - core.drawTip("读档成功"); - if (id != "autoSave") { - core.saves.saveIndex = id; - core.setLocalStorage('saveIndex', core.saves.saveIndex); - } - }); -} + }); +}; control.prototype._doSL_replayLoad_afterGet = function (id, data) { - if (!data) { - core.playSound('操作失败'); - return core.drawTip("无效的存档"); - } - if (data.version != core.firstData.version) { - core.playSound('操作失败'); - return core.drawTip("存档版本不匹配"); - } - if (data.hero.flags.__events__ && data.guid != core.getGuid()) { - core.playSound('操作失败'); - return core.drawTip("此存档可能存在风险,无法读档"); - } - var route = core.subarray(core.status.route, core.decodeRoute(data.route)); - if (route == null) { - core.playSound('操作失败'); - return core.drawTip("无法从此存档回放录像"); - } - core.loadData(data, function () { - core.removeFlag('__fromLoad__'); - core.startReplay(route); - core.drawTip("回退到存档节点"); - }); -} + if (!data) { + core.playSound("操作失败"); + return core.drawTip("无效的存档"); + } + if (data.version != core.firstData.version) { + core.playSound("操作失败"); + return core.drawTip("存档版本不匹配"); + } + if (data.hero.flags.__events__ && data.guid != core.getGuid()) { + core.playSound("操作失败"); + return core.drawTip("此存档可能存在风险,无法读档"); + } + var route = core.subarray(core.status.route, core.decodeRoute(data.route)); + if (route == null) { + core.playSound("操作失败"); + return core.drawTip("无法从此存档回放录像"); + } + core.loadData(data, function () { + core.removeFlag("__fromLoad__"); + core.startReplay(route); + core.drawTip("回退到存档节点"); + }); +}; control.prototype._doSL_replayRemain_afterGet = function (id, data) { - if (!data) { - core.playSound('操作失败'); - return core.drawTip("无效的存档"); - } - var route = core.decodeRoute(data.route); - if (core.status.tempRoute) { - var remainRoute = core.subarray(route, core.status.tempRoute); - if (remainRoute == null) - return alert("无法接续播放录像!\n该存档必须是前一个选择的存档的后续内容。"); - delete core.status.tempRoute; - core.ui.closePanel(); - core.startReplay(remainRoute); - core.drawTip("接续播放录像"); - return; - } - else if (data.floorId != core.status.floorId || data.hero.loc.x != core.getHeroLoc('x') || data.hero.loc.y != core.getHeroLoc('y')) - return alert("楼层或坐标不一致!"); - - core.status.tempRoute = route; + if (!data) { + core.playSound("操作失败"); + return core.drawTip("无效的存档"); + } + var route = core.decodeRoute(data.route); + if (core.status.tempRoute) { + var remainRoute = core.subarray(route, core.status.tempRoute); + if (remainRoute == null) + return alert( + "无法接续播放录像!\n该存档必须是前一个选择的存档的后续内容。" + ); + delete core.status.tempRoute; core.ui.closePanel(); - core.drawText("\t[步骤2]请选择第二个存档。\n\r[yellow]该存档必须是前一个存档的后续。\r\n将尝试播放到此存档。", function () { - core.status.event.id = 'replayRemain'; - core.lockControl(); - var saveIndex = core.saves.saveIndex; - var page = parseInt((saveIndex - 1) / 5), offset = saveIndex - 5 * page; - core.ui._drawSLPanel(10 * page + offset); - }); -} + core.startReplay(remainRoute); + core.drawTip("接续播放录像"); + return; + } else if ( + data.floorId != core.status.floorId || + data.hero.loc.x != core.getHeroLoc("x") || + data.hero.loc.y != core.getHeroLoc("y") + ) + return alert("楼层或坐标不一致!"); + + core.status.tempRoute = route; + core.ui.closePanel(); + core.drawText( + "\t[步骤2]请选择第二个存档。\n\r[yellow]该存档必须是前一个存档的后续。\r\n将尝试播放到此存档。", + function () { + core.status.event.id = "replayRemain"; + core.lockControl(); + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 5), + offset = saveIndex - 5 * page; + core.ui._drawSLPanel(10 * page + offset); + } + ); +}; control.prototype._doSL_replaySince_afterGet = function (id, data) { - if (data.floorId != core.status.floorId || data.hero.loc.x != core.getHeroLoc('x') || data.hero.loc.y != core.getHeroLoc('y')) - return alert("楼层或坐标不一致!"); - if (!data.__toReplay__) return alert('该存档没有剩余录像!'); - core.ui.closePanel(); - core.startReplay(core.decodeRoute(data.__toReplay__)); - core.drawTip("播放存档剩余录像"); - return; -} + if ( + data.floorId != core.status.floorId || + data.hero.loc.x != core.getHeroLoc("x") || + data.hero.loc.y != core.getHeroLoc("y") + ) + return alert("楼层或坐标不一致!"); + if (!data.__toReplay__) return alert("该存档没有剩余录像!"); + core.ui.closePanel(); + core.startReplay(core.decodeRoute(data.__toReplay__)); + core.drawTip("播放存档剩余录像"); + return; +}; ////// 同步存档到服务器 ////// control.prototype.syncSave = function (type) { - core.ui.drawWaiting("正在同步,请稍候..."); - var callback = function (saves) { - core.control._syncSave_http(type, saves); - } - if (type == 'all') core.getAllSaves(callback); - else core.getSave(core.saves.saveIndex, callback); -} + core.ui.drawWaiting("正在同步,请稍候..."); + var callback = function (saves) { + core.control._syncSave_http(type, saves); + }; + if (type == "all") core.getAllSaves(callback); + else core.getSave(core.saves.saveIndex, callback); +}; control.prototype._syncSave_http = function (type, saves) { - if (!saves) return core.drawText("没有要同步的存档"); - var formData = new FormData(); - formData.append('type', 'save'); - formData.append('name', core.firstData.name); - formData.append('data', LZString.compressToBase64(JSON.stringify(saves))); - formData.append('shorten', '1'); + if (!saves) return core.drawText("没有要同步的存档"); + var formData = new FormData(); + formData.append("type", "save"); + formData.append("name", core.firstData.name); + formData.append("data", LZString.compressToBase64(JSON.stringify(saves))); + formData.append("shorten", "1"); - core.http("POST", "/games/sync.php", formData, function (data) { - var response = JSON.parse(data); - if (response.code < 0) { - core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:" + response.msg); - } - else { - core.drawText((type == 'all' ? "所有存档" : "存档" + core.saves.saveIndex) + "同步成功!\n\n您的存档编号+密码: \r[yellow]" - + response.code + response.msg - + "\r\n\n请牢记以上信息(如截图等),在从服务器\n同步存档时使用。\n\r[yellow]另外请注意,存档同步只会保存一个月的时间。\r") - } - }, function (e) { - core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:" + e); - }) -} + core.http( + "POST", + "/games/sync.php", + formData, + function (data) { + var response = JSON.parse(data); + if (response.code < 0) { + core.drawText( + "出错啦!\n无法同步存档到服务器。\n错误原因:" + response.msg + ); + } else { + core.drawText( + (type == "all" ? "所有存档" : "存档" + core.saves.saveIndex) + + "同步成功!\n\n您的存档编号+密码: \r[yellow]" + + response.code + + response.msg + + "\r\n\n请牢记以上信息(如截图等),在从服务器\n同步存档时使用。\n\r[yellow]另外请注意,存档同步只会保存一个月的时间。\r" + ); + } + }, + function (e) { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:" + e); + } + ); +}; ////// 从服务器加载存档 ////// control.prototype.syncLoad = function () { - core.myprompt("请输入存档编号+密码", null, function (idpassword) { - if (!idpassword) return core.ui._drawSyncSave(); - if (!/^\d{6}\w{4}$/.test(idpassword) && !/^\d{4}\w{3}$/.test(idpassword)) { - core.drawText("不合法的存档编号+密码!"); - return; - } - core.ui.drawWaiting("正在同步,请稍候..."); - if (idpassword.length == 7) { - core.control._syncLoad_http(idpassword.substring(0, 4), idpassword.substring(4)); - } else { - core.control._syncLoad_http(idpassword.substring(0, 6), idpassword.substring(6)); - } - }); -} + core.myprompt("请输入存档编号+密码", null, function (idpassword) { + if (!idpassword) return core.ui._drawSyncSave(); + if (!/^\d{6}\w{4}$/.test(idpassword) && !/^\d{4}\w{3}$/.test(idpassword)) { + core.drawText("不合法的存档编号+密码!"); + return; + } + core.ui.drawWaiting("正在同步,请稍候..."); + if (idpassword.length == 7) { + core.control._syncLoad_http( + idpassword.substring(0, 4), + idpassword.substring(4) + ); + } else { + core.control._syncLoad_http( + idpassword.substring(0, 6), + idpassword.substring(6) + ); + } + }); +}; control.prototype._syncLoad_http = function (id, password) { - var formData = new FormData(); - formData.append('type', 'load'); - formData.append('name', core.firstData.name); - formData.append('id', id); - formData.append('password', password); + var formData = new FormData(); + formData.append("type", "load"); + formData.append("name", core.firstData.name); + formData.append("id", id); + formData.append("password", password); - core.http("POST", "/games/sync.php", formData, function (data) { - var response = JSON.parse(data); - if (response.code == 0) { - var msg = null; - try { - msg = JSON.parse(LZString.decompressFromBase64(response.msg)); - } catch (e) { } - if (!msg) { - try { - msg = JSON.parse(response.msg); - } catch (e) { } - } - if (msg) { - core.control._syncLoad_write(msg); - } else { - core.drawText("出错啦!\n存档解析失败!"); - } + core.http( + "POST", + "/games/sync.php", + formData, + function (data) { + var response = JSON.parse(data); + if (response.code == 0) { + var msg = null; + try { + msg = JSON.parse(LZString.decompressFromBase64(response.msg)); + } catch (e) {} + if (!msg) { + try { + msg = JSON.parse(response.msg); + } catch (e) {} } - else { - core.drawText("出错啦!\n无法从服务器同步存档。\n错误原因:" + response.msg); + if (msg) { + core.control._syncLoad_write(msg); + } else { + core.drawText("出错啦!\n存档解析失败!"); } - }, function (e) { - core.drawText("出错啦!\n无法从服务器同步存档。\n错误原因:" + e); - }); -} + } else { + core.drawText( + "出错啦!\n无法从服务器同步存档。\n错误原因:" + response.msg + ); + } + }, + function (e) { + core.drawText("出错啦!\n无法从服务器同步存档。\n错误原因:" + e); + } + ); +}; control.prototype._syncLoad_write = function (data) { - if (data instanceof Array) { - core.status.event.selection = 1; - core.ui.drawConfirmBox("所有本地存档都将被覆盖,确认?", function () { - for (var i = 1; i <= 5 * (main.savePages || 30); i++) { - if (i <= data.length) - core.setLocalForage("save" + i, data[i - 1]); - else if (core.saves.ids[i]) - core.removeLocalForage("save" + i); - } - core.ui.closePanel(); - core.drawText("同步成功!\n你的本地所有存档均已被覆盖。"); - }, function () { - core.status.event.selection = 0; - core.ui._drawSyncSave(); - }); - } - else { - // 只覆盖单存档 - core.setLocalForage("save" + core.saves.saveIndex, data, function () { - core.drawText("同步成功!\n单存档已覆盖至存档" + core.saves.saveIndex); - }); - } -} + if (data instanceof Array) { + core.status.event.selection = 1; + core.ui.drawConfirmBox( + "所有本地存档都将被覆盖,确认?", + function () { + for (var i = 1; i <= 5 * (main.savePages || 30); i++) { + if (i <= data.length) core.setLocalForage("save" + i, data[i - 1]); + else if (core.saves.ids[i]) core.removeLocalForage("save" + i); + } + core.ui.closePanel(); + core.drawText("同步成功!\n你的本地所有存档均已被覆盖。"); + }, + function () { + core.status.event.selection = 0; + core.ui._drawSyncSave(); + } + ); + } else { + // 只覆盖单存档 + core.setLocalForage("save" + core.saves.saveIndex, data, function () { + core.drawText("同步成功!\n单存档已覆盖至存档" + core.saves.saveIndex); + }); + } +}; ////// 存档到本地 ////// control.prototype.saveData = function () { - return this.controldata.saveData(); -} + return this.controldata.saveData(); +}; ////// 从本地读档 ////// control.prototype.loadData = function (data, callback) { - return this.controldata.loadData(data, callback); -} + return this.controldata.loadData(data, callback); +}; control.prototype.getSave = function (index, callback) { - if (index == 0) { - // --- 自动存档先从缓存中获取 - if (core.saves.autosave.data != null) - callback(core.saves.autosave.data); - else { - core.getLocalForage("autoSave", null, function (data) { - if (data != null) { - core.saves.autosave.data = data; - if (!(core.saves.autosave.data instanceof Array)) { - core.saves.autosave.data = [core.saves.autosave.data]; - } - core.saves.autosave.now = core.saves.autosave.data.length; - } - callback(core.saves.autosave.data); - }, function (err) { - console.error(err); - callback(null); - }); + if (index == 0) { + // --- 自动存档先从缓存中获取 + if (core.saves.autosave.data != null) callback(core.saves.autosave.data); + else { + core.getLocalForage( + "autoSave", + null, + function (data) { + if (data != null) { + core.saves.autosave.data = data; + if (!(core.saves.autosave.data instanceof Array)) { + core.saves.autosave.data = [core.saves.autosave.data]; + } + core.saves.autosave.now = core.saves.autosave.data.length; + } + callback(core.saves.autosave.data); + }, + function (err) { + console.error(err); + callback(null); } - return; + ); } - core.getLocalForage("save" + index, null, function (data) { - if (callback) callback(data); - }, function (err) { - console.error(err); - if (callback) callback(null); - }); -} + return; + } + core.getLocalForage( + "save" + index, + null, + function (data) { + if (callback) callback(data); + }, + function (err) { + console.error(err); + if (callback) callback(null); + } + ); +}; control.prototype.getSaves = function (ids, callback) { - if (!(ids instanceof Array)) return this.getSave(ids, callback); - var count = ids.length, data = {}; - for (var i = 0; i < ids.length; ++i) { - (function (i) { - core.getSave(ids[i], function (result) { - data[i] = result; - if (Object.keys(data).length == count) - callback(data); - }) - })(i); - } -} + if (!(ids instanceof Array)) return this.getSave(ids, callback); + var count = ids.length, + data = {}; + for (var i = 0; i < ids.length; ++i) { + (function (i) { + core.getSave(ids[i], function (result) { + data[i] = result; + if (Object.keys(data).length == count) callback(data); + }); + })(i); + } +}; control.prototype.getAllSaves = function (callback) { - var ids = Object.keys(core.saves.ids).filter(function (x) { return x != 0; }) - .sort(function (a, b) { return a - b; }), saves = []; - this.getSaves(ids, function (data) { - for (var i = 0; i < ids.length; ++i) { - if (data[i] != null) - saves.push(data[i]); - } - callback(saves); - }); -} + var ids = Object.keys(core.saves.ids) + .filter(function (x) { + return x != 0; + }) + .sort(function (a, b) { + return a - b; + }), + saves = []; + this.getSaves(ids, function (data) { + for (var i = 0; i < ids.length; ++i) { + if (data[i] != null) saves.push(data[i]); + } + callback(saves); + }); +}; ////// 获得所有存在存档的存档位 ////// control.prototype.getSaveIndexes = function (callback) { - var indexes = {}; - core.keysLocalForage(function (err, keys) { - if (err) { - console.error(err); - return callback(indexes); - } - keys.forEach(function (key) { - core.control._getSaveIndexes_getIndex(indexes, key); - }); - callback(indexes); + var indexes = {}; + core.keysLocalForage(function (err, keys) { + if (err) { + console.error(err); + return callback(indexes); + } + keys.forEach(function (key) { + core.control._getSaveIndexes_getIndex(indexes, key); }); -} + callback(indexes); + }); +}; control.prototype._getSaveIndexes_getIndex = function (indexes, name) { - var e = new RegExp('^' + core.firstData.name + "_(save\\d+|autoSave)$").exec(name); - if (e) { - if (e[1] == 'autoSave') indexes[0] = true; - else indexes[parseInt(e[1].substring(4))] = true; - } -} + var e = new RegExp("^" + core.firstData.name + "_(save\\d+|autoSave)$").exec( + name + ); + if (e) { + if (e[1] == "autoSave") indexes[0] = true; + else indexes[parseInt(e[1].substring(4))] = true; + } +}; ////// 判断某个存档位是否存在存档 ////// control.prototype.hasSave = function (index) { - return core.saves.ids[index] || false; -} + return core.saves.ids[index] || false; +}; ////// 删除某个存档 control.prototype.removeSave = function (index, callback) { - if (index == 0 || index == "autoSave") { - index = "autoSave"; - core.removeLocalForage(index, function () { - core.saves.autosave.data = null; - core.saves.autosave.updated = false; - if (callback) callback(); - }); - return; - } - core.removeLocalForage("save" + index, function () { - core.saves.favorite = core.saves.favorite.filter(function (i) { return core.hasSave(i); }); - delete core.saves.favoriteName[index]; - core.control._updateFavoriteSaves(); - if (callback) callback(); - }, function () { - core.playSound('操作失败'); - core.drawTip("无法删除存档!"); - if (callback) callback(); + if (index == 0 || index == "autoSave") { + index = "autoSave"; + core.removeLocalForage(index, function () { + core.saves.autosave.data = null; + core.saves.autosave.updated = false; + if (callback) callback(); }); -} + return; + } + core.removeLocalForage( + "save" + index, + function () { + core.saves.favorite = core.saves.favorite.filter(function (i) { + return core.hasSave(i); + }); + delete core.saves.favoriteName[index]; + core.control._updateFavoriteSaves(); + if (callback) callback(); + }, + function () { + core.playSound("操作失败"); + core.drawTip("无法删除存档!"); + if (callback) callback(); + } + ); +}; ////// 读取收藏信息 control.prototype._loadFavoriteSaves = function () { - core.saves.favorite = core.getLocalStorage("favorite", []); - // --- 移除不存在的收藏 - core.saves.favorite = core.saves.favorite.filter(function (i) { return core.hasSave(i); }); - core.saves.favoriteName = core.getLocalStorage("favoriteName", {}); -} + core.saves.favorite = core.getLocalStorage("favorite", []); + // --- 移除不存在的收藏 + core.saves.favorite = core.saves.favorite.filter(function (i) { + return core.hasSave(i); + }); + core.saves.favoriteName = core.getLocalStorage("favoriteName", {}); +}; control.prototype._updateFavoriteSaves = function () { - core.setLocalStorage("favorite", core.saves.favorite); - core.setLocalStorage("favoriteName", core.saves.favoriteName); -} + core.setLocalStorage("favorite", core.saves.favorite); + core.setLocalStorage("favoriteName", core.saves.favoriteName); +}; // ------ 属性,状态,位置,buff,变量,锁定控制等 ------ // ////// 设置勇士属性 ////// control.prototype.setStatus = function (name, value) { - if (!core.status.hero) return; - if (name == 'x' || name == 'y' || name == 'direction') - this.setHeroLoc(name, value); - else - core.status.hero[name] = value; -} + if (!core.status.hero) return; + if (name == "x" || name == "y" || name == "direction") + this.setHeroLoc(name, value); + else core.status.hero[name] = value; +}; ////// 增减勇士属性 ////// control.prototype.addStatus = function (name, value) { - this.setStatus(name, this.getStatus(name) + value); -} + this.setStatus(name, this.getStatus(name) + value); +}; ////// 获得勇士属性 ////// control.prototype.getStatus = function (name) { - if (!core.status.hero) return null; - if (name == 'x' || name == 'y' || name == 'direction') - return this.getHeroLoc(name); - if (main.mode == 'editor' && !core.hasFlag('__statistics__')) { - return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero[name]; - } - return core.status.hero[name]; -} + if (!core.status.hero) return null; + if (name == "x" || name == "y" || name == "direction") + return this.getHeroLoc(name); + if (main.mode == "editor" && !core.hasFlag("__statistics__")) { + return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero[name]; + } + return core.status.hero[name]; +}; ////// 从status中获得属性,如果不存在则从勇士属性中获取 ////// control.prototype.getStatusOrDefault = function (status, name) { - if (status && name in status) - return Math.floor(status[name]); - return Math.floor(this.getStatus(name)); -} + if (status && name in status) return Math.floor(status[name]); + return Math.floor(this.getStatus(name)); +}; ////// 获得勇士实际属性(增幅后的) ////// control.prototype.getRealStatus = function (name) { - return this.getRealStatusOrDefault(null, name); -} + return this.getRealStatusOrDefault(null, name); +}; ////// 从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取 ////// control.prototype.getRealStatusOrDefault = function (status, name) { - return Math.floor(this.getStatusOrDefault(status, name) * this.getBuff(name)); -} + return Math.floor(this.getStatusOrDefault(status, name) * this.getBuff(name)); +}; ////// 获得勇士原始属性(无装备和衰弱影响) ////// control.prototype.getNakedStatus = function (name) { - var value = this.getStatus(name); - if (value == null) return value; - // 装备增幅 - core.status.hero.equipment.forEach(function (v) { - if (!v || !(core.material.items[v] || {}).equip) return; - value -= core.material.items[v].equip.value[name] || 0; - }); - // 衰弱扣除 - if (core.hasFlag('weak') && core.values.weakValue >= 1 && (name == 'atk' || name == 'def')) { - value += core.values.weakValue; - } - return value; -} + var value = this.getStatus(name); + if (value == null) return value; + // 装备增幅 + core.status.hero.equipment.forEach(function (v) { + if (!v || !(core.material.items[v] || {}).equip) return; + value -= core.material.items[v].equip.value[name] || 0; + }); + // 衰弱扣除 + if ( + core.hasFlag("weak") && + core.values.weakValue >= 1 && + (name == "atk" || name == "def") + ) { + value += core.values.weakValue; + } + return value; +}; ////// 获得某个属性的名字 ////// control.prototype.getStatusLabel = function (name) { - if (this.controldata.getStatusLabel) { - return this.controldata.getStatusLabel(name) || name; - } - return { - name: "名称", lv: "等级", hpmax: "生命上限", hp: "生命", manamax: "魔力上限", mana: "魔力", - atk: "攻击", def: "防御", mdef: "护盾", money: "金币", exp: "经验", point: "加点", steps: "步数" - }[name] || name; -} + if (this.controldata.getStatusLabel) { + return this.controldata.getStatusLabel(name) || name; + } + return ( + { + name: "名称", + lv: "等级", + hpmax: "生命上限", + hp: "生命", + manamax: "魔力上限", + mana: "魔力", + atk: "攻击", + def: "防御", + mdef: "护盾", + money: "金币", + exp: "经验", + point: "加点", + steps: "步数", + }[name] || name + ); +}; ////// 设置某个属性的增幅值 ////// control.prototype.setBuff = function (name, value) { - // 仅保留三位有效buff值 - value = parseFloat(value.toFixed(3)); - this.setFlag('__' + name + '_buff__', value); -} + // 仅保留三位有效buff值 + value = parseFloat(value.toFixed(3)); + this.setFlag("__" + name + "_buff__", value); +}; ////// 加减某个属性的增幅值 ////// control.prototype.addBuff = function (name, value) { - var buff = this.getBuff(name) + value; - // 仅保留三位有效buff值 - buff = parseFloat(buff.toFixed(3)); - this.setFlag('__' + name + '_buff__', buff); -} + var buff = this.getBuff(name) + value; + // 仅保留三位有效buff值 + buff = parseFloat(buff.toFixed(3)); + this.setFlag("__" + name + "_buff__", buff); +}; ////// 获得某个属性的增幅值 ////// control.prototype.getBuff = function (name) { - return core.getFlag('__' + name + '_buff__', 1); -} + return core.getFlag("__" + name + "_buff__", 1); +}; ////// 获得或移除毒衰咒效果 ////// control.prototype.triggerDebuff = function (action, type) { - return this.controldata.triggerDebuff(action, type); -} + return this.controldata.triggerDebuff(action, type); +}; ////// 设置勇士的位置 ////// control.prototype.setHeroLoc = function (name, value, noGather) { - if (!core.status.hero) return; - core.status.hero.loc[name] = value; - if ((name == 'x' || name == 'y') && !noGather) { - this.gatherFollowers(); - } - core.ui.drawStatusBar(); -} + if (!core.status.hero) return; + core.status.hero.loc[name] = value; + if ((name == "x" || name == "y") && !noGather) { + this.gatherFollowers(); + } + core.ui.drawStatusBar(); +}; ////// 获得勇士的位置 ////// control.prototype.getHeroLoc = function (name) { - if (!core.status.hero) return; - if (main.mode == 'editor') { - if (name == null) return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero.loc; - return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero.loc[name]; - } - if (name == null) return core.status.hero.loc; - return core.status.hero.loc[name]; -} + if (!core.status.hero) return; + if (main.mode == "editor") { + if (name == null) + return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero.loc; + return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero.loc[name]; + } + if (name == null) return core.status.hero.loc; + return core.status.hero.loc[name]; +}; ////// 获得某个等级的名称 ////// control.prototype.getLvName = function (lv) { - if (!core.status.hero) return null; - if (lv == null) lv = core.status.hero.lv; - return ((core.firstData.levelUp || [])[lv - 1] || {}).title || lv; -} + if (!core.status.hero) return null; + if (lv == null) lv = core.status.hero.lv; + return ((core.firstData.levelUp || [])[lv - 1] || {}).title || lv; +}; ////// 获得下个等级所需经验;如果不存在下个等级,返回null。 ////// control.prototype.getNextLvUpNeed = function () { - if (!core.status.hero) return null; - if (core.status.hero.lv >= core.firstData.levelUp.length) return null; - var need = core.calValue(core.firstData.levelUp[core.status.hero.lv].need); - if (core.flags.statusBarItems.indexOf('levelUpLeftMode') >= 0) - return Math.max(need - core.getStatus('exp'), 0); - else return need; -} + if (!core.status.hero) return null; + if (core.status.hero.lv >= core.firstData.levelUp.length) return null; + var need = core.calValue(core.firstData.levelUp[core.status.hero.lv].need); + if (core.flags.statusBarItems.indexOf("levelUpLeftMode") >= 0) + return Math.max(need - core.getStatus("exp"), 0); + else return need; +}; ////// 设置某个自定义变量或flag ////// control.prototype.setFlag = function (name, value) { - if (value == null) return this.removeFlag(name); - if (!core.status.hero) return; - core.status.hero.flags[name] = value; -} + if (value == null) return this.removeFlag(name); + if (!core.status.hero) return; + core.status.hero.flags[name] = value; +}; ////// 增加某个flag数值 ////// control.prototype.addFlag = function (name, value) { - if (!core.status.hero) return; - core.setFlag(name, core.getFlag(name, 0) + value); -} + if (!core.status.hero) return; + core.setFlag(name, core.getFlag(name, 0) + value); +}; ////// 获得某个自定义变量或flag ////// control.prototype.getFlag = function (name, defaultValue) { - if (!core.status.hero) return defaultValue; - var value = core.status.hero.flags[name]; - return value != null ? value : defaultValue; -} + if (!core.status.hero) return defaultValue; + var value = core.status.hero.flags[name]; + return value != null ? value : defaultValue; +}; ////// 是否存在某个自定义变量或flag,且值为true ////// control.prototype.hasFlag = function (name) { - return !!core.getFlag(name); -} + return !!core.getFlag(name); +}; ////// 删除某个自定义变量或flag ////// control.prototype.removeFlag = function (name) { - if (!core.status.hero) return; - delete core.status.hero.flags[name]; -} + if (!core.status.hero) return; + delete core.status.hero.flags[name]; +}; ////// 获得某个点的独立开关 ////// control.prototype.getSwitch = function (x, y, floorId, name, defaultValue) { - var prefix = [floorId || core.status.floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join("@"); - return this.getFlag(prefix + "@" + name, defaultValue); -} + var prefix = [ + floorId || core.status.floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + return this.getFlag(prefix + "@" + name, defaultValue); +}; ////// 设置某个点的独立开关 ////// control.prototype.setSwitch = function (x, y, floorId, name, value) { - var prefix = [floorId || core.status.floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join("@"); - return this.setFlag(prefix + "@" + name, value); -} + var prefix = [ + floorId || core.status.floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + return this.setFlag(prefix + "@" + name, value); +}; ////// 增加某个点的独立开关 ////// control.prototype.addSwitch = function (x, y, floorId, name, value) { - var prefix = [floorId || core.status.floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join("@"); - return this.addFlag(prefix + "@" + name, value); -} + var prefix = [ + floorId || core.status.floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + return this.addFlag(prefix + "@" + name, value); +}; ////// 判定某个点的独立开关 ////// control.prototype.hasSwitch = function (x, y, floorId, name) { - var prefix = [floorId || core.status.floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join("@"); - return this.hasFlag(prefix + "@" + name); -} + var prefix = [ + floorId || core.status.floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + return this.hasFlag(prefix + "@" + name); +}; ////// 删除某个点的独立开关 ////// control.prototype.removeSwitch = function (x, y, floorId, name) { - var prefix = [floorId || core.status.floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join("@"); - return this.removeFlag(prefix + "@" + name); -} + var prefix = [ + floorId || core.status.floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + return this.removeFlag(prefix + "@" + name); +}; ////// 锁定状态栏,常常用于事件处理 ////// control.prototype.lockControl = function () { - core.status.lockControl = true; -} + core.status.lockControl = true; +}; ////// 解锁状态栏 ////// control.prototype.unlockControl = function () { - core.status.lockControl = false; -} + core.status.lockControl = false; +}; ////// 开启debug模式 ////// control.prototype.debug = function () { - core.setFlag('debug', true); - core.drawText("\t[调试模式开启]此模式下按住Ctrl键(或Ctrl+Shift键)可以穿墙并忽略一切事件。\n此模式下将无法上传成绩。"); -} + core.setFlag("debug", true); + core.drawText( + "\t[调试模式开启]此模式下按住Ctrl键(或Ctrl+Shift键)可以穿墙并忽略一切事件。\n此模式下将无法上传成绩。" + ); +}; control.prototype._bindRoutePush = function () { - core.status.route.push = function (element) { - // 忽视移动、转向、瞬移 - if (["up", "down", "left", "right", "turn"].indexOf(element) < 0 && !element.startsWith("move:")) { - core.clearRouteFolding(); - } - Array.prototype.push.call(core.status.route, element); + core.status.route.push = function (element) { + // 忽视移动、转向、瞬移 + if ( + ["up", "down", "left", "right", "turn"].indexOf(element) < 0 && + !element.startsWith("move:") + ) { + core.clearRouteFolding(); } -} + Array.prototype.push.call(core.status.route, element); + }; +}; ////// 清除录像折叠信息 ////// control.prototype.clearRouteFolding = function () { - core.status.routeFolding = {}; -} + core.status.routeFolding = {}; +}; ////// 检查录像折叠 ////// control.prototype.checkRouteFolding = function () { - // 未开启、未开始游戏、录像播放中、正在事件中:不执行 - if (!core.flags.enableRouteFolding || !core.isPlaying() || core.isReplaying() || core.status.event.id) { - return this.clearRouteFolding(); + // 未开启、未开始游戏、录像播放中、正在事件中:不执行 + if ( + !core.flags.enableRouteFolding || + !core.isPlaying() || + core.isReplaying() || + core.status.event.id + ) { + return this.clearRouteFolding(); + } + var hero = core.clone(core.status.hero, function (name, value) { + return name != "steps" && typeof value == "number"; + }); + var index = [ + core.getHeroLoc("x"), + core.getHeroLoc("y"), + core.getHeroLoc("direction").charAt(0), + ].join(","); + core.status.routeFolding = core.status.routeFolding || {}; + if (core.status.routeFolding[index]) { + var one = core.status.routeFolding[index]; + if (core.same(one.hero, hero) && one.length < core.status.route.length) { + Object.keys(core.status.routeFolding).forEach(function (v) { + if (core.status.routeFolding[v].length >= one.length) + delete core.status.routeFolding[v]; + }); + core.status.route = core.status.route.slice(0, one.length); + this._bindRoutePush(); } - var hero = core.clone(core.status.hero, function (name, value) { - return name != 'steps' && typeof value == 'number'; - }); - var index = [core.getHeroLoc('x'), core.getHeroLoc('y'), core.getHeroLoc('direction').charAt(0)].join(','); - core.status.routeFolding = core.status.routeFolding || {}; - if (core.status.routeFolding[index]) { - var one = core.status.routeFolding[index]; - if (core.same(one.hero, hero) && one.length < core.status.route.length) { - Object.keys(core.status.routeFolding).forEach(function (v) { - if (core.status.routeFolding[v].length >= one.length) delete core.status.routeFolding[v]; - }); - core.status.route = core.status.route.slice(0, one.length); - this._bindRoutePush(); - } - } - core.status.routeFolding[index] = { hero: hero, length: core.status.route.length }; -} + } + core.status.routeFolding[index] = { + hero: hero, + length: core.status.route.length, + }; +}; // ------ 天气,色调,BGM ------ // control.prototype.getMappedName = function (name) { - return core.getFlag('__nameMap__', {})[name] || (main.nameMap || {})[name] || name; -} + return ( + core.getFlag("__nameMap__", {})[name] || (main.nameMap || {})[name] || name + ); +}; ////// 更改天气效果 ////// control.prototype.setWeather = function (type, level) { - // 非雨雪 - if (type == null || !this.weathers[type]) { - core.deleteCanvas('weather') - core.animateFrame.weather.type = null; - core.animateFrame.weather.nodes = []; - return; - } - if (level == null) level = core.animateFrame.weather.level; - level = core.clamp(parseInt(level) || 5, 1, 10); - // 当前天气:则忽略 - if (type == core.animateFrame.weather.type && level == core.animateFrame.weather.level) return; - - // 计算当前的宽高 - core.createCanvas('weather', 0, 0, core._PX_, core._PY_, 80); - core.setOpacity('weather', 1.0); - core.animateFrame.weather.type = type; - core.animateFrame.weather.level = level; + // 非雨雪 + if (type == null || !this.weathers[type]) { + core.deleteCanvas("weather"); + core.animateFrame.weather.type = null; core.animateFrame.weather.nodes = []; - try { - core.doFunc(this.weathers[type].initFunc, this, level); - } catch (e) { - console.error(e); - console.error("ERROR in weather[" + type + "]:已自动注销该项。"); - core.unregisterWeather(type); - } -} + return; + } + if (level == null) level = core.animateFrame.weather.level; + level = core.clamp(parseInt(level) || 5, 1, 10); + // 当前天气:则忽略 + if ( + type == core.animateFrame.weather.type && + level == core.animateFrame.weather.level + ) + return; + + // 计算当前的宽高 + core.createCanvas("weather", 0, 0, core._PX_, core._PY_, 80); + core.setOpacity("weather", 1.0); + core.animateFrame.weather.type = type; + core.animateFrame.weather.level = level; + core.animateFrame.weather.nodes = []; + try { + core.doFunc(this.weathers[type].initFunc, this, level); + } catch (e) { + console.error(e); + console.error("ERROR in weather[" + type + "]:已自动注销该项。"); + core.unregisterWeather(type); + } +}; ////// 注册一个天气 ////// // name为天气类型,如 sun, rain, snow 等 // initFunc 为设置为此天气时的初始化,接受level参数 // frameFunc 为该天气下每帧的效果,接受和timestamp参数(从页面加载完毕到当前经过的时间) control.prototype.registerWeather = function (name, initFunc, frameFunc) { - this.unregisterWeather(name); - this.weathers[name] = { initFunc: initFunc, frameFunc: frameFunc }; -} + this.unregisterWeather(name); + this.weathers[name] = { initFunc: initFunc, frameFunc: frameFunc }; +}; ////// 取消注册一个天气 ////// control.prototype.unregisterWeather = function (name) { - delete this.weathers[name]; - if (core.animateFrame.weather.type == name) { - this.setWeather(null); - } -} + delete this.weathers[name]; + if (core.animateFrame.weather.type == name) { + this.setWeather(null); + } +}; control.prototype._weather_rain = function (level) { - var number = level * parseInt(20 * core.bigmap.width * core.bigmap.height / (core._WIDTH_ * core._HEIGHT_)); - for (var a = 0; a < number; a++) { - core.animateFrame.weather.nodes.push({ - 'x': Math.random() * core.bigmap.width * 32, - 'y': Math.random() * core.bigmap.height * 32, - 'l': Math.random() * 2.5, - 'xs': -4 + Math.random() * 4 + 2, - 'ys': Math.random() * 10 + 10 - }) - } -} + var number = + level * + parseInt( + (20 * core.bigmap.width * core.bigmap.height) / + (core._WIDTH_ * core._HEIGHT_) + ); + for (var a = 0; a < number; a++) { + core.animateFrame.weather.nodes.push({ + x: Math.random() * core.bigmap.width * 32, + y: Math.random() * core.bigmap.height * 32, + l: Math.random() * 2.5, + xs: -4 + Math.random() * 4 + 2, + ys: Math.random() * 10 + 10, + }); + } +}; control.prototype._weather_snow = function (level) { - var number = level * parseInt(20 * core.bigmap.width * core.bigmap.height / (core._WIDTH_ * core._HEIGHT_)); - for (var a = 0; a < number; a++) { - core.animateFrame.weather.nodes.push({ - 'x': Math.random() * core.bigmap.width * 32, - 'y': Math.random() * core.bigmap.height * 32, - 'r': Math.random() * 5 + 1, - 'd': Math.random() * Math.min(level, 200), - }) - } -} + var number = + level * + parseInt( + (20 * core.bigmap.width * core.bigmap.height) / + (core._WIDTH_ * core._HEIGHT_) + ); + for (var a = 0; a < number; a++) { + core.animateFrame.weather.nodes.push({ + x: Math.random() * core.bigmap.width * 32, + y: Math.random() * core.bigmap.height * 32, + r: Math.random() * 5 + 1, + d: Math.random() * Math.min(level, 200), + }); + } +}; control.prototype._weather_fog = function (level) { - if (!core.animateFrame.weather.fog) return; - core.animateFrame.weather.nodes = [{ - 'image': core.animateFrame.weather.fog, - 'level': 40 * level, - 'x': 0, - 'y': -core._PY_ / 2, - 'dx': -Math.random() * 1.5, - 'dy': Math.random(), - 'delta': 0.001, - }]; -} + if (!core.animateFrame.weather.fog) return; + core.animateFrame.weather.nodes = [ + { + image: core.animateFrame.weather.fog, + level: 40 * level, + x: 0, + y: -core._PY_ / 2, + dx: -Math.random() * 1.5, + dy: Math.random(), + delta: 0.001, + }, + ]; +}; control.prototype._weather_cloud = function (level) { - if (!core.animateFrame.weather.cloud) return; - core.animateFrame.weather.nodes = [{ - 'image': core.animateFrame.weather.cloud, - 'level': 40 * level, - 'x': 0, - 'y': -core._PY_ / 2, - 'dx': -Math.random() * 1.5, - 'dy': Math.random(), - 'delta': 0.001, - }]; -} + if (!core.animateFrame.weather.cloud) return; + core.animateFrame.weather.nodes = [ + { + image: core.animateFrame.weather.cloud, + level: 40 * level, + x: 0, + y: -core._PY_ / 2, + dx: -Math.random() * 1.5, + dy: Math.random(), + delta: 0.001, + }, + ]; +}; control.prototype._weather_sun = function (level) { - if (!core.animateFrame.weather.sun) return; - // 直接绘制 - core.clearMap('weather'); - core.drawImage( - 'weather', core.animateFrame.weather.sun, 0, 0, core.animateFrame.weather.sun.width, core.animateFrame.weather.sun.height, 0, 0, core._PX_, core._PY_ - ); - core.setOpacity('weather', level / 10); - core.animateFrame.weather.nodes = [{ opacity: level / 10, delta: 0.01 }]; -} + if (!core.animateFrame.weather.sun) return; + // 直接绘制 + core.clearMap("weather"); + core.drawImage( + "weather", + core.animateFrame.weather.sun, + 0, + 0, + core.animateFrame.weather.sun.width, + core.animateFrame.weather.sun.height, + 0, + 0, + core._PX_, + core._PY_ + ); + core.setOpacity("weather", level / 10); + core.animateFrame.weather.nodes = [{ opacity: level / 10, delta: 0.01 }]; +}; ////// 更改画面色调 ////// control.prototype.setCurtain = function (color, time, moveMode, callback) { - if (time == null) time = 750; - if (time <= 0) time = 0; - if (!core.status.curtainColor) - core.status.curtainColor = [0, 0, 0, 0]; - if (!color) color = [0, 0, 0, 0]; - if (color[3] == null) color[3] = 1; - color[3] = core.clamp(color[3], 0, 1); + if (time == null) time = 750; + if (time <= 0) time = 0; + if (!core.status.curtainColor) core.status.curtainColor = [0, 0, 0, 0]; + if (!color) color = [0, 0, 0, 0]; + if (color[3] == null) color[3] = 1; + color[3] = core.clamp(color[3], 0, 1); - if (time == 0) { - // 直接变色 - core.clearMap('curtain'); - core.fillRect('curtain', 0, 0, core._PX_, core._PY_, core.arrayToRGBA(color)); - core.status.curtainColor = color; - if (callback) callback(); - return; + if (time == 0) { + // 直接变色 + core.clearMap("curtain"); + core.fillRect( + "curtain", + 0, + 0, + core._PX_, + core._PY_, + core.arrayToRGBA(color) + ); + core.status.curtainColor = color; + if (callback) callback(); + return; + } + + this._setCurtain_animate( + core.status.curtainColor, + color, + time, + moveMode, + callback + ); +}; + +control.prototype._setCurtain_animate = function ( + nowColor, + color, + time, + moveMode, + callback +) { + time /= Math.max(core.status.replay.speed, 1); + var per_time = 10, + step = 0, + steps = parseInt(time / per_time); + if (steps <= 0) steps = 1; + var curr = nowColor; + var moveFunc = core.applyEasing(moveMode); + + var cb = function () { + core.status.curtainColor = curr; + if (callback) callback(); + }; + var animate = setInterval(function () { + step++; + curr = [ + nowColor[0] + (color[0] - nowColor[0]) * moveFunc(step / steps), + nowColor[1] + (color[1] - nowColor[1]) * moveFunc(step / steps), + nowColor[2] + (color[2] - nowColor[2]) * moveFunc(step / steps), + nowColor[3] + (color[3] - nowColor[3]) * moveFunc(step / steps), + ]; + core.clearMap("curtain"); + core.fillRect( + "curtain", + 0, + 0, + core._PX_, + core._PY_, + core.arrayToRGBA(curr) + ); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + cb(); } + }, per_time); - this._setCurtain_animate(core.status.curtainColor, color, time, moveMode, callback); -} - -control.prototype._setCurtain_animate = function (nowColor, color, time, moveMode, callback) { - time /= Math.max(core.status.replay.speed, 1) - var per_time = 10, step = 0, steps = parseInt(time / per_time); - if (steps <= 0) steps = 1; - var curr = nowColor; - var moveFunc = core.applyEasing(moveMode); - - var cb = function () { - core.status.curtainColor = curr; - if (callback) callback(); - } - var animate = setInterval(function () { - step++; - curr = [ - nowColor[0] + (color[0] - nowColor[0]) * moveFunc(step / steps), - nowColor[1] + (color[1] - nowColor[1]) * moveFunc(step / steps), - nowColor[2] + (color[2] - nowColor[2]) * moveFunc(step / steps), - nowColor[3] + (color[3] - nowColor[3]) * moveFunc(step / steps), - ] - core.clearMap('curtain'); - core.fillRect('curtain', 0, 0, core._PX_, core._PY_, core.arrayToRGBA(curr)); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - cb(); - } - }, per_time); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; +}; ////// 画面闪烁 ////// -control.prototype.screenFlash = function (color, time, times, moveMode, callback) { - times = times || 1; - time = time / 3; - var nowColor = core.clone(core.status.curtainColor); - core.setCurtain(color, time, moveMode, function () { - core.setCurtain(nowColor, time * 2, moveMode, function () { - if (times > 1) - core.screenFlash(color, time * 3, times - 1, moveMode, callback); - else { - if (callback) callback(); - } - }); +control.prototype.screenFlash = function ( + color, + time, + times, + moveMode, + callback +) { + times = times || 1; + time = time / 3; + var nowColor = core.clone(core.status.curtainColor); + core.setCurtain(color, time, moveMode, function () { + core.setCurtain(nowColor, time * 2, moveMode, function () { + if (times > 1) + core.screenFlash(color, time * 3, times - 1, moveMode, callback); + else { + if (callback) callback(); + } }); -} + }); +}; ////// 播放背景音乐 ////// control.prototype.playBgm = function (bgm, startTime) { - bgm = core.getMappedName(bgm); - if (main.mode != 'play' || !core.material.bgms[bgm]) return; - // 如果不允许播放 - if (!core.musicStatus.bgmStatus) { - try { - core.musicStatus.playingBgm = bgm; - core.musicStatus.lastBgm = bgm; - core.material.bgms[bgm].pause(); - } - catch (e) { - console.error(e); - } - return; - } - this.setMusicBtn(); - + bgm = core.getMappedName(bgm); + if (main.mode != "play" || !core.material.bgms[bgm]) return; + // 如果不允许播放 + if (!core.musicStatus.bgmStatus) { try { - this._playBgm_play(bgm, startTime); + core.musicStatus.playingBgm = bgm; + core.musicStatus.lastBgm = bgm; + core.material.bgms[bgm].pause(); + } catch (e) { + console.error(e); } - catch (e) { - console.log("无法播放BGM " + bgm); - console.error(e); - core.musicStatus.playingBgm = null; - } -} + return; + } + this.setMusicBtn(); + + try { + this._playBgm_play(bgm, startTime); + } catch (e) { + console.log("无法播放BGM " + bgm); + console.error(e); + core.musicStatus.playingBgm = null; + } +}; control.prototype._playBgm_play = function (bgm, startTime) { - // 如果当前正在播放,且和本BGM相同,直接忽略 - if (core.musicStatus.playingBgm == bgm && !core.material.bgms[core.musicStatus.playingBgm].paused) { - return; - } - // 如果正在播放中,暂停 - if (core.musicStatus.playingBgm) { - core.material.bgms[core.musicStatus.playingBgm].pause(); - } - // 缓存BGM - core.loader.loadBgm(bgm); - // 播放当前BGM - core.material.bgms[bgm].volume = core.musicStatus.userVolume * core.musicStatus.designVolume; - core.material.bgms[bgm].currentTime = startTime || 0; - core.material.bgms[bgm].play(); - core.musicStatus.playingBgm = bgm; - core.musicStatus.lastBgm = bgm; - core.setBgmSpeed(100); -} + // 如果当前正在播放,且和本BGM相同,直接忽略 + if ( + core.musicStatus.playingBgm == bgm && + !core.material.bgms[core.musicStatus.playingBgm].paused + ) { + return; + } + // 如果正在播放中,暂停 + if (core.musicStatus.playingBgm) { + core.material.bgms[core.musicStatus.playingBgm].pause(); + } + // 缓存BGM + core.loader.loadBgm(bgm); + // 播放当前BGM + core.material.bgms[bgm].volume = + core.musicStatus.userVolume * core.musicStatus.designVolume; + core.material.bgms[bgm].currentTime = startTime || 0; + core.material.bgms[bgm].play(); + core.musicStatus.playingBgm = bgm; + core.musicStatus.lastBgm = bgm; + core.setBgmSpeed(100); +}; ///// 设置当前背景音乐的播放速度 ////// control.prototype.setBgmSpeed = function (speed, usePitch) { - var bgm = core.musicStatus.playingBgm; - if (main.mode != 'play' || !core.material.bgms[bgm]) return; - bgm = core.material.bgms[bgm]; - if (speed < 30 || speed > 300) return; - bgm.playbackRate = speed / 100; - core.musicStatus.bgmSpeed = speed; + var bgm = core.musicStatus.playingBgm; + if (main.mode != "play" || !core.material.bgms[bgm]) return; + bgm = core.material.bgms[bgm]; + if (speed < 30 || speed > 300) return; + bgm.playbackRate = speed / 100; + core.musicStatus.bgmSpeed = speed; - if (bgm.preservesPitch != null) { - if (bgm.__preservesPitch == null) bgm.__preservesPitch = bgm.preservesPitch; - if (usePitch == null) bgm.preservesPitch = bgm.__preservesPitch; - else if (usePitch) bgm.preservesPitch = false; - else bgm.preservesPitch = true; - core.musicStatus.bgmUsePitch = usePitch; - } -} + if (bgm.preservesPitch != null) { + if (bgm.__preservesPitch == null) bgm.__preservesPitch = bgm.preservesPitch; + if (usePitch == null) bgm.preservesPitch = bgm.__preservesPitch; + else if (usePitch) bgm.preservesPitch = false; + else bgm.preservesPitch = true; + core.musicStatus.bgmUsePitch = usePitch; + } +}; ////// 暂停背景音乐的播放 ////// control.prototype.pauseBgm = function () { - if (main.mode != 'play') return; - try { - if (core.musicStatus.playingBgm) { - core.musicStatus.pauseTime = core.material.bgms[core.musicStatus.playingBgm].currentTime; - core.material.bgms[core.musicStatus.playingBgm].pause(); - core.musicStatus.playingBgm = null; - } + if (main.mode != "play") return; + try { + if (core.musicStatus.playingBgm) { + core.musicStatus.pauseTime = + core.material.bgms[core.musicStatus.playingBgm].currentTime; + core.material.bgms[core.musicStatus.playingBgm].pause(); + core.musicStatus.playingBgm = null; } - catch (e) { - console.log("无法暂停BGM"); - console.error(e); - } - this.setMusicBtn(); -} + } catch (e) { + console.log("无法暂停BGM"); + console.error(e); + } + this.setMusicBtn(); +}; ////// 恢复背景音乐的播放 ////// control.prototype.resumeBgm = function (resumeTime) { - if (main.mode != 'play') return; - try { - var speed = core.musicStatus.bgmSpeed; - var usePitch = core.musicStatus.bgmUsePitch; - core.playBgm(core.musicStatus.playingBgm || core.musicStatus.lastBgm || main.startBgm, - resumeTime ? core.musicStatus.pauseTime : 0); - if (resumeTime) { - core.setBgmSpeed(speed, usePitch); - } + if (main.mode != "play") return; + try { + var speed = core.musicStatus.bgmSpeed; + var usePitch = core.musicStatus.bgmUsePitch; + core.playBgm( + core.musicStatus.playingBgm || core.musicStatus.lastBgm || main.startBgm, + resumeTime ? core.musicStatus.pauseTime : 0 + ); + if (resumeTime) { + core.setBgmSpeed(speed, usePitch); } - catch (e) { - console.log("无法恢复BGM"); - console.error(e); - } - this.setMusicBtn(); -} + } catch (e) { + console.log("无法恢复BGM"); + console.error(e); + } + this.setMusicBtn(); +}; control.prototype.setMusicBtn = function () { - if (core.musicStatus.bgmStatus) - core.dom.musicBtn.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABWVBMVEX///9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmL///8AAAC5ubn+/v6xsbEtLS0MDAxmZmZoaGhvb2/c3Nzd3d38/Pz9/f0oKCgpKSl0dHR1dXW6urrb29v7+/v09PTv7+/39/cgICACAgImJibh4eGFhYWGhoaHh4eOjo5paWm7u7vDw8PMzMwyMjI7OztAQEDe3t5FRUVMTEzj4+Pl5eXm5ubp6enr6+tcXFzi4uL19fVeXl74+PgjIyNkZGQGBgaSkpKYmJiampqenp4DAwMwMDBnZ2cICAivr68eHh63t7cLCwsSEhLw8PBhYWEUFBQVFRXNzc3Pz8/Z2dna2toaGhqkpKSlpaWpqamrq6tFOUNAAAAAc3RSTlMAAwQFBhUWGxwkJSYyO0dISVBRUmpvj5CSk5SVoaOlpqiysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyA0IuUgAAAVdJREFUeF5NkVVbw0AQRTcQrLR4IIEGcidJoaUuQHF3d3d3+P/CkuxCzss8nG++mbnDBJXhNt2CpbeFK1kQpSEKidlc8S9qdATRa6UIdQMoxEpDA0Ov3wUAPfW+qLWACydNv9zMrzkJwPK6FB3oHyOfXfuNxvoBQ+GmBYinhHB77TmiVBxoYUw1AYcEq332AS8OYKosAuTT0nza9uU2USYPRJgGxEiSOFywJ3mNARozgBJJzkfLvfu8JgGDWcC9FEsjWzR+y80gYDEAA8QZ3N6kmP1Fs3fEASB7pob7Hh+Wz5L0ci17Or05J7bH6B6dZv05XWK3rG+myV05Ert592Qo55sPuoIr7hEZHHtieIPWy0RU9DLwc3Mnck/vi8/E8XNrDWQtEVnL/ySKMrv0jPwPp870fprcyYifmiEmqGpHkI5q9ofSFIUk2qiwIGpEMyxYhhZRRcMPz89RJ2s9W8wAAAAASUVORK5CYII="; - else - core.dom.musicBtn.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABYlBMVEX///9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmL////8/PwAAABmZmZoaGihoaGioqKxsbG5ubnb29vc3Nzd3d3h4eHi4uL9/f3+/v4tLS1nZ2d0dHSUlJSenp66uroMDAz7+/spKSkoKCgUFBRpaWkVFRVvb291dXU7OzuVlZWYmJhkZGQgICAjIyOkpKQCAgK3t7cGBgbv7++pqamrq6seHh4mJiZhYWGamprp6enr6+saGhpeXl7j4+Pl5eXm5uZKSkrw8PD09PT19fW7u7vDw8PMzMwICAgwMDAyMjILCwtAQECGhoaHh4eBgYGFhYUSEhJXV1dZWVlcXFyOjo6SkpLNzc339/fPz8/Z2dna2tqTk5OlpaWxOPeTAAAAdnRSTlMAAwQFBhUWGxwkJSYyO0dISVBRUmpvj5CSk5SVoaOlpqiysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyNuo+uwAAAWJJREFUeF5NkmV34zAQReUm7WbTuJBNunY3bvXGDjNTkZkZlpn5/9eR5FPfbzr3jGb0RkwRiMQMDm7EIgHmRxtLwMOaHHoQjwz4MUKeCM8AWMrmd7u7f/aXAMyOShHiQD1n04DtN5e5FMBFlSauIsm585dKi4CpuSYKJIv1tBDVmvOSqJgEoowFLSBHaQh10XHWiCgHWEGmAw2blPrvOK/KRJUGoLM4kCVSKrWz7HwgoiwQZyaQJ0+9PvxV23BNATAZB25IqX9b3+jTW9fcApwB6NLgUD5NY3mPXnwmFwBezff1ztzRFzTp94FXMy36HDuCa2RafdnnmZqtL818Gl9/qNnEeyrUk2aTPiKj3qMyWBVi/YSuWq5qiwxkbtX3vYWzdz/l8M0k8ERlvViiB1Ygslb7SbVtJezncj+Cx5bYaeGuonZqhZlieAp+no74/s5EAh6JcY35Cepxk4ObcT3IJPe/1lKsDpFCFQAAAABJRU5ErkJggg=="; -} + if (core.musicStatus.bgmStatus) + core.dom.musicBtn.src = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABWVBMVEX///9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmL///8AAAC5ubn+/v6xsbEtLS0MDAxmZmZoaGhvb2/c3Nzd3d38/Pz9/f0oKCgpKSl0dHR1dXW6urrb29v7+/v09PTv7+/39/cgICACAgImJibh4eGFhYWGhoaHh4eOjo5paWm7u7vDw8PMzMwyMjI7OztAQEDe3t5FRUVMTEzj4+Pl5eXm5ubp6enr6+tcXFzi4uL19fVeXl74+PgjIyNkZGQGBgaSkpKYmJiampqenp4DAwMwMDBnZ2cICAivr68eHh63t7cLCwsSEhLw8PBhYWEUFBQVFRXNzc3Pz8/Z2dna2toaGhqkpKSlpaWpqamrq6tFOUNAAAAAc3RSTlMAAwQFBhUWGxwkJSYyO0dISVBRUmpvj5CSk5SVoaOlpqiysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyA0IuUgAAAVdJREFUeF5NkVVbw0AQRTcQrLR4IIEGcidJoaUuQHF3d3d3+P/CkuxCzss8nG++mbnDBJXhNt2CpbeFK1kQpSEKidlc8S9qdATRa6UIdQMoxEpDA0Ov3wUAPfW+qLWACydNv9zMrzkJwPK6FB3oHyOfXfuNxvoBQ+GmBYinhHB77TmiVBxoYUw1AYcEq332AS8OYKosAuTT0nza9uU2USYPRJgGxEiSOFywJ3mNARozgBJJzkfLvfu8JgGDWcC9FEsjWzR+y80gYDEAA8QZ3N6kmP1Fs3fEASB7pob7Hh+Wz5L0ci17Or05J7bH6B6dZv05XWK3rG+myV05Ert592Qo55sPuoIr7hEZHHtieIPWy0RU9DLwc3Mnck/vi8/E8XNrDWQtEVnL/ySKMrv0jPwPp870fprcyYifmiEmqGpHkI5q9ofSFIUk2qiwIGpEMyxYhhZRRcMPz89RJ2s9W8wAAAAASUVORK5CYII="; + else + core.dom.musicBtn.src = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABYlBMVEX///9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmL////8/PwAAABmZmZoaGihoaGioqKxsbG5ubnb29vc3Nzd3d3h4eHi4uL9/f3+/v4tLS1nZ2d0dHSUlJSenp66uroMDAz7+/spKSkoKCgUFBRpaWkVFRVvb291dXU7OzuVlZWYmJhkZGQgICAjIyOkpKQCAgK3t7cGBgbv7++pqamrq6seHh4mJiZhYWGamprp6enr6+saGhpeXl7j4+Pl5eXm5uZKSkrw8PD09PT19fW7u7vDw8PMzMwICAgwMDAyMjILCwtAQECGhoaHh4eBgYGFhYUSEhJXV1dZWVlcXFyOjo6SkpLNzc339/fPz8/Z2dna2tqTk5OlpaWxOPeTAAAAdnRSTlMAAwQFBhUWGxwkJSYyO0dISVBRUmpvj5CSk5SVoaOlpqiysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyNuo+uwAAAWJJREFUeF5NkmV34zAQReUm7WbTuJBNunY3bvXGDjNTkZkZlpn5/9eR5FPfbzr3jGb0RkwRiMQMDm7EIgHmRxtLwMOaHHoQjwz4MUKeCM8AWMrmd7u7f/aXAMyOShHiQD1n04DtN5e5FMBFlSauIsm585dKi4CpuSYKJIv1tBDVmvOSqJgEoowFLSBHaQh10XHWiCgHWEGmAw2blPrvOK/KRJUGoLM4kCVSKrWz7HwgoiwQZyaQJ0+9PvxV23BNATAZB25IqX9b3+jTW9fcApwB6NLgUD5NY3mPXnwmFwBezff1ztzRFzTp94FXMy36HDuCa2RafdnnmZqtL818Gl9/qNnEeyrUk2aTPiKj3qMyWBVi/YSuWq5qiwxkbtX3vYWzdz/l8M0k8ERlvViiB1Ygslb7SbVtJezncj+Cx5bYaeGuonZqhZlieAp+no74/s5EAh6JcY35Cepxk4ObcT3IJPe/1lKsDpFCFQAAAABJRU5ErkJggg=="; +}; ////// 更改背景音乐的播放 ////// control.prototype.triggerBgm = function () { - if (main.mode != 'play') return; + if (main.mode != "play") return; - core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; - if (core.musicStatus.bgmStatus) - this.resumeBgm(); - else - this.pauseBgm(); - core.setLocalStorage('bgmStatus', core.musicStatus.bgmStatus); -} + core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; + if (core.musicStatus.bgmStatus) this.resumeBgm(); + else this.pauseBgm(); + core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); +}; ////// 播放音频 ////// control.prototype.playSound = function (sound, pitch, callback) { - sound = core.getMappedName(sound); - if (main.mode != 'play' || !core.musicStatus.soundStatus || !core.material.sounds[sound]) return; - try { - if (core.musicStatus.audioContext != null) { - var source = core.musicStatus.audioContext.createBufferSource(); - source.__name = sound; - source.buffer = core.material.sounds[sound]; - source.connect(core.musicStatus.gainNode); - var id = setTimeout(null); - if (pitch && pitch >= 30 && pitch <= 300) { - source.playbackRate.setValueAtTime(pitch / 100, 0); - } - source.onended = function () { - delete core.musicStatus.playingSounds[id]; - if (callback) callback(); - } - core.musicStatus.playingSounds[id] = source; - if (source.start) source.start(0); - else if (source.noteOn) source.noteOn(0); - return id; - } - else { - core.material.sounds[sound].volume = core.musicStatus.userVolume; - core.material.sounds[sound].play(); - if (callback) callback(); - } + sound = core.getMappedName(sound); + if ( + main.mode != "play" || + !core.musicStatus.soundStatus || + !core.material.sounds[sound] + ) + return; + try { + if (core.musicStatus.audioContext != null) { + var source = core.musicStatus.audioContext.createBufferSource(); + source.__name = sound; + source.buffer = core.material.sounds[sound]; + source.connect(core.musicStatus.gainNode); + var id = setTimeout(null); + if (pitch && pitch >= 30 && pitch <= 300) { + source.playbackRate.setValueAtTime(pitch / 100, 0); + } + source.onended = function () { + delete core.musicStatus.playingSounds[id]; + if (callback) callback(); + }; + core.musicStatus.playingSounds[id] = source; + if (source.start) source.start(0); + else if (source.noteOn) source.noteOn(0); + return id; + } else { + core.material.sounds[sound].volume = core.musicStatus.userVolume; + core.material.sounds[sound].play(); + if (callback) callback(); } - catch (e) { - console.log("无法播放SE " + sound); - console.error(e); - } -} + } catch (e) { + console.log("无法播放SE " + sound); + console.error(e); + } +}; ////// 停止所有音频 ////// control.prototype.stopSound = function (id) { - if (id == null) { - Object.keys(core.musicStatus.playingSounds).forEach(function (id) { - core.control.stopSound(id); - }); - return; - } - var source = core.musicStatus.playingSounds[id]; - if (!source) return; - try { - if (source.stop) source.stop(); - else if (source.noteOff) source.noteOff(); - } - catch (e) { - console.error(e); - } - delete core.musicStatus.playingSounds[id]; -} + if (id == null) { + Object.keys(core.musicStatus.playingSounds).forEach(function (id) { + core.control.stopSound(id); + }); + return; + } + var source = core.musicStatus.playingSounds[id]; + if (!source) return; + try { + if (source.stop) source.stop(); + else if (source.noteOff) source.noteOff(); + } catch (e) { + console.error(e); + } + delete core.musicStatus.playingSounds[id]; +}; ////// 获得当前正在播放的所有(指定)音效的id列表 ////// control.prototype.getPlayingSounds = function (name) { - name = core.getMappedName(name); - return Object.keys(core.musicStatus.playingSounds).filter(function (one) { - return name == null || core.musicStatus.playingSounds[one].__name == name - }); -} + name = core.getMappedName(name); + return Object.keys(core.musicStatus.playingSounds).filter(function (one) { + return name == null || core.musicStatus.playingSounds[one].__name == name; + }); +}; ////// 检查bgm状态 ////// control.prototype.checkBgm = function () { - core.playBgm(core.musicStatus.playingBgm || main.startBgm); -} + core.playBgm(core.musicStatus.playingBgm || main.startBgm); +}; ///// 设置屏幕放缩 ////// control.prototype.setDisplayScale = function (delta) { - var index = core.domStyle.availableScale.indexOf(core.domStyle.scale); - if (index < 0) return; - index = (index + delta + core.domStyle.availableScale.length) % core.domStyle.availableScale.length; - core.domStyle.scale = core.domStyle.availableScale[index]; - core.setLocalStorage('scale', core.domStyle.scale); - core.resize(); -} + var index = core.domStyle.availableScale.indexOf(core.domStyle.scale); + if (index < 0) return; + index = + (index + delta + core.domStyle.availableScale.length) % + core.domStyle.availableScale.length; + core.domStyle.scale = core.domStyle.availableScale[index]; + core.setLocalStorage("scale", core.domStyle.scale); + core.resize(); +}; // ------ 状态栏,工具栏等相关 ------ // ////// 清空状态栏 ////// control.prototype.clearStatusBar = function () { - Object.keys(core.statusBar).forEach(function (e) { - if (core.statusBar[e].innerHTML != null) { - core.statusBar[e].innerHTML = " "; - core.statusBar[e].removeAttribute('_style'); - core.statusBar[e].removeAttribute('_value'); - } - }) - core.statusBar.image.book.style.opacity = 0.3; - if (!core.flags.equipboxButton) - core.statusBar.image.fly.style.opacity = 0.3; -} + Object.keys(core.statusBar).forEach(function (e) { + if (core.statusBar[e].innerHTML != null) { + core.statusBar[e].innerHTML = " "; + core.statusBar[e].removeAttribute("_style"); + core.statusBar[e].removeAttribute("_value"); + } + }); + core.statusBar.image.book.style.opacity = 0.3; + if (!core.flags.equipboxButton) core.statusBar.image.fly.style.opacity = 0.3; +}; ////// 更新状态栏 ////// control.prototype.updateStatusBar = function (doNotCheckAutoEvents, immediate) { - if (!core.isPlaying()) return; - if (immediate) { - return this.updateStatusBar_update(); - } - if (!doNotCheckAutoEvents) this.noAutoEvents = false; - if (core.isReplaying()) return this.updateStatusBar_update(); - if (!core.control.updateNextFrame) { - core.control.updateNextFrame = true; - requestAnimationFrame(this.updateStatusBar_update); - } + if (!core.isPlaying()) return; + if (immediate) { + return this.updateStatusBar_update(); + } + if (!doNotCheckAutoEvents) this.noAutoEvents = false; + if (core.isReplaying()) return this.updateStatusBar_update(); + if (!core.control.updateNextFrame) { + core.control.updateNextFrame = true; + requestAnimationFrame(this.updateStatusBar_update); + } }; control.prototype.updateStatusBar_update = function () { - core.control.updateNextFrame = false; - if (!core.isPlaying() || core.hasFlag('__statistics__')) return; - core.control.controldata.updateStatusBar(); - if (!core.control.noAutoEvents) core.checkAutoEvents(); - core.control._updateStatusBar_setToolboxIcon(); - core.clearRouteFolding(); - core.control.noAutoEvents = true; + core.control.updateNextFrame = false; + if (!core.isPlaying() || core.hasFlag("__statistics__")) return; + core.control.controldata.updateStatusBar(); + if (!core.control.noAutoEvents) core.checkAutoEvents(); + core.control._updateStatusBar_setToolboxIcon(); + core.clearRouteFolding(); + core.control.noAutoEvents = true; }; control.prototype._updateStatusBar_setToolboxIcon = function () { - if (core.isReplaying()) { - core.statusBar.image.book.src = core.status.replay.pausing ? core.statusBar.icons.play.src : core.statusBar.icons.pause.src; - core.statusBar.image.book.style.opacity = 1; - core.statusBar.image.fly.src = core.statusBar.icons.stop.src; - core.statusBar.image.fly.style.opacity = 1; - core.statusBar.image.toolbox.src = core.statusBar.icons.rewind.src; - core.statusBar.image.keyboard.src = core.statusBar.icons.book.src; - core.statusBar.image.shop.src = core.statusBar.icons.floor.src; - core.statusBar.image.save.src = core.statusBar.icons.speedDown.src; - core.statusBar.image.save.style.opacity = 1; - core.statusBar.image.load.src = core.statusBar.icons.speedUp.src; - core.statusBar.image.settings.src = core.statusBar.icons.save.src; + if (core.isReplaying()) { + core.statusBar.image.book.src = core.status.replay.pausing + ? core.statusBar.icons.play.src + : core.statusBar.icons.pause.src; + core.statusBar.image.book.style.opacity = 1; + core.statusBar.image.fly.src = core.statusBar.icons.stop.src; + core.statusBar.image.fly.style.opacity = 1; + core.statusBar.image.toolbox.src = core.statusBar.icons.rewind.src; + core.statusBar.image.keyboard.src = core.statusBar.icons.book.src; + core.statusBar.image.shop.src = core.statusBar.icons.floor.src; + core.statusBar.image.save.src = core.statusBar.icons.speedDown.src; + core.statusBar.image.save.style.opacity = 1; + core.statusBar.image.load.src = core.statusBar.icons.speedUp.src; + core.statusBar.image.settings.src = core.statusBar.icons.save.src; + } else { + core.statusBar.image.book.src = core.statusBar.icons.book.src; + core.statusBar.image.book.style.opacity = core.hasItem("book") ? 1 : 0.3; + if (!core.flags.equipboxButton) { + core.statusBar.image.fly.src = core.statusBar.icons.fly.src; + core.statusBar.image.fly.style.opacity = core.hasItem("fly") ? 1 : 0.3; + } else { + core.statusBar.image.fly.src = core.statusBar.icons.equipbox.src; + core.statusBar.image.fly.style.opacity = 1; } - else { - core.statusBar.image.book.src = core.statusBar.icons.book.src; - core.statusBar.image.book.style.opacity = core.hasItem('book') ? 1 : 0.3; - if (!core.flags.equipboxButton) { - core.statusBar.image.fly.src = core.statusBar.icons.fly.src; - core.statusBar.image.fly.style.opacity = core.hasItem('fly') ? 1 : 0.3; - } - else { - core.statusBar.image.fly.src = core.statusBar.icons.equipbox.src; - core.statusBar.image.fly.style.opacity = 1; - } - core.statusBar.image.toolbox.src = core.statusBar.icons.toolbox.src; - core.statusBar.image.keyboard.src = core.statusBar.icons.keyboard.src; - core.statusBar.image.shop.src = core.statusBar.icons.shop.src; - core.statusBar.image.save.src = core.statusBar.icons.save.src; - core.statusBar.image.save.style.opacity = core.hasFlag('__forbidSave__') ? 0.3 : 1; - core.statusBar.image.load.src = core.statusBar.icons.load.src; - core.statusBar.image.settings.src = core.statusBar.icons.settings.src; - } -} + core.statusBar.image.toolbox.src = core.statusBar.icons.toolbox.src; + core.statusBar.image.keyboard.src = core.statusBar.icons.keyboard.src; + core.statusBar.image.shop.src = core.statusBar.icons.shop.src; + core.statusBar.image.save.src = core.statusBar.icons.save.src; + core.statusBar.image.save.style.opacity = core.hasFlag("__forbidSave__") + ? 0.3 + : 1; + core.statusBar.image.load.src = core.statusBar.icons.load.src; + core.statusBar.image.settings.src = core.statusBar.icons.settings.src; + } +}; control.prototype.showStatusBar = function () { - if (main.mode == 'editor') return; - if (core.domStyle.showStatusBar) return; - var statusItems = core.dom.status; - core.domStyle.showStatusBar = true; - core.removeFlag('hideStatusBar'); - // 显示 - for (var i = 0; i < statusItems.length; ++i) - statusItems[i].style.opacity = 1; - this.setToolbarButton(false); - core.dom.tools.hard.style.display = 'block'; - core.dom.toolBar.style.display = 'block'; -} + if (main.mode == "editor") return; + if (core.domStyle.showStatusBar) return; + var statusItems = core.dom.status; + core.domStyle.showStatusBar = true; + core.removeFlag("hideStatusBar"); + // 显示 + for (var i = 0; i < statusItems.length; ++i) statusItems[i].style.opacity = 1; + this.setToolbarButton(false); + core.dom.tools.hard.style.display = "block"; + core.dom.toolBar.style.display = "block"; +}; control.prototype.hideStatusBar = function (showToolbox) { - if (main.mode == 'editor') return; + if (main.mode == "editor") return; - // 如果原本就是隐藏的,则先显示 - if (!core.domStyle.showStatusBar) - this.showStatusBar(); - if (core.isReplaying()) showToolbox = true; + // 如果原本就是隐藏的,则先显示 + if (!core.domStyle.showStatusBar) this.showStatusBar(); + if (core.isReplaying()) showToolbox = true; - var statusItems = core.dom.status, toolItems = core.dom.tools; - core.domStyle.showStatusBar = false; - core.setFlag('hideStatusBar', true); - core.setFlag('showToolbox', showToolbox || null); - // 隐藏 - for (var i = 0; i < statusItems.length; ++i) - statusItems[i].style.opacity = 0; - if ((!core.domStyle.isVertical && !core.flags.extendToolbar) || !showToolbox) { - for (var i = 0; i < toolItems.length; ++i) - toolItems[i].style.display = 'none'; - } - if (!core.domStyle.isVertical && !core.flags.extendToolbar) { - core.dom.toolBar.style.display = 'none'; - } -} + var statusItems = core.dom.status, + toolItems = core.dom.tools; + core.domStyle.showStatusBar = false; + core.setFlag("hideStatusBar", true); + core.setFlag("showToolbox", showToolbox || null); + // 隐藏 + for (var i = 0; i < statusItems.length; ++i) statusItems[i].style.opacity = 0; + if ( + (!core.domStyle.isVertical && !core.flags.extendToolbar) || + !showToolbox + ) { + for (var i = 0; i < toolItems.length; ++i) + toolItems[i].style.display = "none"; + } + if (!core.domStyle.isVertical && !core.flags.extendToolbar) { + core.dom.toolBar.style.display = "none"; + } +}; ////// 更新状态栏的勇士图标 ////// control.prototype.updateHeroIcon = function (name) { - name = name || "hero.png"; - if (core.statusBar.icons.name == name) return; - core.statusBar.icons.name = name; + name = name || "hero.png"; + if (core.statusBar.icons.name == name) return; + core.statusBar.icons.name = name; - var image = core.material.images.hero; - // 全身图 - var w = core.material.icons.hero.width || 32; - var h = core.material.icons.hero.height || 48; - var ratio = Math.min(w / h, 1), width = 32 * ratio, left = 16 - width / 2; + var image = core.material.images.hero; + // 全身图 + var w = core.material.icons.hero.width || 32; + var h = core.material.icons.hero.height || 48; + var ratio = Math.min(w / h, 1), + width = 32 * ratio, + left = 16 - width / 2; - var canvas = document.createElement("canvas"); - var ctx = canvas.getContext("2d"); - canvas.width = 32; - canvas.height = 32; - core.drawImage(ctx, image, 0, 0, w, h, left, 0, width, 32); + var canvas = document.createElement("canvas"); + var ctx = canvas.getContext("2d"); + canvas.width = 32; + canvas.height = 32; + core.drawImage(ctx, image, 0, 0, w, h, left, 0, width, 32); - core.statusBar.image.name.src = canvas.toDataURL("image/png"); -} + core.statusBar.image.name.src = canvas.toDataURL("image/png"); +}; ////// 改变工具栏为按钮1-8 ////// control.prototype.setToolbarButton = function (useButton) { - if (!core.domStyle.showStatusBar) { - // 隐藏状态栏时检查竖屏 - if (!core.domStyle.isVertical && !core.flags.extendToolbar) { - for (var i = 0; i < core.dom.tools.length; ++i) - core.dom.tools[i].style.display = 'none'; - return; - } - if (!core.hasFlag('showToolbox')) return; - else core.dom.tools.hard.style.display = 'block'; + if (!core.domStyle.showStatusBar) { + // 隐藏状态栏时检查竖屏 + if (!core.domStyle.isVertical && !core.flags.extendToolbar) { + for (var i = 0; i < core.dom.tools.length; ++i) + core.dom.tools[i].style.display = "none"; + return; } + if (!core.hasFlag("showToolbox")) return; + else core.dom.tools.hard.style.display = "block"; + } - if (useButton == null) useButton = core.domStyle.toolbarBtn; - if ((!core.domStyle.isVertical && !core.flags.extendToolbar)) useButton = false; - core.domStyle.toolbarBtn = useButton; + if (useButton == null) useButton = core.domStyle.toolbarBtn; + if (!core.domStyle.isVertical && !core.flags.extendToolbar) useButton = false; + core.domStyle.toolbarBtn = useButton; - if (useButton) { - ["book", "fly", "toolbox", "keyboard", "shop", "save", "load", "settings"].forEach(function (t) { - core.statusBar.image[t].style.display = 'none'; - }); - ["btn1", "btn2", "btn3", "btn4", "btn5", "btn6", "btn7", "btn8"].forEach(function (t) { - core.statusBar.image[t].style.display = 'block'; - }) - main.statusBar.image.btn8.style.filter = core.getLocalStorage('altKey') ? 'sepia(1) contrast(1.5)' : ''; - } - else { - ["btn1", "btn2", "btn3", "btn4", "btn5", "btn6", "btn7", "btn8"].forEach(function (t) { - core.statusBar.image[t].style.display = 'none'; - }); - ["book", "fly", "toolbox", "save", "load", "settings"].forEach(function (t) { - core.statusBar.image[t].style.display = 'block'; - }); - core.statusBar.image.keyboard.style.display - = core.statusBar.image.shop.style.display - = core.domStyle.isVertical || core.flags.extendToolbar ? "block" : "none"; - } -} + if (useButton) { + [ + "book", + "fly", + "toolbox", + "keyboard", + "shop", + "save", + "load", + "settings", + ].forEach(function (t) { + core.statusBar.image[t].style.display = "none"; + }); + ["btn1", "btn2", "btn3", "btn4", "btn5", "btn6", "btn7", "btn8"].forEach( + function (t) { + core.statusBar.image[t].style.display = "block"; + } + ); + main.statusBar.image.btn8.style.filter = core.getLocalStorage("altKey") + ? "sepia(1) contrast(1.5)" + : ""; + } else { + ["btn1", "btn2", "btn3", "btn4", "btn5", "btn6", "btn7", "btn8"].forEach( + function (t) { + core.statusBar.image[t].style.display = "none"; + } + ); + ["book", "fly", "toolbox", "save", "load", "settings"].forEach(function ( + t + ) { + core.statusBar.image[t].style.display = "block"; + }); + core.statusBar.image.keyboard.style.display = + core.statusBar.image.shop.style.display = + core.domStyle.isVertical || core.flags.extendToolbar ? "block" : "none"; + } +}; ////// ------ resize处理 ------ // control.prototype._shouldDisplayStatus = function (id) { - if (id == null) { - var toDraw = [], status = core.dom.status; - for (var i = 0; i < status.length; ++i) { - var dom = core.dom.status[i], idCol = dom.id; - if (idCol.indexOf("Col") != idCol.length - 3) continue; - var id = idCol.substring(0, idCol.length - 3); - if (!this._shouldDisplayStatus(id)) continue; - toDraw.push(id); - } - return toDraw; + if (id == null) { + var toDraw = [], + status = core.dom.status; + for (var i = 0; i < status.length; ++i) { + var dom = core.dom.status[i], + idCol = dom.id; + if (idCol.indexOf("Col") != idCol.length - 3) continue; + var id = idCol.substring(0, idCol.length - 3); + if (!this._shouldDisplayStatus(id)) continue; + toDraw.push(id); } - var obj = {}; - core.flags.statusBarItems.forEach(function (v) { obj[v] = true; }) - switch (id) { - case 'floor': return obj.enableFloor; - case 'name': return obj.enableName; - case 'lv': return obj.enableLv; - case 'hp': return obj.enableHP; - case 'hpmax': return obj.enableHPMax; - case 'mana': return obj.enableMana; - case 'atk': return obj.enableAtk; - case 'def': return obj.enableDef; - case 'mdef': return obj.enableMDef; - case 'money': return obj.enableMoney; - case 'exp': return obj.enableExp && !obj.levelUpLeftMode; - case 'up': return obj.enableLevelUp; - case 'skill': return obj.enableSkill; - case 'key': return obj.enableKeys; - case 'pzf': return obj.enablePZF; - case 'debuff': return obj.enableDebuff; - default: return true; - } -} + return toDraw; + } + var obj = {}; + core.flags.statusBarItems.forEach(function (v) { + obj[v] = true; + }); + switch (id) { + case "floor": + return obj.enableFloor; + case "name": + return obj.enableName; + case "lv": + return obj.enableLv; + case "hp": + return obj.enableHP; + case "hpmax": + return obj.enableHPMax; + case "mana": + return obj.enableMana; + case "atk": + return obj.enableAtk; + case "def": + return obj.enableDef; + case "mdef": + return obj.enableMDef; + case "money": + return obj.enableMoney; + case "exp": + return obj.enableExp && !obj.levelUpLeftMode; + case "up": + return obj.enableLevelUp; + case "skill": + return obj.enableSkill; + case "key": + return obj.enableKeys; + case "pzf": + return obj.enablePZF; + case "debuff": + return obj.enableDebuff; + default: + return true; + } +}; ////// 注册一个resize函数 ////// // name为名称,可供注销使用 // func可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。 control.prototype.registerResize = function (name, func) { - this.unregisterResize(name); - this.resizes.push({ name: name, func: func }); -} + this.unregisterResize(name); + this.resizes.push({ name: name, func: func }); +}; ////// 注销一个resize函数 ////// control.prototype.unregisterResize = function (name) { - this.resizes = this.resizes.filter(function (b) { return b.name != name; }); -} + this.resizes = this.resizes.filter(function (b) { + return b.name != name; + }); +}; control.prototype._doResize = function (obj) { - for (var i in this.resizes) { - try { - if (core.doFunc(this.resizes[i].func, this, obj)) return true; - } catch (e) { - console.error(e); - console.error("ERROR in resizes[" + this.resizes[i].name + "]:已自动注销该项。"); - this.unregisterResize(this.resizes[i].name); - } + for (var i in this.resizes) { + try { + if (core.doFunc(this.resizes[i].func, this, obj)) return true; + } catch (e) { + console.error(e); + console.error( + "ERROR in resizes[" + this.resizes[i].name + "]:已自动注销该项。" + ); + this.unregisterResize(this.resizes[i].name); } - return false; -} + } + return false; +}; ////// 屏幕分辨率改变后重新自适应 ////// control.prototype.resize = function () { - if (main.mode == 'editor') return; - var clientWidth = main.dom.body.clientWidth, clientHeight = main.dom.body.clientHeight; - var BORDER = 3; - var extendToolbar = core.flags.extendToolbar; - let hideLeftStatusBar = core.flags.hideLeftStatusBar; - var BAR_WIDTH = hideLeftStatusBar ? 0 : Math.round(core._PY_ * 0.31); + if (main.mode == "editor") return; + var clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + var BORDER = 3; + var extendToolbar = core.flags.extendToolbar; + let hideLeftStatusBar = core.flags.hideLeftStatusBar; + var BAR_WIDTH = hideLeftStatusBar ? 0 : Math.round(core._PY_ * 0.31); - var horizontalMaxRatio = (clientHeight - 2 * BORDER - (hideLeftStatusBar ? BORDER : 0)) / (core._PY_ + (hideLeftStatusBar ? 38 : 0)); + var horizontalMaxRatio = + (clientHeight - 2 * BORDER - (hideLeftStatusBar ? BORDER : 0)) / + (core._PY_ + (hideLeftStatusBar ? 38 : 0)); - if (clientWidth - 3 * BORDER >= core._PX_ + BAR_WIDTH || (clientWidth > clientHeight && horizontalMaxRatio < 1)) { - // 横屏 - core.domStyle.isVertical = false; + if ( + clientWidth - 3 * BORDER >= core._PX_ + BAR_WIDTH || + (clientWidth > clientHeight && horizontalMaxRatio < 1) + ) { + // 横屏 + core.domStyle.isVertical = false; - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5].forEach(function (v) { - if (clientWidth - 3 * BORDER >= v * (core._PX_ + BAR_WIDTH) && horizontalMaxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); - if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { - core.domStyle.scale = Math.min(1, horizontalMaxRatio); - } - } - else { - // 竖屏 - core.domStyle.isVertical = true; - core.domStyle.scale = Math.min((clientWidth - 2 * BORDER) / core._PX_); - core.domStyle.availableScale = []; - extendToolbar = false; - hideLeftStatusBar = false; - BAR_WIDTH = Math.round(core._PX_ * 0.3); + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5].forEach(function (v) { + if ( + clientWidth - 3 * BORDER >= v * (core._PX_ + BAR_WIDTH) && + horizontalMaxRatio >= v + ) { + core.domStyle.availableScale.push(v); + } + }); + if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { + core.domStyle.scale = Math.min(1, horizontalMaxRatio); } + } else { + // 竖屏 + core.domStyle.isVertical = true; + core.domStyle.scale = Math.min((clientWidth - 2 * BORDER) / core._PX_); + core.domStyle.availableScale = []; + extendToolbar = false; + hideLeftStatusBar = false; + BAR_WIDTH = Math.round(core._PX_ * 0.3); + } - var statusDisplayArr = this._shouldDisplayStatus(), count = statusDisplayArr.length; - var statusCanvas = core.flags.statusCanvas, statusCanvasRows = core.values.statusCanvasRowsOnMobile || 3; - var col = statusCanvas ? statusCanvasRows : Math.ceil(count / 3); - if (col > 5) { - if (statusCanvas) alert("自绘状态栏的在竖屏下的行数应不超过5!"); - else alert("当前状态栏数目(" + count + ")大于15,请调整到不超过15以避免手机端出现显示问题。"); - } - var globalAttribute = core.status.globalAttribute || core.initStatus.globalAttribute; + var statusDisplayArr = this._shouldDisplayStatus(), + count = statusDisplayArr.length; + var statusCanvas = core.flags.statusCanvas, + statusCanvasRows = core.values.statusCanvasRowsOnMobile || 3; + var col = statusCanvas ? statusCanvasRows : Math.ceil(count / 3); + if (col > 5) { + if (statusCanvas) alert("自绘状态栏的在竖屏下的行数应不超过5!"); + else + alert( + "当前状态栏数目(" + + count + + ")大于15,请调整到不超过15以避免手机端出现显示问题。" + ); + } + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; - var obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - BORDER: BORDER, - BAR_WIDTH: BAR_WIDTH, - TOOLBAR_HEIGHT: 38, - outerWidth: core._PX_ * core.domStyle.scale + 2 * BORDER, - outerHeight: core._PY_ * core.domStyle.scale + 2 * BORDER, - globalAttribute: globalAttribute, - border: '3px ' + core.arrayToRGBA(globalAttribute.borderColor) + ' solid', - statusDisplayArr: statusDisplayArr, - count: count, - col: col, - statusBarHeightInVertical: core.domStyle.isVertical ? (32 * col + 6) * core.domStyle.scale + 2 * BORDER : 0, - toolbarHeightInVertical: core.domStyle.isVertical ? 38 * core.domStyle.scale + 2 * BORDER : 0, - extendToolbar: extendToolbar, - is15x15: false, - hideLeftStatusBar - }; + var obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + BORDER: BORDER, + BAR_WIDTH: BAR_WIDTH, + TOOLBAR_HEIGHT: 38, + outerWidth: core._PX_ * core.domStyle.scale + 2 * BORDER, + outerHeight: core._PY_ * core.domStyle.scale + 2 * BORDER, + globalAttribute: globalAttribute, + border: "3px " + core.arrayToRGBA(globalAttribute.borderColor) + " solid", + statusDisplayArr: statusDisplayArr, + count: count, + col: col, + statusBarHeightInVertical: core.domStyle.isVertical + ? (32 * col + 6) * core.domStyle.scale + 2 * BORDER + : 0, + toolbarHeightInVertical: core.domStyle.isVertical + ? 38 * core.domStyle.scale + 2 * BORDER + : 0, + extendToolbar: extendToolbar, + is15x15: false, + hideLeftStatusBar, + }; - this._doResize(obj); - this.setToolbarButton(); - core.updateStatusBar(); -} + this._doResize(obj); + this.setToolbarButton(); + core.updateStatusBar(); +}; control.prototype._resize_gameGroup = function (obj) { - var startBackground = core.domStyle.isVertical ? (main.styles.startVerticalBackground || main.styles.startBackground) : main.styles.startBackground; - if (main.dom.startBackground.getAttribute('__src__') != startBackground) { - main.dom.startBackground.setAttribute('__src__', startBackground); - main.dom.startBackground.src = startBackground; - } + var startBackground = core.domStyle.isVertical + ? main.styles.startVerticalBackground || main.styles.startBackground + : main.styles.startBackground; + if (main.dom.startBackground.getAttribute("__src__") != startBackground) { + main.dom.startBackground.setAttribute("__src__", startBackground); + main.dom.startBackground.src = startBackground; + } - var gameGroup = core.dom.gameGroup; - var totalWidth, totalHeight; - if (core.domStyle.isVertical) { - totalWidth = obj.outerWidth; - totalHeight = obj.outerHeight + obj.statusBarHeightInVertical + obj.toolbarHeightInVertical - } - else { - totalWidth = obj.outerWidth + obj.BAR_WIDTH * core.domStyle.scale + (obj.hideLeftStatusBar ? 0 : obj.BORDER); - totalHeight = obj.outerHeight + (obj.extendToolbar ? obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER : 0); - } - gameGroup.style.width = totalWidth + "px"; - gameGroup.style.height = totalHeight + "px"; - gameGroup.style.left = (obj.clientWidth - totalWidth) / 2 + "px"; - gameGroup.style.top = (obj.clientHeight - totalHeight) / 2 + "px"; - // floorMsgGroup - var floorMsgGroup = core.dom.floorMsgGroup; - floorMsgGroup.style = obj.globalAttribute.floorChangingStyle; - floorMsgGroup.style.width = obj.outerWidth - 2 * obj.BORDER + "px"; - floorMsgGroup.style.height = totalHeight - 2 * obj.BORDER + "px"; - floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; - // startPanel - core.dom.startPanel.style.fontSize = 16 * core.domStyle.scale + "px"; - // musicBtn - if (core.domStyle.isVertical || core.domStyle.scale < 1) { - core.dom.musicBtn.style.right = core.dom.musicBtn.style.bottom = "3px"; - } - else { - core.dom.musicBtn.style.right = (obj.clientWidth - totalWidth) / 2 + "px"; - core.dom.musicBtn.style.bottom = (obj.clientHeight - totalHeight) / 2 - 27 + "px"; - } -} + var gameGroup = core.dom.gameGroup; + var totalWidth, totalHeight; + if (core.domStyle.isVertical) { + totalWidth = obj.outerWidth; + totalHeight = + obj.outerHeight + + obj.statusBarHeightInVertical + + obj.toolbarHeightInVertical; + } else { + totalWidth = + obj.outerWidth + + obj.BAR_WIDTH * core.domStyle.scale + + (obj.hideLeftStatusBar ? 0 : obj.BORDER); + totalHeight = + obj.outerHeight + + (obj.extendToolbar + ? obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER + : 0); + } + gameGroup.style.width = totalWidth + "px"; + gameGroup.style.height = totalHeight + "px"; + gameGroup.style.left = (obj.clientWidth - totalWidth) / 2 + "px"; + gameGroup.style.top = (obj.clientHeight - totalHeight) / 2 + "px"; + // floorMsgGroup + var floorMsgGroup = core.dom.floorMsgGroup; + floorMsgGroup.style = obj.globalAttribute.floorChangingStyle; + floorMsgGroup.style.width = obj.outerWidth - 2 * obj.BORDER + "px"; + floorMsgGroup.style.height = totalHeight - 2 * obj.BORDER + "px"; + floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; + // startPanel + core.dom.startPanel.style.fontSize = 16 * core.domStyle.scale + "px"; + // musicBtn + if (core.domStyle.isVertical || core.domStyle.scale < 1) { + core.dom.musicBtn.style.right = core.dom.musicBtn.style.bottom = "3px"; + } else { + core.dom.musicBtn.style.right = (obj.clientWidth - totalWidth) / 2 + "px"; + core.dom.musicBtn.style.bottom = + (obj.clientHeight - totalHeight) / 2 - 27 + "px"; + } +}; control.prototype._resize_canvas = function (obj) { - var innerWidth = (core._PX_ * core.domStyle.scale) + "px", innerHeight = (core._PY_ * core.domStyle.scale) + "px"; - if (!core.isPlaying()) { - for (var i = 0; i < core.dom.gameCanvas.length; ++i) { - var ctx = core.dom.gameCanvas[i].getContext('2d'); - core.resizeCanvas(ctx, core._PX_, core._PY_); - core.dom.gameCanvas[i].style.width = innerWidth; - core.dom.gameCanvas[i].style.height = innerHeight; - } - } else { - requestAnimationFrame(function () { - for (var i = 0; i < core.dom.gameCanvas.length; ++i) { - core.dom.gameCanvas[i].style.width = innerWidth; - core.dom.gameCanvas[i].style.height = innerHeight; - } - }); + var innerWidth = core._PX_ * core.domStyle.scale + "px", + innerHeight = core._PY_ * core.domStyle.scale + "px"; + if (!core.isPlaying()) { + for (var i = 0; i < core.dom.gameCanvas.length; ++i) { + var ctx = core.dom.gameCanvas[i].getContext("2d"); + core.resizeCanvas(ctx, core._PX_, core._PY_); + core.dom.gameCanvas[i].style.width = innerWidth; + core.dom.gameCanvas[i].style.height = innerHeight; } - core.dom.gif.style.width = innerWidth; - core.dom.gif.style.height = innerHeight; - core.dom.gif2.style.width = innerWidth; - core.dom.gif2.style.height = innerHeight; - core.dom.gameDraw.style.width = innerWidth; - core.dom.gameDraw.style.height = innerHeight; - core.dom.gameDraw.style.top = obj.statusBarHeightInVertical + "px"; - core.dom.gameDraw.style.right = 0; - core.dom.gameDraw.style.border = obj.border; - // resize bigmap - core.bigmap.canvas.forEach(function (cn) { - var ratio = core.canvas[cn].canvas.hasAttribute('isHD') ? core.domStyle.ratio : 1; - core.canvas[cn].canvas.style.width = core.canvas[cn].canvas.width / ratio * core.domStyle.scale + "px"; - core.canvas[cn].canvas.style.height = core.canvas[cn].canvas.height / ratio * core.domStyle.scale + "px"; + } else { + requestAnimationFrame(function () { + for (var i = 0; i < core.dom.gameCanvas.length; ++i) { + core.dom.gameCanvas[i].style.width = innerWidth; + core.dom.gameCanvas[i].style.height = innerHeight; + } }); - // resize dynamic canvas - if (!core.isPlaying()) { - for (var name in core.dymCanvas) { - var ctx = core.dymCanvas[name], canvas = ctx.canvas; - // core.maps._setHDCanvasSize(ctx, parseFloat(canvas.getAttribute('_width')), parseFloat(canvas.getAttribute('_height'))); - canvas.style.left = parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; - canvas.style.top = parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; - var scale = canvas.getAttribute('_scale') || 1; - core.resizeCanvas(canvas, canvas.width * scale / core.domStyle.scale, canvas.height * scale / core.domStyle.scale); - } - } else { - for (var name in core.dymCanvas) { - var ctx = core.dymCanvas[name], canvas = ctx.canvas; - core.resizeCanvas(ctx, parseFloat(canvas.getAttribute("_width")), parseFloat(canvas.getAttribute("_height"))) - canvas.style.left = parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; - canvas.style.top = parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; - } + } + core.dom.gif.style.width = innerWidth; + core.dom.gif.style.height = innerHeight; + core.dom.gif2.style.width = innerWidth; + core.dom.gif2.style.height = innerHeight; + core.dom.gameDraw.style.width = innerWidth; + core.dom.gameDraw.style.height = innerHeight; + core.dom.gameDraw.style.top = obj.statusBarHeightInVertical + "px"; + core.dom.gameDraw.style.right = 0; + core.dom.gameDraw.style.border = obj.border; + // resize bigmap + core.bigmap.canvas.forEach(function (cn) { + var ratio = core.canvas[cn].canvas.hasAttribute("isHD") + ? core.domStyle.ratio + : 1; + core.canvas[cn].canvas.style.width = + (core.canvas[cn].canvas.width / ratio) * core.domStyle.scale + "px"; + core.canvas[cn].canvas.style.height = + (core.canvas[cn].canvas.height / ratio) * core.domStyle.scale + "px"; + }); + // resize dynamic canvas + if (!core.isPlaying()) { + for (var name in core.dymCanvas) { + var ctx = core.dymCanvas[name], + canvas = ctx.canvas; + // core.maps._setHDCanvasSize(ctx, parseFloat(canvas.getAttribute('_width')), parseFloat(canvas.getAttribute('_height'))); + canvas.style.left = + parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; + canvas.style.top = + parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; + var scale = canvas.getAttribute("_scale") || 1; + core.resizeCanvas( + canvas, + (canvas.width * scale) / core.domStyle.scale, + (canvas.height * scale) / core.domStyle.scale + ); } - // resize next - main.dom.next.style.width = main.dom.next.style.height = 5 * core.domStyle.scale + "px"; - main.dom.next.style.borderBottomWidth = main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; -} + } else { + for (var name in core.dymCanvas) { + var ctx = core.dymCanvas[name], + canvas = ctx.canvas; + core.resizeCanvas( + ctx, + parseFloat(canvas.getAttribute("_width")), + parseFloat(canvas.getAttribute("_height")) + ); + canvas.style.left = + parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; + canvas.style.top = + parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; + } + } + // resize next + main.dom.next.style.width = main.dom.next.style.height = + 5 * core.domStyle.scale + "px"; + main.dom.next.style.borderBottomWidth = main.dom.next.style.borderRightWidth = + 4 * core.domStyle.scale + "px"; +}; control.prototype._resize_statusBar = function (obj) { - // statusBar - var statusBar = core.dom.statusBar; - if (core.domStyle.isVertical) { - statusBar.style.width = obj.outerWidth + "px"; - statusBar.style.height = obj.statusBarHeightInVertical + "px"; - statusBar.style.background = obj.globalAttribute.statusTopBackground; - statusBar.style.fontSize = 16 * core.domStyle.scale + "px"; + // statusBar + var statusBar = core.dom.statusBar; + if (core.domStyle.isVertical) { + statusBar.style.width = obj.outerWidth + "px"; + statusBar.style.height = obj.statusBarHeightInVertical + "px"; + statusBar.style.background = obj.globalAttribute.statusTopBackground; + statusBar.style.fontSize = 16 * core.domStyle.scale + "px"; + } else { + statusBar.style.width = + obj.BAR_WIDTH * core.domStyle.scale + obj.BORDER + "px"; + statusBar.style.height = + obj.outerHeight + + (obj.extendToolbar + ? obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER + : 0) + + "px"; + statusBar.style.background = obj.globalAttribute.statusLeftBackground; + // --- 计算文字大小 + if (obj.hideLeftStatusBar) { + statusBar.style.fontSize = 16 * core.domStyle.scale + "px"; + } else { + statusBar.style.fontSize = + 16 * + Math.min(1, (core._HEIGHT_ - 4) / obj.count) * + core.domStyle.scale + + "px"; } - else { - statusBar.style.width = (obj.BAR_WIDTH * core.domStyle.scale + obj.BORDER) + "px"; - statusBar.style.height = obj.outerHeight + (obj.extendToolbar ? obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER : 0) + "px"; - statusBar.style.background = obj.globalAttribute.statusLeftBackground; - // --- 计算文字大小 - if (obj.hideLeftStatusBar) { - statusBar.style.fontSize = 16 * core.domStyle.scale + "px"; - } else { - statusBar.style.fontSize = 16 * Math.min(1, (core._HEIGHT_ - 4) / obj.count) * core.domStyle.scale + "px"; - } - } - statusBar.style.display = obj.hideLeftStatusBar ? 'none' : 'block'; - statusBar.style.borderTop = statusBar.style.borderLeft = obj.border; - statusBar.style.borderRight = core.domStyle.isVertical ? obj.border : ''; - statusBar.style.borderBottom = core.domStyle.isVertical ? '' : obj.border; - // 自绘状态栏 - if (core.domStyle.isVertical) { - core.dom.statusCanvas.style.width = core._PX_ * core.domStyle.scale + "px"; - core.dom.statusCanvas.style.height = obj.statusBarHeightInVertical - 3 + "px"; - core.maps._setHDCanvasSize(core.dom.statusCanvasCtx, core._PX_, obj.col * 32 + 9); - } - else { - core.dom.statusCanvas.style.width = obj.BAR_WIDTH * core.domStyle.scale + "px"; - core.dom.statusCanvas.style.height = obj.outerHeight - 2 * obj.BORDER + (obj.extendToolbar ? obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER : 0) + "px"; - core.maps._setHDCanvasSize(core.dom.statusCanvasCtx, obj.BAR_WIDTH, core._PY_ + (obj.extendToolbar ? obj.TOOLBAR_HEIGHT + obj.BORDER : 0)); - } - core.dom.statusCanvas.style.display = core.flags.statusCanvas && !obj.hideLeftStatusBar ? "block" : "none"; -} + } + statusBar.style.display = obj.hideLeftStatusBar ? "none" : "block"; + statusBar.style.borderTop = statusBar.style.borderLeft = obj.border; + statusBar.style.borderRight = core.domStyle.isVertical ? obj.border : ""; + statusBar.style.borderBottom = core.domStyle.isVertical ? "" : obj.border; + // 自绘状态栏 + if (core.domStyle.isVertical) { + core.dom.statusCanvas.style.width = core._PX_ * core.domStyle.scale + "px"; + core.dom.statusCanvas.style.height = + obj.statusBarHeightInVertical - 3 + "px"; + core.maps._setHDCanvasSize( + core.dom.statusCanvasCtx, + core._PX_, + obj.col * 32 + 9 + ); + } else { + core.dom.statusCanvas.style.width = + obj.BAR_WIDTH * core.domStyle.scale + "px"; + core.dom.statusCanvas.style.height = + obj.outerHeight - + 2 * obj.BORDER + + (obj.extendToolbar + ? obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER + : 0) + + "px"; + core.maps._setHDCanvasSize( + core.dom.statusCanvasCtx, + obj.BAR_WIDTH, + core._PY_ + (obj.extendToolbar ? obj.TOOLBAR_HEIGHT + obj.BORDER : 0) + ); + } + core.dom.statusCanvas.style.display = + core.flags.statusCanvas && !obj.hideLeftStatusBar ? "block" : "none"; +}; control.prototype._resize_status = function (obj) { - var statusHeight; - if (core.domStyle.isVertical) { - statusHeight = 32 * core.domStyle.scale * 0.8; - } else { - statusHeight = (obj.hideLeftStatusBar ? core._HEIGHT_ : core._HEIGHT_ - 4) / obj.count * 32 * core.domStyle.scale * 0.8; - } - // status - for (var i = 0; i < core.dom.status.length; ++i) { - var id = core.dom.status[i].id, style = core.dom.status[i].style; - if (id.endsWith("Col")) id = id.substring(0, id.length - 3); - style.display = core.flags.statusCanvas || obj.statusDisplayArr.indexOf(id) < 0 ? 'none' : 'block'; - style.margin = 3 * core.domStyle.scale + "px"; - style.height = statusHeight + "px"; - style.maxWidth = obj.BAR_WIDTH * core.domStyle.scale * (core.domStyle.isVertical ? 0.95 : 1) + obj.BORDER + "px"; - if (obj.is15x15 && !core.domStyle.isVertical) - style.marginLeft = 11 * core.domStyle.scale + "px"; - } - // statusLabels, statusTexts - for (var i = 0; i < core.dom.statusLabels.length; ++i) { - core.dom.statusLabels[i].style.lineHeight = statusHeight + "px"; - core.dom.statusLabels[i].style.marginLeft = 6 * core.domStyle.scale + "px"; - } - for (var i = 0; i < core.dom.statusTexts.length; ++i) { - core.dom.statusTexts[i].style.color = core.arrayToRGBA(obj.globalAttribute.statusBarColor); - } - // keys - if (core.flags.statusBarItems.indexOf('enableGreenKey') >= 0) { - core.dom.keyCol.style.fontSize = '0.75em'; - core.statusBar.greenKey.style.display = ''; - } else { - core.dom.keyCol.style.fontSize = ''; - core.statusBar.greenKey.style.display = 'none'; - } -} + var statusHeight; + if (core.domStyle.isVertical) { + statusHeight = 32 * core.domStyle.scale * 0.8; + } else { + statusHeight = + ((obj.hideLeftStatusBar ? core._HEIGHT_ : core._HEIGHT_ - 4) / + obj.count) * + 32 * + core.domStyle.scale * + 0.8; + } + // status + for (var i = 0; i < core.dom.status.length; ++i) { + var id = core.dom.status[i].id, + style = core.dom.status[i].style; + if (id.endsWith("Col")) id = id.substring(0, id.length - 3); + style.display = + core.flags.statusCanvas || obj.statusDisplayArr.indexOf(id) < 0 + ? "none" + : "block"; + style.margin = 3 * core.domStyle.scale + "px"; + style.height = statusHeight + "px"; + style.maxWidth = + obj.BAR_WIDTH * + core.domStyle.scale * + (core.domStyle.isVertical ? 0.95 : 1) + + obj.BORDER + + "px"; + if (obj.is15x15 && !core.domStyle.isVertical) + style.marginLeft = 11 * core.domStyle.scale + "px"; + } + // statusLabels, statusTexts + for (var i = 0; i < core.dom.statusLabels.length; ++i) { + core.dom.statusLabels[i].style.lineHeight = statusHeight + "px"; + core.dom.statusLabels[i].style.marginLeft = 6 * core.domStyle.scale + "px"; + } + for (var i = 0; i < core.dom.statusTexts.length; ++i) { + core.dom.statusTexts[i].style.color = core.arrayToRGBA( + obj.globalAttribute.statusBarColor + ); + } + // keys + if (core.flags.statusBarItems.indexOf("enableGreenKey") >= 0) { + core.dom.keyCol.style.fontSize = "0.75em"; + core.statusBar.greenKey.style.display = ""; + } else { + core.dom.keyCol.style.fontSize = ""; + core.statusBar.greenKey.style.display = "none"; + } +}; control.prototype._resize_toolBar = function (obj) { - // toolBar - var toolBar = core.dom.toolBar; - if (core.domStyle.isVertical) { - toolBar.style.left = 0; - toolBar.style.right = ""; - toolBar.style.width = obj.outerWidth + "px"; - toolBar.style.top = obj.statusBarHeightInVertical + obj.outerHeight + "px"; - toolBar.style.height = obj.toolbarHeightInVertical + "px"; - toolBar.style.background = obj.globalAttribute.toolsBackground; - } - else { - if (obj.extendToolbar || obj.hideLeftStatusBar) { - toolBar.style.left = ""; - toolBar.style.right = 0; - toolBar.style.width = obj.outerWidth + "px"; - toolBar.style.top = obj.outerHeight + "px"; - toolBar.style.height = obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER + "px"; - toolBar.style.background = obj.globalAttribute.toolsBackground; - } else { - toolBar.style.left = 0; - toolBar.style.right = ""; - toolBar.style.width = obj.BAR_WIDTH * core.domStyle.scale + obj.BORDER + "px"; - toolBar.style.top = 0.75 * obj.outerHeight + "px"; - toolBar.style.height = 0.25 * obj.outerHeight + "px"; - toolBar.style.background = 'transparent'; - } - } - toolBar.style.borderLeft = obj.border; - toolBar.style.borderRight = toolBar.style.borderBottom = core.domStyle.isVertical || obj.extendToolbar ? obj.border : ''; - toolBar.style.fontSize = 16 * core.domStyle.scale + "px"; - - if (!core.domStyle.showStatusBar && !core.domStyle.isVertical && !obj.extendToolbar) { - toolBar.style.display = 'none'; + // toolBar + var toolBar = core.dom.toolBar; + if (core.domStyle.isVertical) { + toolBar.style.left = 0; + toolBar.style.right = ""; + toolBar.style.width = obj.outerWidth + "px"; + toolBar.style.top = obj.statusBarHeightInVertical + obj.outerHeight + "px"; + toolBar.style.height = obj.toolbarHeightInVertical + "px"; + toolBar.style.background = obj.globalAttribute.toolsBackground; + } else { + if (obj.extendToolbar || obj.hideLeftStatusBar) { + toolBar.style.left = ""; + toolBar.style.right = 0; + toolBar.style.width = obj.outerWidth + "px"; + toolBar.style.top = obj.outerHeight + "px"; + toolBar.style.height = + obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER + "px"; + toolBar.style.background = obj.globalAttribute.toolsBackground; } else { - toolBar.style.display = 'block'; + toolBar.style.left = 0; + toolBar.style.right = ""; + toolBar.style.width = + obj.BAR_WIDTH * core.domStyle.scale + obj.BORDER + "px"; + toolBar.style.top = 0.75 * obj.outerHeight + "px"; + toolBar.style.height = 0.25 * obj.outerHeight + "px"; + toolBar.style.background = "transparent"; } -} + } + toolBar.style.borderLeft = obj.border; + toolBar.style.borderRight = toolBar.style.borderBottom = + core.domStyle.isVertical || obj.extendToolbar ? obj.border : ""; + toolBar.style.fontSize = 16 * core.domStyle.scale + "px"; + + if ( + !core.domStyle.showStatusBar && + !core.domStyle.isVertical && + !obj.extendToolbar + ) { + toolBar.style.display = "none"; + } else { + toolBar.style.display = "block"; + } +}; control.prototype._resize_tools = function (obj) { - var toolsHeight = 32 * core.domStyle.scale * ((core.domStyle.isVertical || obj.extendToolbar) && !obj.is15x15 ? 0.95 : 1); - var toolsMarginLeft; - if (core.domStyle.isVertical || obj.extendToolbar) - toolsMarginLeft = (core._HALF_WIDTH_ - 3) * 3 * core.domStyle.scale; - else - toolsMarginLeft = (obj.BAR_WIDTH * core.domStyle.scale - 9 - toolsHeight * 3) / 4; - for (var i = 0; i < core.dom.tools.length; ++i) { - var style = core.dom.tools[i].style; - style.height = toolsHeight + "px"; - style.marginLeft = toolsMarginLeft + "px"; - style.marginTop = 3 * core.domStyle.scale + "px" - } - core.dom.hard.style.lineHeight = toolsHeight + "px"; - if (core.domStyle.isVertical || obj.extendToolbar) { - core.dom.hard.style.width = obj.outerWidth - 9 * toolsMarginLeft - 8.5 * toolsHeight - 12 + "px"; - } - else { - core.dom.hard.style.width = obj.BAR_WIDTH * core.domStyle.scale - 9 - 2 * toolsMarginLeft + "px"; - if (!obj.is15x15) core.dom.hard.style.marginTop = 0; - } -} + var toolsHeight = + 32 * + core.domStyle.scale * + ((core.domStyle.isVertical || obj.extendToolbar) && !obj.is15x15 + ? 0.95 + : 1); + var toolsMarginLeft; + if (core.domStyle.isVertical || obj.extendToolbar) + toolsMarginLeft = (core._HALF_WIDTH_ - 3) * 3 * core.domStyle.scale; + else + toolsMarginLeft = + (obj.BAR_WIDTH * core.domStyle.scale - 9 - toolsHeight * 3) / 4; + for (var i = 0; i < core.dom.tools.length; ++i) { + var style = core.dom.tools[i].style; + style.height = toolsHeight + "px"; + style.marginLeft = toolsMarginLeft + "px"; + style.marginTop = 3 * core.domStyle.scale + "px"; + } + core.dom.hard.style.lineHeight = toolsHeight + "px"; + if (core.domStyle.isVertical || obj.extendToolbar) { + core.dom.hard.style.width = + obj.outerWidth - 9 * toolsMarginLeft - 8.5 * toolsHeight - 12 + "px"; + } else { + core.dom.hard.style.width = + obj.BAR_WIDTH * core.domStyle.scale - 9 - 2 * toolsMarginLeft + "px"; + if (!obj.is15x15) core.dom.hard.style.marginTop = 0; + } +}; diff --git a/libs/events.js b/libs/events.js index 66d9954..3aabd20 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1,429 +1,485 @@ - "use strict"; -function events () { - this._init(); +function events() { + this._init(); } ////// 初始化 ////// events.prototype._init = function () { - this.eventdata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.events; - this.commonEvent = events_c12a15a8_c380_4b28_8144_256cba95f760.commonEvent; - this.systemEvents = {}; - this.actions = {}; -} + this.eventdata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.events; + this.commonEvent = events_c12a15a8_c380_4b28_8144_256cba95f760.commonEvent; + this.systemEvents = {}; + this.actions = {}; +}; // ------ 初始化,开始和结束 ------ // /// 初始化游戏 events.prototype.resetGame = function (hero, hard, floorId, maps, values) { - this.eventdata.resetGame(hero, hard, floorId, maps, values); -} + this.eventdata.resetGame(hero, hard, floorId, maps, values); +}; ////// 游戏开始事件 ////// events.prototype.startGame = function (hard, seed, route, callback) { - main.dom.levelChooseButtons.style.display = 'none'; - main.dom.startButtonGroup.style.display = 'none'; - hard = hard || ""; + main.dom.levelChooseButtons.style.display = "none"; + main.dom.startButtonGroup.style.display = "none"; + hard = hard || ""; - if (main.mode != 'play') return; + if (main.mode != "play") return; - // 无动画的开始游戏 - if (core.flags.startUsingCanvas || route != null) { - core.dom.startPanel.style.display = 'none'; - this._startGame_start(hard, seed, route, callback); - } - else { - core.hideStartAnimate(function () { - core.events._startGame_start(hard, seed, route, callback); - }); - } -} + // 无动画的开始游戏 + if (core.flags.startUsingCanvas || route != null) { + core.dom.startPanel.style.display = "none"; + this._startGame_start(hard, seed, route, callback); + } else { + core.hideStartAnimate(function () { + core.events._startGame_start(hard, seed, route, callback); + }); + } +}; events.prototype._startGame_start = function (hard, seed, route, callback) { - core.resetGame(core.firstData.hero, hard, null, core.cloneArray(core.initStatus.maps)); - core.setHeroLoc('x', -1); - core.setHeroLoc('y', -1); + core.resetGame( + core.firstData.hero, + hard, + null, + core.cloneArray(core.initStatus.maps) + ); + core.setHeroLoc("x", -1); + core.setHeroLoc("y", -1); - if (seed != null && seed > 0) { - core.setFlag('__seed__', seed); - core.setFlag('__rand__', seed); - } - else core.utils.__init_seed(); - core.clearStatusBar(); + if (seed != null && seed > 0) { + core.setFlag("__seed__", seed); + core.setFlag("__rand__", seed); + } else core.utils.__init_seed(); + core.clearStatusBar(); - var todo = []; - if (core.flags.startUsingCanvas) { - core.hideStatusBar(); - core.dom.musicBtn.style.display = 'block'; - core.push(todo, core.firstData.startCanvas); - } - core.push(todo, { "type": "function", "function": "function() { core.events._startGame_setHard(); }" }) - core.push(todo, core.firstData.startText); - this.insertAction(todo, null, null, function () { - core.events._startGame_afterStart(callback); - }); + var todo = []; + if (core.flags.startUsingCanvas) { + core.hideStatusBar(); + core.dom.musicBtn.style.display = "block"; + core.push(todo, core.firstData.startCanvas); + } + core.push(todo, { + type: "function", + function: "function() { core.events._startGame_setHard(); }", + }); + core.push(todo, core.firstData.startText); + this.insertAction(todo, null, null, function () { + core.events._startGame_afterStart(callback); + }); - if (route != null) core.startReplay(route); -} + if (route != null) core.startReplay(route); +}; events.prototype._startGame_setHard = function () { - // 根据难度设置flag:hard - // 这一段应当在startCanvas之后,startText之前做 - var hardValue = 0; - var hardColor = 'red'; - main.levelChoose.forEach(function (one) { - if (one.name == core.status.hard) { - hardValue = one.hard; - hardColor = core.arrayToRGBA(one.color || [255, 0, 0, 1]); - core.insertAction(one.action); - } - }); - core.setFlag('hard', hardValue || 0); - core.setFlag('__hardColor__', hardColor); -} + // 根据难度设置flag:hard + // 这一段应当在startCanvas之后,startText之前做 + var hardValue = 0; + var hardColor = "red"; + main.levelChoose.forEach(function (one) { + if (one.name == core.status.hard) { + hardValue = one.hard; + hardColor = core.arrayToRGBA(one.color || [255, 0, 0, 1]); + core.insertAction(one.action); + } + }); + core.setFlag("hard", hardValue || 0); + core.setFlag("__hardColor__", hardColor); +}; events.prototype._startGame_afterStart = function (callback) { - core.ui.closePanel(); - core.changeFloor(core.firstData.floorId, null, core.firstData.hero.loc, null, function () { - // 插入一个空事件避免直接回放录像出错 - core.insertAction([]); - if (callback) callback(); - }); - this._startGame_upload(); -} + core.ui.closePanel(); + core.changeFloor( + core.firstData.floorId, + null, + core.firstData.hero.loc, + null, + function () { + // 插入一个空事件避免直接回放录像出错 + core.insertAction([]); + if (callback) callback(); + } + ); + this._startGame_upload(); +}; events.prototype._startGame_upload = function () { - // Upload - var formData = new FormData(); - formData.append('type', 'people'); - formData.append('name', core.firstData.name); - formData.append('version', core.firstData.version); - formData.append('platform', core.platform.string); - formData.append('hard', core.encodeBase64(core.status.hard)); - formData.append('hardCode', core.getFlag('hard', 0)); - formData.append('base64', 1); + // Upload + var formData = new FormData(); + formData.append("type", "people"); + formData.append("name", core.firstData.name); + formData.append("version", core.firstData.version); + formData.append("platform", core.platform.string); + formData.append("hard", core.encodeBase64(core.status.hard)); + formData.append("hardCode", core.getFlag("hard", 0)); + formData.append("base64", 1); - core.utils.http("POST", "/games/upload.php", formData); -} + core.utils.http("POST", "/games/upload.php", formData); +}; ////// 游戏获胜事件 ////// events.prototype.win = function (reason, norank, noexit) { - if (!noexit) core.status.gameOver = true; - return this.eventdata.win(reason, norank, noexit); -} + if (!noexit) core.status.gameOver = true; + return this.eventdata.win(reason, norank, noexit); +}; ////// 游戏失败事件 ////// events.prototype.lose = function (reason) { - if (core.isReplaying()) return core.control._replay_error(reason, function () { core.lose(reason); }); - core.status.gameOver = true; - return this.eventdata.lose(reason); -} + if (core.isReplaying()) + return core.control._replay_error(reason, function () { + core.lose(reason); + }); + core.status.gameOver = true; + return this.eventdata.lose(reason); +}; ////// 游戏结束 ////// events.prototype.gameOver = function (ending, fromReplay, norank) { - if (!core.status.extraEvent) { - core.clearMap('all'); - core.deleteAllCanvas(); - core.dom.gif2.innerHTML = ""; - core.setWeather(); - } - core.ui.closePanel(); + if (!core.status.extraEvent) { + core.clearMap("all"); + core.deleteAllCanvas(); + core.dom.gif2.innerHTML = ""; + core.setWeather(); + } + core.ui.closePanel(); - if (main.isCompetition && ending != null) { - if (ending == "") ending = "恭喜通关"; - ending += "[比赛]"; - } + if (main.isCompetition && ending != null) { + if (ending == "") ending = "恭喜通关"; + ending += "[比赛]"; + } - var reason = null; - if (fromReplay) reason = "录像回放完毕!"; - else if (core.hasFlag("debug")) reason = "\t[系统提示]调试模式下无法上传成绩"; + var reason = null; + if (fromReplay) reason = "录像回放完毕!"; + else if (core.hasFlag("debug")) reason = "\t[系统提示]调试模式下无法上传成绩"; - if (reason != null) - core.drawText(reason, core.restart); - else - this._gameOver_confirmUpload(ending, norank); -} + if (reason != null) core.drawText(reason, core.restart); + else this._gameOver_confirmUpload(ending, norank); +}; events.prototype._gameOver_confirmUpload = function (ending, norank) { - core.ui.closePanel(); + core.ui.closePanel(); - if (ending == null) { - this._gameOver_confirmDownload(ending); - return; + if (ending == null) { + this._gameOver_confirmDownload(ending); + return; + } + core.ui.drawConfirmBox( + "你想记录你的ID和成绩吗?", + function () { + if (main.isCompetition) { + core.events._gameOver_doUpload("", ending, norank); + } else { + var id = core.getCookie("id") || ""; + var hint = + "请输入你的ID:\n(登录状态下输入数字用户编号可成为蓝名成绩并计入用户通关数)"; + if (id) + hint = + "请输入你的ID:\n(输入数字用户编号" + + id + + "可成为蓝名成绩并计入用户通关数)"; + core.myprompt(hint, id, function (username) { + core.events._gameOver_doUpload(username, ending, norank); + }); + } + }, + function () { + if (main.isCompetition) core.events._gameOver_confirmDownload(ending); + else core.events._gameOver_doUpload(null, ending, norank); } - core.ui.drawConfirmBox("你想记录你的ID和成绩吗?", function () { - if (main.isCompetition) { - core.events._gameOver_doUpload("", ending, norank); - } - else { - var id = core.getCookie('id') || ""; - var hint = "请输入你的ID:\n(登录状态下输入数字用户编号可成为蓝名成绩并计入用户通关数)"; - if (id) hint = "请输入你的ID:\n(输入数字用户编号" + id + "可成为蓝名成绩并计入用户通关数)"; - core.myprompt(hint, id, function (username) { - core.events._gameOver_doUpload(username, ending, norank); - }); - } - }, function () { - if (main.isCompetition) - core.events._gameOver_confirmDownload(ending); - else - core.events._gameOver_doUpload(null, ending, norank); - }) -} + ); +}; events.prototype._gameOver_doUpload = function (username, ending, norank) { - var hp = core.status.hero.hp; - if (username == null) hp = 1; - core.ui.closePanel(); - // upload - var formData = new FormData(); - formData.append('type', 'score'); - formData.append('name', core.firstData.name); - formData.append('version', core.firstData.version); - formData.append('platform', core.platform.string); - formData.append('hard', core.encodeBase64(core.status.hard)); - formData.append('username', core.encodeBase64(username || "")); - formData.append('ending', core.encodeBase64(ending)); - formData.append('lv', core.status.hero.lv); - formData.append('hp', Math.min(hp, Math.pow(2, 63))); - formData.append('atk', core.status.hero.atk); - formData.append('def', core.status.hero.def); - formData.append('mdef', core.status.hero.mdef); - formData.append('money', core.status.hero.money); - formData.append('experience', core.status.hero.exp); - formData.append('steps', core.status.hero.steps); - formData.append('norank', norank ? 1 : 0); - formData.append('seed', core.getFlag('__seed__')); - formData.append('totalTime', Math.floor(core.status.hero.statistics.totalTime / 1000)); - formData.append('route', core.encodeRoute(core.status.route)); - formData.append('base64', 1); + var hp = core.status.hero.hp; + if (username == null) hp = 1; + core.ui.closePanel(); + // upload + var formData = new FormData(); + formData.append("type", "score"); + formData.append("name", core.firstData.name); + formData.append("version", core.firstData.version); + formData.append("platform", core.platform.string); + formData.append("hard", core.encodeBase64(core.status.hard)); + formData.append("username", core.encodeBase64(username || "")); + formData.append("ending", core.encodeBase64(ending)); + formData.append("lv", core.status.hero.lv); + formData.append("hp", Math.min(hp, Math.pow(2, 63))); + formData.append("atk", core.status.hero.atk); + formData.append("def", core.status.hero.def); + formData.append("mdef", core.status.hero.mdef); + formData.append("money", core.status.hero.money); + formData.append("experience", core.status.hero.exp); + formData.append("steps", core.status.hero.steps); + formData.append("norank", norank ? 1 : 0); + formData.append("seed", core.getFlag("__seed__")); + formData.append( + "totalTime", + Math.floor(core.status.hero.statistics.totalTime / 1000) + ); + formData.append("route", core.encodeRoute(core.status.route)); + formData.append("base64", 1); - if (main.isCompetition) - core.http("POST", "/games/competition/upload.php", formData); - else - core.http("POST", "/games/upload.php", formData); + if (main.isCompetition) + core.http("POST", "/games/competition/upload.php", formData); + else core.http("POST", "/games/upload.php", formData); - core.events._gameOver_confirmDownload(ending); -} + core.events._gameOver_confirmDownload(ending); +}; events.prototype._gameOver_confirmDownload = function (ending) { - core.ui.closePanel(); - core.ui.drawConfirmBox("你想下载录像吗?", function () { - var obj = { - 'name': core.firstData.name, - 'version': core.firstData.version, - 'hard': core.status.hard, - 'seed': core.getFlag('__seed__'), - 'route': core.encodeRoute(core.status.route) - } - core.download(core.firstData.name + "_" + core.formatDate2(new Date()) + ".h5route", - LZString.compressToBase64(JSON.stringify(obj))); - core.events._gameOver_askRate(ending); - }, function () { - core.events._gameOver_askRate(ending); - }); -} + core.ui.closePanel(); + core.ui.drawConfirmBox( + "你想下载录像吗?", + function () { + var obj = { + name: core.firstData.name, + version: core.firstData.version, + hard: core.status.hard, + seed: core.getFlag("__seed__"), + route: core.encodeRoute(core.status.route), + }; + core.download( + core.firstData.name + "_" + core.formatDate2(new Date()) + ".h5route", + LZString.compressToBase64(JSON.stringify(obj)) + ); + core.events._gameOver_askRate(ending); + }, + function () { + core.events._gameOver_askRate(ending); + } + ); +}; events.prototype._gameOver_askRate = function (ending) { - core.ui.closePanel(); + core.ui.closePanel(); - // 继续接下来的事件 - if (core.status.extraEvent) { - core.status.event = core.status.extraEvent; - delete core.status.extraEvent; - core.lockControl(); - core.doAction(); - return; + // 继续接下来的事件 + if (core.status.extraEvent) { + core.status.event = core.status.extraEvent; + delete core.status.extraEvent; + core.lockControl(); + core.doAction(); + return; + } + + if (ending == null) { + if (!core.hasSave(0)) { + core.ui.closePanel(); + core.restart(); + return; } - if (ending == null) { - if (!core.hasSave(0)) { - core.ui.closePanel(); - core.restart(); - return; - } - - core.status.event.selection = 0; - core.ui.drawConfirmBox("你想读取自动存档么?", function () { - core.ui.closePanel(); - core.doSL("autoSave", "load"); - }, function () { - core.ui.closePanel(); - core.restart(); - }); - return; - } - - core.ui.drawConfirmBox("恭喜通关!你想查看榜单、评论,\n以及评分和标色投票吗?", function () { - if (core.platform.isPC) { - window.open("/tower/?name=" + core.firstData.name, "_blank"); - core.restart(); - } - else { - window.location.href = "/tower/?name=" + core.firstData.name; - } - }, function () { + core.status.event.selection = 0; + core.ui.drawConfirmBox( + "你想读取自动存档么?", + function () { + core.ui.closePanel(); + core.doSL("autoSave", "load"); + }, + function () { + core.ui.closePanel(); core.restart(); - }); -} + } + ); + return; + } + + core.ui.drawConfirmBox( + "恭喜通关!你想查看榜单、评论,\n以及评分和标色投票吗?", + function () { + if (core.platform.isPC) { + window.open("/tower/?name=" + core.firstData.name, "_blank"); + core.restart(); + } else { + window.location.href = "/tower/?name=" + core.firstData.name; + } + }, + function () { + core.restart(); + } + ); +}; ////// 重新开始游戏;此函数将回到标题页面 ////// events.prototype.restart = function () { - core.showStartAnimate(); - core.playBgm(main.startBgm); -} + core.showStartAnimate(); + core.playBgm(main.startBgm); +}; ////// 询问是否需要重新开始 ////// events.prototype.confirmRestart = function () { - core.playSound('打开界面'); - core.status.event.selection = 1; - core.ui.drawConfirmBox("你确定要返回标题页面吗?", function () { - core.playSound('确定'); - core.ui.closePanel(); - core.restart(); - }, function () { - core.playSound('取消'); - core.ui.closePanel(); - }); -} + core.playSound("打开界面"); + core.status.event.selection = 1; + core.ui.drawConfirmBox( + "你确定要返回标题页面吗?", + function () { + core.playSound("确定"); + core.ui.closePanel(); + core.restart(); + }, + function () { + core.playSound("取消"); + core.ui.closePanel(); + } + ); +}; // ------ 系统事件的处理 ------ // ////// 注册一个系统事件 ////// // type为事件名,func为事件的处理函数,可接受(data, callback)参数 events.prototype.registerSystemEvent = function (type, func) { - this.systemEvents[type] = func; -} + this.systemEvents[type] = func; +}; ////// 注销一个系统事件 ////// events.prototype.unregisterSystemEvent = function (type) { - delete this.systemEvents[type]; -} + delete this.systemEvents[type]; +}; ////// 执行一个系统事件 ////// events.prototype.doSystemEvent = function (type, data, callback) { - core.clearRouteFolding(); - if (this.systemEvents[type]) { - try { - return core.doFunc(this.systemEvents[type], this, data, callback); - } - catch (e) { - console.error(e); - console.error("ERROR in systemEvents[" + type + "]"); - } + core.clearRouteFolding(); + if (this.systemEvents[type]) { + try { + return core.doFunc(this.systemEvents[type], this, data, callback); + } catch (e) { + console.error(e); + console.error("ERROR in systemEvents[" + type + "]"); } - if (this["_sys_" + type]) return this["_sys_" + type](data, callback); - console.error("未知的系统事件: " + type + "!"); - if (callback) callback(); -} + } + if (this["_sys_" + type]) return this["_sys_" + type](data, callback); + console.error("未知的系统事件: " + type + "!"); + if (callback) callback(); +}; ////// 触发(x,y)点的事件 ////// events.prototype.trigger = function (x, y, callback) { - var _executeCallback = function () { - // 因为trigger之后还有可能触发其他同步脚本(比如阻激夹域检测) - // 所以这里强制callback被异步触发 - if (callback) { - setTimeout(callback, 1); // +1是为了录像检测系统 - } - return; - } - if (core.status.gameOver) return _executeCallback(); - if (core.status.event.id == 'action') { - core.insertAction({ "type": "function", "function": "function () { core.events._trigger_inAction(" + x + "," + y + "); }", "async": true }, - null, null, null, true); - return _executeCallback(); - } - if (core.status.event.id) return _executeCallback(); - - var block = core.getBlock(x, y); - if (block == null) return _executeCallback(); - - // 执行该点的脚本 - if (block.event.script) { - core.clearRouteFolding(); - try { - eval(block.event.script); - } catch (ee) { console.error(ee) } - } - - // 碰触事件 - if (block.event.event) { - core.clearRouteFolding(); - core.insertAction(block.event.event, block.x, block.y); - // 不再执行该点的系统事件 - return _executeCallback(); - } - - if (block.event.trigger && block.event.trigger != 'null') { - var noPass = block.event.noPass, trigger = block.event.trigger; - if (noPass) core.clearAutomaticRouteNode(x, y); - - // 转换楼层能否穿透 - if (trigger == 'changeFloor' && !noPass && this._trigger_ignoreChangeFloor(block)) - return _executeCallback(); - core.status.automaticRoute.moveDirectly = false; - this.doSystemEvent(trigger, block); + var _executeCallback = function () { + // 因为trigger之后还有可能触发其他同步脚本(比如阻激夹域检测) + // 所以这里强制callback被异步触发 + if (callback) { + setTimeout(callback, 1); // +1是为了录像检测系统 } + return; + }; + if (core.status.gameOver) return _executeCallback(); + if (core.status.event.id == "action") { + core.insertAction( + { + type: "function", + function: + "function () { core.events._trigger_inAction(" + x + "," + y + "); }", + async: true, + }, + null, + null, + null, + true + ); return _executeCallback(); -} + } + if (core.status.event.id) return _executeCallback(); + + var block = core.getBlock(x, y); + if (block == null) return _executeCallback(); + + // 执行该点的脚本 + if (block.event.script) { + core.clearRouteFolding(); + try { + eval(block.event.script); + } catch (ee) { + console.error(ee); + } + } + + // 碰触事件 + if (block.event.event) { + core.clearRouteFolding(); + core.insertAction(block.event.event, block.x, block.y); + // 不再执行该点的系统事件 + return _executeCallback(); + } + + if (block.event.trigger && block.event.trigger != "null") { + var noPass = block.event.noPass, + trigger = block.event.trigger; + if (noPass) core.clearAutomaticRouteNode(x, y); + + // 转换楼层能否穿透 + if ( + trigger == "changeFloor" && + !noPass && + this._trigger_ignoreChangeFloor(block) + ) + return _executeCallback(); + core.status.automaticRoute.moveDirectly = false; + this.doSystemEvent(trigger, block); + } + return _executeCallback(); +}; events.prototype._trigger_inAction = function (x, y) { - if (core.status.gameOver || core.status.event.id != 'action') return; + if (core.status.gameOver || core.status.event.id != "action") return; - var block = core.getBlock(x, y); - if (block == null) return core.doAction(); + var block = core.getBlock(x, y); + if (block == null) return core.doAction(); - // 执行该点的脚本 - try { - eval(block.event.script); - } catch (ee) { console.error(ee) } + // 执行该点的脚本 + try { + eval(block.event.script); + } catch (ee) { + console.error(ee); + } - // 碰触事件 - if (block.event.event) { - core.clearRouteFolding(); - core.insertAction(block.event.event, block.x, block.y); - // 不再执行该点的系统事件 - return core.doAction(); - } - - if (block.event.trigger && block.event.trigger != 'null') { - this.setEvents(null, x, y); - if (block.event.trigger == 'action') { - this.insertAction(block.event.data); - } - else { - this.doSystemEvent(block.event.trigger, block, core.doAction); - return; - } - } + // 碰触事件 + if (block.event.event) { + core.clearRouteFolding(); + core.insertAction(block.event.event, block.x, block.y); + // 不再执行该点的系统事件 return core.doAction(); -} + } + + if (block.event.trigger && block.event.trigger != "null") { + this.setEvents(null, x, y); + if (block.event.trigger == "action") { + this.insertAction(block.event.data); + } else { + this.doSystemEvent(block.event.trigger, block, core.doAction); + return; + } + } + return core.doAction(); +}; events.prototype._trigger_ignoreChangeFloor = function (block) { - var able = core.flags.ignoreChangeFloor; - if (block.event.data && block.event.data.ignoreChangeFloor != null) - able = block.event.data.ignoreChangeFloor; - if (able) { - if (core.isReplaying()) { - if (core.status.replay.toReplay[0] == 'no') { - core.status.replay.toReplay.shift(); - core.status.route.push("no"); - return true; - } - } - else if (core.status.automaticRoute.autoHeroMove - || core.status.automaticRoute.autoStep < core.status.automaticRoute.autoStepRoutes.length) { - core.status.route.push("no"); - return true; - } + var able = core.flags.ignoreChangeFloor; + if (block.event.data && block.event.data.ignoreChangeFloor != null) + able = block.event.data.ignoreChangeFloor; + if (able) { + if (core.isReplaying()) { + if (core.status.replay.toReplay[0] == "no") { + core.status.replay.toReplay.shift(); + core.status.route.push("no"); + return true; + } + } else if ( + core.status.automaticRoute.autoHeroMove || + core.status.automaticRoute.autoStep < + core.status.automaticRoute.autoStepRoutes.length + ) { + core.status.route.push("no"); + return true; } - return false; -} + } + return false; +}; events.prototype._sys_battle = function (data, callback) { - // 检查是否需要改变朝向 - /* if (data.x == core.nextX() && data.y == core.nextY()) { + // 检查是否需要改变朝向 + /* if (data.x == core.nextX() && data.y == core.nextY()) { var dir = core.turnDirection(":back"); var id = data.event.id, toId = (data.event.faceIds || {})[dir]; if (toId && id != toId) { @@ -433,499 +489,554 @@ events.prototype._sys_battle = function (data, callback) { } } */ - // 检查战前事件 - var beforeBattle = []; - core.push(beforeBattle, core.floors[core.status.floorId].beforeBattle[data.x + "," + data.y]); - core.push(beforeBattle, (core.material.enemys[data.event.id] || {}).beforeBattle); - if (beforeBattle.length > 0) { - core.push(beforeBattle, [{ "type": "battle", "x": data.x, "y": data.y }]); - core.clearContinueAutomaticRoute(); + // 检查战前事件 + var beforeBattle = []; + core.push( + beforeBattle, + core.floors[core.status.floorId].beforeBattle[data.x + "," + data.y] + ); + core.push( + beforeBattle, + (core.material.enemys[data.event.id] || {}).beforeBattle + ); + if (beforeBattle.length > 0) { + core.push(beforeBattle, [{ type: "battle", x: data.x, y: data.y }]); + core.clearContinueAutomaticRoute(); - // 自动存档 - var inAction = core.status.event.id == 'action'; - if (inAction) { - core.insertAction(beforeBattle, data.x, data.y); - core.doAction(); - } else { - core.autosave(true); - core.insertAction(beforeBattle, data.x, data.y, callback); - } + // 自动存档 + var inAction = core.status.event.id == "action"; + if (inAction) { + core.insertAction(beforeBattle, data.x, data.y); + core.doAction(); } else { - this.battle(data.event.id, data.x, data.y, false, callback); + core.autosave(true); + core.insertAction(beforeBattle, data.x, data.y, callback); } -} + } else { + this.battle(data.event.id, data.x, data.y, false, callback); + } +}; ////// 战斗 ////// events.prototype.battle = function (id, x, y, force, callback) { - core.saveAndStopAutomaticRoute(); - id = id || core.getBlockId(x, y); - if (!id) return core.clearContinueAutomaticRoute(callback); - // 非强制战斗 - if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) { - core.stopSound(); - core.playSound('操作失败'); - core.drawTip("你打不过此怪物!", id); - return core.clearContinueAutomaticRoute(callback); - } - // 自动存档 - if (!core.status.event.id) core.autosave(true); - // 战前事件 - if (!this.beforeBattle(id, x, y)) - return core.clearContinueAutomaticRoute(callback); - // 战后事件 - this.afterBattle(id, x, y); - if (callback) callback(); -} + core.saveAndStopAutomaticRoute(); + id = id || core.getBlockId(x, y); + if (!id) return core.clearContinueAutomaticRoute(callback); + // 非强制战斗 + if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) { + core.stopSound(); + core.playSound("操作失败"); + core.drawTip("你打不过此怪物!", id); + return core.clearContinueAutomaticRoute(callback); + } + // 自动存档 + if (!core.status.event.id) core.autosave(true); + // 战前事件 + if (!this.beforeBattle(id, x, y)) + return core.clearContinueAutomaticRoute(callback); + // 战后事件 + this.afterBattle(id, x, y); + if (callback) callback(); +}; ////// 战斗前触发的事件 ////// events.prototype.beforeBattle = function (enemyId, x, y) { - return this.eventdata.beforeBattle(enemyId, x, y) -} + return this.eventdata.beforeBattle(enemyId, x, y); +}; ////// 战斗结束后触发的事件 ////// events.prototype.afterBattle = function (enemyId, x, y) { - return this.eventdata.afterBattle(enemyId, x, y); -} + return this.eventdata.afterBattle(enemyId, x, y); +}; events.prototype._sys_openDoor = function (data, callback) { - this.openDoor(data.x, data.y, true, function () { - core.replay(); - if (callback) callback(); - }); -} + this.openDoor(data.x, data.y, true, function () { + core.replay(); + if (callback) callback(); + }); +}; ////// 开门 ////// events.prototype.openDoor = function (x, y, needKey, callback) { - var block = core.getBlock(x, y); - core.saveAndStopAutomaticRoute(); - if (!this._openDoor_check(block, x, y, needKey)) { - var locked = core.status.lockControl; - core.waitHeroToStop(function () { - if (!locked) core.unlockControl(); - if (callback) callback(); - }); - return; - } - if (core.status.replay.speed == 24) { - core.status.replay.animate = true; - core.removeBlock(x, y); - setTimeout(function () { - core.status.replay.animate = false; - core.events.afterOpenDoor(block.event.id, x, y); - if (callback) callback(); - }, 1); // +1是为了录像检测系统 - } else { - this._openDoor_animate(block, x, y, callback); - } -} - -events.prototype._openDoor_check = function (block, x, y, needKey) { - var clearAndReturn = function () { - core.clearContinueAutomaticRoute(); - return false; - } - - if (block == null || block.event == null) return clearAndReturn(); - var id = block.event.id; - - // 是否存在门或暗墙 - if (core.material.icons.animates[id] == null && core.material.icons.npc48[id] == null) { - return clearAndReturn(); - } - - if (id == 'steelDoor' && core.flags.steelDoorWithoutKey) - needKey = false; - var doorInfo = block.event.doorInfo; - if (doorInfo == null) return clearAndReturn(); - // Check all keys - var keyInfo = doorInfo.keys || {}; - if (needKey) { - for (var keyName in keyInfo) { - var keyValue = keyInfo[keyName]; - if (keyName.endsWith(':o')) keyName = keyName.substring(0, keyName.length - 2); - - // --- 如果是一个不存在的道具,则直接认为无法开启 - if (!core.material.items[keyName]) { - core.stopSound(); - core.playSound('操作失败'); - core.drawTip("无法开启此门"); - return clearAndReturn(); - } - if (core.itemCount(keyName) < keyValue) { - core.stopSound(); - core.playSound('操作失败'); - core.drawTip("你的" + ((core.material.items[keyName] || {}).name || "钥匙") + "不足!", null, true); - return false; - } - } - if (!core.status.event.id) core.autosave(true); - for (var keyName in keyInfo) { - if (!keyName.endsWith(':o')) core.removeItem(keyName, keyInfo[keyName]); - } - } - core.playSound(doorInfo.openSound); - return true; -} - -events.prototype._openDoor_animate = function (block, x, y, callback) { - var blockInfo = core.getBlockInfo(block); - blockInfo.opacity = block.opacity; - blockInfo.filter = block.filter; - - var speed = (block.event.doorInfo.time || 160) / 4; - + var block = core.getBlock(x, y); + core.saveAndStopAutomaticRoute(); + if (!this._openDoor_check(block, x, y, needKey)) { var locked = core.status.lockControl; - core.lockControl(); + core.waitHeroToStop(function () { + if (!locked) core.unlockControl(); + if (callback) callback(); + }); + return; + } + if (core.status.replay.speed == 24) { core.status.replay.animate = true; core.removeBlock(x, y); + setTimeout(function () { + core.status.replay.animate = false; + core.events.afterOpenDoor(block.event.id, x, y); + if (callback) callback(); + }, 1); // +1是为了录像检测系统 + } else { + this._openDoor_animate(block, x, y, callback); + } +}; - blockInfo.posX = 0; - core.maps._drawBlockInfo(blockInfo, x, y); +events.prototype._openDoor_check = function (block, x, y, needKey) { + var clearAndReturn = function () { + core.clearContinueAutomaticRoute(); + return false; + }; - var cb = function () { - core.maps._removeBlockFromMap(core.status.floorId, block); - if (!locked) core.unlockControl(); - core.status.replay.animate = false; - core.events.afterOpenDoor(block.event.id, x, y); - if (callback) callback(); + if (block == null || block.event == null) return clearAndReturn(); + var id = block.event.id; + + // 是否存在门或暗墙 + if ( + core.material.icons.animates[id] == null && + core.material.icons.npc48[id] == null + ) { + return clearAndReturn(); + } + + if (id == "steelDoor" && core.flags.steelDoorWithoutKey) needKey = false; + var doorInfo = block.event.doorInfo; + if (doorInfo == null) return clearAndReturn(); + // Check all keys + var keyInfo = doorInfo.keys || {}; + if (needKey) { + for (var keyName in keyInfo) { + var keyValue = keyInfo[keyName]; + if (keyName.endsWith(":o")) + keyName = keyName.substring(0, keyName.length - 2); + + // --- 如果是一个不存在的道具,则直接认为无法开启 + if (!core.material.items[keyName]) { + core.stopSound(); + core.playSound("操作失败"); + core.drawTip("无法开启此门"); + return clearAndReturn(); + } + if (core.itemCount(keyName) < keyValue) { + core.stopSound(); + core.playSound("操作失败"); + core.drawTip( + "你的" + + ((core.material.items[keyName] || {}).name || "钥匙") + + "不足!", + null, + true + ); + return false; + } } + if (!core.status.event.id) core.autosave(true); + for (var keyName in keyInfo) { + if (!keyName.endsWith(":o")) core.removeItem(keyName, keyInfo[keyName]); + } + } + core.playSound(doorInfo.openSound); + return true; +}; - var animate = window.setInterval(function () { - blockInfo.posX++; - if (blockInfo.posX == 4) { - clearInterval(animate); - delete core.animateFrame.asyncId[animate]; - cb(); - return; - } - core.maps._drawBlockInfo(blockInfo, x, y); - }, core.status.replay.speed == 24 ? 1 : speed / Math.max(core.status.replay.speed, 1)); +events.prototype._openDoor_animate = function (block, x, y, callback) { + var blockInfo = core.getBlockInfo(block); + blockInfo.opacity = block.opacity; + blockInfo.filter = block.filter; - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; -} + var speed = (block.event.doorInfo.time || 160) / 4; + + var locked = core.status.lockControl; + core.lockControl(); + core.status.replay.animate = true; + core.removeBlock(x, y); + + blockInfo.posX = 0; + core.maps._drawBlockInfo(blockInfo, x, y); + + var cb = function () { + core.maps._removeBlockFromMap(core.status.floorId, block); + if (!locked) core.unlockControl(); + core.status.replay.animate = false; + core.events.afterOpenDoor(block.event.id, x, y); + if (callback) callback(); + }; + + var animate = window.setInterval( + function () { + blockInfo.posX++; + if (blockInfo.posX == 4) { + clearInterval(animate); + delete core.animateFrame.asyncId[animate]; + cb(); + return; + } + core.maps._drawBlockInfo(blockInfo, x, y); + }, + core.status.replay.speed == 24 + ? 1 + : speed / Math.max(core.status.replay.speed, 1) + ); + + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; +}; ////// 开一个门后触发的事件 ////// events.prototype.afterOpenDoor = function (doorId, x, y) { - return this.eventdata.afterOpenDoor(doorId, x, y); -} + return this.eventdata.afterOpenDoor(doorId, x, y); +}; events.prototype._sys_getItem = function (data, callback) { - this.getItem(data.event.id, 1, data.x, data.y, false, callback); -} + this.getItem(data.event.id, 1, data.x, data.y, false, callback); +}; ////// 获得某个物品 ////// events.prototype.getItem = function (id, num, x, y, isGentleClick, callback) { - if (num == null) num = 1; - var itemCls = core.material.items[id].cls; - core.removeBlock(x, y); - core.items.getItemEffect(id, num); - var text = '获得 ' + core.material.items[id].name; - if (num > 1) text += "x" + num; - if (itemCls === 'items' && num == 1) text += core.items.getItemEffectTip(id); - core.drawTip(text, id); + if (num == null) num = 1; + var itemCls = core.material.items[id].cls; + core.removeBlock(x, y); + core.items.getItemEffect(id, num); + var text = "获得 " + core.material.items[id].name; + if (num > 1) text += "x" + num; + if (itemCls === "items" && num == 1) text += core.items.getItemEffectTip(id); + core.drawTip(text, id); - // --- 首次获得道具的提示 - if (!core.hasFlag("__itemHint__")) core.setFlag("__itemHint__", []); - var itemHint = core.getFlag("__itemHint__"); - if (core.flags.itemFirstText && itemHint.indexOf(id) < 0 && itemCls != 'items') { - var hint = core.material.items[id].text || "该道具暂无描述"; - try { - hint = core.replaceText(hint); - } catch (e) { } - if (!core.status.event.id || core.status.event.id == 'action') { - core.insertAction("\t[" + core.material.items[id].name + "," + id + "]" + hint + "\n" - + (id.endsWith('Key') ? "(钥匙类道具,遇到对应的门时自动打开)" - : itemCls == 'tools' ? "(消耗类道具,请按T在道具栏使用)" - : itemCls == 'constants' ? "(永久类道具,请按T在道具栏使用)" - : itemCls == 'equips' ? "(装备类道具,请按Q在装备栏进行装备)" : "")); - } - itemHint.push(id); + // --- 首次获得道具的提示 + if (!core.hasFlag("__itemHint__")) core.setFlag("__itemHint__", []); + var itemHint = core.getFlag("__itemHint__"); + if ( + core.flags.itemFirstText && + itemHint.indexOf(id) < 0 && + itemCls != "items" + ) { + var hint = core.material.items[id].text || "该道具暂无描述"; + try { + hint = core.replaceText(hint); + } catch (e) {} + if (!core.status.event.id || core.status.event.id == "action") { + core.insertAction( + "\t[" + + core.material.items[id].name + + "," + + id + + "]" + + hint + + "\n" + + (id.endsWith("Key") + ? "(钥匙类道具,遇到对应的门时自动打开)" + : itemCls == "tools" + ? "(消耗类道具,请按T在道具栏使用)" + : itemCls == "constants" + ? "(永久类道具,请按T在道具栏使用)" + : itemCls == "equips" + ? "(装备类道具,请按Q在装备栏进行装备)" + : "") + ); } + itemHint.push(id); + } - this.afterGetItem(id, x, y, isGentleClick); - if (callback) callback(); -} + this.afterGetItem(id, x, y, isGentleClick); + if (callback) callback(); +}; events.prototype.afterGetItem = function (id, x, y, isGentleClick) { - this.eventdata.afterGetItem(id, x, y, isGentleClick); -} + this.eventdata.afterGetItem(id, x, y, isGentleClick); +}; ////// 获得面前的物品(轻按) ////// events.prototype.getNextItem = function (noRoute) { - if (core.isMoving() || !core.flags.enableGentleClick) return false; - if (this._canGetNextItem()) return this._getNextItem(null, noRoute); + if (core.isMoving() || !core.flags.enableGentleClick) return false; + if (this._canGetNextItem()) return this._getNextItem(null, noRoute); - var directions = ["up", "down", "left", "right"].filter(function (dir) { - return core.events._canGetNextItem(dir); - }); - return directions.length > 0 ? this._getNextItem(directions[0], noRoute) : false; -} + var directions = ["up", "down", "left", "right"].filter(function (dir) { + return core.events._canGetNextItem(dir); + }); + return directions.length > 0 + ? this._getNextItem(directions[0], noRoute) + : false; +}; events.prototype._canGetNextItem = function (direction) { - direction = direction || core.getHeroLoc('direction'); - if (!core.canMoveHero(null, null, direction)) return; - var nx = core.getHeroLoc('x') + core.utils.scan[direction].x; - var ny = core.getHeroLoc('y') + core.utils.scan[direction].y; - var block = core.getBlock(nx, ny); - return block != null && !block.event.script && !block.event.event && block.event.trigger == 'getItem'; -} + direction = direction || core.getHeroLoc("direction"); + if (!core.canMoveHero(null, null, direction)) return; + var nx = core.getHeroLoc("x") + core.utils.scan[direction].x; + var ny = core.getHeroLoc("y") + core.utils.scan[direction].y; + var block = core.getBlock(nx, ny); + return ( + block != null && + !block.event.script && + !block.event.event && + block.event.trigger == "getItem" + ); +}; events.prototype._getNextItem = function (direction, noRoute) { - direction = direction || core.getHeroLoc('direction'); - var nx = core.getHeroLoc('x') + core.utils.scan[direction].x; - var ny = core.getHeroLoc('y') + core.utils.scan[direction].y; - if (!noRoute) core.status.route.push("getNext"); - this.getItem(core.getBlockId(nx, ny), 1, nx, ny, true); - return true; -} + direction = direction || core.getHeroLoc("direction"); + var nx = core.getHeroLoc("x") + core.utils.scan[direction].x; + var ny = core.getHeroLoc("y") + core.utils.scan[direction].y; + if (!noRoute) core.status.route.push("getNext"); + this.getItem(core.getBlockId(nx, ny), 1, nx, ny, true); + return true; +}; events.prototype._sys_changeFloor = function (data, callback) { - data = data.event.data; - var heroLoc = {}; - if (data.loc) heroLoc = { 'x': data.loc[0], 'y': data.loc[1] }; - if (data.direction) heroLoc.direction = data.direction; - if (core.status.event.id != 'action') core.status.event.id = null; - core.changeFloor(data.floorId, data.stair, heroLoc, data.time, function () { - core.replay(); - if (callback) callback(); - }); -} + data = data.event.data; + var heroLoc = {}; + if (data.loc) heroLoc = { x: data.loc[0], y: data.loc[1] }; + if (data.direction) heroLoc.direction = data.direction; + if (core.status.event.id != "action") core.status.event.id = null; + core.changeFloor(data.floorId, data.stair, heroLoc, data.time, function () { + core.replay(); + if (callback) callback(); + }); +}; ////// 楼层切换 ////// -events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) { - var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time); - if (info == null) { - if (callback) callback(); - return; - } - floorId = info.floorId; - info.locked = core.status.lockControl; +events.prototype.changeFloor = function ( + floorId, + stair, + heroLoc, + time, + callback +) { + var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time); + if (info == null) { + if (callback) callback(); + return; + } + floorId = info.floorId; + info.locked = core.status.lockControl; - core.dom.floorNameLabel.innerText = core.status.maps[floorId].title; - core.lockControl(); - core.stopAutomaticRoute(); - core.clearContinueAutomaticRoute(); - core.status.replay.animate = true; - clearInterval(core.interval.onDownInterval); - core.interval.onDownInterval = 'tmp'; + core.dom.floorNameLabel.innerText = core.status.maps[floorId].title; + core.lockControl(); + core.stopAutomaticRoute(); + core.clearContinueAutomaticRoute(); + core.status.replay.animate = true; + clearInterval(core.interval.onDownInterval); + core.interval.onDownInterval = "tmp"; - this._changeFloor_beforeChange(info, callback); -} + this._changeFloor_beforeChange(info, callback); +}; -events.prototype._changeFloor_getInfo = function (floorId, stair, heroLoc, time) { - floorId = floorId || core.status.floorId; - if (floorId == ':before') { - var index = core.floorIds.indexOf(core.status.floorId); - if (index > 0) floorId = core.floorIds[index - 1]; - else floorId = core.status.floorId; - } - else if (floorId == ':next') { - var index = core.floorIds.indexOf(core.status.floorId); - if (index < core.floorIds.length - 1) floorId = core.floorIds[index + 1]; - else floorId = core.status.floorId; - } else if (floorId == ':now') { - floorId = core.status.floorId; - } - if (!core.status.maps[floorId]) { - console.error("不存在的楼层:" + floorId); - return null; - } +events.prototype._changeFloor_getInfo = function ( + floorId, + stair, + heroLoc, + time +) { + floorId = floorId || core.status.floorId; + if (floorId == ":before") { + var index = core.floorIds.indexOf(core.status.floorId); + if (index > 0) floorId = core.floorIds[index - 1]; + else floorId = core.status.floorId; + } else if (floorId == ":next") { + var index = core.floorIds.indexOf(core.status.floorId); + if (index < core.floorIds.length - 1) floorId = core.floorIds[index + 1]; + else floorId = core.status.floorId; + } else if (floorId == ":now") { + floorId = core.status.floorId; + } + if (!core.status.maps[floorId]) { + console.error("不存在的楼层:" + floorId); + return null; + } - if (main.mode != 'play' || core.isReplaying()) time = 0; - if (time == null) time = core.values.floorChangeTime; - time /= 20; + if (main.mode != "play" || core.isReplaying()) time = 0; + if (time == null) time = core.values.floorChangeTime; + time /= 20; - return { - floorId: floorId, - time: time, - heroLoc: core.clone(this._changeFloor_getHeroLoc(floorId, stair, heroLoc)) - }; -} + return { + floorId: floorId, + time: time, + heroLoc: core.clone(this._changeFloor_getHeroLoc(floorId, stair, heroLoc)), + }; +}; events.prototype._changeFloor_getHeroLoc = function (floorId, stair, heroLoc) { - if (!heroLoc) - heroLoc = core.clone(core.status.hero.loc); - if (stair) { - // --- 对称 - if (stair == ':now') - heroLoc = core.clone(core.status.hero.loc); - else if (stair == ':symmetry') { - heroLoc.x = core.bigmap.width - 1 - core.getHeroLoc('x'); - heroLoc.y = core.bigmap.height - 1 - core.getHeroLoc('y'); - } - else if (stair == ':symmetry_x') - heroLoc.x = core.bigmap.width - 1 - core.getHeroLoc('x'); - else if (stair == ':symmetry_y') - heroLoc.y = core.bigmap.height - 1 - core.getHeroLoc('y'); - // 检查该层地图的 upFloor & downFloor & flyPoint - else if (core.status.maps[floorId][stair]) { - heroLoc.x = core.status.maps[floorId][stair][0]; - heroLoc.y = core.status.maps[floorId][stair][1]; - } - else { - core.extractBlocks(floorId); - var blocks = core.status.maps[floorId].blocks; - for (var i in blocks) { - if (!blocks[i].disable && blocks[i].event.id === stair) { - heroLoc.x = blocks[i].x; - heroLoc.y = blocks[i].y; - break; - } - } + if (!heroLoc) heroLoc = core.clone(core.status.hero.loc); + if (stair) { + // --- 对称 + if (stair == ":now") heroLoc = core.clone(core.status.hero.loc); + else if (stair == ":symmetry") { + heroLoc.x = core.bigmap.width - 1 - core.getHeroLoc("x"); + heroLoc.y = core.bigmap.height - 1 - core.getHeroLoc("y"); + } else if (stair == ":symmetry_x") + heroLoc.x = core.bigmap.width - 1 - core.getHeroLoc("x"); + else if (stair == ":symmetry_y") + heroLoc.y = core.bigmap.height - 1 - core.getHeroLoc("y"); + // 检查该层地图的 upFloor & downFloor & flyPoint + else if (core.status.maps[floorId][stair]) { + heroLoc.x = core.status.maps[floorId][stair][0]; + heroLoc.y = core.status.maps[floorId][stair][1]; + } else { + core.extractBlocks(floorId); + var blocks = core.status.maps[floorId].blocks; + for (var i in blocks) { + if (!blocks[i].disable && blocks[i].event.id === stair) { + heroLoc.x = blocks[i].x; + heroLoc.y = blocks[i].y; + break; } + } } - ['x', 'y', 'direction'].forEach(function (name) { - if (heroLoc[name] == null) - heroLoc[name] = core.getHeroLoc(name); - }); - return heroLoc; -} + } + ["x", "y", "direction"].forEach(function (name) { + if (heroLoc[name] == null) heroLoc[name] = core.getHeroLoc(name); + }); + return heroLoc; +}; events.prototype._changeFloor_beforeChange = function (info, callback) { - this._changeFloor_playSound(); - // 需要 setTimeout 执行,不然会出错 - window.setTimeout(function () { - if (info.time == 0) - core.events._changeFloor_changing(info, callback); - else - core.showWithAnimate(core.dom.floorMsgGroup, info.time / 2, function () { - core.events._changeFloor_changing(info, callback); - }); - }, 25) -} + this._changeFloor_playSound(); + // 需要 setTimeout 执行,不然会出错 + window.setTimeout(function () { + if (info.time == 0) core.events._changeFloor_changing(info, callback); + else + core.showWithAnimate(core.dom.floorMsgGroup, info.time / 2, function () { + core.events._changeFloor_changing(info, callback); + }); + }, 25); +}; events.prototype._changeFloor_playSound = function () { - // 播放换层音效 - if (core.hasFlag('__fromLoad__')) // 是否是读档造成的切换 - core.playSound('读档'); - else if (core.hasFlag('__isFlying__')) // 是否是楼传造成的切换 - core.playSound('飞行器'); - else - core.playSound('上下楼'); -} + // 播放换层音效 + if (core.hasFlag("__fromLoad__")) + // 是否是读档造成的切换 + core.playSound("读档"); + else if (core.hasFlag("__isFlying__")) + // 是否是楼传造成的切换 + core.playSound("飞行器"); + else core.playSound("上下楼"); +}; events.prototype._changeFloor_changing = function (info, callback) { - this.changingFloor(info.floorId, info.heroLoc); - // 回归视角 - var __lockViewport__ = flags.__lockViewport__; - core.setFlag('__lockViewport__', null); - core.drawHero(); - core.setFlag('__lockViewport__', __lockViewport__); + this.changingFloor(info.floorId, info.heroLoc); + // 回归视角 + var __lockViewport__ = flags.__lockViewport__; + core.setFlag("__lockViewport__", null); + core.drawHero(); + core.setFlag("__lockViewport__", __lockViewport__); - if (info.time == 0) - this._changeFloor_afterChange(info, callback); - else - core.hideWithAnimate(core.dom.floorMsgGroup, info.time / 4, function () { - core.events._changeFloor_afterChange(info, callback); - }); -} + if (info.time == 0) this._changeFloor_afterChange(info, callback); + else + core.hideWithAnimate(core.dom.floorMsgGroup, info.time / 4, function () { + core.events._changeFloor_afterChange(info, callback); + }); +}; events.prototype._changeFloor_afterChange = function (info, callback) { - if (!info.locked) core.unlockControl(); - core.status.replay.animate = false; - core.events.afterChangeFloor(info.floorId); + if (!info.locked) core.unlockControl(); + core.status.replay.animate = false; + core.events.afterChangeFloor(info.floorId); - if (callback) callback(); -} + if (callback) callback(); +}; events.prototype.changingFloor = function (floorId, heroLoc) { - this.eventdata.changingFloor(floorId, heroLoc); -} + this.eventdata.changingFloor(floorId, heroLoc); +}; ////// 转换楼层结束的事件 ////// events.prototype.afterChangeFloor = function (floorId) { - if (main.mode != 'play') return; - return this.eventdata.afterChangeFloor(floorId); -} + if (main.mode != "play") return; + return this.eventdata.afterChangeFloor(floorId); +}; ////// 是否到达过某个楼层 ////// events.prototype.hasVisitedFloor = function (floorId) { - if (!core.hasFlag("__visited__")) core.setFlag("__visited__", {}); - return core.getFlag("__visited__")[floorId] || false; -} + if (!core.hasFlag("__visited__")) core.setFlag("__visited__", {}); + return core.getFlag("__visited__")[floorId] || false; +}; ////// 到达某楼层 ////// events.prototype.visitFloor = function (floorId) { - if (!core.hasFlag("__visited__")) core.setFlag("__visited__", {}); - core.getFlag("__visited__")[floorId] = true; -} + if (!core.hasFlag("__visited__")) core.setFlag("__visited__", {}); + core.getFlag("__visited__")[floorId] = true; +}; events.prototype._sys_pushBox = function (data, callback) { - this.pushBox(data); - if (callback) callback(); -} + this.pushBox(data); + if (callback) callback(); +}; ////// 推箱子 ////// events.prototype.pushBox = function (data) { - if (data.event.id != 'box' && data.event.id != 'boxed') return; + if (data.event.id != "box" && data.event.id != "boxed") return; - // 判断还能否前进,看看是否存在事件 - var direction = core.getHeroLoc('direction'), - nx = data.x + core.utils.scan[direction].x, ny = data.y + core.utils.scan[direction].y; + // 判断还能否前进,看看是否存在事件 + var direction = core.getHeroLoc("direction"), + nx = data.x + core.utils.scan[direction].x, + ny = data.y + core.utils.scan[direction].y; - // 检测能否推上去 - if (!core.canMoveHero()) return; - var canGoDeadZone = core.flags.canGoDeadZone; - core.flags.canGoDeadZone = true; - if (!core.canMoveHero(data.x, data.y, direction)) { - core.flags.canGoDeadZone = canGoDeadZone; - return; - } + // 检测能否推上去 + if (!core.canMoveHero()) return; + var canGoDeadZone = core.flags.canGoDeadZone; + core.flags.canGoDeadZone = true; + if (!core.canMoveHero(data.x, data.y, direction)) { core.flags.canGoDeadZone = canGoDeadZone; + return; + } + core.flags.canGoDeadZone = canGoDeadZone; - var nextId = core.getBlockId(nx, ny); - if (nextId != null && nextId != 'flower') return; + var nextId = core.getBlockId(nx, ny); + if (nextId != null && nextId != "flower") return; - core.setBlock(nextId == null ? 'box' : 'boxed', nx, ny); + core.setBlock(nextId == null ? "box" : "boxed", nx, ny); - if (data.event.id == 'box') - core.removeBlock(data.x, data.y); - else - core.setBlock('flower', data.x, data.y); - // 勇士前进一格,然后触发推箱子后事件 - core.insertAction([ - { "type": "moveAction" }, - { "type": "function", "function": "function() { core.afterPushBox(); }" } - ]); -} + if (data.event.id == "box") core.removeBlock(data.x, data.y); + else core.setBlock("flower", data.x, data.y); + // 勇士前进一格,然后触发推箱子后事件 + core.insertAction([ + { type: "moveAction" }, + { type: "function", function: "function() { core.afterPushBox(); }" }, + ]); +}; ////// 推箱子后的事件 ////// events.prototype.afterPushBox = function () { - return this.eventdata.afterPushBox(); -} + return this.eventdata.afterPushBox(); +}; events.prototype._sys_ski = function (data, callback) { - core.insertAction(["V2.6后,请将滑冰放在背景层!"], data.x, data.y); - if (callback) callback(); -} + core.insertAction(["V2.6后,请将滑冰放在背景层!"], data.x, data.y); + if (callback) callback(); +}; /// 当前是否在冰上 events.prototype.onSki = function (number) { - if (number == null) number = core.getBgNumber(); - var block = core.getBlockByNumber(number); - return block && block.event && block.event.trigger == 'ski'; -} + if (number == null) number = core.getBgNumber(); + var block = core.getBlockByNumber(number); + return block && block.event && block.event.trigger == "ski"; +}; events.prototype._sys_action = function (data, callback) { - var ev = core.clone(data.event.data), ex = data.x, ey = data.y; - // 检查是否需要改变朝向 - if (ex == core.nextX() && ey == core.nextY()) { - var dir = core.turnDirection(":back"); - var id = data.event.id, toId = (data.event.faceIds || {})[dir]; - if (toId && id != toId) { - var number = core.getNumberById(toId); - if (number > 0) - core.setBlock(number, ex, ey); - } + var ev = core.clone(data.event.data), + ex = data.x, + ey = data.y; + // 检查是否需要改变朝向 + if (ex == core.nextX() && ey == core.nextY()) { + var dir = core.turnDirection(":back"); + var id = data.event.id, + toId = (data.event.faceIds || {})[dir]; + if (toId && id != toId) { + var number = core.getNumberById(toId); + if (number > 0) core.setBlock(number, ex, ey); } - this.insertAction(ev, ex, ey, callback); -} + } + this.insertAction(ev, ex, ey, callback); +}; events.prototype._sys_custom = function (data, callback) { - core.insertAction(["请使用\r[yellow]core.registerSystemEvent('custom', func)\r来处理自己添加的系统触发器!"], - data.x, data.y, callback); -} + core.insertAction( + [ + "请使用\r[yellow]core.registerSystemEvent('custom', func)\r来处理自己添加的系统触发器!", + ], + data.x, + data.y, + callback + ); +}; // ------ 自定义事件的处理 ------ // @@ -933,2856 +1044,3552 @@ events.prototype._sys_custom = function (data, callback) { // type为事件名,func为事件的处理函数,可接受(data, x, y, prefix)参数 // data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀 events.prototype.registerEvent = function (type, func) { - this.actions[type] = func; -} + this.actions[type] = func; +}; ////// 注销一个自定义事件 events.prototype.unregisterEvent = function (type) { - delete this.actions[type]; -} + delete this.actions[type]; +}; ////// 执行一个自定义事件 events.prototype.doEvent = function (data, x, y, prefix) { - var type = data.type; - if (this.actions[type]) { - try { - return core.doFunc(this.actions[type], this, data, x, y, prefix); - } - catch (e) { - console.error(e); - console.error("ERROR in actions[" + type + "]"); - } + var type = data.type; + if (this.actions[type]) { + try { + return core.doFunc(this.actions[type], this, data, x, y, prefix); + } catch (e) { + console.error(e); + console.error("ERROR in actions[" + type + "]"); } - if (this["_action_" + type]) return this["_action_" + type](data, x, y, prefix); - core.insertAction("未知的自定义事件: " + type + "!"); - core.doAction(); -} + } + if (this["_action_" + type]) + return this["_action_" + type](data, x, y, prefix); + core.insertAction("未知的自定义事件: " + type + "!"); + core.doAction(); +}; events.prototype.setEvents = function (list, x, y, callback) { - var data = core.status.event.data || {}; - if (list) { - var l = core.clone(list); - if (!(l instanceof Array)) l = [l]; - l.push({ "type": "_label" }); - data.list = [{ todo: l, total: core.clone(l), condition: "false" }]; - // 结束所有正在执行的自动事件 - if (list.length == 0) { - core.status.autoEvents.forEach(function (autoEvent) { - core.autoEventExecuting(autoEvent.symbol, false); - }); - } + var data = core.status.event.data || {}; + if (list) { + var l = core.clone(list); + if (!(l instanceof Array)) l = [l]; + l.push({ type: "_label" }); + data.list = [{ todo: l, total: core.clone(l), condition: "false" }]; + // 结束所有正在执行的自动事件 + if (list.length == 0) { + core.status.autoEvents.forEach(function (autoEvent) { + core.autoEventExecuting(autoEvent.symbol, false); + }); } - if (x != null) data.x = x; - if (y != null) data.y = y; - if (callback) data.callback = callback; - if (!data.appendingEvents) data.appendingEvents = []; - if (!data.locStack) data.locStack = []; - core.status.event.id = 'action'; - core.status.event.data = data; -} + } + if (x != null) data.x = x; + if (y != null) data.y = y; + if (callback) data.callback = callback; + if (!data.appendingEvents) data.appendingEvents = []; + if (!data.locStack) data.locStack = []; + core.status.event.id = "action"; + core.status.event.data = data; +}; ////// 开始执行一系列自定义事件 ////// events.prototype.startEvents = function (list, x, y, callback) { - if (!list) return; - if (!(list instanceof Array)) { - list = [list]; - } - this.setEvents(list, x, y, callback); - // 停止勇士 - core.waitHeroToStop(function () { - core.lockControl(); - core.doAction(); - }); -} + if (!list) return; + if (!(list instanceof Array)) { + list = [list]; + } + this.setEvents(list, x, y, callback); + // 停止勇士 + core.waitHeroToStop(function () { + core.lockControl(); + core.doAction(); + }); +}; ////// 执行当前自定义事件列表中的下一个事件 ////// events.prototype.doAction = function () { - // 清空boxAnimate和UI层 - clearInterval(core.status.event.interval); - clearTimeout(core.status.event.interval); - clearInterval(core.status.event.animateUI); - core.status.event.interval = null; - delete core.status.event.aniamteUI; - if (core.status.gameOver || core.status.replay.failed) return; - // 判定是否执行完毕 - if (this._doAction_finishEvents()) return; - core.clearUI(); - var floorId = core.status.event.data.floorId || core.status.floorId; - // 当前点坐标和前缀 - var x = core.status.event.data.x, y = core.status.event.data.y; - var prefix = [floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join("@"); - var current = core.status.event.data.list[0]; - if (this._popEvents(current, prefix)) return; - // 当前要执行的事件 - var data = current.todo.shift(); - core.status.event.data.current = data; - if (typeof data == "string") - data = { "type": "text", "text": data }; - // 该事件块已经被禁用 - if (data._disabled) return core.doAction(); - data.floorId = data.floorId || floorId; - core.status.event.data.type = data.type; - this.doEvent(data, x, y, prefix); - return; -} + // 清空boxAnimate和UI层 + clearInterval(core.status.event.interval); + clearTimeout(core.status.event.interval); + clearInterval(core.status.event.animateUI); + core.status.event.interval = null; + delete core.status.event.aniamteUI; + if (core.status.gameOver || core.status.replay.failed) return; + // 判定是否执行完毕 + if (this._doAction_finishEvents()) return; + core.clearUI(); + var floorId = core.status.event.data.floorId || core.status.floorId; + // 当前点坐标和前缀 + var x = core.status.event.data.x, + y = core.status.event.data.y; + var prefix = [floorId || ":f", x != null ? x : "x", y != null ? y : "y"].join( + "@" + ); + var current = core.status.event.data.list[0]; + if (this._popEvents(current, prefix)) return; + // 当前要执行的事件 + var data = current.todo.shift(); + core.status.event.data.current = data; + if (typeof data == "string") data = { type: "text", text: data }; + // 该事件块已经被禁用 + if (data._disabled) return core.doAction(); + data.floorId = data.floorId || floorId; + core.status.event.data.type = data.type; + this.doEvent(data, x, y, prefix); + return; +}; events.prototype._doAction_finishEvents = function () { - if (core.status.event.id != 'action') return true; - // 事件处理完毕 - if (core.status.event.data.list.length == 0) { - // 检测并执行延迟自动事件 - if (core.status.event.data.appendingEvents.length > 0) { - this.setEvents(core.status.event.data.appendingEvents.shift()); - return false; - } - var callback = core.status.event.data.callback; - core.ui.closePanel(); - if (callback) callback(); - core.replay(); - return true; + if (core.status.event.id != "action") return true; + // 事件处理完毕 + if (core.status.event.data.list.length == 0) { + // 检测并执行延迟自动事件 + if (core.status.event.data.appendingEvents.length > 0) { + this.setEvents(core.status.event.data.appendingEvents.shift()); + return false; } - return false; -} + var callback = core.status.event.data.callback; + core.ui.closePanel(); + if (callback) callback(); + core.replay(); + return true; + } + return false; +}; events.prototype._popEvents = function (current, prefix) { - if (current.todo.length == 0) { // current list is empty - if (core.calValue(current.condition, prefix)) { // check condition - current.todo = core.clone(current.total); - } - else { - core.status.event.data.list.shift(); // remove stack - } - core.doAction(); - return true; + if (current.todo.length == 0) { + // current list is empty + if (core.calValue(current.condition, prefix)) { + // check condition + current.todo = core.clone(current.total); + } else { + core.status.event.data.list.shift(); // remove stack } - return false; -} + core.doAction(); + return true; + } + return false; +}; ////// 往当前事件列表之前或之后添加一个或多个事件 ////// events.prototype.insertAction = function (action, x, y, callback, addToLast) { - if (core.hasFlag("__statistics__")) return; - if (core.status.gameOver) return; - if (!action) return; - core.clearRouteFolding(); + if (core.hasFlag("__statistics__")) return; + if (core.status.gameOver) return; + if (!action) return; + core.clearRouteFolding(); - action = this.precompile(action); + action = this.precompile(action); - if (core.status.event.id != 'action') { - this.startEvents(action, x, y, callback); - } - else { - if (addToLast) { - var list = core.status.event.data.list[0].todo; - var index = 0; - for (var index = 0; index < list.length; index++) { - if (list[index].type == '_label') { - list.splice(index, 0, action); - break; - } - } + if (core.status.event.id != "action") { + this.startEvents(action, x, y, callback); + } else { + if (addToLast) { + var list = core.status.event.data.list[0].todo; + var index = 0; + for (var index = 0; index < list.length; index++) { + if (list[index].type == "_label") { + list.splice(index, 0, action); + break; } - else core.unshift(core.status.event.data.list[0].todo, action); - this.setEvents(null, x, y, callback); - } -} + } + } else core.unshift(core.status.event.data.list[0].todo, action); + this.setEvents(null, x, y, callback); + } +}; ////// 往当前事件列表之前或之后添加一个公共事件 ////// -events.prototype.insertCommonEvent = function (name, args, x, y, callback, addToLast) { - var commonEvent = this.getCommonEvent(name); - if (!commonEvent) { - if (callback) callback(); - return; - } +events.prototype.insertCommonEvent = function ( + name, + args, + x, + y, + callback, + addToLast +) { + var commonEvent = this.getCommonEvent(name); + if (!commonEvent) { + if (callback) callback(); + return; + } - // 设置参数 - core.setFlag('arg0', name); - if (args instanceof Array) { - for (var i = 0; i < args.length; ++i) { - try { - if (args[i] != null) - core.setFlag('arg' + (i + 1), args[i]); - } catch (ee) { console.error(ee) } - } + // 设置参数 + core.setFlag("arg0", name); + if (args instanceof Array) { + for (var i = 0; i < args.length; ++i) { + try { + if (args[i] != null) core.setFlag("arg" + (i + 1), args[i]); + } catch (ee) { + console.error(ee); + } } + } - this.insertAction({ "type": "dowhile", "condition": "false", "data": commonEvent }, x, y, callback, addToLast); -} + this.insertAction( + { type: "dowhile", condition: "false", data: commonEvent }, + x, + y, + callback, + addToLast + ); +}; ////// 获得一个公共事件 ////// events.prototype.getCommonEvent = function (name) { - if (!name || typeof name !== 'string') return null; - return this.commonEvent[name] || null; -} + if (!name || typeof name !== "string") return null; + return this.commonEvent[name] || null; +}; ////// 恢复一个事件 ////// events.prototype.recoverEvents = function (data) { - if (data) { - core.ui.closePanel(); - core.lockControl(); - core.status.event.id = 'action'; - core.status.event.data = data; - setTimeout(function () { - core.doAction(); - }, 30); - return true; - } - return false; -} + if (data) { + core.ui.closePanel(); + core.lockControl(); + core.status.event.id = "action"; + core.status.event.data = data; + setTimeout(function () { + core.doAction(); + }, 30); + return true; + } + return false; +}; ////// 检测自动事件 ////// events.prototype.checkAutoEvents = function () { - // 只有在无操作或事件流中才能执行自动事件! - if (!core.isPlaying() || (core.status.lockControl && core.status.event.id != 'action')) return; - if (core.hasFlag('__doNotCheckAutoEvents__')) return; - var todo = [], delay = []; - core.status.autoEvents.forEach(function (autoEvent) { - var symbol = autoEvent.symbol, x = autoEvent.x, y = autoEvent.y, floorId = autoEvent.floorId; - // 不在当前楼层 or 已经执行过 or 已被分区 or 正在执行中 - if (autoEvent.currentFloor && floorId != core.status.floorId) return; - if (!autoEvent.multiExecute && core.autoEventExecuted(symbol)) return; - if ((flags.__removed__ || []).indexOf(floorId) >= 0) return; - if (core.autoEventExecuting(symbol)) return; - var prefix = floorId + "@" + x + "@" + y; - try { - if (!core.calValue(autoEvent.condition, prefix)) return; - } catch (e) { - return; - } - - core.autoEventExecuting(symbol, true); - core.autoEventExecuted(symbol, true); - - var event; - if (x == null && y == null) { - event = [ - // 用do-while(0)包一层防止break影响事件流 - { "type": "dowhile", "condition": "false", "data": autoEvent.data }, - { - "type": "function", "function": - "function() { core.autoEventExecuting('" + symbol + "', false); }" - } - ]; - } else { - event = [ - { - "type": "function", "function": - "function() { core.pushEventLoc(" + x + ", " + y + ", '" + floorId + "' ); }" - }, - // 用do-while(0)包一层防止break影响事件流 - { "type": "dowhile", "condition": "false", "data": autoEvent.data }, - { - "type": "function", "function": - "function() { core.popEventLoc(); core.autoEventExecuting('" + symbol + "', false); }" - } - ]; - } - - if (autoEvent.delayExecute) - delay.push(event); - else - core.push(todo, event); - }); - - if (todo.length == 0 && delay.length == 0) return; - - if (core.status.event.id == 'action' || todo.length > 0) { - core.insertAction(todo); - core.push(core.status.event.data.appendingEvents, delay); - } else { - core.insertAction(delay[0]); - if (delay.length > 0) { - core.insertAction(delay.slice(1)); - } + // 只有在无操作或事件流中才能执行自动事件! + if ( + !core.isPlaying() || + (core.status.lockControl && core.status.event.id != "action") + ) + return; + if (core.hasFlag("__doNotCheckAutoEvents__")) return; + var todo = [], + delay = []; + core.status.autoEvents.forEach(function (autoEvent) { + var symbol = autoEvent.symbol, + x = autoEvent.x, + y = autoEvent.y, + floorId = autoEvent.floorId; + // 不在当前楼层 or 已经执行过 or 已被分区 or 正在执行中 + if (autoEvent.currentFloor && floorId != core.status.floorId) return; + if (!autoEvent.multiExecute && core.autoEventExecuted(symbol)) return; + if ((flags.__removed__ || []).indexOf(floorId) >= 0) return; + if (core.autoEventExecuting(symbol)) return; + var prefix = floorId + "@" + x + "@" + y; + try { + if (!core.calValue(autoEvent.condition, prefix)) return; + } catch (e) { + return; } -} + core.autoEventExecuting(symbol, true); + core.autoEventExecuted(symbol, true); + + var event; + if (x == null && y == null) { + event = [ + // 用do-while(0)包一层防止break影响事件流 + { type: "dowhile", condition: "false", data: autoEvent.data }, + { + type: "function", + function: + "function() { core.autoEventExecuting('" + symbol + "', false); }", + }, + ]; + } else { + event = [ + { + type: "function", + function: + "function() { core.pushEventLoc(" + + x + + ", " + + y + + ", '" + + floorId + + "' ); }", + }, + // 用do-while(0)包一层防止break影响事件流 + { type: "dowhile", condition: "false", data: autoEvent.data }, + { + type: "function", + function: + "function() { core.popEventLoc(); core.autoEventExecuting('" + + symbol + + "', false); }", + }, + ]; + } + + if (autoEvent.delayExecute) delay.push(event); + else core.push(todo, event); + }); + + if (todo.length == 0 && delay.length == 0) return; + + if (core.status.event.id == "action" || todo.length > 0) { + core.insertAction(todo); + core.push(core.status.event.data.appendingEvents, delay); + } else { + core.insertAction(delay[0]); + if (delay.length > 0) { + core.insertAction(delay.slice(1)); + } + } +}; events.prototype.autoEventExecuting = function (symbol, value) { - var aei = core.getFlag('__aei__', []); - if (value == null) return aei.indexOf(symbol) >= 0; - else { - aei = aei.filter(function (one) { return one != symbol; }); - if (value) aei.push(symbol); - core.setFlag('__aei__', aei); - } -} + var aei = core.getFlag("__aei__", []); + if (value == null) return aei.indexOf(symbol) >= 0; + else { + aei = aei.filter(function (one) { + return one != symbol; + }); + if (value) aei.push(symbol); + core.setFlag("__aei__", aei); + } +}; events.prototype.autoEventExecuted = function (symbol, value) { - var aed = core.getFlag('__aed__', []); - if (value == null) return aed.indexOf(symbol) >= 0; - else { - aed = aed.filter(function (one) { return one != symbol; }); - if (value) aed.push(symbol); - core.setFlag('__aed__', aed); - } -} + var aed = core.getFlag("__aed__", []); + if (value == null) return aed.indexOf(symbol) >= 0; + else { + aed = aed.filter(function (one) { + return one != symbol; + }); + if (value) aed.push(symbol); + core.setFlag("__aed__", aed); + } +}; events.prototype.pushEventLoc = function (x, y, floorId) { - if (core.status.event.id != 'action') return; - core.status.event.data.locStack.push({ - x: core.status.event.data.x, - y: core.status.event.data.y, - floorId: core.status.event.data.floorId - }); - core.status.event.data.x = x; - core.status.event.data.y = y; - core.status.event.data.floorId = floorId; -} + if (core.status.event.id != "action") return; + core.status.event.data.locStack.push({ + x: core.status.event.data.x, + y: core.status.event.data.y, + floorId: core.status.event.data.floorId, + }); + core.status.event.data.x = x; + core.status.event.data.y = y; + core.status.event.data.floorId = floorId; +}; events.prototype.popEventLoc = function () { - if (core.status.event.id != 'action') return; - var loc = core.status.event.data.locStack.shift(); - if (loc) { - core.status.event.data.x = loc.x; - core.status.event.data.y = loc.y; - core.status.event.data.floorId = loc.floorId; - } -} + if (core.status.event.id != "action") return; + var loc = core.status.event.data.locStack.shift(); + if (loc) { + core.status.event.data.x = loc.x; + core.status.event.data.y = loc.y; + core.status.event.data.floorId = loc.floorId; + } +}; events.prototype.precompile = function (data) { - var array = this.__precompile_getArray(); - if (typeof data == 'string') { - return this.__precompile_text(data); - } - if (data instanceof Array) { - for (var i = 0; i < data.length; ++i) { - data[i] = this.precompile(data[i]); - } - return data; - } - if (data && data.type) { - if (this["_precompile_" + data.type]) { - data = this["_precompile_" + data.type](data); - } - if (array.texts.indexOf(data.type) >= 0) { - data.text = this.__precompile_text(data.text); - } - if (array.locs.indexOf(data.type) >= 0) { - data.loc = this.__precompile_array(data.loc); - } - if (array.values.indexOf(data.type) >= 0) { - data.value = core.replaceValue(data.value); - } - if (array.uievents.indexOf(data.type) >= 0) { - data.x = core.replaceValue(data.x); - data.y = core.replaceValue(data.y); - data.width = core.replaceValue(data.width); - data.height = core.replaceValue(data.height); - } - if (data.type in array.others) { - array.others[data.type].forEach(function (field) { - data[field] = core.replaceValue(data[field]); - }) - } + var array = this.__precompile_getArray(); + if (typeof data == "string") { + return this.__precompile_text(data); + } + if (data instanceof Array) { + for (var i = 0; i < data.length; ++i) { + data[i] = this.precompile(data[i]); } return data; -} + } + if (data && data.type) { + if (this["_precompile_" + data.type]) { + data = this["_precompile_" + data.type](data); + } + if (array.texts.indexOf(data.type) >= 0) { + data.text = this.__precompile_text(data.text); + } + if (array.locs.indexOf(data.type) >= 0) { + data.loc = this.__precompile_array(data.loc); + } + if (array.values.indexOf(data.type) >= 0) { + data.value = core.replaceValue(data.value); + } + if (array.uievents.indexOf(data.type) >= 0) { + data.x = core.replaceValue(data.x); + data.y = core.replaceValue(data.y); + data.width = core.replaceValue(data.width); + data.height = core.replaceValue(data.height); + } + if (data.type in array.others) { + array.others[data.type].forEach(function (field) { + data[field] = core.replaceValue(data[field]); + }); + } + } + return data; +}; events.prototype.__precompile_getArray = function () { - var texts = [ - "text", "autoText", "scrollText", "tip", "textImage", "input", "input2", - "choices", "confirm", "fillText", "fillBoldText", "drawTextContent" - ]; - var locs = [ - "show", "hide", "setBlock", "setBlockOpacity", "showFloorImg", "hideFloorImg", "showBgFgMap", - "hideBgFgMap", "setBgFgBlock", "animate", "setViewport", "move", "jumoHero", - "changeFloor", "changePos", "showTextImage", "showGif", "openDoor", - "closeDoor", "battle", "trigger", "insert", "setEnemyOnPoint", "resetEnemyOnPoint" - ]; - var values = [ - "setValue", "setEnemy", "setEnemyOnPoint", "setEquip", "setFloor", "setGlobalValue", - ]; - var uievents = [ - "clearMap", "fillText", "fillBoldText", "fillRect", "strokeRect", "fillEllipse", "strokeEllipse", - "fillArc", "strokeArc", "drawIcon", "drawSelector", "drawBackground", - ]; - var others = { - "fillEllipse": ["a", "b", "angle"], - "strokeEllipse": ["a", "b", "angle"], - "fillRect": ["radius", "angle"], - "strokeRect": ["radius", "angle"], - "fillArc": ["r", "start", "end"], - "strokeArc": ["r", "start", "end"], - "drawLine": ["x1", "y1", "x2", "y2"], - "drawArrow": ["x1", "y1", "x2", "y2"], - "drawImage": ["x", "y", "w", "h", "x1", "y1", "w1", "h1", "angle"], - "drawTextContent": ["left", "top"], - }; - return { - texts: texts, - locs: locs, - values: values, - uievents: uievents, - others: others - }; -} + var texts = [ + "text", + "autoText", + "scrollText", + "tip", + "textImage", + "input", + "input2", + "choices", + "confirm", + "fillText", + "fillBoldText", + "drawTextContent", + ]; + var locs = [ + "show", + "hide", + "setBlock", + "setBlockOpacity", + "showFloorImg", + "hideFloorImg", + "showBgFgMap", + "hideBgFgMap", + "setBgFgBlock", + "animate", + "setViewport", + "move", + "jumoHero", + "changeFloor", + "changePos", + "showTextImage", + "showGif", + "openDoor", + "closeDoor", + "battle", + "trigger", + "insert", + "setEnemyOnPoint", + "resetEnemyOnPoint", + ]; + var values = [ + "setValue", + "setEnemy", + "setEnemyOnPoint", + "setEquip", + "setFloor", + "setGlobalValue", + ]; + var uievents = [ + "clearMap", + "fillText", + "fillBoldText", + "fillRect", + "strokeRect", + "fillEllipse", + "strokeEllipse", + "fillArc", + "strokeArc", + "drawIcon", + "drawSelector", + "drawBackground", + ]; + var others = { + fillEllipse: ["a", "b", "angle"], + strokeEllipse: ["a", "b", "angle"], + fillRect: ["radius", "angle"], + strokeRect: ["radius", "angle"], + fillArc: ["r", "start", "end"], + strokeArc: ["r", "start", "end"], + drawLine: ["x1", "y1", "x2", "y2"], + drawArrow: ["x1", "y1", "x2", "y2"], + drawImage: ["x", "y", "w", "h", "x1", "y1", "w1", "h1", "angle"], + drawTextContent: ["left", "top"], + }; + return { + texts: texts, + locs: locs, + values: values, + uievents: uievents, + others: others, + }; +}; events.prototype.__precompile_text = function (text) { - if (typeof text != 'string') return text; - return text.replace(/\${(.*?)}/g, function (word, value) { - return "${" + core.replaceValue(value) + "}"; - }); -} + if (typeof text != "string") return text; + return text.replace(/\${(.*?)}/g, function (word, value) { + return "${" + core.replaceValue(value) + "}"; + }); +}; events.prototype.__precompile_array = function (value) { - if (typeof value == 'string') { - value = core.replaceValue(value); - return value; - } - if (value instanceof Array) { - for (var i = 0; i < value.length; ++i) { - value[i] = this.__precompile_array(value[i]); - } - } + if (typeof value == "string") { + value = core.replaceValue(value); return value; -} + } + if (value instanceof Array) { + for (var i = 0; i < value.length; ++i) { + value[i] = this.__precompile_array(value[i]); + } + } + return value; +}; // ------ 样板提供的的自定义事件 ------ // events.prototype.__action_checkReplaying = function () { - if (core.isReplaying()) { - core.doAction(); - return true; - } - return false; -} + if (core.isReplaying()) { + core.doAction(); + return true; + } + return false; +}; events.prototype.__action_getLoc = function (loc, x, y, prefix) { - if (loc) { - x = core.calValue(loc[0], prefix); - y = core.calValue(loc[1], prefix); - } - return [x, y]; -} + if (loc) { + x = core.calValue(loc[0], prefix); + y = core.calValue(loc[1], prefix); + } + return [x, y]; +}; events.prototype.__action_getHeroLoc = function (loc, prefix) { - return this.__action_getLoc(loc, core.getHeroLoc('x'), core.getHeroLoc('y'), prefix); -} + return this.__action_getLoc( + loc, + core.getHeroLoc("x"), + core.getHeroLoc("y"), + prefix + ); +}; events.prototype.__action_getLoc2D = function (loc, x, y, prefix) { - if (!(loc && loc[0] instanceof Array)) - loc = [this.__action_getLoc(loc, x, y, prefix)]; - return loc; -} + if (!(loc && loc[0] instanceof Array)) + loc = [this.__action_getLoc(loc, x, y, prefix)]; + return loc; +}; events.prototype.__action_doAsyncFunc = function (isAsync, func) { - var parameters = Array.prototype.slice.call(arguments, 2); - if (isAsync) { - func.apply(this, parameters); - core.doAction(); - } - else { - func.apply(this, parameters.concat(core.doAction)); - } -} + var parameters = Array.prototype.slice.call(arguments, 2); + if (isAsync) { + func.apply(this, parameters); + core.doAction(); + } else { + func.apply(this, parameters.concat(core.doAction)); + } +}; events.prototype._action_text = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - data.text = core.replaceText(data.text, prefix); - var ctx = data.code ? ('__text__' + data.code) : null;; - data.ctx = ctx; - if (core.getContextByName(ctx) && !data.showAll) { - core.ui._animateUI('hide', ctx, function () { - core.ui.drawTextBox(data.text, data); - core.ui._animateUI('show', ctx, function () { - if (data.async) core.doAction(); - }); - }); - return; - } - core.ui.drawTextBox(data.text, data); - if (!data.showAll) { - core.ui._animateUI('show', ctx, function () { - if (data.async) core.doAction(); - }); - } -} + if (this.__action_checkReplaying()) return; + data.text = core.replaceText(data.text, prefix); + var ctx = data.code ? "__text__" + data.code : null; + data.ctx = ctx; + if (core.getContextByName(ctx) && !data.showAll) { + core.ui._animateUI("hide", ctx, function () { + core.ui.drawTextBox(data.text, data); + core.ui._animateUI("show", ctx, function () { + if (data.async) core.doAction(); + }); + }); + return; + } + core.ui.drawTextBox(data.text, data); + if (!data.showAll) { + core.ui._animateUI("show", ctx, function () { + if (data.async) core.doAction(); + }); + } +}; events.prototype._action_moveTextBox = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - this.__action_doAsyncFunc(data.async, core.moveTextBox, - data.code, this.__action_getLoc(data.loc, x, y, prefix), data.relative, data.moveMode, data.time); -} + if (this.__action_checkReplaying()) return; + this.__action_doAsyncFunc( + data.async, + core.moveTextBox, + data.code, + this.__action_getLoc(data.loc, x, y, prefix), + data.relative, + data.moveMode, + data.time + ); +}; events.prototype._action_clearTextBox = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - core.clearTextBox(data.code, core.doAction); -} + if (this.__action_checkReplaying()) return; + core.clearTextBox(data.code, core.doAction); +}; events.prototype._action_autoText = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - data.text = core.replaceText(data.text, prefix); - core.ui.drawTextBox(data.text); - setTimeout(core.doAction, data.time || 3000); -} + if (this.__action_checkReplaying()) return; + data.text = core.replaceText(data.text, prefix); + core.ui.drawTextBox(data.text); + setTimeout(core.doAction, data.time || 3000); +}; events.prototype._action_scrollText = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - data.text = core.replaceText(data.text, prefix); - this.__action_doAsyncFunc(data.async, core.drawScrollText, data.text, data.time || 5000, data.lineHeight || 1.4); -} + if (this.__action_checkReplaying()) return; + data.text = core.replaceText(data.text, prefix); + this.__action_doAsyncFunc( + data.async, + core.drawScrollText, + data.text, + data.time || 5000, + data.lineHeight || 1.4 + ); +}; events.prototype._action_comment = function (data, x, y, prefix) { - core.doAction(); -} + core.doAction(); +}; events.prototype._action__label = function (data, x, y, prefix) { - core.doAction(); -} + core.doAction(); +}; events.prototype._action_setText = function (data, x, y, prefix) { - this.setTextAttribute(data); - core.doAction(); -} + this.setTextAttribute(data); + core.doAction(); +}; events.prototype._action_tip = function (data, x, y, prefix) { - core.drawTip(core.replaceText(data.text, prefix), data.icon); - core.doAction(); -} + core.drawTip(core.replaceText(data.text, prefix), data.icon); + core.doAction(); +}; events.prototype._action_show = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - if (data.time > 0 && data.floorId == core.status.floorId) { - this.__action_doAsyncFunc(data.async, core.animateBlock, data.loc, 'show', data.time); - } - else { - data.loc.forEach(function (t) { - core.showBlock(t[0], t[1], data.floorId); - }); - core.doAction(); - } -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + if (data.time > 0 && data.floorId == core.status.floorId) { + this.__action_doAsyncFunc( + data.async, + core.animateBlock, + data.loc, + "show", + data.time + ); + } else { + data.loc.forEach(function (t) { + core.showBlock(t[0], t[1], data.floorId); + }); + core.doAction(); + } +}; events.prototype._action_hide = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - if (data.time > 0 && data.floorId == core.status.floorId) { - this.__action_doAsyncFunc(data.async, core.animateBlock, data.loc, data.remove ? 'remove' : 'hide', data.time); - } - else { - data.loc.forEach(function (t) { - if (data.remove) core.removeBlock(t[0], t[1], data.floorId); - else core.hideBlock(t[0], t[1], data.floorId); - }); - core.doAction(); - } -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + if (data.time > 0 && data.floorId == core.status.floorId) { + this.__action_doAsyncFunc( + data.async, + core.animateBlock, + data.loc, + data.remove ? "remove" : "hide", + data.time + ); + } else { + data.loc.forEach(function (t) { + if (data.remove) core.removeBlock(t[0], t[1], data.floorId); + else core.hideBlock(t[0], t[1], data.floorId); + }); + core.doAction(); + } +}; events.prototype._action_setBlock = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - data.time = data.time || 0; - data.floorId = data.floorId || core.status.floorId; - if (data.time > 0 && data.floorId == core.status.floorId) { - this.__action_doAsyncFunc(data.async, core.animateSetBlocks, data.number, data.loc, data.floorId, data.time); - } else { - data.loc.forEach(function (loc) { - core.setBlock(data.number, loc[0], loc[1], data.floorId); - }); - core.doAction(); - } -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + data.time = data.time || 0; + data.floorId = data.floorId || core.status.floorId; + if (data.time > 0 && data.floorId == core.status.floorId) { + this.__action_doAsyncFunc( + data.async, + core.animateSetBlocks, + data.number, + data.loc, + data.floorId, + data.time + ); + } else { + data.loc.forEach(function (loc) { + core.setBlock(data.number, loc[0], loc[1], data.floorId); + }); + core.doAction(); + } +}; events.prototype._action_setBlockOpacity = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - if (data.time > 0 && data.floorId == core.status.floorId) { - this.__action_doAsyncFunc(data.async, core.animateBlock, data.loc, data.opacity, data.time); - } - else { - data.loc.forEach(function (t) { - core.setBlockOpacity(data.opacity, t[0], t[1], data.floorId); - }); - core.doAction(); - } -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + if (data.time > 0 && data.floorId == core.status.floorId) { + this.__action_doAsyncFunc( + data.async, + core.animateBlock, + data.loc, + data.opacity, + data.time + ); + } else { + data.loc.forEach(function (t) { + core.setBlockOpacity(data.opacity, t[0], t[1], data.floorId); + }); + core.doAction(); + } +}; events.prototype._action_setBlockFilter = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - data.loc.forEach(function (t) { - core.setBlockFilter(data, t[0], t[1], data.floorId); - }); - core.doAction(); -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + data.loc.forEach(function (t) { + core.setBlockFilter(data, t[0], t[1], data.floorId); + }); + core.doAction(); +}; events.prototype._action_turnBlock = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - data.loc.forEach(function (t) { - core.turnBlock(data.direction, t[0], t[1], data.floorId); - }); - core.doAction(); -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + data.loc.forEach(function (t) { + core.turnBlock(data.direction, t[0], t[1], data.floorId); + }); + core.doAction(); +}; events.prototype._action_showFloorImg = function (data, x, y, prefix) { - core.maps.showFloorImage(this.__action_getLoc2D(data.loc, x, y, prefix), data.floorId, core.doAction); -} + core.maps.showFloorImage( + this.__action_getLoc2D(data.loc, x, y, prefix), + data.floorId, + core.doAction + ); +}; events.prototype._action_hideFloorImg = function (data, x, y, prefix) { - core.maps.hideFloorImage(this.__action_getLoc2D(data.loc, x, y, prefix), data.floorId, core.doAction); -} + core.maps.hideFloorImage( + this.__action_getLoc2D(data.loc, x, y, prefix), + data.floorId, + core.doAction + ); +}; events.prototype._action_showBgFgMap = function (data, x, y, prefix) { - core.maps.showBgFgMap(data.name, this.__action_getLoc2D(data.loc, x, y, prefix), data.floorId, core.doAction) -} + core.maps.showBgFgMap( + data.name, + this.__action_getLoc2D(data.loc, x, y, prefix), + data.floorId, + core.doAction + ); +}; events.prototype._action_hideBgFgMap = function (data, x, y, prefix) { - core.maps.hideBgFgMap(data.name, this.__action_getLoc2D(data.loc, x, y, prefix), data.floorId, core.doAction); -} + core.maps.hideBgFgMap( + data.name, + this.__action_getLoc2D(data.loc, x, y, prefix), + data.floorId, + core.doAction + ); +}; events.prototype._action_setBgFgBlock = function (data, x, y, prefix) { - data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); - data.loc.forEach(function (t) { - core.setBgFgBlock(data.name, data.number, t[0], t[1], data.floorId); - }); - core.doAction(); -} + data.loc = this.__action_getLoc2D(data.loc, x, y, prefix); + data.loc.forEach(function (t) { + core.setBgFgBlock(data.name, data.number, t[0], t[1], data.floorId); + }); + core.doAction(); +}; events.prototype._action_follow = function (data, x, y, prefix) { - this.follow(data.name); - core.doAction(); -} + this.follow(data.name); + core.doAction(); +}; events.prototype._action_unfollow = function (data, x, y, prefix) { - this.unfollow(data.name); - core.doAction(); -} + this.unfollow(data.name); + core.doAction(); +}; events.prototype._action_animate = function (data, x, y, prefix) { - if (data.loc == 'hero') { - this.__action_doAsyncFunc(data.async, core.drawHeroAnimate, data.name); - } else { - data.loc = this.__action_getLoc(data.loc, x, y, prefix); - this.__action_doAsyncFunc(data.async, core.drawAnimate, data.name, data.loc[0], data.loc[1], data.alignWindow); - } -} + if (data.loc == "hero") { + this.__action_doAsyncFunc(data.async, core.drawHeroAnimate, data.name); + } else { + data.loc = this.__action_getLoc(data.loc, x, y, prefix); + this.__action_doAsyncFunc( + data.async, + core.drawAnimate, + data.name, + data.loc[0], + data.loc[1], + data.alignWindow + ); + } +}; events.prototype._action_stopAnimate = function (data, x, y, prefix) { - core.stopAnimate(null, data.doCallback); - core.doAction(); -} + core.stopAnimate(data.id, data.doCallback); + core.doAction(); +}; events.prototype._action_setViewport = function (data, x, y, prefix) { - if (data.dxy != null) { - data.loc = [core.bigmap.offsetX / 32 + (core.calValue(data.dxy[0], prefix) || 0), core.bigmap.offsetY / 32 + (core.calValue(data.dxy[1], prefix) || 0)]; - } else if (data.loc == null) { - data.loc = [core.getHeroLoc('x') - core._HALF_WIDTH_, core.getHeroLoc('y') - core._HALF_HEIGHT_]; - } else { - data.loc = this.__action_getLoc(data.loc, x, y, prefix); - } - this.__action_doAsyncFunc(data.async, core.moveViewport, data.loc[0], data.loc[1], data.moveMode, data.time); -} + if (data.dxy != null) { + data.loc = [ + core.bigmap.offsetX / 32 + (core.calValue(data.dxy[0], prefix) || 0), + core.bigmap.offsetY / 32 + (core.calValue(data.dxy[1], prefix) || 0), + ]; + } else if (data.loc == null) { + data.loc = [ + core.getHeroLoc("x") - core._HALF_WIDTH_, + core.getHeroLoc("y") - core._HALF_HEIGHT_, + ]; + } else { + data.loc = this.__action_getLoc(data.loc, x, y, prefix); + } + this.__action_doAsyncFunc( + data.async, + core.moveViewport, + data.loc[0], + data.loc[1], + data.moveMode, + data.time + ); +}; events.prototype._action_lockViewport = function (data, x, y, prefix) { - core.setFlag('__lockViewport__', data.lock || null); - core.doAction(); -} + core.setFlag("__lockViewport__", data.lock || null); + core.doAction(); +}; events.prototype._action_move = function (data, x, y, prefix) { - var loc = this.__action_getLoc(data.loc, x, y, prefix); - this.__action_doAsyncFunc(data.async, core.moveBlock, loc[0], loc[1], data.steps, data.time, data.keep); -} + var loc = this.__action_getLoc(data.loc, x, y, prefix); + this.__action_doAsyncFunc( + data.async, + core.moveBlock, + loc[0], + loc[1], + data.steps, + data.time, + data.keep + ); +}; events.prototype._action_moveAction = function (data, x, y, prefix) { - // 检查下一个点是否可通行 - if (core.canMoveHero()) { - var nx = core.nextX(), ny = core.nextY(); - // 检查noPass决定是撞击还是移动 - if (core.noPass(nx, ny)) { - core.insertAction([ - { "type": "trigger", "loc": [nx, ny] } - ]); - } else { - // 先移动一格,然后尝试触发事件 - core.insertAction([ - { "type": "moveHero", "steps": ["forward"] }, - { "type": "function", "function": "function() { core.moveOneStep(core.doAction); }", "async": true }, - { "type": "_label" }, - ]); - } + // 检查下一个点是否可通行 + if (core.canMoveHero()) { + var nx = core.nextX(), + ny = core.nextY(); + // 检查noPass决定是撞击还是移动 + if (core.noPass(nx, ny)) { + core.insertAction([{ type: "trigger", loc: [nx, ny] }]); + } else { + // 先移动一格,然后尝试触发事件 + core.insertAction([ + { type: "moveHero", steps: ["forward"] }, + { + type: "function", + function: "function() { core.moveOneStep(core.doAction); }", + async: true, + }, + { type: "_label" }, + ]); } - core.doAction(); -} + } + core.doAction(); +}; events.prototype._action_moveHero = function (data, x, y, prefix) { - this.__action_doAsyncFunc(data.async, core.eventMoveHero, data.steps, data.time); -} + this.__action_doAsyncFunc( + data.async, + core.eventMoveHero, + data.steps, + data.time + ); +}; events.prototype._action_jump = function (data, x, y, prefix) { - var from = this.__action_getLoc(data.from, x, y, prefix), to; - if (data.dxy) { - to = [from[0] + (core.calValue(data.dxy[0], prefix) || 0), from[1] + (core.calValue(data.dxy[1], prefix) || 0)]; - } else { - to = this.__action_getLoc(data.to, x, y, prefix); - } - this.__action_doAsyncFunc(data.async, core.jumpBlock, from[0], from[1], to[0], to[1], data.time, data.keep); -} + var from = this.__action_getLoc(data.from, x, y, prefix), + to; + if (data.dxy) { + to = [ + from[0] + (core.calValue(data.dxy[0], prefix) || 0), + from[1] + (core.calValue(data.dxy[1], prefix) || 0), + ]; + } else { + to = this.__action_getLoc(data.to, x, y, prefix); + } + this.__action_doAsyncFunc( + data.async, + core.jumpBlock, + from[0], + from[1], + to[0], + to[1], + data.time, + data.keep + ); +}; events.prototype._precompile_jump = function (data) { - data.from = this.__precompile_array(data.from); - data.to = this.__precompile_array(data.to); - data.dxy = this.__precompile_array(data.dxy); - return data; -} + data.from = this.__precompile_array(data.from); + data.to = this.__precompile_array(data.to); + data.dxy = this.__precompile_array(data.dxy); + return data; +}; events.prototype._action_jumpHero = function (data, x, y, prefix) { - var loc; - if (data.dxy) { - loc = [core.getHeroLoc('x') + (core.calValue(data.dxy[0], prefix) || 0), core.getHeroLoc('y') + (core.calValue(data.dxy[1], prefix) || 0)]; - } else { - loc = this.__action_getHeroLoc(data.loc, prefix); - } - this.__action_doAsyncFunc(data.async, core.jumpHero, loc[0], loc[1], data.time); -} + var loc; + if (data.dxy) { + loc = [ + core.getHeroLoc("x") + (core.calValue(data.dxy[0], prefix) || 0), + core.getHeroLoc("y") + (core.calValue(data.dxy[1], prefix) || 0), + ]; + } else { + loc = this.__action_getHeroLoc(data.loc, prefix); + } + this.__action_doAsyncFunc( + data.async, + core.jumpHero, + loc[0], + loc[1], + data.time + ); +}; events.prototype._action_changeFloor = function (data, x, y, prefix) { - var loc = this.__action_getHeroLoc(data.loc, prefix); - var heroLoc = { x: loc[0], y: loc[1], direction: data.direction }; - core.changeFloor(data.floorId, data.stair, heroLoc, data.time, core.doAction); -} + var loc = this.__action_getHeroLoc(data.loc, prefix); + var heroLoc = { x: loc[0], y: loc[1], direction: data.direction }; + core.changeFloor(data.floorId, data.stair, heroLoc, data.time, core.doAction); +}; events.prototype._action_changePos = function (data, x, y, prefix) { - core.clearMap('hero'); - if (!data.loc && data.direction) { - core.setHeroLoc('direction', core.turnDirection(data.direction), true); - core.drawHero(); - return core.doAction(); - } - - var loc = this.__action_getHeroLoc(data.loc, prefix); - core.setHeroLoc('x', loc[0]); - core.setHeroLoc('y', loc[1]); - if (data.direction) core.setHeroLoc('direction', core.turnDirection(data.direction)); + core.clearMap("hero"); + if (!data.loc && data.direction) { + core.setHeroLoc("direction", core.turnDirection(data.direction), true); core.drawHero(); - core.doAction(); -} + return core.doAction(); + } + + var loc = this.__action_getHeroLoc(data.loc, prefix); + core.setHeroLoc("x", loc[0]); + core.setHeroLoc("y", loc[1]); + if (data.direction) + core.setHeroLoc("direction", core.turnDirection(data.direction)); + core.drawHero(); + core.doAction(); +}; events.prototype._action_showImage = function (data, x, y, prefix) { - if (core.isReplaying()) data.time = 0; - this.__action_doAsyncFunc(data.async || data.time == 0, core.showImage, - data.code, data.image + (data.reverse || ''), data.sloc, data.loc, data.opacity, data.time); -} + if (core.isReplaying()) data.time = 0; + this.__action_doAsyncFunc( + data.async || data.time == 0, + core.showImage, + data.code, + data.image + (data.reverse || ""), + data.sloc, + data.loc, + data.opacity, + data.time + ); +}; events.prototype._precompile_showImage = function (data) { - data.sloc = this.__precompile_array(data.sloc); - data.loc = this.__precompile_array(data.loc); - return data; -} + data.sloc = this.__precompile_array(data.sloc); + data.loc = this.__precompile_array(data.loc); + return data; +}; events.prototype._action_showTextImage = function (data, x, y, prefix) { - var loc = this.__action_getLoc(data.loc, 0, 0, prefix); - if (core.isReplaying()) data.time = 0; - data.text = core.replaceText(data.text, prefix); - var __tmpName = (Math.random() + "_" + Math.random()).replace(/\./g, "") + ".png"; - core.material.images.images[__tmpName] = core.ui.textImage(data.text); - this.__action_doAsyncFunc(data.async || data.time == 0, core.showImage, - data.code, __tmpName + (data.reverse || ""), null, loc, data.opacity, data.time); - delete core.material.images.images[__tmpName]; -} + var loc = this.__action_getLoc(data.loc, 0, 0, prefix); + if (core.isReplaying()) data.time = 0; + data.text = core.replaceText(data.text, prefix); + var __tmpName = + (Math.random() + "_" + Math.random()).replace(/\./g, "") + ".png"; + core.material.images.images[__tmpName] = core.ui.textImage(data.text); + this.__action_doAsyncFunc( + data.async || data.time == 0, + core.showImage, + data.code, + __tmpName + (data.reverse || ""), + null, + loc, + data.opacity, + data.time + ); + delete core.material.images.images[__tmpName]; +}; events.prototype._action_hideImage = function (data, x, y, prefix) { - if (core.isReplaying()) data.time = 0; - this.__action_doAsyncFunc(data.async || data.time == 0, core.hideImage, data.code, data.time); -} + if (core.isReplaying()) data.time = 0; + this.__action_doAsyncFunc( + data.async || data.time == 0, + core.hideImage, + data.code, + data.time + ); +}; events.prototype._action_showGif = function (data, x, y, prefix) { - var loc = this.__action_getLoc(data.loc, 0, 0, prefix); - this.showGif(data.name, loc[0], loc[1]); - core.doAction(); -} + var loc = this.__action_getLoc(data.loc, 0, 0, prefix); + this.showGif(data.name, loc[0], loc[1]); + core.doAction(); +}; events.prototype._action_moveImage = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - this.__action_doAsyncFunc(data.async, core.moveImage, data.code, data.to, data.opacity, data.moveMode, data.time); -} + if (this.__action_checkReplaying()) return; + this.__action_doAsyncFunc( + data.async, + core.moveImage, + data.code, + data.to, + data.opacity, + data.moveMode, + data.time + ); +}; events.prototype._precompile_moveImage = function (data) { - data.to = this.__precompile_array(data.to); - return data; -} + data.to = this.__precompile_array(data.to); + return data; +}; events.prototype._action_rotateImage = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - this.__action_doAsyncFunc(data.async, core.rotateImage, data.code, data.center, data.angle, data.moveMode, data.time); -} + if (this.__action_checkReplaying()) return; + this.__action_doAsyncFunc( + data.async, + core.rotateImage, + data.code, + data.center, + data.angle, + data.moveMode, + data.time + ); +}; events.prototype._precompile_rotateImage = function (data) { - data.center = this.__precompile_array(data.center); - return data; -} + data.center = this.__precompile_array(data.center); + return data; +}; events.prototype._action_scaleImage = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; - this.__action_doAsyncFunc(data.async, core.scaleImage, data.code, data.center, data.scale, data.moveMode, data.time); -} + if (this.__action_checkReplaying()) return; + this.__action_doAsyncFunc( + data.async, + core.scaleImage, + data.code, + data.center, + data.scale, + data.moveMode, + data.time + ); +}; events.prototype._precompile_scaleImage = function (data) { - data.center = this.__precompile_array(data.center); - return data; -} + data.center = this.__precompile_array(data.center); + return data; +}; events.prototype._action_setCurtain = function (data, x, y, prefix) { - if (data.async) { - core.setCurtain(data.color || core.status.thisMap.color, data.time, data.moveMode); - if (data.color == null || data.keep) core.setFlag('__color__', data.color || null); + if (data.async) { + core.setCurtain( + data.color || core.status.thisMap.color, + data.time, + data.moveMode + ); + if (data.color == null || data.keep) + core.setFlag("__color__", data.color || null); + core.doAction(); + } else { + core.setCurtain( + data.color || core.status.thisMap.color, + data.time, + data.moveMode, + function () { + if (data.color == null || data.keep) + core.setFlag("__color__", data.color || null); core.doAction(); - } - else { - core.setCurtain(data.color || core.status.thisMap.color, data.time, data.moveMode, function () { - if (data.color == null || data.keep) core.setFlag('__color__', data.color || null); - core.doAction(); - }); - } -} + } + ); + } +}; events.prototype._action_screenFlash = function (data, x, y, prefix) { - this.__action_doAsyncFunc(data.async, core.screenFlash, data.color, data.time, data.times, data.moveMode); -} + this.__action_doAsyncFunc( + data.async, + core.screenFlash, + data.color, + data.time, + data.times, + data.moveMode + ); +}; events.prototype._action_setWeather = function (data, x, y, prefix) { - core.setWeather(data.name, data.level); - if (data.keep && ['rain', 'snow', 'sun', 'fog', 'cloud'].indexOf(data.name) >= 0) - core.setFlag('__weather__', [data.name, data.level]); - else core.removeFlag('__weather__'); - core.doAction(); -} + core.setWeather(data.name, data.level); + if ( + data.keep && + ["rain", "snow", "sun", "fog", "cloud"].indexOf(data.name) >= 0 + ) + core.setFlag("__weather__", [data.name, data.level]); + else core.removeFlag("__weather__"); + core.doAction(); +}; events.prototype._action_openDoor = function (data, x, y, prefix) { - var loc = this.__action_getLoc(data.loc, x, y, prefix); - var floorId = data.floorId; - if (floorId == core.status.floorId) { - this.__action_doAsyncFunc(data.async, core.openDoor, loc[0], loc[1], data.needKey); - } - else { - core.removeBlock(loc[0], loc[1], floorId); - core.doAction(); - } -} + var loc = this.__action_getLoc(data.loc, x, y, prefix); + var floorId = data.floorId; + if (floorId == core.status.floorId) { + this.__action_doAsyncFunc( + data.async, + core.openDoor, + loc[0], + loc[1], + data.needKey + ); + } else { + core.removeBlock(loc[0], loc[1], floorId); + core.doAction(); + } +}; events.prototype._action_closeDoor = function (data, x, y, prefix) { - var loc = this.__action_getLoc(data.loc, x, y, prefix); - this.__action_doAsyncFunc(data.async, core.closeDoor, loc[0], loc[1], data.id); -} + var loc = this.__action_getLoc(data.loc, x, y, prefix); + this.__action_doAsyncFunc( + data.async, + core.closeDoor, + loc[0], + loc[1], + data.id + ); +}; events.prototype._action_useItem = function (data, x, y, prefix) { - // 考虑到可能覆盖楼传事件的问题,这里不对fly进行检查。 - if (data.id != 'book' && core.canUseItem(data.id)) { - core.useItem(data.id, true, core.doAction); - } - else { - core.playSound('操作失败'); - core.drawTip("当前无法使用" + ((core.material.items[data.id] || {}).name || "未知道具")); - core.doAction(); - } -} - -events.prototype._action_loadEquip = function (data, x, y, prefix) { - core.loadEquip(data.id); - core.doAction(); -} - -events.prototype._action_unloadEquip = function (data, x, y, prefix) { - core.unloadEquip(data.pos); - core.doAction(); -} - -events.prototype._action_openShop = function (data, x, y, prefix) { - core.setShopVisited(data.id, true); - if (data.open) core.openShop(data.id, true); - core.doAction(); -} - -events.prototype._action_disableShop = function (data, x, y, prefix) { - core.setShopVisited(data.id, false); - core.doAction(); -} - -events.prototype._action_battle = function (data, x, y, prefix) { - if (data.id) { - this.battle(data.id, null, null, true, core.doAction); - } - else { - if (data.floorId != core.status.floorId) { - core.doAction(); - return; - } - var loc = this.__action_getLoc(data.loc, x, y, prefix); - this.battle(null, loc[0], loc[1], true, core.doAction); - } -} - -events.prototype._action_trigger = function (data, x, y, prefix) { - var loc = this.__action_getLoc(data.loc, x, y, prefix); - this._trigger_inAction(loc[0], loc[1]); -} - -events.prototype._action_insert = function (data, x, y, prefix) { - if (data.name) { // 公共事件 - core.insertCommonEvent(data.name, data.args); - } - else { - // 设置参数 - if (data.args instanceof Array) { - for (var i = 0; i < data.args.length; ++i) { - try { - if (data.args[i] != null) - core.setFlag('arg' + (i + 1), data.args[i]); - } catch (ee) { console.error(ee) } - } - } - var loc = this.__action_getLoc(data.loc, x, y, prefix); - core.setFlag('arg0', loc); - var floorId = data.floorId; - var which = data.which || "events"; - var event = (core.floors[floorId][which] || [])[loc[0] + "," + loc[1]]; - if (event) this.insertAction(event.data || event); - } - core.doAction(); -} - -events.prototype._action_playBgm = function (data, x, y, prefix) { - core.playBgm(data.name, data.startTime || 0); - core.setFlag("__bgm__", data.keep ? data.name : null); - core.doAction(); -} - -events.prototype._action_pauseBgm = function (data, x, y, prefix) { - core.pauseBgm(); - core.doAction(); -} - -events.prototype._action_resumeBgm = function (data, x, y, prefix) { - core.resumeBgm(data.resume); - core.doAction(); -} - -events.prototype._action_loadBgm = function (data, x, y, prefix) { - core.loadBgm(data.name); - core.doAction(); -} - -events.prototype._action_freeBgm = function (data, x, y, prefix) { - core.freeBgm(data.name); - core.doAction(); -} - -events.prototype._action_playSound = function (data, x, y, prefix) { - if (data.stop) core.stopSound(); - if (data.sync) { - core.playSound(data.name, data.pitch, core.doAction); - } else { - core.playSound(data.name, data.pitch); - core.doAction(); - } -} - -events.prototype._action_stopSound = function (data, x, y, prefix) { - core.stopSound(); - core.doAction(); -} - -events.prototype._action_setVolume = function (data, x, y, prefix) { - data.value = core.clamp(parseInt(data.value) / 100, 0, 1); - core.setFlag("__volume__", data.value); - this.__action_doAsyncFunc(data.async, core.setVolume, data.value, data.time || 0); -} - -events.prototype._action_setBgmSpeed = function (data, x, y, prefix) { - core.setBgmSpeed(data.value, data.pitch || false); - core.doAction(); -} - -events.prototype._action_setValue = function (data, x, y, prefix) { - this.setValue(data.name, data.operator, data.value, prefix); - if (!data.norefresh) { - if (core.status.hero.hp <= 0) { - core.status.hero.hp = 0; - core.updateStatusBar(); - core.events.lose(); - } else { - core.updateStatusBar(); - } - } - core.doAction(); -} - -events.prototype._action_addValue = function (data, x, y, prefix) { - data.operator = '+='; - this._action_setValue(data, x, y, prefix); -} - -events.prototype._action_setEnemy = function (data, x, y, prefix) { - this.setEnemy(data.id, data.name, data.value, data.operator, prefix, data.norefresh); - core.doAction(); -} - -events.prototype._action_setEnemyOnPoint = function (data, x, y, prefix) { - var loc = this.__action_getLoc2D(data.loc, x, y, prefix); - loc.forEach(function (one) { - core.setEnemyOnPoint(one[0], one[1], data.floorId, data.name, data.value, data.operator, prefix, data.norefresh); - }); - core.doAction(); -} - -events.prototype._action_resetEnemyOnPoint = function (data, x, y, prefix) { - var loc = this.__action_getLoc2D(data.loc, x, y, prefix); - loc.forEach(function (one) { - core.resetEnemyOnPoint(one[0], one[1], data.floorId, data.norefresh); - }); - core.doAction(); -} - -events.prototype._precompile_moveEnemyOnPoint = function (data) { - data.from = this.__precompile_array(data.from); - data.to = this.__precompile_array(data.to); - data.dxy = this.__precompile_array(data.dxy); - return data; -} - -events.prototype._action_moveEnemyOnPoint = function (data, x, y, prefix) { - var from = this.__action_getLoc(data.from, x, y, prefix), to; - if (data.dxy) { - to = [from[0] + (core.calValue(data.dxy[0], prefix) || 0), from[1] + (core.calValue(data.dxy[1], prefix) || 0)]; - } else { - to = this.__action_getLoc(data.to, x, y, prefix); - } - this.moveEnemyOnPoint(from[0], from[1], to[0], to[1], data.floorId, data.norefresh); - core.doAction(); -} - -events.prototype._action_setEquip = function (data, x, y, prefix) { - core.setEquip(data.id, data.valueType, data.name, data.value, data.operator, prefix); - core.doAction(); -} - -events.prototype._action_setFloor = function (data, x, y, prefix) { - this.setFloorInfo(data.name, data.value, data.floorId, prefix); - core.doAction(); -} - -events.prototype._action_setGlobalAttribute = function (data, x, y, prefix) { - this.setGlobalAttribute(data.name, data.value); - core.doAction(); -} - -events.prototype._action_setGlobalValue = function (data, x, y, prefix) { - core.values[data.name] = data.value; - core.doAction(); -} - -events.prototype._action_setGlobalFlag = function (data, x, y, prefix) { - this.setGlobalFlag(data.name, data.value); - core.doAction(); -} - -events.prototype._action_setNameMap = function (data, x, y, floorId) { - this.setNameMap(data.name, data.value); - core.doAction(); -} - -events.prototype._action_setHeroIcon = function (data, x, y, prefix) { - this.setHeroIcon(data.name, data.noDraw); - core.doAction(); -} - -events.prototype._action_input = function (data, x, y, prefix) { - this.__action_getInput(core.replaceText(data.text, prefix), false, function (value) { - value = parseInt(value) || 0; // 允许负整数 - core.status.route.push("input:" + value); - core.setFlag("input", value); - core.doAction(); - }); -} - -events.prototype._action_input2 = function (data, x, y, prefix) { - this.__action_getInput(core.replaceText(data.text, prefix), true, function (value) { - value = value || ""; - core.status.route.push("input2:" + core.encodeBase64(value)); - core.setFlag("input", value); - core.doAction(); - }); -} - -events.prototype.__action_getInput = function (hint, isText, callback) { - var value, prefix = isText ? "input2:" : "input:"; - if (core.isReplaying()) { - var action = core.status.replay.toReplay.shift(); - try { - if (action.indexOf(prefix) != 0) { - console.warn("警告!当前需要一个 " + prefix + " 项,实际为 " + action); - core.status.replay.toReplay.unshift(action); - return callback(isText ? '' : 0); - } - if (isText) value = core.decodeBase64(action.substring(7)); - else value = parseInt(action.substring(6)); - callback(value); - } - catch (e) { - core.control._replay_error(action); - return; - } - } - else { - core.myprompt(core.replaceText(hint), null, callback); - } -} - -events.prototype._action_if = function (data, x, y, prefix) { - if (core.calValue(data.condition, prefix)) - core.events.insertAction(data["true"]) - else - core.events.insertAction(data["false"]) - core.doAction(); -} - -events.prototype._precompile_if = function (data) { - data.condition = core.replaceValue(data.condition); - data["true"] = this.precompile(data["true"]); - data["false"] = this.precompile(data["false"]); - return data; -} - -events.prototype._action_switch = function (data, x, y, prefix) { - var key = core.calValue(data.condition, prefix) - var list = []; - for (var i = 0; i < data.caseList.length; i++) { - if (data.caseList[i]._disabled) continue; - var condition = data.caseList[i]["case"]; - if (condition == "default" || core.calValue(condition, prefix) === key) { - core.push(list, data.caseList[i].action); - if (!data.caseList[i].nobreak) - break; - } - } - core.insertAction(list); - core.doAction(); -} - -events.prototype._precompile_switch = function (data) { - data.condition = core.replaceValue(data.condition); - for (var i = 0; i < data.caseList.length; i++) { - data.caseList[i]["case"] = core.replaceValue(data.caseList[i]["case"]); - data.caseList[i].action = this.precompile(data.caseList[i].action); - } - return data; -} - -events.prototype._action_choices = function (data, x, y, prefix) { - data.choices = data.choices.filter(function (x) { - if (x._disabled) return false; - if (x.condition == null || x.condition == '') return true; - try { return core.calValue(x.condition, prefix); } catch (e) { return true; } - }) - if (data.choices.length == 0) return this.doAction(); - if (core.isReplaying()) { - var action = core.status.replay.toReplay.shift(); - if (action.indexOf('choices:') == 0 && !(action == 'choices:none' && !data.timeout)) { - var index = action.substring(8); - if (!this.__action_choices_replaying(data, index)) { - core.control._replay_error(action); - return; - } - } else { - // 容错录像 - if (main.replayChecking) { - // 录像验证系统中选最后一项 - if (action != 'choices:none') core.status.replay.toReplay.unshift(action); // 首先归还刚才读出的下一步操作 - core.events.__action_choices_replaying(data, -1); - } else { - // 正常游戏中弹窗选择 - core.myprompt('录像回放出错!当前需要执行选择项但录像中未记录。\n如需修复请输入您要选的项(从0起),点击取消将不会修复。', 0, function (value) { - if (value == null) { - core.control._replay_error(action); - return; - } - if (action != 'choices:none') core.status.replay.toReplay.unshift(action); // 首先归还刚才读出的下一步操作 - core.events.__action_choices_replaying(data, ((parseInt(value) || 0) + data.choices.length) % data.choices.length); - }); - } - } - } else { - if (data.timeout) { - core.status.event.interval = setTimeout(function () { - core.status.route.push("choices:none"); - core.setFlag('timeout', 0); - core.doAction(); - }, data.timeout); - } - core.status.event.timeout = new Date().getTime() + (data.timeout || 0); - } - for (var i = 0; i < data.choices.length; i++) { - if (typeof data.choices[i] === 'string') - data.choices[i] = { "text": data.choices[i] }; - data.choices[i].text = core.replaceText(data.choices[i].text, prefix); - } - core.ui.drawChoices(core.replaceText(data.text, prefix), data.choices, data.width); -} - -events.prototype.__action_choices_replaying = function (data, index) { - var selection = index; - if (index != 'none') { - selection = parseInt(index); - if (isNaN(selection)) return false; - if (selection < 0) selection += data.choices.length; - if (selection < 0) return false; - if (selection % 100 > 50) selection += data.choices.length; - if (selection % 100 > data.choices.length) return false; - var timeout = Math.floor(selection / 100) || 0; - core.setFlag('timeout', timeout); - selection %= 100; - } else core.setFlag('timeout', 0); - core.status.event.selection = selection; - setTimeout(function () { - core.status.route.push("choices:" + index); - if (selection != 'none') { - // 检查 - var choice = data.choices[selection]; - if (choice.need != null && choice.need != '' && !core.calValue(choice.need)) { - // 无法选择此项 - core.control._replay_error("无法选择项:" + index); - return; - } else { - core.insertAction(choice.action); - } - } - core.doAction(); - }, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed)); - return true; -} - -events.prototype._precompile_choices = function (data) { - if (!(data.choices instanceof Array)) return data; - for (var i = 0; i < data.choices.length; ++i) { - data.choices[i].condition = core.replaceValue(data.choices[i].condition); - data.choices[i].text = this.__precompile_text(data.choices[i].text); - data.choices[i].action = this.precompile(data.choices[i].action); - } - return data; -} - -events.prototype._action_confirm = function (data, x, y, prefix) { - data.text = core.replaceText(data.text, prefix); - core.status.event.ui = { "text": data.text, "yes": data.yes, "no": data.no }; - if (core.isReplaying()) { - var action = core.status.replay.toReplay.shift(); - if (action.indexOf('choices:') == 0 && !(action == 'choices:none' && !data.timeout)) { - var index = action.substring(8); - if (index == 'none' || ((index = parseInt(index)) >= 0) && index % 100 < 2) { - this.__action_confirm_replaying(data, index); - } else { - core.control._replay_error(action); - return; - } - } else { - // 录像中未记录选了哪个,则选默认值,而不是直接报错 - if (action != 'choices:none') core.status.replay.toReplay.unshift(action); - this.__action_confirm_replaying(data, data["default"] ? 0 : 1); - } - } - else { - core.status.event.selection = data["default"] ? 0 : 1; - if (data.timeout) { - core.status.event.interval = setTimeout(function () { - core.status.route.push("choices:none"); - core.setFlag('timeout', 0); - core.doAction(); - }, data.timeout); - } - core.status.event.timeout = new Date().getTime() + (data.timeout || 0); - } - core.ui.drawConfirmBox(data.text); -} - -events.prototype.__action_confirm_replaying = function (data, index) { - if (index != 'none') { - var timeout = Math.floor(index / 100) || 0; - core.setFlag('timeout', timeout); - index %= 100; - } else core.setFlag('timeout', 0); - core.status.event.selection = index; - setTimeout(function () { - core.status.route.push("choices:" + index); - if (index != 'none') { - if (index == 0) core.insertAction(data.yes); - else core.insertAction(data.no); - } - core.doAction(); - }, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed)); -} - -events.prototype._precompile_confirm = function (data) { - data.yes = this.precompile(data.yes); - data.no = this.precompile(data.no); - return data; -} - -events.prototype._action_for = function (data, x, y, prefix) { - // Only support temp:A - if (!/^temp:[A-Z]$/.test(data.name)) { - core.insertAction('循环遍历事件只支持临时变量!'); - return core.doAction(); - } - var from = core.calValue(data.from); - var to = core.calValue(data.to); - var step = core.calValue(data.step); - if (typeof from != 'number' || typeof to != 'number' || typeof step != 'number') { - core.insertAction('循环遍历事件要求【起始点】【终止点】【每步】仅能是数字!'); - return core.doAction(); - } - // 首次判定 - if ((step > 0 && from > to) || (step < 0 && from < to)) { - core.doAction(); - return; - } - - var letter = data.name.substring(5); - core.setFlag('@temp@' + letter, from); - var toName = '@temp@for-to@' + letter; - var stepName = '@temp@for-step@' + letter; - core.setFlag(toName, data.to); - core.setFlag(stepName, data.step); - var condition = "(function () {" + - "var to = core.calValue(core.getFlag('" + toName + "'));" + - "var step = core.calValue(core.getFlag('" + stepName + "'));" + - "if (typeof step != 'number' || typeof to != 'number') return false;" + - "if (step == 0) return true;" + - "var currentValue = core.getFlag('@temp@" + letter + "');" + - "currentValue += step;" + - "core.setFlag('@temp@" + letter + "', currentValue);" + - "if (step > 0) { return currentValue <= to; }" + - "else { return currentValue >= to; }" + - "})()"; - return this._action_dowhile({ "condition": condition, "data": data.data }, x, y, prefix); -} - -events.prototype._precompile_for = function (data) { - data.from = core.replaceValue(data.from); - data.to = core.replaceValue(data.to); - data.step = core.replaceValue(data.step); - data.data = this.precompile(data.data); - return data; -} - -events.prototype._action_forEach = function (data, x, y, prefix) { - // Only support temp:A - if (!/^temp:[A-Z]$/.test(data.name)) { - core.insertAction(['循环遍历事件只支持临时变量!']); - return core.doAction(); - } - var listName = '@temp@forEach@' + data.name.substring(5); - core.setFlag(listName, core.clone(data.list)); - var condition = "(function () {" + - "var list = core.getFlag('" + listName + "', []);" + - "if (list.length == 0) return false;" + - "core.setFlag('@temp@'+'" + data.name.substring(5) + "', list.shift());" + - "return true;" + - "})()"; - return this._action_while({ "condition": condition, "data": data.data }, x, y, prefix); -} - -events.prototype._precompile_forEach = function (data) { - data.data = this.precompile(data.data); - return data; -} - -events.prototype._action_while = function (data, x, y, prefix) { - if (core.calValue(data.condition, prefix)) { - var list = core.clone(data.data); - if (!(list instanceof Array)) list = [list]; - list.push({ "type": "_label" }); - core.unshift(core.status.event.data.list, - { "todo": list, "total": core.clone(list), "condition": data.condition } - ); - } - core.doAction(); -} - -events.prototype._precompile_while = function (data) { - data.condition = core.replaceValue(data.condition); - data.data = this.precompile(data.data); - return data; -} - -events.prototype._action_dowhile = function (data, x, y, prefix) { - var list = core.clone(data.data); - if (!(list instanceof Array)) list = [list]; - list.push({ "type": "_label" }); - core.unshift(core.status.event.data.list, - { "todo": list, "total": core.clone(list), "condition": data.condition } + // 考虑到可能覆盖楼传事件的问题,这里不对fly进行检查。 + if (data.id != "book" && core.canUseItem(data.id)) { + core.useItem(data.id, true, core.doAction); + } else { + core.playSound("操作失败"); + core.drawTip( + "当前无法使用" + ((core.material.items[data.id] || {}).name || "未知道具") ); core.doAction(); -} + } +}; -events.prototype._precompile_dowhile = function (data) { - data.condition = core.replaceValue(data.condition); - data.data = this.precompile(data.data); - return data; -} +events.prototype._action_loadEquip = function (data, x, y, prefix) { + core.loadEquip(data.id); + core.doAction(); +}; -events.prototype._action_break = function (data, x, y, prefix) { - var n = data.n || 1; - while (n--) { - if (core.status.event.data.list.length > 1) - core.status.event.data.list.shift(); +events.prototype._action_unloadEquip = function (data, x, y, prefix) { + core.unloadEquip(data.pos); + core.doAction(); +}; + +events.prototype._action_openShop = function (data, x, y, prefix) { + core.setShopVisited(data.id, true); + if (data.open) core.openShop(data.id, true); + core.doAction(); +}; + +events.prototype._action_disableShop = function (data, x, y, prefix) { + core.setShopVisited(data.id, false); + core.doAction(); +}; + +events.prototype._action_battle = function (data, x, y, prefix) { + if (data.id) { + this.battle(data.id, null, null, true, core.doAction); + } else { + if (data.floorId != core.status.floorId) { + core.doAction(); + return; } - core.doAction(); -} + var loc = this.__action_getLoc(data.loc, x, y, prefix); + this.battle(null, loc[0], loc[1], true, core.doAction); + } +}; -events.prototype._action_continue = function (data, x, y, prefix) { - var n = data.n || 1; - while (n-- > 1) { - if (core.status.event.data.list.length > 1) - core.status.event.data.list.shift(); - } - if (core.status.event.data.list.length > 1) { - if (core.calValue(core.status.event.data.list[0].condition, prefix)) { - core.status.event.data.list[0].todo = core.clone(core.status.event.data.list[0].total); - } - else { - core.status.event.data.list.shift(); +events.prototype._action_trigger = function (data, x, y, prefix) { + var loc = this.__action_getLoc(data.loc, x, y, prefix); + this._trigger_inAction(loc[0], loc[1]); +}; + +events.prototype._action_insert = function (data, x, y, prefix) { + if (data.name) { + // 公共事件 + core.insertCommonEvent(data.name, data.args); + } else { + // 设置参数 + if (data.args instanceof Array) { + for (var i = 0; i < data.args.length; ++i) { + try { + if (data.args[i] != null) core.setFlag("arg" + (i + 1), data.args[i]); + } catch (ee) { + console.error(ee); } + } } + var loc = this.__action_getLoc(data.loc, x, y, prefix); + core.setFlag("arg0", loc); + var floorId = data.floorId; + var which = data.which || "events"; + var event = (core.floors[floorId][which] || [])[loc[0] + "," + loc[1]]; + if (event) this.insertAction(event.data || event); + } + core.doAction(); +}; + +events.prototype._action_playBgm = function (data, x, y, prefix) { + core.playBgm(data.name, data.startTime || 0); + core.setFlag("__bgm__", data.keep ? data.name : null); + core.doAction(); +}; + +events.prototype._action_pauseBgm = function (data, x, y, prefix) { + core.pauseBgm(); + core.doAction(); +}; + +events.prototype._action_resumeBgm = function (data, x, y, prefix) { + core.resumeBgm(data.resume); + core.doAction(); +}; + +events.prototype._action_loadBgm = function (data, x, y, prefix) { + core.loadBgm(data.name); + core.doAction(); +}; + +events.prototype._action_freeBgm = function (data, x, y, prefix) { + core.freeBgm(data.name); + core.doAction(); +}; + +events.prototype._action_playSound = function (data, x, y, prefix) { + if (data.stop) core.stopSound(); + if (data.sync) { + core.playSound(data.name, data.pitch, core.doAction); + } else { + core.playSound(data.name, data.pitch); core.doAction(); -} + } +}; -events.prototype._action_win = function (data, x, y, prefix) { - this.win(core.replaceText(data.reason, prefix), data.norank, data.noexit); -} +events.prototype._action_stopSound = function (data, x, y, prefix) { + core.stopSound(); + core.doAction(); +}; -events.prototype._action_lose = function (data, x, y, prefix) { - this.lose(core.replaceText(data.reason, prefix)); -} +events.prototype._action_setVolume = function (data, x, y, prefix) { + data.value = core.clamp(parseInt(data.value) / 100, 0, 1); + core.setFlag("__volume__", data.value); + this.__action_doAsyncFunc( + data.async, + core.setVolume, + data.value, + data.time || 0 + ); +}; -events.prototype._action_restart = function (data, x, y, prefix) { - core.restart(); -} +events.prototype._action_setBgmSpeed = function (data, x, y, prefix) { + core.setBgmSpeed(data.value, data.pitch || false); + core.doAction(); +}; -events.prototype._action_function = function (data, x, y, prefix) { - var func = data["function"]; - try { - if (typeof func == "string" && func.indexOf("function") == 0) { - eval('(' + func + ')()'); - } - } catch (e) { - console.error(e); - } - if (!data.async) - core.doAction(); -} - -events.prototype._action_update = function (data, x, y, prefix) { - core.updateStatusBar(data.doNotCheckAutoEvents, true); - core.doAction(); -} - -events.prototype._action_showStatusBar = function (data, x, y, prefix) { - core.showStatusBar(); - core.doAction(); -} - -events.prototype._action_hideStatusBar = function (data, x, y, prefix) { - core.hideStatusBar(data.toolbox); - core.doAction(); -} - -events.prototype._action_showHero = function (data, x, y, prefix) { - data.opacity = 1; - return this._action_setHeroOpacity(data, x, y, prefix); -} - -events.prototype._action_hideHero = function (data, x, y, prefix) { - data.opacity = 0; - return this._action_setHeroOpacity(data, x, y, prefix); -} - -events.prototype._action_setHeroOpacity = function (data, x, y, prefix) { - data.time = data.time || 0; - if (data.opacity == null) data.opacity = 1; - if (data.time > 0) { - this.__action_doAsyncFunc(data.async, core.setHeroOpacity, data.opacity, data.moveMode, data.time); +events.prototype._action_setValue = function (data, x, y, prefix) { + this.setValue(data.name, data.operator, data.value, prefix); + if (!data.norefresh) { + if (core.status.hero.hp <= 0) { + core.status.hero.hp = 0; + core.updateStatusBar(); + core.events.lose(); } else { - core.setFlag('__heroOpacity__', data.opacity); - core.drawHero(); - core.doAction(); + core.updateStatusBar(); } -} + } + core.doAction(); +}; -events.prototype._action_vibrate = function (data, x, y, prefix) { - this.__action_doAsyncFunc(data.async, core.vibrate, data.direction, data.time, data.speed, data.power); -} +events.prototype._action_addValue = function (data, x, y, prefix) { + data.operator = "+="; + this._action_setValue(data, x, y, prefix); +}; -events.prototype._action_sleep = function (data, x, y, prefix) { - core.timeout.sleepTimeout = setTimeout(function () { - core.timeout.sleepTimeout = null; - core.doAction(); - }, core.isReplaying() ? Math.min(data.time, 20) : data.time); -} +events.prototype._action_setEnemy = function (data, x, y, prefix) { + this.setEnemy( + data.id, + data.name, + data.value, + data.operator, + prefix, + data.norefresh + ); + core.doAction(); +}; -events.prototype._action_wait = function (data, x, y, prefix) { - if (core.isReplaying()) { - var code = core.status.replay.toReplay.shift(); - if (code.indexOf("input:") == 0 && !(code == "input:none" && !data.timeout)) { - if (code == "input:none") { - core.status.route.push("input:none"); - core.setFlag("type", -1); - core.setFlag("timeout", 0); - this.__action_wait_afterGet(data); - return core.doAction(); - } else { - var value = parseInt(code.substring(6)); - core.status.route.push("input:" + value); - this.__action_wait_getValue(value); - if (this.__action_wait_afterGet(data) || !data.forceChild) return core.doAction(); - } - } - core.control._replay_error(code); +events.prototype._action_setEnemyOnPoint = function (data, x, y, prefix) { + var loc = this.__action_getLoc2D(data.loc, x, y, prefix); + loc.forEach(function (one) { + core.setEnemyOnPoint( + one[0], + one[1], + data.floorId, + data.name, + data.value, + data.operator, + prefix, + data.norefresh + ); + }); + core.doAction(); +}; + +events.prototype._action_resetEnemyOnPoint = function (data, x, y, prefix) { + var loc = this.__action_getLoc2D(data.loc, x, y, prefix); + loc.forEach(function (one) { + core.resetEnemyOnPoint(one[0], one[1], data.floorId, data.norefresh); + }); + core.doAction(); +}; + +events.prototype._precompile_moveEnemyOnPoint = function (data) { + data.from = this.__precompile_array(data.from); + data.to = this.__precompile_array(data.to); + data.dxy = this.__precompile_array(data.dxy); + return data; +}; + +events.prototype._action_moveEnemyOnPoint = function (data, x, y, prefix) { + var from = this.__action_getLoc(data.from, x, y, prefix), + to; + if (data.dxy) { + to = [ + from[0] + (core.calValue(data.dxy[0], prefix) || 0), + from[1] + (core.calValue(data.dxy[1], prefix) || 0), + ]; + } else { + to = this.__action_getLoc(data.to, x, y, prefix); + } + this.moveEnemyOnPoint( + from[0], + from[1], + to[0], + to[1], + data.floorId, + data.norefresh + ); + core.doAction(); +}; + +events.prototype._action_setEquip = function (data, x, y, prefix) { + core.setEquip( + data.id, + data.valueType, + data.name, + data.value, + data.operator, + prefix + ); + core.doAction(); +}; + +events.prototype._action_setFloor = function (data, x, y, prefix) { + this.setFloorInfo(data.name, data.value, data.floorId, prefix); + core.doAction(); +}; + +events.prototype._action_setGlobalAttribute = function (data, x, y, prefix) { + this.setGlobalAttribute(data.name, data.value); + core.doAction(); +}; + +events.prototype._action_setGlobalValue = function (data, x, y, prefix) { + core.values[data.name] = data.value; + core.doAction(); +}; + +events.prototype._action_setGlobalFlag = function (data, x, y, prefix) { + this.setGlobalFlag(data.name, data.value); + core.doAction(); +}; + +events.prototype._action_setNameMap = function (data, x, y, floorId) { + this.setNameMap(data.name, data.value); + core.doAction(); +}; + +events.prototype._action_setHeroIcon = function (data, x, y, prefix) { + this.setHeroIcon(data.name, data.noDraw); + core.doAction(); +}; + +events.prototype._action_input = function (data, x, y, prefix) { + this.__action_getInput( + core.replaceText(data.text, prefix), + false, + function (value) { + value = parseInt(value) || 0; // 允许负整数 + core.status.route.push("input:" + value); + core.setFlag("input", value); + core.doAction(); + } + ); +}; + +events.prototype._action_input2 = function (data, x, y, prefix) { + this.__action_getInput( + core.replaceText(data.text, prefix), + true, + function (value) { + value = value || ""; + core.status.route.push("input2:" + core.encodeBase64(value)); + core.setFlag("input", value); + core.doAction(); + } + ); +}; + +events.prototype.__action_getInput = function (hint, isText, callback) { + var value, + prefix = isText ? "input2:" : "input:"; + if (core.isReplaying()) { + var action = core.status.replay.toReplay.shift(); + try { + if (action.indexOf(prefix) != 0) { + console.warn("警告!当前需要一个 " + prefix + " 项,实际为 " + action); + core.status.replay.toReplay.unshift(action); + return callback(isText ? "" : 0); + } + if (isText) value = core.decodeBase64(action.substring(7)); + else value = parseInt(action.substring(6)); + callback(value); + } catch (e) { + core.control._replay_error(action); + return; + } + } else { + core.myprompt(core.replaceText(hint), null, callback); + } +}; + +events.prototype._action_if = function (data, x, y, prefix) { + if (core.calValue(data.condition, prefix)) + core.events.insertAction(data["true"]); + else core.events.insertAction(data["false"]); + core.doAction(); +}; + +events.prototype._precompile_if = function (data) { + data.condition = core.replaceValue(data.condition); + data["true"] = this.precompile(data["true"]); + data["false"] = this.precompile(data["false"]); + return data; +}; + +events.prototype._action_switch = function (data, x, y, prefix) { + var key = core.calValue(data.condition, prefix); + var list = []; + for (var i = 0; i < data.caseList.length; i++) { + if (data.caseList[i]._disabled) continue; + var condition = data.caseList[i]["case"]; + if (condition == "default" || core.calValue(condition, prefix) === key) { + core.push(list, data.caseList[i].action); + if (!data.caseList[i].nobreak) break; + } + } + core.insertAction(list); + core.doAction(); +}; + +events.prototype._precompile_switch = function (data) { + data.condition = core.replaceValue(data.condition); + for (var i = 0; i < data.caseList.length; i++) { + data.caseList[i]["case"] = core.replaceValue(data.caseList[i]["case"]); + data.caseList[i].action = this.precompile(data.caseList[i].action); + } + return data; +}; + +events.prototype._action_choices = function (data, x, y, prefix) { + data.choices = data.choices.filter(function (x) { + if (x._disabled) return false; + if (x.condition == null || x.condition == "") return true; + try { + return core.calValue(x.condition, prefix); + } catch (e) { + return true; + } + }); + if (data.choices.length == 0) return this.doAction(); + if (core.isReplaying()) { + var action = core.status.replay.toReplay.shift(); + if ( + action.indexOf("choices:") == 0 && + !(action == "choices:none" && !data.timeout) + ) { + var index = action.substring(8); + if (!this.__action_choices_replaying(data, index)) { + core.control._replay_error(action); return; - } else if (data.timeout) { - core.status.event.interval = setTimeout(function () { - core.status.route.push("input:none"); - core.setFlag("type", -1); - core.setFlag("timeout", 0); - core.events.__action_wait_afterGet(data); - core.doAction(); - }, data.timeout); + } + } else { + // 容错录像 + if (main.replayChecking) { + // 录像验证系统中选最后一项 + if (action != "choices:none") + core.status.replay.toReplay.unshift(action); // 首先归还刚才读出的下一步操作 + core.events.__action_choices_replaying(data, -1); + } else { + // 正常游戏中弹窗选择 + core.myprompt( + "录像回放出错!当前需要执行选择项但录像中未记录。\n如需修复请输入您要选的项(从0起),点击取消将不会修复。", + 0, + function (value) { + if (value == null) { + core.control._replay_error(action); + return; + } + if (action != "choices:none") + core.status.replay.toReplay.unshift(action); // 首先归还刚才读出的下一步操作 + core.events.__action_choices_replaying( + data, + ((parseInt(value) || 0) + data.choices.length) % + data.choices.length + ); + } + ); + } + } + } else { + if (data.timeout) { + core.status.event.interval = setTimeout(function () { + core.status.route.push("choices:none"); + core.setFlag("timeout", 0); + core.doAction(); + }, data.timeout); } core.status.event.timeout = new Date().getTime() + (data.timeout || 0); -} + } + for (var i = 0; i < data.choices.length; i++) { + if (typeof data.choices[i] === "string") + data.choices[i] = { text: data.choices[i] }; + data.choices[i].text = core.replaceText(data.choices[i].text, prefix); + } + core.ui.drawChoices( + core.replaceText(data.text, prefix), + data.choices, + data.width + ); +}; + +events.prototype.__action_choices_replaying = function (data, index) { + var selection = index; + if (index != "none") { + selection = parseInt(index); + if (isNaN(selection)) return false; + if (selection < 0) selection += data.choices.length; + if (selection < 0) return false; + if (selection % 100 > 50) selection += data.choices.length; + if (selection % 100 > data.choices.length) return false; + var timeout = Math.floor(selection / 100) || 0; + core.setFlag("timeout", timeout); + selection %= 100; + } else core.setFlag("timeout", 0); + core.status.event.selection = selection; + setTimeout( + function () { + core.status.route.push("choices:" + index); + if (selection != "none") { + // 检查 + var choice = data.choices[selection]; + if ( + choice.need != null && + choice.need != "" && + !core.calValue(choice.need) + ) { + // 无法选择此项 + core.control._replay_error("无法选择项:" + index); + return; + } else { + core.insertAction(choice.action); + } + } + core.doAction(); + }, + core.status.replay.speed == 24 + ? 1 + : 750 / Math.max(1, core.status.replay.speed) + ); + return true; +}; + +events.prototype._precompile_choices = function (data) { + if (!(data.choices instanceof Array)) return data; + for (var i = 0; i < data.choices.length; ++i) { + data.choices[i].condition = core.replaceValue(data.choices[i].condition); + data.choices[i].text = this.__precompile_text(data.choices[i].text); + data.choices[i].action = this.precompile(data.choices[i].action); + } + return data; +}; + +events.prototype._action_confirm = function (data, x, y, prefix) { + data.text = core.replaceText(data.text, prefix); + core.status.event.ui = { text: data.text, yes: data.yes, no: data.no }; + if (core.isReplaying()) { + var action = core.status.replay.toReplay.shift(); + if ( + action.indexOf("choices:") == 0 && + !(action == "choices:none" && !data.timeout) + ) { + var index = action.substring(8); + if ( + index == "none" || + ((index = parseInt(index)) >= 0 && index % 100 < 2) + ) { + this.__action_confirm_replaying(data, index); + } else { + core.control._replay_error(action); + return; + } + } else { + // 录像中未记录选了哪个,则选默认值,而不是直接报错 + if (action != "choices:none") core.status.replay.toReplay.unshift(action); + this.__action_confirm_replaying(data, data["default"] ? 0 : 1); + } + } else { + core.status.event.selection = data["default"] ? 0 : 1; + if (data.timeout) { + core.status.event.interval = setTimeout(function () { + core.status.route.push("choices:none"); + core.setFlag("timeout", 0); + core.doAction(); + }, data.timeout); + } + core.status.event.timeout = new Date().getTime() + (data.timeout || 0); + } + core.ui.drawConfirmBox(data.text); +}; + +events.prototype.__action_confirm_replaying = function (data, index) { + if (index != "none") { + var timeout = Math.floor(index / 100) || 0; + core.setFlag("timeout", timeout); + index %= 100; + } else core.setFlag("timeout", 0); + core.status.event.selection = index; + setTimeout( + function () { + core.status.route.push("choices:" + index); + if (index != "none") { + if (index == 0) core.insertAction(data.yes); + else core.insertAction(data.no); + } + core.doAction(); + }, + core.status.replay.speed == 24 + ? 1 + : 750 / Math.max(1, core.status.replay.speed) + ); +}; + +events.prototype._precompile_confirm = function (data) { + data.yes = this.precompile(data.yes); + data.no = this.precompile(data.no); + return data; +}; + +events.prototype._action_for = function (data, x, y, prefix) { + // Only support temp:A + if (!/^temp:[A-Z]$/.test(data.name)) { + core.insertAction("循环遍历事件只支持临时变量!"); + return core.doAction(); + } + var from = core.calValue(data.from); + var to = core.calValue(data.to); + var step = core.calValue(data.step); + if ( + typeof from != "number" || + typeof to != "number" || + typeof step != "number" + ) { + core.insertAction( + "循环遍历事件要求【起始点】【终止点】【每步】仅能是数字!" + ); + return core.doAction(); + } + // 首次判定 + if ((step > 0 && from > to) || (step < 0 && from < to)) { + core.doAction(); + return; + } + + var letter = data.name.substring(5); + core.setFlag("@temp@" + letter, from); + var toName = "@temp@for-to@" + letter; + var stepName = "@temp@for-step@" + letter; + core.setFlag(toName, data.to); + core.setFlag(stepName, data.step); + var condition = + "(function () {" + + "var to = core.calValue(core.getFlag('" + + toName + + "'));" + + "var step = core.calValue(core.getFlag('" + + stepName + + "'));" + + "if (typeof step != 'number' || typeof to != 'number') return false;" + + "if (step == 0) return true;" + + "var currentValue = core.getFlag('@temp@" + + letter + + "');" + + "currentValue += step;" + + "core.setFlag('@temp@" + + letter + + "', currentValue);" + + "if (step > 0) { return currentValue <= to; }" + + "else { return currentValue >= to; }" + + "})()"; + return this._action_dowhile( + { condition: condition, data: data.data }, + x, + y, + prefix + ); +}; + +events.prototype._precompile_for = function (data) { + data.from = core.replaceValue(data.from); + data.to = core.replaceValue(data.to); + data.step = core.replaceValue(data.step); + data.data = this.precompile(data.data); + return data; +}; + +events.prototype._action_forEach = function (data, x, y, prefix) { + // Only support temp:A + if (!/^temp:[A-Z]$/.test(data.name)) { + core.insertAction(["循环遍历事件只支持临时变量!"]); + return core.doAction(); + } + var listName = "@temp@forEach@" + data.name.substring(5); + core.setFlag(listName, core.clone(data.list)); + var condition = + "(function () {" + + "var list = core.getFlag('" + + listName + + "', []);" + + "if (list.length == 0) return false;" + + "core.setFlag('@temp@'+'" + + data.name.substring(5) + + "', list.shift());" + + "return true;" + + "})()"; + return this._action_while( + { condition: condition, data: data.data }, + x, + y, + prefix + ); +}; + +events.prototype._precompile_forEach = function (data) { + data.data = this.precompile(data.data); + return data; +}; + +events.prototype._action_while = function (data, x, y, prefix) { + if (core.calValue(data.condition, prefix)) { + var list = core.clone(data.data); + if (!(list instanceof Array)) list = [list]; + list.push({ type: "_label" }); + core.unshift(core.status.event.data.list, { + todo: list, + total: core.clone(list), + condition: data.condition, + }); + } + core.doAction(); +}; + +events.prototype._precompile_while = function (data) { + data.condition = core.replaceValue(data.condition); + data.data = this.precompile(data.data); + return data; +}; + +events.prototype._action_dowhile = function (data, x, y, prefix) { + var list = core.clone(data.data); + if (!(list instanceof Array)) list = [list]; + list.push({ type: "_label" }); + core.unshift(core.status.event.data.list, { + todo: list, + total: core.clone(list), + condition: data.condition, + }); + core.doAction(); +}; + +events.prototype._precompile_dowhile = function (data) { + data.condition = core.replaceValue(data.condition); + data.data = this.precompile(data.data); + return data; +}; + +events.prototype._action_break = function (data, x, y, prefix) { + var n = data.n || 1; + while (n--) { + if (core.status.event.data.list.length > 1) + core.status.event.data.list.shift(); + } + core.doAction(); +}; + +events.prototype._action_continue = function (data, x, y, prefix) { + var n = data.n || 1; + while (n-- > 1) { + if (core.status.event.data.list.length > 1) + core.status.event.data.list.shift(); + } + if (core.status.event.data.list.length > 1) { + if (core.calValue(core.status.event.data.list[0].condition, prefix)) { + core.status.event.data.list[0].todo = core.clone( + core.status.event.data.list[0].total + ); + } else { + core.status.event.data.list.shift(); + } + } + core.doAction(); +}; + +events.prototype._action_win = function (data, x, y, prefix) { + this.win(core.replaceText(data.reason, prefix), data.norank, data.noexit); +}; + +events.prototype._action_lose = function (data, x, y, prefix) { + this.lose(core.replaceText(data.reason, prefix)); +}; + +events.prototype._action_restart = function (data, x, y, prefix) { + core.restart(); +}; + +events.prototype._action_function = function (data, x, y, prefix) { + var func = data["function"]; + try { + if (typeof func == "string" && func.indexOf("function") == 0) { + eval("(" + func + ")()"); + } + } catch (e) { + console.error(e); + } + if (!data.async) core.doAction(); +}; + +events.prototype._action_update = function (data, x, y, prefix) { + core.updateStatusBar(data.doNotCheckAutoEvents, true); + core.doAction(); +}; + +events.prototype._action_showStatusBar = function (data, x, y, prefix) { + core.showStatusBar(); + core.doAction(); +}; + +events.prototype._action_hideStatusBar = function (data, x, y, prefix) { + core.hideStatusBar(data.toolbox); + core.doAction(); +}; + +events.prototype._action_showHero = function (data, x, y, prefix) { + data.opacity = 1; + return this._action_setHeroOpacity(data, x, y, prefix); +}; + +events.prototype._action_hideHero = function (data, x, y, prefix) { + data.opacity = 0; + return this._action_setHeroOpacity(data, x, y, prefix); +}; + +events.prototype._action_setHeroOpacity = function (data, x, y, prefix) { + data.time = data.time || 0; + if (data.opacity == null) data.opacity = 1; + if (data.time > 0) { + this.__action_doAsyncFunc( + data.async, + core.setHeroOpacity, + data.opacity, + data.moveMode, + data.time + ); + } else { + core.setFlag("__heroOpacity__", data.opacity); + core.drawHero(); + core.doAction(); + } +}; + +events.prototype._action_vibrate = function (data, x, y, prefix) { + this.__action_doAsyncFunc( + data.async, + core.vibrate, + data.direction, + data.time, + data.speed, + data.power + ); +}; + +events.prototype._action_sleep = function (data, x, y, prefix) { + core.timeout.sleepTimeout = setTimeout( + function () { + core.timeout.sleepTimeout = null; + core.doAction(); + }, + core.isReplaying() ? Math.min(data.time, 20) : data.time + ); +}; + +events.prototype._action_wait = function (data, x, y, prefix) { + if (core.isReplaying()) { + var code = core.status.replay.toReplay.shift(); + if ( + code.indexOf("input:") == 0 && + !(code == "input:none" && !data.timeout) + ) { + if (code == "input:none") { + core.status.route.push("input:none"); + core.setFlag("type", -1); + core.setFlag("timeout", 0); + this.__action_wait_afterGet(data); + return core.doAction(); + } else { + var value = parseInt(code.substring(6)); + core.status.route.push("input:" + value); + this.__action_wait_getValue(value); + if (this.__action_wait_afterGet(data) || !data.forceChild) + return core.doAction(); + } + } + core.control._replay_error(code); + return; + } else if (data.timeout) { + core.status.event.interval = setTimeout(function () { + core.status.route.push("input:none"); + core.setFlag("type", -1); + core.setFlag("timeout", 0); + core.events.__action_wait_afterGet(data); + core.doAction(); + }, data.timeout); + } + core.status.event.timeout = new Date().getTime() + (data.timeout || 0); +}; events.prototype.__action_wait_getValue = function (value) { - core.setFlag("timeout", Math.floor(value / 1e8) || 0); - value %= 1e8; - if (value >= 1000000) { - core.setFlag('type', 1); - var px = parseInt((value - 1000000) / 1000), py = value % 1000; - core.setFlag('px', px); - core.setFlag('py', py); - core.setFlag('x', parseInt(px / 32)); - core.setFlag('y', parseInt(py / 32)); - } - else if (value >= 10000) { - core.setFlag('type', 1); - var x = parseInt((value - 10000) / 100), y = value % 100; - core.setFlag('px', 32 * x + 16); - core.setFlag('py', 32 * y + 16); - core.setFlag('x', x); - core.setFlag('y', y); - } - else if (value > 0) { - core.setFlag('type', 0); - core.setFlag('keycode', value); - } -} + core.setFlag("timeout", Math.floor(value / 1e8) || 0); + value %= 1e8; + if (value >= 1000000) { + core.setFlag("type", 1); + var px = parseInt((value - 1000000) / 1000), + py = value % 1000; + core.setFlag("px", px); + core.setFlag("py", py); + core.setFlag("x", parseInt(px / 32)); + core.setFlag("y", parseInt(py / 32)); + } else if (value >= 10000) { + core.setFlag("type", 1); + var x = parseInt((value - 10000) / 100), + y = value % 100; + core.setFlag("px", 32 * x + 16); + core.setFlag("py", 32 * y + 16); + core.setFlag("x", x); + core.setFlag("y", y); + } else if (value > 0) { + core.setFlag("type", 0); + core.setFlag("keycode", value); + } +}; events.prototype.__action_wait_afterGet = function (data) { - if (!data.data) return false; - var todo = []; - var stop = false; - var found = false; - data.data.forEach(function (one) { - if (one._disabled || stop) return; - if (one["case"] == "keyboard" && core.getFlag("type") == 0) { - (one.keycode + "").split(",").forEach(function (keycode) { - if (core.getFlag("keycode", 0) == keycode) { - found = true; - core.push(todo, one.action); - if (one["break"]) stop = true; - } - }); + if (!data.data) return false; + var todo = []; + var stop = false; + var found = false; + data.data.forEach(function (one) { + if (one._disabled || stop) return; + if (one["case"] == "keyboard" && core.getFlag("type") == 0) { + (one.keycode + "").split(",").forEach(function (keycode) { + if (core.getFlag("keycode", 0) == keycode) { + found = true; + core.push(todo, one.action); + if (one["break"]) stop = true; } - if (one["case"] == "mouse" && one.px instanceof Array - && one.py instanceof Array && core.getFlag("type") == 1) { - var pxmin = core.calValue(one.px[0]); - var pxmax = core.calValue(one.px[1]); - var pymin = core.calValue(one.py[0]); - var pymax = core.calValue(one.py[1]); - var px = core.getFlag("px", 0), py = core.getFlag("py", 0); - if (px >= pxmin && px <= pxmax && py >= pymin && py <= pymax) { - found = true; - core.push(todo, one.action); - if (one["break"]) stop = true; - } - } - if (one["case"] == "condition") { - var condition = false; - try { condition = core.calValue(one.condition); } catch (e) { } - if (condition) { - found = true; - core.push(todo, one.action); - if (one["break"]) stop = true; - } - } - if (one["case"] == "timeout" && core.getFlag("type") == -1) { - found = true; - core.push(todo, one.action); - if (one["break"]) stop = true; - } - }) - if (found) { - core.insertAction(todo); - return true; + }); } - return false; -} + if ( + one["case"] == "mouse" && + one.px instanceof Array && + one.py instanceof Array && + core.getFlag("type") == 1 + ) { + var pxmin = core.calValue(one.px[0]); + var pxmax = core.calValue(one.px[1]); + var pymin = core.calValue(one.py[0]); + var pymax = core.calValue(one.py[1]); + var px = core.getFlag("px", 0), + py = core.getFlag("py", 0); + if (px >= pxmin && px <= pxmax && py >= pymin && py <= pymax) { + found = true; + core.push(todo, one.action); + if (one["break"]) stop = true; + } + } + if (one["case"] == "condition") { + var condition = false; + try { + condition = core.calValue(one.condition); + } catch (e) {} + if (condition) { + found = true; + core.push(todo, one.action); + if (one["break"]) stop = true; + } + } + if (one["case"] == "timeout" && core.getFlag("type") == -1) { + found = true; + core.push(todo, one.action); + if (one["break"]) stop = true; + } + }); + if (found) { + core.insertAction(todo); + return true; + } + return false; +}; events.prototype._precompile_wait = function (data) { - if (data.data) { - data.data.forEach(function (v) { - if (v.px != null) v.px = this.__precompile_array(v.px); - if (v.py != null) v.py = this.__precompile_array(v.py); - if (v.condition != null) v.condition = this.__precompile_array(v.condition); - v.action = this.precompile(v.action); - }, this); - } - return data; -} + if (data.data) { + data.data.forEach(function (v) { + if (v.px != null) v.px = this.__precompile_array(v.px); + if (v.py != null) v.py = this.__precompile_array(v.py); + if (v.condition != null) + v.condition = this.__precompile_array(v.condition); + v.action = this.precompile(v.action); + }, this); + } + return data; +}; events.prototype._action_waitAsync = function (data, x, y, prefix) { - var test = window.setInterval(function () { - if (!core.hasAsync() - && (data.excludeAnimates || core.isReplaying() || core.getPlayingAnimates().length == 0) - && (!data.includeSounds || core.isReplaying() || core.getPlayingSounds().length == 0)) { - clearInterval(test); - core.doAction(); - } - }, 50 / core.status.replay.speed); -} + var test = window.setInterval(function () { + if ( + !core.hasAsync() && + (data.excludeAnimates || + core.isReplaying() || + core.getPlayingAnimates().length == 0) && + (!data.includeSounds || + core.isReplaying() || + core.getPlayingSounds().length == 0) + ) { + clearInterval(test); + core.doAction(); + } + }, 50 / core.status.replay.speed); +}; events.prototype._action_stopAsync = function (data, x, y, prefix) { - core.stopAsync(); - core.doAction(); -} + core.stopAsync(); + core.doAction(); +}; events.prototype._action_callBook = function (data, x, y, prefix) { - if (core.isReplaying() || !core.hasItem('book')) { - core.doAction(); - } - else { - var e = core.clone(core.status.event.data); - core.ui.closePanel(); - core.openBook(); - core.status.event.interval = e; - } -} - -events.prototype._action_callSave = function (data, x, y, prefix) { - if (core.isReplaying() || core.hasFlag("__events__")) { - core.removeFlag("__events__"); - core.doAction(); - } - else { - var e = core.clone(core.status.event.data); - core.ui.closePanel(); - var forbidSave = core.hasFlag('__forbidSave__'); - core.removeFlag('__forbidSave__'); - core.save(); - if (forbidSave) core.setFlag('__forbidSave__', true); - core.status.event.interval = e; - } -} - -events.prototype._action_autoSave = function (data, x, y, prefix) { - var forbidSave = core.hasFlag('__forbidSave__'); - core.removeFlag('__forbidSave__'); - core.autosave(data.removeLast); - if (forbidSave) core.setFlag('__forbidSave__', true); + if (core.isReplaying() || !core.hasItem("book")) { core.doAction(); -} - -events.prototype._action_forbidSave = function (data, x, y, prefix) { - core.setFlag('__forbidSave__', data.forbid || null); - core.doAction(); -} - -events.prototype._action_callLoad = function (data, x, y, prefix) { - if (this.__action_checkReplaying()) return; + } else { var e = core.clone(core.status.event.data); core.ui.closePanel(); - core.load(); + core.openBook(); core.status.event.interval = e; -} + } +}; + +events.prototype._action_callSave = function (data, x, y, prefix) { + if (core.isReplaying() || core.hasFlag("__events__")) { + core.removeFlag("__events__"); + core.doAction(); + } else { + var e = core.clone(core.status.event.data); + core.ui.closePanel(); + var forbidSave = core.hasFlag("__forbidSave__"); + core.removeFlag("__forbidSave__"); + core.save(); + if (forbidSave) core.setFlag("__forbidSave__", true); + core.status.event.interval = e; + } +}; + +events.prototype._action_autoSave = function (data, x, y, prefix) { + var forbidSave = core.hasFlag("__forbidSave__"); + core.removeFlag("__forbidSave__"); + core.autosave(data.removeLast); + if (forbidSave) core.setFlag("__forbidSave__", true); + core.doAction(); +}; + +events.prototype._action_forbidSave = function (data, x, y, prefix) { + core.setFlag("__forbidSave__", data.forbid || null); + core.doAction(); +}; + +events.prototype._action_callLoad = function (data, x, y, prefix) { + if (this.__action_checkReplaying()) return; + var e = core.clone(core.status.event.data); + core.ui.closePanel(); + core.load(); + core.status.event.interval = e; +}; events.prototype._action_exit = function (data, x, y, prefix) { - this.setEvents([]); - core.doAction(); -} + this.setEvents([]); + core.doAction(); +}; events.prototype._action_previewUI = function (data, x, y, prefix) { - this.insertAction(data.action); - core.doAction(); -} + this.insertAction(data.action); + core.doAction(); +}; events.prototype._precompile_previewUI = function (data) { - data.action = this.precompile(data.action); - return data; -} + data.action = this.precompile(data.action); + return data; +}; events.prototype.__action_doUIEvent = function (data) { - this.__action_doUIEvent_doOne(data); - var current = core.status.event.data.list[0]; - while (current.todo.length > 0) { - data = current.todo[0]; - if (this.__action_doUIEvent_doOne(current.todo[0])) - current.todo.shift(); - else break; - } - core.doAction(); -} + this.__action_doUIEvent_doOne(data); + var current = core.status.event.data.list[0]; + while (current.todo.length > 0) { + data = current.todo[0]; + if (this.__action_doUIEvent_doOne(current.todo[0])) current.todo.shift(); + else break; + } + core.doAction(); +}; events.prototype.__action_doUIEvent_doOne = function (data) { - if (core.ui['_uievent_' + data.type]) { - core.ui['_uievent_' + data.type](data); - return true; - } - return false; -} + if (core.ui["_uievent_" + data.type]) { + core.ui["_uievent_" + data.type](data); + return true; + } + return false; +}; events.prototype._action_clearMap = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_fillText = function (data, x, y, prefix) { - data.text = core.replaceText(data.text, prefix); - this.__action_doUIEvent(data); -} + data.text = core.replaceText(data.text, prefix); + this.__action_doUIEvent(data); +}; events.prototype._action_fillBoldText = function (data, x, y, prefix) { - data.text = core.replaceText(data.text, prefix); - this.__action_doUIEvent(data); -} + data.text = core.replaceText(data.text, prefix); + this.__action_doUIEvent(data); +}; events.prototype._action_fillRect = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_fillPolygon = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._precompile_fillPolygon = function (data) { - data.nodes = this.__precompile_array(data.nodes); - return data; -} + data.nodes = this.__precompile_array(data.nodes); + return data; +}; events.prototype._action_strokeRect = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_strokePolygon = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._precompile_strokePolygon = function (data) { - data.nodes = this.__precompile_array(data.nodes); - return data; -} + data.nodes = this.__precompile_array(data.nodes); + return data; +}; events.prototype._action_fillEllipse = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_strokeEllipse = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_fillArc = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_strokeArc = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawLine = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawArrow = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_setAttribute = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_setFilter = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawImage = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawIcon = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawSelector = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawBackground = function (data, x, y, prefix) { - this.__action_doUIEvent(data); -} + this.__action_doUIEvent(data); +}; events.prototype._action_drawTextContent = function (data, x, y, prefix) { - data.text = core.replaceText(data.text, prefix); - this.__action_doUIEvent(data); -} + data.text = core.replaceText(data.text, prefix); + this.__action_doUIEvent(data); +}; // ------ 点击状态栏图标所进行的一些操作 ------ // ////// 判断当前能否进入某个事件 ////// events.prototype._checkStatus = function (name, fromUserAction, checkItem) { - if (fromUserAction && core.status.event.id == name) { - core.ui.closePanel(); - return false; - } - if (fromUserAction && core.status.lockControl) return false; - if (checkItem && !core.hasItem(name)) { - core.playSound('操作失败'); - core.drawTip("你没有" + core.material.items[name].name, name); - return false; - } - if (core.isMoving()) { - core.playSound('操作失败'); - core.drawTip("请先停止勇士行动"); - return false; - } - core.lockControl(); - core.status.event.id = name; - return true; -} + if (fromUserAction && core.status.event.id == name) { + core.ui.closePanel(); + return false; + } + if (fromUserAction && core.status.lockControl) return false; + if (checkItem && !core.hasItem(name)) { + core.playSound("操作失败"); + core.drawTip("你没有" + core.material.items[name].name, name); + return false; + } + if (core.isMoving()) { + core.playSound("操作失败"); + core.drawTip("请先停止勇士行动"); + return false; + } + core.lockControl(); + core.status.event.id = name; + return true; +}; ////// 点击怪物手册时的打开操作 ////// events.prototype.openBook = function (fromUserAction) { - if (core.isReplaying()) return; - // 如果能恢复事件(从callBook事件触发) - if (core.status.event.id == 'book' && core.events.recoverEvents(core.status.event.interval)) - return; - // 当前是book,且从“浏览地图”打开 - if (core.status.event.id == 'book' && core.status.event.ui) { - core.status.boxAnimateObjs = []; - core.ui._drawViewMaps(core.status.event.ui); - return; - } - // 从“浏览地图”页面打开 - if (core.status.event.id == 'viewMaps') { - fromUserAction = false; - core.status.event.ui = core.status.event.data; - } - if (!this._checkStatus('book', fromUserAction, true)) return; - core.playSound('打开界面'); - core.useItem('book', true); -} + if (core.isReplaying()) return; + // 如果能恢复事件(从callBook事件触发) + if ( + core.status.event.id == "book" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + // 当前是book,且从“浏览地图”打开 + if (core.status.event.id == "book" && core.status.event.ui) { + core.status.boxAnimateObjs = []; + core.ui._drawViewMaps(core.status.event.ui); + return; + } + // 从“浏览地图”页面打开 + if (core.status.event.id == "viewMaps") { + fromUserAction = false; + core.status.event.ui = core.status.event.data; + } + if (!this._checkStatus("book", fromUserAction, true)) return; + core.playSound("打开界面"); + core.useItem("book", true); +}; ////// 点击楼层传送器时的打开操作 ////// events.prototype.useFly = function (fromUserAction) { - if (core.isReplaying()) return; - // 从“浏览地图”页面:尝试直接传送到该层 - if (core.status.event.id == 'viewMaps') { - if (!core.hasItem('fly')) { - core.playSound('操作失败'); - core.drawTip('你没有' + core.material.items['fly'].name, 'fly'); - } else if (!core.canUseItem('fly') || (core.flags.flyNearStair && !core.nearStair())) { - core.playSound('操作失败'); - core.drawTip('无法传送到当前层', 'fly'); - } else { - core.flyTo(core.status.event.data.floorId); - } - return; + if (core.isReplaying()) return; + // 从“浏览地图”页面:尝试直接传送到该层 + if (core.status.event.id == "viewMaps") { + if (!core.hasItem("fly")) { + core.playSound("操作失败"); + core.drawTip("你没有" + core.material.items["fly"].name, "fly"); + } else if ( + !core.canUseItem("fly") || + (core.flags.flyNearStair && !core.nearStair()) + ) { + core.playSound("操作失败"); + core.drawTip("无法传送到当前层", "fly"); + } else { + core.flyTo(core.status.event.data.floorId); } - - if (!this._checkStatus('fly', fromUserAction, true)) return; - if (core.flags.flyNearStair && !core.nearStair()) { - core.playSound('操作失败'); - core.drawTip("只有在楼梯边才能使用" + core.material.items['fly'].name, 'fly'); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - return; - } - if (!core.canUseItem('fly')) { - core.playSound('操作失败'); - core.drawTip(core.material.items['fly'].name + "好像失效了", 'fly'); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - return; - } - core.playSound('打开界面'); - core.useItem('fly', true); return; -} + } + + if (!this._checkStatus("fly", fromUserAction, true)) return; + if (core.flags.flyNearStair && !core.nearStair()) { + core.playSound("操作失败"); + core.drawTip( + "只有在楼梯边才能使用" + core.material.items["fly"].name, + "fly" + ); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + return; + } + if (!core.canUseItem("fly")) { + core.playSound("操作失败"); + core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + return; + } + core.playSound("打开界面"); + core.useItem("fly", true); + return; +}; events.prototype.flyTo = function (toId, callback) { - return this.eventdata.flyTo(toId, callback); -} + return this.eventdata.flyTo(toId, callback); +}; ////// 点击装备栏时的打开操作 ////// events.prototype.openEquipbox = function (fromUserAction) { - if (core.isReplaying()) return; - if (!this._checkStatus('equipbox', fromUserAction)) return; - core.playSound('打开界面'); - core.ui._drawEquipbox(); -} + if (core.isReplaying()) return; + if (!this._checkStatus("equipbox", fromUserAction)) return; + core.playSound("打开界面"); + core.ui._drawEquipbox(); +}; ////// 点击工具栏时的打开操作 ////// events.prototype.openToolbox = function (fromUserAction) { - if (core.isReplaying()) return; - if (!this._checkStatus('toolbox', fromUserAction)) return; - core.playSound('打开界面'); - core.ui._drawToolbox(); -} + if (core.isReplaying()) return; + if (!this._checkStatus("toolbox", fromUserAction)) return; + core.playSound("打开界面"); + core.ui._drawToolbox(); +}; ////// 点击快捷商店按钮时的打开操作 ////// events.prototype.openQuickShop = function (fromUserAction) { - if (core.isReplaying()) return; + if (core.isReplaying()) return; - if (Object.keys(core.status.shops).length == 0) { - core.playSound('操作失败'); - core.drawTip("本游戏没有快捷商店!"); - return; + if (Object.keys(core.status.shops).length == 0) { + core.playSound("操作失败"); + core.drawTip("本游戏没有快捷商店!"); + return; + } + + // --- 如果只有一个商店,则直接打开之 + if (Object.keys(core.status.shops).length == 1) { + var shopId = Object.keys(core.status.shops)[0]; + if (core.status.event.id != null) return; + if (!core.canOpenShop(shopId)) { + core.playSound("操作失败"); + core.drawTip("当前无法打开快捷商店!"); + return; } - - // --- 如果只有一个商店,则直接打开之 - if (Object.keys(core.status.shops).length == 1) { - var shopId = Object.keys(core.status.shops)[0]; - if (core.status.event.id != null) return; - if (!core.canOpenShop(shopId)) { - core.playSound('操作失败'); - core.drawTip("当前无法打开快捷商店!"); - return; - } - var message = core.canUseQuickShop(shopId); - if (message != null) { - core.playSound('操作失败'); - core.drawTip(message); - return; - } - core.openShop(shopId, false); - return; + var message = core.canUseQuickShop(shopId); + if (message != null) { + core.playSound("操作失败"); + core.drawTip(message); + return; } + core.openShop(shopId, false); + return; + } - if (!this._checkStatus('selectShop', fromUserAction)) return; - core.ui._drawQuickShop(); -} + if (!this._checkStatus("selectShop", fromUserAction)) return; + core.ui._drawQuickShop(); +}; events.prototype.openKeyBoard = function (fromUserAction) { - if (core.isReplaying()) return; - if (!this._checkStatus('keyBoard', fromUserAction)) return; - core.ui._drawKeyBoard(); -} + if (core.isReplaying()) return; + if (!this._checkStatus("keyBoard", fromUserAction)) return; + core.ui._drawKeyBoard(); +}; ////// 点击保存按钮时的打开操作 ////// events.prototype.save = function (fromUserAction) { - if (core.isReplaying()) return; - if (core.hasFlag('__forbidSave__')) { - core.playSound('操作失败'); - core.drawTip('当前禁止存档'); - return; - } - if (core.status.event.id == 'save' && core.events.recoverEvents(core.status.event.interval)) - return; - if (!this._checkStatus('save', fromUserAction)) return; - var saveIndex = core.saves.saveIndex; - var page = parseInt((saveIndex - 1) / 5), offset = saveIndex - 5 * page; - core.playSound('打开界面'); - core.ui._drawSLPanel(10 * page + offset); -} + if (core.isReplaying()) return; + if (core.hasFlag("__forbidSave__")) { + core.playSound("操作失败"); + core.drawTip("当前禁止存档"); + return; + } + if ( + core.status.event.id == "save" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + if (!this._checkStatus("save", fromUserAction)) return; + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 5), + offset = saveIndex - 5 * page; + core.playSound("打开界面"); + core.ui._drawSLPanel(10 * page + offset); +}; ////// 点击读取按钮时的打开操作 ////// events.prototype.load = function (fromUserAction) { - if (core.isReplaying()) return; - var saveIndex = core.saves.saveIndex; - var page = parseInt((saveIndex - 1) / 5), offset = saveIndex - 5 * page; - // 游戏开始前读档 - if (!core.isPlaying()) { - core.dom.startPanel.style.display = 'none'; - core.clearStatus(); - core.clearMap('all'); - core.status.event = { 'id': 'load', 'data': null }; - core.status.lockControl = true; - core.playSound('打开界面'); - core.ui._drawSLPanel(10 * page + offset); - return; - } - if (core.status.event.id == 'load' && core.events.recoverEvents(core.status.event.interval)) - return; - if (!this._checkStatus('load', fromUserAction)) return; - core.playSound('打开界面'); + if (core.isReplaying()) return; + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 5), + offset = saveIndex - 5 * page; + // 游戏开始前读档 + if (!core.isPlaying()) { + core.dom.startPanel.style.display = "none"; + core.clearStatus(); + core.clearMap("all"); + core.status.event = { id: "load", data: null }; + core.status.lockControl = true; + core.playSound("打开界面"); core.ui._drawSLPanel(10 * page + offset); -} + return; + } + if ( + core.status.event.id == "load" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + if (!this._checkStatus("load", fromUserAction)) return; + core.playSound("打开界面"); + core.ui._drawSLPanel(10 * page + offset); +}; ////// 点击设置按钮时的操作 ////// events.prototype.openSettings = function (fromUserAction) { - if (core.isReplaying()) return; - if (!this._checkStatus('settings', fromUserAction)) - return; - core.playSound('打开界面'); - core.ui._drawSettings(); -} + if (core.isReplaying()) return; + if (!this._checkStatus("settings", fromUserAction)) return; + core.playSound("打开界面"); + core.ui._drawSettings(); +}; // ------ 一些事件的具体执行过程 ------ // events.prototype.hasAsync = function () { - return Object.keys(core.animateFrame.asyncId).length > 0; -} + return Object.keys(core.animateFrame.asyncId).length > 0; +}; ////// 立刻停止所有异步事件 ////// events.prototype.stopAsync = function () { - var callbacks = []; - for (var id in core.animateFrame.asyncId) { - clearInterval(id); - callbacks.push(core.animateFrame.asyncId[id]); - } - core.animateFrame.asyncId = {}; - callbacks.forEach(function (cb) { - if (cb && cb instanceof Function) cb(); - }); -} + var callbacks = []; + for (var id in core.animateFrame.asyncId) { + clearInterval(id); + callbacks.push(core.animateFrame.asyncId[id]); + } + core.animateFrame.asyncId = {}; + callbacks.forEach(function (cb) { + if (cb && cb instanceof Function) cb(); + }); +}; events.prototype.hasAsyncAnimate = function () { - return (core.status.animateObjs || []).length > 0; -} + return (core.status.animateObjs || []).length > 0; +}; ////// 跟随 ////// events.prototype.follow = function (name) { - name = core.getMappedName(name); - if (core.material.images.images[name]) { - core.status.hero.followers.push({ "name": name }); - core.gatherFollowers(); - core.clearMap('hero'); - core.drawHero(); - } - core.clearRouteFolding(); -} + name = core.getMappedName(name); + if (core.material.images.images[name]) { + core.status.hero.followers.push({ name: name }); + core.gatherFollowers(); + core.clearMap("hero"); + core.drawHero(); + } + core.clearRouteFolding(); +}; ////// 取消跟随 ////// events.prototype.unfollow = function (name) { - if (!name) { - core.status.hero.followers = []; + if (!name) { + core.status.hero.followers = []; + } else { + name = core.getMappedName(name); + for (var i = 0; i < core.status.hero.followers.length; i++) { + if (core.status.hero.followers[i].name == name) { + core.status.hero.followers.splice(i, 1); + break; + } } - else { - name = core.getMappedName(name); - for (var i = 0; i < core.status.hero.followers.length; i++) { - if (core.status.hero.followers[i].name == name) { - core.status.hero.followers.splice(i, 1); - break; - } - } - } - core.gatherFollowers(); - core.clearMap('hero'); - core.drawHero(); - core.clearRouteFolding(); -} + } + core.gatherFollowers(); + core.clearMap("hero"); + core.drawHero(); + core.clearRouteFolding(); +}; -events.prototype._updateValueByOperator = function (value, originValue, operator) { - switch (operator) { - case '+=': value = originValue + value; break; - case '-=': value = originValue - value; break; - case '*=': value = originValue * value; break; - case '/=': value = originValue / value; break; - case '**=': value = Math.pow(originValue, value); break; - case '//=': value = Math.trunc(originValue / value); break; - case '%=': value = originValue % value; break; - case 'min=': value = Math.min(originValue, value); break; - case 'max=': value = Math.max(originValue, value); break; - default: break; - } - return value; -} +events.prototype._updateValueByOperator = function ( + value, + originValue, + operator +) { + switch (operator) { + case "+=": + value = originValue + value; + break; + case "-=": + value = originValue - value; + break; + case "*=": + value = originValue * value; + break; + case "/=": + value = originValue / value; + break; + case "**=": + value = Math.pow(originValue, value); + break; + case "//=": + value = Math.trunc(originValue / value); + break; + case "%=": + value = originValue % value; + break; + case "min=": + value = Math.min(originValue, value); + break; + case "max=": + value = Math.max(originValue, value); + break; + default: + break; + } + return value; +}; ////// 数值操作 ////// events.prototype.setValue = function (name, operator, value, prefix) { - value = this._updateValueByOperator(core.calValue(value, prefix), core.calValue(name, prefix), operator); - this._setValue_setStatus(name, value); - this._setValue_setBuff(name, value); - this._setValue_setItem(name, value); - this._setValue_setFlag(name, value); - this._setValue_setSwitch(name, value, prefix); - this._setValue_setTemp(name, value, prefix); - this._setValue_setGlobal(name, value); -} + value = this._updateValueByOperator( + core.calValue(value, prefix), + core.calValue(name, prefix), + operator + ); + this._setValue_setStatus(name, value); + this._setValue_setBuff(name, value); + this._setValue_setItem(name, value); + this._setValue_setFlag(name, value); + this._setValue_setSwitch(name, value, prefix); + this._setValue_setTemp(name, value, prefix); + this._setValue_setGlobal(name, value); +}; events.prototype._setValue_setStatus = function (name, value) { - if (name.indexOf("status:") !== 0) return; - core.setStatus(name.substring(7), value); -} + if (name.indexOf("status:") !== 0) return; + core.setStatus(name.substring(7), value); +}; events.prototype._setValue_setBuff = function (name, value) { - if (name.indexOf('buff:') !== 0) return; - core.setBuff(name.substring(5), value); -} + if (name.indexOf("buff:") !== 0) return; + core.setBuff(name.substring(5), value); +}; events.prototype._setValue_setItem = function (name, value) { - if (name.indexOf("item:") !== 0) return; - var itemId = name.substring(5), count = core.itemCount(itemId); - if (value > count) core.getItem(itemId, value - count); - else core.setItem(itemId, value); -} + if (name.indexOf("item:") !== 0) return; + var itemId = name.substring(5), + count = core.itemCount(itemId); + if (value > count) core.getItem(itemId, value - count); + else core.setItem(itemId, value); +}; events.prototype._setValue_setFlag = function (name, value) { - if (name.indexOf("flag:") !== 0) return; - core.setFlag(name.substring(5), value); -} + if (name.indexOf("flag:") !== 0) return; + core.setFlag(name.substring(5), value); +}; events.prototype._setValue_setSwitch = function (name, value, prefix) { - if (name.indexOf("switch:") !== 0) return; - core.setFlag((prefix || ":f@x@y") + "@" + name.substring(7), value); -} + if (name.indexOf("switch:") !== 0) return; + core.setFlag((prefix || ":f@x@y") + "@" + name.substring(7), value); +}; events.prototype._setValue_setTemp = function (name, value) { - if (name.indexOf("temp:") !== 0) return; - core.setFlag("@temp@" + name.substring(5), value); -} + if (name.indexOf("temp:") !== 0) return; + core.setFlag("@temp@" + name.substring(5), value); +}; events.prototype._setValue_setGlobal = function (name, value) { - if (name.indexOf("global:") !== 0) return; - core.setGlobal(name.substring(7), value); -} + if (name.indexOf("global:") !== 0) return; + core.setGlobal(name.substring(7), value); +}; ////// 设置一个怪物属性 ////// -events.prototype.setEnemy = function (id, name, value, operator, prefix, norefresh) { - if (!core.hasFlag('enemyInfo')) { - core.setFlag('enemyInfo', {}); - } - var enemyInfo = core.getFlag('enemyInfo'); - if (!enemyInfo[id]) enemyInfo[id] = {}; - if (typeof value === 'string' && name == 'name') value = value.replace(/\r/g, '\\r'); - value = this._updateValueByOperator(core.calValue(value, prefix), (core.material.enemys[id] || {})[name], operator); - enemyInfo[id][name] = value; - (core.material.enemys[id] || {})[name] = core.clone(value); - if (!norefresh) core.updateStatusBar(); -} +events.prototype.setEnemy = function ( + id, + name, + value, + operator, + prefix, + norefresh +) { + if (!core.hasFlag("enemyInfo")) { + core.setFlag("enemyInfo", {}); + } + var enemyInfo = core.getFlag("enemyInfo"); + if (!enemyInfo[id]) enemyInfo[id] = {}; + if (typeof value === "string" && name == "name") + value = value.replace(/\r/g, "\\r"); + value = this._updateValueByOperator( + core.calValue(value, prefix), + (core.material.enemys[id] || {})[name], + operator + ); + enemyInfo[id][name] = value; + (core.material.enemys[id] || {})[name] = core.clone(value); + if (!norefresh) core.updateStatusBar(); +}; ////// 设置某个点上的怪物属性 ////// -events.prototype.setEnemyOnPoint = function (x, y, floorId, name, value, operator, prefix, norefresh) { - floorId = floorId || core.status.floorId; - var block = core.getBlock(x, y, floorId); - if (block == null) return; - if (block.event.cls.indexOf('enemy') != 0) return; - var enemy = core.material.enemys[block.event.id]; - if (enemy == null) return; - if (typeof value === 'string' && name == 'name') value = value.replaceAll(/\r/g, '\\r'); - value = this._updateValueByOperator(core.calValue(value, prefix), core.getEnemyValue(enemy, name, x, y, floorId), operator); - flags.enemyOnPoint = flags.enemyOnPoint || {}; - flags.enemyOnPoint[floorId] = flags.enemyOnPoint[floorId] || {}; - flags.enemyOnPoint[floorId][x + "," + y] = flags.enemyOnPoint[floorId][x + "," + y] || {}; - flags.enemyOnPoint[floorId][x + "," + y][name] = value; - if (!norefresh) core.updateStatusBar(); -} +events.prototype.setEnemyOnPoint = function ( + x, + y, + floorId, + name, + value, + operator, + prefix, + norefresh +) { + floorId = floorId || core.status.floorId; + var block = core.getBlock(x, y, floorId); + if (block == null) return; + if (block.event.cls.indexOf("enemy") != 0) return; + var enemy = core.material.enemys[block.event.id]; + if (enemy == null) return; + if (typeof value === "string" && name == "name") + value = value.replaceAll(/\r/g, "\\r"); + value = this._updateValueByOperator( + core.calValue(value, prefix), + core.getEnemyValue(enemy, name, x, y, floorId), + operator + ); + flags.enemyOnPoint = flags.enemyOnPoint || {}; + flags.enemyOnPoint[floorId] = flags.enemyOnPoint[floorId] || {}; + flags.enemyOnPoint[floorId][x + "," + y] = + flags.enemyOnPoint[floorId][x + "," + y] || {}; + flags.enemyOnPoint[floorId][x + "," + y][name] = value; + if (!norefresh) core.updateStatusBar(); +}; ////// 重置某个点上的怪物属性 ////// events.prototype.resetEnemyOnPoint = function (x, y, floorId, norefresh) { - delete ((flags.enemyOnPoint || {})[floorId || core.status.floorId] || {})[x + "," + y]; - if (!norefresh) core.updateStatusBar(); -} + delete ((flags.enemyOnPoint || {})[floorId || core.status.floorId] || {})[ + x + "," + y + ]; + if (!norefresh) core.updateStatusBar(); +}; ////// 将某个点上已经设置的怪物属性移动到其他点 ////// -events.prototype.moveEnemyOnPoint = function (fromX, fromY, toX, toY, floorId, norefresh) { - floorId = floorId || core.status.floorId; - if (((flags.enemyOnPoint || {})[floorId] || {})[fromX + "," + fromY]) { - flags.enemyOnPoint[floorId][toX + "," + toY] = flags.enemyOnPoint[floorId][fromX + "," + fromY]; - delete flags.enemyOnPoint[floorId][fromX + "," + fromY]; - if (!norefresh) core.updateStatusBar(); - } -} +events.prototype.moveEnemyOnPoint = function ( + fromX, + fromY, + toX, + toY, + floorId, + norefresh +) { + floorId = floorId || core.status.floorId; + if (((flags.enemyOnPoint || {})[floorId] || {})[fromX + "," + fromY]) { + flags.enemyOnPoint[floorId][toX + "," + toY] = + flags.enemyOnPoint[floorId][fromX + "," + fromY]; + delete flags.enemyOnPoint[floorId][fromX + "," + fromY]; + if (!norefresh) core.updateStatusBar(); + } +}; ////// 设置楼层属性 ////// events.prototype.setFloorInfo = function (name, value, floorId, prefix) { - floorId = floorId || core.status.floorId; - core.status.maps[floorId][name] = value; - core.updateStatusBar(); -} + floorId = floorId || core.status.floorId; + core.status.maps[floorId][name] = value; + core.updateStatusBar(); +}; ////// 设置全塔属性 ////// events.prototype.setGlobalAttribute = function (name, value) { - if (typeof value == 'string') { - if ((value.charAt(0) == '"' && value.charAt(value.length - 1) == '"') - || (value.charAt(0) == "'" && value.charAt(value.length - 1) == "'")) - value = value.substring(1, value.length - 1); - // --- 检查 [] - if (value.charAt(0) == '[' && value.charAt(value.length - 1) == ']') - value = eval(value); - // --- 检查颜色 - if (/^[0-9 ]+,[0-9 ]+,[0-9 ]+(,[0-9. ]+)?$/.test(value)) { - value = 'rgba(' + value + ')'; - } + if (typeof value == "string") { + if ( + (value.charAt(0) == '"' && value.charAt(value.length - 1) == '"') || + (value.charAt(0) == "'" && value.charAt(value.length - 1) == "'") + ) + value = value.substring(1, value.length - 1); + // --- 检查 [] + if (value.charAt(0) == "[" && value.charAt(value.length - 1) == "]") + value = eval(value); + // --- 检查颜色 + if (/^[0-9 ]+,[0-9 ]+,[0-9 ]+(,[0-9. ]+)?$/.test(value)) { + value = "rgba(" + value + ")"; } - core.status.globalAttribute[name] = value; - core.setFlag('globalAttribute', core.status.globalAttribute); - core.resize(); -} + } + core.status.globalAttribute[name] = value; + core.setFlag("globalAttribute", core.status.globalAttribute); + core.resize(); +}; ////// 设置全局开关 ////// events.prototype.setGlobalFlag = function (name, value) { - var flags = core.getFlag("globalFlags", {}); - if (name.startsWith('s:')) { - name = name.substring(2); - var statusBarItems = core.flags.statusBarItems.filter(function (v) { return v != name; }); - if (value) statusBarItems.push(name); - core.flags.statusBarItems = statusBarItems; - flags.statusBarItems = core.clone(statusBarItems); - } else { - flags[name] = core.flags[name] = value; - } - core.setFlag("globalFlags", flags); - core.resize(); - if (name == 'blurFg') - core.redrawMap(); -} + var flags = core.getFlag("globalFlags", {}); + if (name.startsWith("s:")) { + name = name.substring(2); + var statusBarItems = core.flags.statusBarItems.filter(function (v) { + return v != name; + }); + if (value) statusBarItems.push(name); + core.flags.statusBarItems = statusBarItems; + flags.statusBarItems = core.clone(statusBarItems); + } else { + flags[name] = core.flags[name] = value; + } + core.setFlag("globalFlags", flags); + core.resize(); + if (name == "blurFg") core.redrawMap(); +}; ////// 设置文件别名 ////// events.prototype.setNameMap = function (name, value) { - if (!core.hasFlag('__nameMap__')) core.setFlag('__nameMap__', {}); - flags.__nameMap__[name] = value; -} + if (!core.hasFlag("__nameMap__")) core.setFlag("__nameMap__", {}); + flags.__nameMap__[name] = value; +}; ////// 设置剧情文本的属性 ////// events.prototype.setTextAttribute = function (data) { - if (!core.isPlaying()) return; - ["position", "offset", "align", "bold", "titlefont", "textfont", "lineHeight", "time", "letterSpacing", "animateTime"].forEach(function (t) { - if (data[t] != null) core.status.textAttribute[t] = data[t]; - }); - ["background", "title", "text"].forEach(function (t) { - if ((data[t] instanceof Array) && data[t].length >= 3) { - if (data[t].length == 3) data[t].push(1); - core.status.textAttribute[t] = data[t]; - } - if (t == 'background') { - var name = core.getMappedName(data[t]); - var img = core.material.images.images[name]; - if (img && img.width == 192 && img.height == 128) { - core.status.textAttribute[t] = name; - } - } - }); - if (main.mode == 'play') core.setFlag('textAttribute', core.status.textAttribute); -} - -events.prototype.moveTextBox = function (code, loc, relative, moveMode, time, callback) { - var ctx = core.getContextByName('__text__' + code); - if (!ctx) { - if (callback) callback(); - return; + if (!core.isPlaying()) return; + [ + "position", + "offset", + "align", + "bold", + "titlefont", + "textfont", + "lineHeight", + "time", + "letterSpacing", + "animateTime", + ].forEach(function (t) { + if (data[t] != null) core.status.textAttribute[t] = data[t]; + }); + ["background", "title", "text"].forEach(function (t) { + if (data[t] instanceof Array && data[t].length >= 3) { + if (data[t].length == 3) data[t].push(1); + core.status.textAttribute[t] = data[t]; } - var sx = parseInt(ctx.canvas.getAttribute('_text_left')) || 0; - var sy = parseInt(ctx.canvas.getAttribute('_text_top')) || 0; - var dx = relative ? loc[0] : (loc[0] - sx); - var dy = relative ? loc[1] : (loc[1] - sy); - var ox = parseInt(ctx.canvas.getAttribute('_left')) || 0; - var oy = parseInt(ctx.canvas.getAttribute('_top')) || 0; - - if (!time) { - core.relocateCanvas(ctx, ox + dx, oy + dy); - ctx.canvas.setAttribute('_text_left', loc[0]); - ctx.canvas.setAttribute('_text_top', loc[1]); - if (callback) callback(); - return; + if (t == "background") { + var name = core.getMappedName(data[t]); + var img = core.material.images.images[name]; + if (img && img.width == 192 && img.height == 128) { + core.status.textAttribute[t] = name; + } } + }); + if (main.mode == "play") + core.setFlag("textAttribute", core.status.textAttribute); +}; - var moveInfo = { - sx: sx, sy: sy, dx: dx, dy: dy, ox: ox, oy: oy, - moveMode: moveMode, time: time / Math.max(core.status.replay.speed, 1) - }; - this._moveTextBox_moving(ctx, moveInfo, callback); -} +events.prototype.moveTextBox = function ( + code, + loc, + relative, + moveMode, + time, + callback +) { + var ctx = core.getContextByName("__text__" + code); + if (!ctx) { + if (callback) callback(); + return; + } + var sx = parseInt(ctx.canvas.getAttribute("_text_left")) || 0; + var sy = parseInt(ctx.canvas.getAttribute("_text_top")) || 0; + var dx = relative ? loc[0] : loc[0] - sx; + var dy = relative ? loc[1] : loc[1] - sy; + var ox = parseInt(ctx.canvas.getAttribute("_left")) || 0; + var oy = parseInt(ctx.canvas.getAttribute("_top")) || 0; + + if (!time) { + core.relocateCanvas(ctx, ox + dx, oy + dy); + ctx.canvas.setAttribute("_text_left", loc[0]); + ctx.canvas.setAttribute("_text_top", loc[1]); + if (callback) callback(); + return; + } + + var moveInfo = { + sx: sx, + sy: sy, + dx: dx, + dy: dy, + ox: ox, + oy: oy, + moveMode: moveMode, + time: time / Math.max(core.status.replay.speed, 1), + }; + this._moveTextBox_moving(ctx, moveInfo, callback); +}; events.prototype._moveTextBox_moving = function (ctx, moveInfo, callback) { - var step = 0, steps = moveInfo.time / 10; - if (steps <= 0) steps = 1; - var moveFunc = core.applyEasing(moveInfo.moveMode); - var animate = setInterval(function () { - step++; - var dx = moveInfo.dx * moveFunc(step / steps); - var dy = moveInfo.dy * moveFunc(step / steps); - core.relocateCanvas(ctx, parseInt(moveInfo.ox + dx), parseInt(moveInfo.oy + dy)); - ctx.canvas.setAttribute('_text_left', moveInfo.sx + dx); - ctx.canvas.setAttribute('_text_top', moveInfo.sy + dy); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, 10); + var step = 0, + steps = moveInfo.time / 10; + if (steps <= 0) steps = 1; + var moveFunc = core.applyEasing(moveInfo.moveMode); + var animate = setInterval(function () { + step++; + var dx = moveInfo.dx * moveFunc(step / steps); + var dy = moveInfo.dy * moveFunc(step / steps); + core.relocateCanvas( + ctx, + parseInt(moveInfo.ox + dx), + parseInt(moveInfo.oy + dy) + ); + ctx.canvas.setAttribute("_text_left", moveInfo.sx + dx); + ctx.canvas.setAttribute("_text_top", moveInfo.sy + dy); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + if (callback) callback(); + } + }, 10); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; ////// 清除对话框 ////// events.prototype.clearTextBox = function (code, callback) { - if (code == null) { - code = Object.keys(core.dymCanvas).filter(function (one) { return one.startsWith('__text__') }) - .map(function (one) { return one.substring('__text__'.length); }) - } + if (code == null) { + code = Object.keys(core.dymCanvas) + .filter(function (one) { + return one.startsWith("__text__"); + }) + .map(function (one) { + return one.substring("__text__".length); + }); + } - if (!(code instanceof Array)) code = [code]; - var index = 0; - var _work = function () { - if (index == code.length) { - if (callback) callback(); - return; - } - var ctx = '__text__' + code[index++]; - if (!core.getContextByName(ctx)) return _work(); - core.ui._animateUI('hide', ctx, function () { - core.deleteCanvas(ctx); - _work(); - }); - }; - _work(); -} + if (!(code instanceof Array)) code = [code]; + var index = 0; + var _work = function () { + if (index == code.length) { + if (callback) callback(); + return; + } + var ctx = "__text__" + code[index++]; + if (!core.getContextByName(ctx)) return _work(); + core.ui._animateUI("hide", ctx, function () { + core.deleteCanvas(ctx); + _work(); + }); + }; + _work(); +}; ////// 关门 ////// events.prototype.closeDoor = function (x, y, id, callback) { - id = id || ""; - if ((core.material.icons.animates[id] == null && core.material.icons.npc48[id] == null) - || core.getBlock(x, y) != null) { - if (callback) callback(); + id = id || ""; + if ( + (core.material.icons.animates[id] == null && + core.material.icons.npc48[id] == null) || + core.getBlock(x, y) != null + ) { + if (callback) callback(); + return; + } + var block = core.getBlockById(id); + var doorInfo = (block.event || {}).doorInfo; + if (!doorInfo) { + if (callback) callback(); + return; + } + + core.playSound(doorInfo.closeSound); + var blockInfo = core.getBlockInfo(block); + var speed = (doorInfo.time || 160) / 4; + blockInfo.posX = 3; + core.maps._drawBlockInfo(blockInfo, x, y); + + var cb = function () { + core.setBlock(id, x, y); + core.showBlock(x, y); + if (callback) callback(); + }; + + var animate = window.setInterval( + function () { + blockInfo.posX--; + if (blockInfo.posX < 0) { + clearInterval(animate); + delete core.animateFrame.asyncId[animate]; + cb(); return; - } - var block = core.getBlockById(id); - var doorInfo = (block.event || {}).doorInfo; - if (!doorInfo) { - if (callback) callback(); - return; - } + } + core.maps._drawBlockInfo(blockInfo, x, y); + }, + core.status.replay.speed == 24 + ? 1 + : speed / Math.max(core.status.replay.speed, 1) + ); - core.playSound(doorInfo.closeSound); - var blockInfo = core.getBlockInfo(block); - var speed = (doorInfo.time || 160) / 4; - blockInfo.posX = 3; - core.maps._drawBlockInfo(blockInfo, x, y); - - var cb = function () { - core.setBlock(id, x, y); - core.showBlock(x, y); - if (callback) callback(); - } - - var animate = window.setInterval(function () { - blockInfo.posX--; - if (blockInfo.posX < 0) { - clearInterval(animate); - delete core.animateFrame.asyncId[animate]; - cb(); - return; - } - core.maps._drawBlockInfo(blockInfo, x, y); - }, core.status.replay.speed == 24 ? 1 : speed / Math.max(core.status.replay.speed, 1)); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; +}; ////// 显示图片 ////// -events.prototype.showImage = function (code, image, sloc, loc, opacityVal, time, callback) { - var imageName = null; - if (typeof image == 'string') { - imageName = image; - if (image.endsWith(':x') || image.endsWith(':y') || image.endsWith(':o')) { - image = image.substring(0, image.length - 2); - } - image = core.getMappedName(image); - image = core.material.images.images[image]; +events.prototype.showImage = function ( + code, + image, + sloc, + loc, + opacityVal, + time, + callback +) { + var imageName = null; + if (typeof image == "string") { + imageName = image; + if (image.endsWith(":x") || image.endsWith(":y") || image.endsWith(":o")) { + image = image.substring(0, image.length - 2); } - if (!image) { - if (callback) callback(); - return; - } - sloc = sloc || []; - var sx = core.calValue(sloc[0]) || 0, sy = core.calValue(sloc[1]) || 0; - var sw = core.calValue(sloc[2]), sh = core.calValue(sloc[3]); - if (sw == null) sw = image.width; - if (sh == null) sh = image.height; - loc = loc || []; - var x = core.calValue(loc[0]) || 0, y = core.calValue(loc[1]) || 0; - var w = core.calValue(loc[2]), h = core.calValue(loc[3]); - if (w == null) w = sw; - if (h == null) h = sh; - var zIndex = code + 100; - time = time || 0; - var name = "image" + zIndex; - var ctx = core.createCanvas(name, x, y, w, h, zIndex); - core.drawImage(ctx, imageName == null ? image : imageName, sx, sy, sw, sh, 0, 0, w, h); - if (time == 0) { - core.setOpacity(name, opacityVal); - if (callback) callback(); - return; - } - core.setOpacity(name, 0); - this.moveImage(code, null, opacityVal, null, time, callback); -} + image = core.getMappedName(image); + image = core.material.images.images[image]; + } + if (!image) { + if (callback) callback(); + return; + } + sloc = sloc || []; + var sx = core.calValue(sloc[0]) || 0, + sy = core.calValue(sloc[1]) || 0; + var sw = core.calValue(sloc[2]), + sh = core.calValue(sloc[3]); + if (sw == null) sw = image.width; + if (sh == null) sh = image.height; + loc = loc || []; + var x = core.calValue(loc[0]) || 0, + y = core.calValue(loc[1]) || 0; + var w = core.calValue(loc[2]), + h = core.calValue(loc[3]); + if (w == null) w = sw; + if (h == null) h = sh; + var zIndex = code + 100; + time = time || 0; + var name = "image" + zIndex; + var ctx = core.createCanvas(name, x, y, w, h, zIndex); + core.drawImage( + ctx, + imageName == null ? image : imageName, + sx, + sy, + sw, + sh, + 0, + 0, + w, + h + ); + if (time == 0) { + core.setOpacity(name, opacityVal); + if (callback) callback(); + return; + } + core.setOpacity(name, 0); + this.moveImage(code, null, opacityVal, null, time, callback); +}; ////// 隐藏图片 ////// events.prototype.hideImage = function (code, time, callback) { - time = time || 0; - var name = "image" + (code + 100); - if (time == 0 || !core.dymCanvas[name]) { - core.deleteCanvas(name); - if (callback) callback(); - return; - } - this.moveImage(code, null, 0, null, time, function () { - core.deleteCanvas(name); - if (callback) callback(); - }); -} + time = time || 0; + var name = "image" + (code + 100); + if (time == 0 || !core.dymCanvas[name]) { + core.deleteCanvas(name); + if (callback) callback(); + return; + } + this.moveImage(code, null, 0, null, time, function () { + core.deleteCanvas(name); + if (callback) callback(); + }); +}; ////// 移动图片 ////// -events.prototype.moveImage = function (code, to, opacityVal, moveMode, time, callback) { - to = to || []; - var name = "image" + (code + 100); - if (!core.dymCanvas[name]) { - if (callback) callback(); - return; - } - var getOrDefault = function (a, b) { - a = core.calValue(a); - return a != null ? a : b; - } - var canvas = core.dymCanvas[name].canvas; - var fromX = parseFloat(canvas.getAttribute("_left")), - fromY = parseFloat(canvas.getAttribute("_top")), - toX = getOrDefault(to[0], fromX), toY = getOrDefault(to[1], fromY); +events.prototype.moveImage = function ( + code, + to, + opacityVal, + moveMode, + time, + callback +) { + to = to || []; + var name = "image" + (code + 100); + if (!core.dymCanvas[name]) { + if (callback) callback(); + return; + } + var getOrDefault = function (a, b) { + a = core.calValue(a); + return a != null ? a : b; + }; + var canvas = core.dymCanvas[name].canvas; + var fromX = parseFloat(canvas.getAttribute("_left")), + fromY = parseFloat(canvas.getAttribute("_top")), + toX = getOrDefault(to[0], fromX), + toY = getOrDefault(to[1], fromY); - var opacity = parseFloat(canvas.style.opacity), toOpacity = getOrDefault(opacityVal, opacity); + var opacity = parseFloat(canvas.style.opacity), + toOpacity = getOrDefault(opacityVal, opacity); - if (!time) { - core.relocateCanvas(name, toX, toY); - core.setOpacity(toOpacity); - if (callback) callback(); - return; - } + if (!time) { + core.relocateCanvas(name, toX, toY); + core.setOpacity(toOpacity); + if (callback) callback(); + return; + } - this._moveImage_moving(name, { - fromX: fromX, fromY: fromY, toX: toX, toY: toY, opacity: opacity, toOpacity: toOpacity, - moveMode: moveMode, time: time / Math.max(core.status.replay.speed, 1) - }, callback) -} + this._moveImage_moving( + name, + { + fromX: fromX, + fromY: fromY, + toX: toX, + toY: toY, + opacity: opacity, + toOpacity: toOpacity, + moveMode: moveMode, + time: time / Math.max(core.status.replay.speed, 1), + }, + callback + ); +}; events.prototype._moveImage_moving = function (name, moveInfo, callback) { - var per_time = 10, step = 0, steps = parseInt(moveInfo.time / per_time); - if (steps <= 0) steps = 1; - var fromX = moveInfo.fromX, fromY = moveInfo.fromY, toX = moveInfo.toX, toY = moveInfo.toY, - opacity = moveInfo.opacity, toOpacity = moveInfo.toOpacity; - var currX = fromX, currY = fromY, currOpacity = opacity; - var moveFunc = core.applyEasing(moveInfo.moveMode); - var animate = setInterval(function () { - step++; - currOpacity = opacity + (toOpacity - opacity) * moveFunc(step / steps); - currX = parseInt(fromX + (toX - fromX) * moveFunc(step / steps)); - currY = parseInt(fromY + (toY - fromY) * moveFunc(step / steps)); - core.setOpacity(name, currOpacity); - core.relocateCanvas(name, currX, currY); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, per_time); + var per_time = 10, + step = 0, + steps = parseInt(moveInfo.time / per_time); + if (steps <= 0) steps = 1; + var fromX = moveInfo.fromX, + fromY = moveInfo.fromY, + toX = moveInfo.toX, + toY = moveInfo.toY, + opacity = moveInfo.opacity, + toOpacity = moveInfo.toOpacity; + var currX = fromX, + currY = fromY, + currOpacity = opacity; + var moveFunc = core.applyEasing(moveInfo.moveMode); + var animate = setInterval(function () { + step++; + currOpacity = opacity + (toOpacity - opacity) * moveFunc(step / steps); + currX = parseInt(fromX + (toX - fromX) * moveFunc(step / steps)); + currY = parseInt(fromY + (toY - fromY) * moveFunc(step / steps)); + core.setOpacity(name, currOpacity); + core.relocateCanvas(name, currX, currY); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + if (callback) callback(); + } + }, per_time); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; ////// 旋转图片 ////// -events.prototype.rotateImage = function (code, center, angle, moveMode, time, callback) { - center = center || []; - var name = "image" + (code + 100); - if (!core.dymCanvas[name]) { - if (callback) callback(); - return; - } - var canvas = core.dymCanvas[name].canvas; - var centerX = core.calValue(center[0]), centerY = core.calValue(center[1]); +events.prototype.rotateImage = function ( + code, + center, + angle, + moveMode, + time, + callback +) { + center = center || []; + var name = "image" + (code + 100); + if (!core.dymCanvas[name]) { + if (callback) callback(); + return; + } + var canvas = core.dymCanvas[name].canvas; + var centerX = core.calValue(center[0]), + centerY = core.calValue(center[1]); - var fromAngle = parseFloat(canvas.getAttribute('_angle')) || 0; + var fromAngle = parseFloat(canvas.getAttribute("_angle")) || 0; - if (!time) { - core.rotateCanvas(name, fromAngle + angle, centerX, centerY); - if (callback) callback(); - return; - } + if (!time) { + core.rotateCanvas(name, fromAngle + angle, centerX, centerY); + if (callback) callback(); + return; + } - var rotateInfo = { - fromAngle: fromAngle, angle: angle, centerX: centerX, centerY: centerY, - moveMode: moveMode, time: time / Math.max(core.status.replay.speed, 1) - } - this._rotateImage_rotating(name, rotateInfo, callback); -} + var rotateInfo = { + fromAngle: fromAngle, + angle: angle, + centerX: centerX, + centerY: centerY, + moveMode: moveMode, + time: time / Math.max(core.status.replay.speed, 1), + }; + this._rotateImage_rotating(name, rotateInfo, callback); +}; events.prototype._rotateImage_rotating = function (name, rotateInfo, callback) { - var per_time = 10, step = 0, steps = parseInt(rotateInfo.time / per_time); - if (steps <= 0) steps = 1; - var moveFunc = core.applyEasing(rotateInfo.moveMode); - var animate = setInterval(function () { - step++; - var currAngle = rotateInfo.fromAngle + rotateInfo.angle * moveFunc(step / steps); - core.rotateCanvas(name, currAngle, rotateInfo.centerX, rotateInfo.centerY); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, per_time); + var per_time = 10, + step = 0, + steps = parseInt(rotateInfo.time / per_time); + if (steps <= 0) steps = 1; + var moveFunc = core.applyEasing(rotateInfo.moveMode); + var animate = setInterval(function () { + step++; + var currAngle = + rotateInfo.fromAngle + rotateInfo.angle * moveFunc(step / steps); + core.rotateCanvas(name, currAngle, rotateInfo.centerX, rotateInfo.centerY); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + if (callback) callback(); + } + }, per_time); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; ////// 放缩一张图片 ////// -events.prototype.scaleImage = function (code, center, scale, moveMode, time, callback) { - center = center || []; - var name = "image" + (code + 100); - if (!core.dymCanvas[name]) { - if (callback) callback(); - return; - } - var ctx = core.dymCanvas[name]; - var currScale = 1.0; - if (ctx.canvas.hasAttribute('_scale')) { - currScale = parseFloat(ctx.canvas.getAttribute('_scale')); - } - var ratio = ctx.canvas.hasAttribute('isHD') ? core.domStyle.ratio : 1; - var width = ctx.canvas.width / ratio, height = ctx.canvas.height / ratio; - var currLeft = parseFloat(ctx.canvas.getAttribute("_left")); - var currTop = parseFloat(ctx.canvas.getAttribute("_top")); - var centerX = core.calValue(center[0]), centerY = core.calValue(center[1]); - if (centerX == null || centerY == null) { - centerX = currLeft + width * currScale / 2; - centerY = currTop + height * currScale / 2; - } - var scaleInfo = { - x: (currLeft - centerX) / currScale, y: (currTop - centerY) / currScale, centerX: centerX, centerY: centerY, - width: width, height: height, currScale: currScale, scale: scale, moveMode: moveMode, time: time - } - this._scaleImage_scale(ctx, scaleInfo, callback); -} +events.prototype.scaleImage = function ( + code, + center, + scale, + moveMode, + time, + callback +) { + center = center || []; + var name = "image" + (code + 100); + if (!core.dymCanvas[name]) { + if (callback) callback(); + return; + } + var ctx = core.dymCanvas[name]; + var currScale = 1.0; + if (ctx.canvas.hasAttribute("_scale")) { + currScale = parseFloat(ctx.canvas.getAttribute("_scale")); + } + var ratio = ctx.canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; + var width = ctx.canvas.width / ratio, + height = ctx.canvas.height / ratio; + var currLeft = parseFloat(ctx.canvas.getAttribute("_left")); + var currTop = parseFloat(ctx.canvas.getAttribute("_top")); + var centerX = core.calValue(center[0]), + centerY = core.calValue(center[1]); + if (centerX == null || centerY == null) { + centerX = currLeft + (width * currScale) / 2; + centerY = currTop + (height * currScale) / 2; + } + var scaleInfo = { + x: (currLeft - centerX) / currScale, + y: (currTop - centerY) / currScale, + centerX: centerX, + centerY: centerY, + width: width, + height: height, + currScale: currScale, + scale: scale, + moveMode: moveMode, + time: time, + }; + this._scaleImage_scale(ctx, scaleInfo, callback); +}; events.prototype._scaleInfo_scale = function (ctx, scaleInfo, scale) { - core.resizeCanvas(ctx, scaleInfo.width * scale, scaleInfo.height * scale, true); - core.relocateCanvas(ctx, scaleInfo.centerX + scaleInfo.x * scale, scaleInfo.centerY + scaleInfo.y * scale); - ctx.canvas.setAttribute('_scale', scale); -} + core.resizeCanvas( + ctx, + scaleInfo.width * scale, + scaleInfo.height * scale, + true + ); + core.relocateCanvas( + ctx, + scaleInfo.centerX + scaleInfo.x * scale, + scaleInfo.centerY + scaleInfo.y * scale + ); + ctx.canvas.setAttribute("_scale", scale); +}; events.prototype._scaleImage_scale = function (ctx, scaleInfo, callback) { - if (!scaleInfo.time) { - this._scaleInfo_scale(ctx, scaleInfo, scaleInfo.scale); - if (callback) callback(); - return; + if (!scaleInfo.time) { + this._scaleInfo_scale(ctx, scaleInfo, scaleInfo.scale); + if (callback) callback(); + return; + } + + var per_time = 10, + step = 0, + steps = parseInt(scaleInfo.time / per_time); + if (steps <= 0) steps = 1; + var moveFunc = core.applyEasing(scaleInfo.moveMode); + + var animate = setInterval(function () { + step++; + var scale = + scaleInfo.currScale + + (scaleInfo.scale - scaleInfo.currScale) * moveFunc(step / steps); + core.events._scaleInfo_scale(ctx, scaleInfo, scale); + if (step == steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + if (callback) callback(); } + }, per_time); - var per_time = 10, step = 0, steps = parseInt(scaleInfo.time / per_time); - if (steps <= 0) steps = 1; - var moveFunc = core.applyEasing(scaleInfo.moveMode); - - var animate = setInterval(function () { - step++; - var scale = scaleInfo.currScale + (scaleInfo.scale - scaleInfo.currScale) * moveFunc(step / steps); - core.events._scaleInfo_scale(ctx, scaleInfo, scale); - if (step == steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, per_time); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; ////// 绘制或取消一张gif图片 ////// events.prototype.showGif = function (name, x, y) { - name = core.getMappedName(name); - var image = core.material.images.images[name]; - if (image) { - var gif = new Image(); - gif.src = image.src; - gif.style.position = 'absolute'; - gif.style.left = x * core.domStyle.scale + "px"; - gif.style.top = y * core.domStyle.scale + "px"; - gif.style.width = image.width * core.domStyle.scale + "px"; - gif.style.height = image.height * core.domStyle.scale + "px"; - core.dom.gif2.appendChild(gif); - } - else { - core.dom.gif2.innerHTML = ""; - } -} + name = core.getMappedName(name); + var image = core.material.images.images[name]; + if (image) { + var gif = new Image(); + gif.src = image.src; + gif.style.position = "absolute"; + gif.style.left = x * core.domStyle.scale + "px"; + gif.style.top = y * core.domStyle.scale + "px"; + gif.style.width = image.width * core.domStyle.scale + "px"; + gif.style.height = image.height * core.domStyle.scale + "px"; + core.dom.gif2.appendChild(gif); + } else { + core.dom.gif2.innerHTML = ""; + } +}; ////// 淡入淡出音乐 ////// events.prototype.setVolume = function (value, time, callback) { - var set = function (value) { - core.musicStatus.designVolume = value; - if (core.musicStatus.playingBgm) - core.material.bgms[core.musicStatus.playingBgm].volume = core.musicStatus.userVolume * core.musicStatus.designVolume; + var set = function (value) { + core.musicStatus.designVolume = value; + if (core.musicStatus.playingBgm) + core.material.bgms[core.musicStatus.playingBgm].volume = + core.musicStatus.userVolume * core.musicStatus.designVolume; + }; + if (!time || time < 100) { + set(value); + if (callback) callback(); + return; + } + var currVolume = core.musicStatus.designVolume; + time /= Math.max(core.status.replay.speed, 1); + var per_time = 10, + step = 0, + steps = parseInt(time / per_time); + if (steps <= 0) steps = 1; + var animate = setInterval(function () { + step++; + set(currVolume + ((value - currVolume) * step) / steps); + if (step >= steps) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + if (callback) callback(); } - if (!time || time < 100) { - set(value); - if (callback) callback(); - return; - } - var currVolume = core.musicStatus.designVolume; - time /= Math.max(core.status.replay.speed, 1); - var per_time = 10, step = 0, steps = parseInt(time / per_time); - if (steps <= 0) steps = 1; - var animate = setInterval(function () { - step++; - set(currVolume + (value - currVolume) * step / steps); - if (step >= steps) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - if (callback) callback(); - } - }, per_time); + }, per_time); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = callback; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = callback; +}; ////// 画面震动 ////// events.prototype.vibrate = function (direction, time, speed, power, callback) { - if (core.isReplaying()) { - if (callback) callback(); - return; + if (core.isReplaying()) { + if (callback) callback(); + return; + } + if (!time) time = 1000; + speed = speed || 10; + power = power || 10; + var shakeInfo = { + duration: parseInt(time / 10), + speed: speed, + power: power, + direction: 1, + shake: 0, + }; + if (direction == "random") { + direction = ["horizontal", "vertical", "diagonal1", "diagonal2"][ + Math.floor(Math.random() * 4) + ]; + } + var cb = function () { + core.addGameCanvasTranslate(0, 0); + if (callback) callback(); + }; + var animate = setInterval(function () { + core.events._vibrate_update(shakeInfo); + switch (direction) { + case "vertical": + core.addGameCanvasTranslate(0, shakeInfo.shake); + break; + case "diagonal1": + core.addGameCanvasTranslate(shakeInfo.shake, shakeInfo.shake); + break; + case "diagonal2": + core.addGameCanvasTranslate(-shakeInfo.shake, shakeInfo.shake); + break; + default: + core.addGameCanvasTranslate(shakeInfo.shake, 0); } - if (!time) time = 1000; - speed = speed || 10; - power = power || 10; - var shakeInfo = { duration: parseInt(time / 10), speed: speed, power: power, direction: 1, shake: 0 }; - if (direction == 'random') { - direction = ['horizontal', 'vertical', 'diagonal1', 'diagonal2'][Math.floor(Math.random() * 4)]; + if (shakeInfo.duration === 0 && shakeInfo.shake == 0) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + cb(); } - var cb = function () { - core.addGameCanvasTranslate(0, 0); - if (callback) callback(); - } - var animate = setInterval(function () { - core.events._vibrate_update(shakeInfo); - switch (direction) { - case 'vertical': core.addGameCanvasTranslate(0, shakeInfo.shake); break; - case 'diagonal1': core.addGameCanvasTranslate(shakeInfo.shake, shakeInfo.shake); break; - case 'diagonal2': core.addGameCanvasTranslate(-shakeInfo.shake, shakeInfo.shake); break; - default: core.addGameCanvasTranslate(shakeInfo.shake, 0); - } - if (shakeInfo.duration === 0 && shakeInfo.shake == 0) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - cb(); - } - }, 10); + }, 10); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; -} + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; +}; events.prototype._vibrate_update = function (shakeInfo) { - if (shakeInfo.duration >= 1 || shakeInfo.shake != 0) { - var delta = shakeInfo.speed * shakeInfo.direction / 6; - if (shakeInfo.duration <= 1 && shakeInfo.shake * (shakeInfo.shake + delta) < 0) { - shakeInfo.shake = 0; - } else { - shakeInfo.shake += delta; - } - if (shakeInfo.shake > shakeInfo.power) { - shakeInfo.direction = -1; - } - if (shakeInfo.shake < -shakeInfo.power) { - shakeInfo.direction = 1; - } - if (shakeInfo.duration >= 1) { - shakeInfo.duration -= 1 - } + if (shakeInfo.duration >= 1 || shakeInfo.shake != 0) { + var delta = (shakeInfo.speed * shakeInfo.direction) / 6; + if ( + shakeInfo.duration <= 1 && + shakeInfo.shake * (shakeInfo.shake + delta) < 0 + ) { + shakeInfo.shake = 0; + } else { + shakeInfo.shake += delta; } -} + if (shakeInfo.shake > shakeInfo.power) { + shakeInfo.direction = -1; + } + if (shakeInfo.shake < -shakeInfo.power) { + shakeInfo.direction = 1; + } + if (shakeInfo.duration >= 1) { + shakeInfo.duration -= 1; + } + } +}; /////// 使用事件让勇士移动。这个函数将不会触发任何事件 ////// events.prototype.eventMoveHero = function (steps, time, callback) { - time = time || core.values.moveSpeed; - var step = 0, moveSteps = (steps || []).map(function (t) { - return [t.split(':')[0], parseInt(t.split(':')[1] || "1")]; - }).filter(function (t) { - return ['up', 'down', 'left', 'right', 'forward', 'backward', 'leftup', 'leftdown', 'rightup', 'rightdown', 'speed'].indexOf(t[0]) >= 0 - && !(t[0] == 'speed' && t[1] < 16); - }); - core.status.heroMoving = -1; - var _run = function () { - var cb = function () { - core.status.heroMoving = 0; - core.drawHero(); - if (callback) callback(); - } - - var animate = window.setInterval(function () { - if (moveSteps.length == 0) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - cb(); - } - else { - if (step == 0 && moveSteps[0][0] == 'speed' && moveSteps[0][1] >= 16) { - time = moveSteps[0][1]; - moveSteps.shift(); - clearInterval(animate); - delete core.animateFrame.asyncId[animate]; - _run(); - } - else if (core.events._eventMoveHero_moving(++step, moveSteps)) - step = 0; - } - }, core.status.replay.speed == 24 ? 1 : time / 8 / core.status.replay.speed); - - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; - } - _run(); -} - -events.prototype._eventMoveHero_moving = function (step, moveSteps) { - var curr = moveSteps[0]; - var direction = curr[0], x = core.getHeroLoc('x'), y = core.getHeroLoc('y'); - // ------ 前进/后退 - var o = direction == 'backward' ? -1 : 1; - if (direction == 'forward' || direction == 'backward') direction = core.getHeroLoc('direction'); - var faceDirection = direction; - if (direction == 'leftup' || direction == 'leftdown') faceDirection = 'left'; - if (direction == 'rightup' || direction == 'rightdown') faceDirection = 'right'; - core.setHeroLoc('direction', direction); - if (curr[1] <= 0) { - core.setHeroLoc('direction', faceDirection); - moveSteps.shift(); - return true; - } - if (step <= 4) { - core.drawHero('leftFoot', 4 * o * step); - } - else if (step <= 8) { - core.drawHero('rightFoot', 4 * o * step); - } - if (step == 8) { - core.setHeroLoc('x', x + o * core.utils.scan2[direction].x, true); - core.setHeroLoc('y', y + o * core.utils.scan2[direction].y, true); - core.updateFollowers(); - curr[1]--; - if (curr[1] <= 0) moveSteps.shift(); - core.setHeroLoc('direction', faceDirection); - return true; - } - return false; -} - -////// 勇士跳跃事件 ////// -events.prototype.jumpHero = function (ex, ey, time, callback) { - var sx = core.getHeroLoc('x'), sy = core.getHeroLoc('y'); - if (ex == null) ex = sx; - if (ey == null) ey = sy; - var sx = core.status.hero.loc.x, sy = core.status.hero.loc.y; - if (!core.isset(ex)) ex = sx; - if (!core.isset(ey)) ey = sy; - var jumpInfo = core.maps.__generateJumpInfo(sx, sy, ex, ey, time || 500); - jumpInfo.icon = core.material.icons.hero[core.getHeroLoc('direction')]; - jumpInfo.width = core.material.icons.hero.width || 32; - jumpInfo.height = core.material.icons.hero.height; - - this._jumpHero_doJump(jumpInfo, callback); -} - -events.prototype._jumpHero_doJump = function (jumpInfo, callback) { + time = time || core.values.moveSpeed; + var step = 0, + moveSteps = (steps || []) + .map(function (t) { + return [t.split(":")[0], parseInt(t.split(":")[1] || "1")]; + }) + .filter(function (t) { + return ( + [ + "up", + "down", + "left", + "right", + "forward", + "backward", + "leftup", + "leftdown", + "rightup", + "rightdown", + "speed", + ].indexOf(t[0]) >= 0 && !(t[0] == "speed" && t[1] < 16) + ); + }); + core.status.heroMoving = -1; + var _run = function () { var cb = function () { - core.setHeroLoc('x', jumpInfo.ex); - core.setHeroLoc('y', jumpInfo.ey); - core.status.heroMoving = 0; - core.drawHero(); - if (callback) callback(); - } + core.status.heroMoving = 0; + core.drawHero(); + if (callback) callback(); + }; - core.status.heroMoving = -1; - var animate = window.setInterval(function () { - if (jumpInfo.jump_count > 0) - core.events._jumpHero_jumping(jumpInfo) - else { - delete core.animateFrame.asyncId[animate]; + var animate = window.setInterval( + function () { + if (moveSteps.length == 0) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + cb(); + } else { + if ( + step == 0 && + moveSteps[0][0] == "speed" && + moveSteps[0][1] >= 16 + ) { + time = moveSteps[0][1]; + moveSteps.shift(); clearInterval(animate); - cb(); + delete core.animateFrame.asyncId[animate]; + _run(); + } else if (core.events._eventMoveHero_moving(++step, moveSteps)) + step = 0; } - }, jumpInfo.per_time); + }, + core.status.replay.speed == 24 ? 1 : time / 8 / core.status.replay.speed + ); core.animateFrame.lastAsyncId = animate; core.animateFrame.asyncId[animate] = cb; -} + }; + _run(); +}; + +events.prototype._eventMoveHero_moving = function (step, moveSteps) { + var curr = moveSteps[0]; + var direction = curr[0], + x = core.getHeroLoc("x"), + y = core.getHeroLoc("y"); + // ------ 前进/后退 + var o = direction == "backward" ? -1 : 1; + if (direction == "forward" || direction == "backward") + direction = core.getHeroLoc("direction"); + var faceDirection = direction; + if (direction == "leftup" || direction == "leftdown") faceDirection = "left"; + if (direction == "rightup" || direction == "rightdown") + faceDirection = "right"; + core.setHeroLoc("direction", direction); + if (curr[1] <= 0) { + core.setHeroLoc("direction", faceDirection); + moveSteps.shift(); + return true; + } + if (step <= 4) { + core.drawHero("leftFoot", 4 * o * step); + } else if (step <= 8) { + core.drawHero("rightFoot", 4 * o * step); + } + if (step == 8) { + core.setHeroLoc("x", x + o * core.utils.scan2[direction].x, true); + core.setHeroLoc("y", y + o * core.utils.scan2[direction].y, true); + core.updateFollowers(); + curr[1]--; + if (curr[1] <= 0) moveSteps.shift(); + core.setHeroLoc("direction", faceDirection); + return true; + } + return false; +}; + +////// 勇士跳跃事件 ////// +events.prototype.jumpHero = function (ex, ey, time, callback) { + var sx = core.getHeroLoc("x"), + sy = core.getHeroLoc("y"); + if (ex == null) ex = sx; + if (ey == null) ey = sy; + var sx = core.status.hero.loc.x, + sy = core.status.hero.loc.y; + if (!core.isset(ex)) ex = sx; + if (!core.isset(ey)) ey = sy; + var jumpInfo = core.maps.__generateJumpInfo(sx, sy, ex, ey, time || 500); + jumpInfo.icon = core.material.icons.hero[core.getHeroLoc("direction")]; + jumpInfo.width = core.material.icons.hero.width || 32; + jumpInfo.height = core.material.icons.hero.height; + + this._jumpHero_doJump(jumpInfo, callback); +}; + +events.prototype._jumpHero_doJump = function (jumpInfo, callback) { + var cb = function () { + core.setHeroLoc("x", jumpInfo.ex); + core.setHeroLoc("y", jumpInfo.ey); + core.status.heroMoving = 0; + core.drawHero(); + if (callback) callback(); + }; + + core.status.heroMoving = -1; + var animate = window.setInterval(function () { + if (jumpInfo.jump_count > 0) core.events._jumpHero_jumping(jumpInfo); + else { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + cb(); + } + }, jumpInfo.per_time); + + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; +}; events.prototype._jumpHero_jumping = function (jumpInfo) { - core.clearMap('hero'); - core.maps.__updateJumpInfo(jumpInfo); - var x = core.getHeroLoc('x'), - y = core.getHeroLoc('y'); - var nowx = jumpInfo.px, nowy = jumpInfo.py, width = jumpInfo.width || 32, height = jumpInfo.height; - core.drawHero('stop', { x: nowx - 32 * x, y: nowy - 32 * y }); -} + core.clearMap("hero"); + core.maps.__updateJumpInfo(jumpInfo); + var x = core.getHeroLoc("x"), + y = core.getHeroLoc("y"); + var nowx = jumpInfo.px, + nowy = jumpInfo.py, + width = jumpInfo.width || 32, + height = jumpInfo.height; + core.drawHero("stop", { x: nowx - 32 * x, y: nowy - 32 * y }); +}; ////// 设置角色行走图 ////// events.prototype.setHeroIcon = function (name, noDraw) { - name = core.getMappedName(name); - var img = core.material.images.images[name]; - if (!img) { - console.error("找不到图片: " + img); - return; - } - if (core.material.images.hero == img) return; - core.status.hero.image = name; - core.material.images.hero = img; - core.material.icons.hero.width = img.width / 4; - core.material.icons.hero.height = img.height / 4; - core.control.updateHeroIcon(name); - if (!noDraw) core.drawHero(); -} + name = core.getMappedName(name); + var img = core.material.images.images[name]; + if (!img) { + console.error("找不到图片: " + img); + return; + } + if (core.material.images.hero == img) return; + core.status.hero.image = name; + core.material.images.hero = img; + core.material.icons.hero.width = img.width / 4; + core.material.icons.hero.height = img.height / 4; + core.control.updateHeroIcon(name); + if (!noDraw) core.drawHero(); +}; ////// 检查升级事件 ////// events.prototype.checkLvUp = function () { - var actions = []; - while (true) { - var next = this._checkLvUp_check(); - if (next == null) break; - actions = actions.concat(next); - } - if (actions.length > 0) core.insertAction(actions); -} + var actions = []; + while (true) { + var next = this._checkLvUp_check(); + if (next == null) break; + actions = actions.concat(next); + } + if (actions.length > 0) core.insertAction(actions); +}; events.prototype._checkLvUp_check = function () { - if (core.flags.statusBarItems.indexOf('enableLevelUp') < 0 || !core.firstData.levelUp - || core.status.hero.lv >= core.firstData.levelUp.length) return null; - // 计算下一个所需要的数值 - var next = (core.firstData.levelUp[core.status.hero.lv] || {}); - var need = core.calValue(next.need); - if (need == null) return null; - if (core.status.hero.exp >= need) { - // 升级 - core.status.hero.lv++; - if (next.clear) core.status.hero.exp -= need; - return next.action || []; - } + if ( + core.flags.statusBarItems.indexOf("enableLevelUp") < 0 || + !core.firstData.levelUp || + core.status.hero.lv >= core.firstData.levelUp.length + ) return null; -} + // 计算下一个所需要的数值 + var next = core.firstData.levelUp[core.status.hero.lv] || {}; + var need = core.calValue(next.need); + if (need == null) return null; + if (core.status.hero.exp >= need) { + // 升级 + core.status.hero.lv++; + if (next.clear) core.status.hero.exp -= need; + return next.action || []; + } + return null; +}; ////// 尝试使用道具 ////// events.prototype.tryUseItem = function (itemId) { - if (itemId == 'book') { - core.ui.closePanel(); - return core.openBook(false); - } - if (itemId == 'fly') { - core.ui.closePanel(); - return core.useFly(false); - } - if (itemId == 'centerFly') { - core.ui.closePanel(); - return core.ui._drawCenterFly(); - } - if (core.canUseItem(itemId)) { - core.ui.closePanel(); - core.useItem(itemId); - } else { - core.playSound('操作失败'); - core.drawTip("当前无法使用" + core.material.items[itemId].name, itemId); - } -} + if (itemId == "book") { + core.ui.closePanel(); + return core.openBook(false); + } + if (itemId == "fly") { + core.ui.closePanel(); + return core.useFly(false); + } + if (itemId == "centerFly") { + core.ui.closePanel(); + return core.ui._drawCenterFly(); + } + if (core.canUseItem(itemId)) { + core.ui.closePanel(); + core.useItem(itemId); + } else { + core.playSound("操作失败"); + core.drawTip("当前无法使用" + core.material.items[itemId].name, itemId); + } +}; diff --git a/libs/loader.js b/libs/loader.js index e00620d..b81aba2 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -1,606 +1,818 @@ - /* loader.js:负责对资源的加载 */ "use strict"; -function loader () { - this._init(); +function loader() { + this._init(); } -loader.prototype._init = function () { - -} +loader.prototype._init = function () {}; ////// 设置加载进度条进度 ////// loader.prototype._setStartProgressVal = function (val) { - core.dom.startTopProgress.style.width = val + '%'; -} + core.dom.startTopProgress.style.width = val + "%"; +}; ////// 设置加载进度条提示文字 ////// loader.prototype._setStartLoadTipText = function (text) { - core.dom.startTopLoadTips.innerText = text; -} + core.dom.startTopLoadTips.innerText = text; +}; loader.prototype._load = function (callback) { - this._loadMusics(); - if (main.useCompress) { - this._load_async(callback); - } else { - this._load_sync(callback); - } -} + this._loadMusics(); + if (main.useCompress) { + this._load_async(callback); + } else { + this._load_sync(callback); + } +}; loader.prototype._load_sync = function (callback) { - this._loadAnimates_sync(); - this._loadSounds_sync(); - core.loader._loadMaterials_sync(function () { - core.loader._loadExtraImages_sync(function () { - core.loader._loadAutotiles_sync(function () { - core.loader._loadTilesets_sync(callback); - }) - }) + this._loadAnimates_sync(); + this._loadSounds_sync(); + core.loader._loadMaterials_sync(function () { + core.loader._loadExtraImages_sync(function () { + core.loader._loadAutotiles_sync(function () { + core.loader._loadTilesets_sync(callback); + }); }); -} + }); +}; loader.prototype._load_async = function (callback) { - core.loader._setStartLoadTipText('正在加载资源文件...'); - const all = {}; + core.loader._setStartLoadTipText("正在加载资源文件..."); + const all = {}; - const _makeOnProgress = function (name) { - if (!all[name]) all[name] = { loaded: 0, total: 0, finished: false }; - return (loaded, total) => { - all[name].loaded = loaded; - all[name].total = total; - let allLoaded = 0, allTotal = 0; - for (const one of Object.values(all)) { - allLoaded += one.loaded; - allTotal += one.total; - } - console.log(allLoaded. allTotal); - if (allTotal > 0) { - if (allLoaded == allTotal) { - core.loader._setStartLoadTipText("正在处理资源文件... 请稍候..."); - } else { - core.loader._setStartLoadTipText('正在加载资源文件... ' + - core.formatSize(allLoaded) + " / " + core.formatSize(allTotal) + - " (" + (allLoaded / allTotal * 100).toFixed(2) + "%)"); - } - core.loader._setStartProgressVal(allLoaded / allTotal * 100); - } - }; - } - const _makeOnFinished = function (name) { - return () => { - setTimeout(() => { - all[name].finished = true; - for (var one in all) { - if (!all[one].finished) return; - } - callback(); - }); + const _makeOnProgress = function (name) { + if (!all[name]) all[name] = { loaded: 0, total: 0, finished: false }; + return (loaded, total) => { + all[name].loaded = loaded; + all[name].total = total; + let allLoaded = 0, + allTotal = 0; + for (const one of Object.values(all)) { + allLoaded += one.loaded; + allTotal += one.total; + } + console.log(allLoaded.allTotal); + if (allTotal > 0) { + if (allLoaded == allTotal) { + core.loader._setStartLoadTipText("正在处理资源文件... 请稍候..."); + } else { + core.loader._setStartLoadTipText( + "正在加载资源文件... " + + core.formatSize(allLoaded) + + " / " + + core.formatSize(allTotal) + + " (" + + ((allLoaded / allTotal) * 100).toFixed(2) + + "%)" + ); } - } + core.loader._setStartProgressVal((allLoaded / allTotal) * 100); + } + }; + }; + const _makeOnFinished = function (name) { + return () => { + setTimeout(() => { + all[name].finished = true; + for (var one in all) { + if (!all[one].finished) return; + } + callback(); + }); + }; + }; - if (main.splitChunkMap) { - this._loadAnimates_chunked(main.splitChunkMap.animates, _makeOnProgress, _makeOnFinished); - this._loadSounds_chunked(main.splitChunkMap.sounds, _makeOnProgress, _makeOnFinished); - this._loadMaterials_chunked(main.splitChunkMap.materials, _makeOnProgress, _makeOnFinished); - this._loadExtraImages_chunked(main.splitChunkMap.images, _makeOnProgress, _makeOnFinished); - this._loadAutotiles_chunked(main.splitChunkMap.autotiles, _makeOnProgress, _makeOnFinished); - this._loadTilesets_chunked(main.splitChunkMap.tilesets, _makeOnProgress, _makeOnFinished); - } else { - this._loadAnimates_async(_makeOnProgress('animates'), _makeOnFinished('animates')); - this._loadSounds_async(_makeOnProgress('sounds'), _makeOnFinished('sounds')); - this._loadMaterials_async(_makeOnProgress('materials'), _makeOnFinished('materials')); - this._loadExtraImages_async(_makeOnProgress('images'), _makeOnFinished('images')); - this._loadAutotiles_async(_makeOnProgress('autotiles'), _makeOnFinished('autotiles')); - this._loadTilesets_async(_makeOnProgress('tilesets'), _makeOnFinished('tilesets')); - } -} + if (main.splitChunkMap) { + this._loadAnimates_chunked( + main.splitChunkMap.animates, + _makeOnProgress, + _makeOnFinished + ); + this._loadSounds_chunked( + main.splitChunkMap.sounds, + _makeOnProgress, + _makeOnFinished + ); + this._loadMaterials_chunked( + main.splitChunkMap.materials, + _makeOnProgress, + _makeOnFinished + ); + this._loadExtraImages_chunked( + main.splitChunkMap.images, + _makeOnProgress, + _makeOnFinished + ); + this._loadAutotiles_chunked( + main.splitChunkMap.autotiles, + _makeOnProgress, + _makeOnFinished + ); + this._loadTilesets_chunked( + main.splitChunkMap.tilesets, + _makeOnProgress, + _makeOnFinished + ); + } else { + this._loadAnimates_async( + _makeOnProgress("animates"), + _makeOnFinished("animates") + ); + this._loadSounds_async( + _makeOnProgress("sounds"), + _makeOnFinished("sounds") + ); + this._loadMaterials_async( + _makeOnProgress("materials"), + _makeOnFinished("materials") + ); + this._loadExtraImages_async( + _makeOnProgress("images"), + _makeOnFinished("images") + ); + this._loadAutotiles_async( + _makeOnProgress("autotiles"), + _makeOnFinished("autotiles") + ); + this._loadTilesets_async( + _makeOnProgress("tilesets"), + _makeOnFinished("tilesets") + ); + } +}; // ----- 加载资源文件 ------ // loader.prototype._loadMaterials_sync = function (callback) { - this._setStartLoadTipText("正在加载资源文件..."); - this.loadImages("materials", core.materials, core.material.images, function () { - core.loader._loadMaterials_afterLoad(); - callback(); - }); -} + this._setStartLoadTipText("正在加载资源文件..."); + this.loadImages( + "materials", + core.materials, + core.material.images, + function () { + core.loader._loadMaterials_afterLoad(); + callback(); + } + ); +}; loader.prototype._loadMaterials_async = function (onprogress, onfinished) { - this.loadImagesFromZip('project/materials/materials.h5data', core.materials, core.material.images, onprogress, function () { - core.loader._loadMaterials_afterLoad(); - onfinished(); - }); -} + this.loadImagesFromZip( + "project/materials/materials.h5data", + core.materials, + core.material.images, + onprogress, + function () { + core.loader._loadMaterials_afterLoad(); + onfinished(); + } + ); +}; -loader.prototype._loadMaterials_chunked = async function (chunks, makeOnProgress, makeOnFinished) { - await this._loadImagesFromChunks(chunks, core.materials, core.material.images, makeOnProgress, makeOnFinished); - core.loader._loadMaterials_afterLoad(); -} +loader.prototype._loadMaterials_chunked = async function ( + chunks, + makeOnProgress, + makeOnFinished +) { + await this._loadImagesFromChunks( + chunks, + core.materials, + core.material.images, + makeOnProgress, + makeOnFinished + ); + core.loader._loadMaterials_afterLoad(); +}; loader.prototype._loadMaterials_afterLoad = function () { - const images = core.splitImage(core.material.images['icons']); - for (let key in core.statusBar.icons) { - if (typeof core.statusBar.icons[key] == 'number') { - core.statusBar.icons[key] = images[core.statusBar.icons[key]]; - if (core.statusBar.image[key] != null) - core.statusBar.image[key].src = core.statusBar.icons[key].src; - } + const images = core.splitImage(core.material.images["icons"]); + for (let key in core.statusBar.icons) { + if (typeof core.statusBar.icons[key] == "number") { + core.statusBar.icons[key] = images[core.statusBar.icons[key]]; + if (core.statusBar.image[key] != null) + core.statusBar.image[key].src = core.statusBar.icons[key].src; } -} + } +}; // ------ 加载使用的图片 ------ // loader.prototype._loadExtraImages_sync = function (callback) { - core.material.images.images = {}; - this._setStartLoadTipText("正在加载图片文件..."); - core.loadImages("images", core.images, core.material.images.images, callback); -} + core.material.images.images = {}; + this._setStartLoadTipText("正在加载图片文件..."); + core.loadImages("images", core.images, core.material.images.images, callback); +}; loader.prototype._loadExtraImages_async = function (onprogress, onfinished) { - core.material.images.images = {}; - - // Check .gif - const gifs = images.filter(function (name) { - return name.toLowerCase().endsWith('.gif'); - }); - // gif没有被压缩在zip中,延迟加载... - this._loadExtraImages_loadLazy(gifs); + core.material.images.images = {}; - images = images.filter((name) => !name.toLowerCase().endsWith('.gif')); + // Check .gif + const gifs = images.filter(function (name) { + return name.toLowerCase().endsWith(".gif"); + }); + // gif没有被压缩在zip中,延迟加载... + this._loadExtraImages_loadLazy(gifs); - this.loadImagesFromZip('project/images/images.h5data', images, core.material.images.images, onprogress, onfinished); -} + images = images.filter((name) => !name.toLowerCase().endsWith(".gif")); -loader.prototype._loadExtraImages_chunked = function (chunks, makeOnProgress, makeOnFinished) { - core.material.images.images = {}; - let images = core.images; + this.loadImagesFromZip( + "project/images/images.h5data", + images, + core.material.images.images, + onprogress, + onfinished + ); +}; - // Check .gif - const gifs = images.filter(function (name) { - return name.toLowerCase().endsWith('.gif'); - }); - // gif没有被压缩在zip中,延迟加载... - this._loadExtraImages_loadLazy(gifs); +loader.prototype._loadExtraImages_chunked = function ( + chunks, + makeOnProgress, + makeOnFinished +) { + core.material.images.images = {}; + let images = core.images; - images = images.filter((name) => !name.toLowerCase().endsWith('.gif')); + // Check .gif + const gifs = images.filter(function (name) { + return name.toLowerCase().endsWith(".gif"); + }); + // gif没有被压缩在zip中,延迟加载... + this._loadExtraImages_loadLazy(gifs); - this._loadImagesFromChunks(chunks, images, core.material.images.images, makeOnProgress, makeOnFinished); -} + images = images.filter((name) => !name.toLowerCase().endsWith(".gif")); + + this._loadImagesFromChunks( + chunks, + images, + core.material.images.images, + makeOnProgress, + makeOnFinished + ); +}; loader.prototype._loadExtraImages_loadLazy = function (list) { - list.forEach(function (gif) { - this.loadImage("images", gif, (id, image) => { - if (image != null) { - core.material.images.images[gif] = image; - } - }); - }, this); -} + list.forEach(function (gif) { + this.loadImage("images", gif, (id, image) => { + if (image != null) { + core.material.images.images[gif] = image; + } + }); + }, this); +}; // ------ 加载自动元件 ------ // loader.prototype._loadAutotiles_sync = function (callback) { - core.material.images.autotile = {}; - var keys = Object.keys(core.material.icons.autotile); - var autotiles = {}; + core.material.images.autotile = {}; + var keys = Object.keys(core.material.icons.autotile); + var autotiles = {}; - this._setStartLoadTipText("正在加载自动元件..."); - this.loadImages("autotiles", keys, autotiles, function () { - core.loader._loadAutotiles_afterLoad(keys, autotiles); - callback(); - }); -} + this._setStartLoadTipText("正在加载自动元件..."); + this.loadImages("autotiles", keys, autotiles, function () { + core.loader._loadAutotiles_afterLoad(keys, autotiles); + callback(); + }); +}; loader.prototype._loadAutotiles_async = function (onprogress, onfinished) { - core.material.images.autotile = {}; - var keys = Object.keys(core.material.icons.autotile); - var autotiles = {}; + core.material.images.autotile = {}; + var keys = Object.keys(core.material.icons.autotile); + var autotiles = {}; - this.loadImagesFromZip('project/autotiles/autotiles.h5data', keys, autotiles, onprogress, function () { - core.loader._loadAutotiles_afterLoad(keys, autotiles); - onfinished(); - }); -} + this.loadImagesFromZip( + "project/autotiles/autotiles.h5data", + keys, + autotiles, + onprogress, + function () { + core.loader._loadAutotiles_afterLoad(keys, autotiles); + onfinished(); + } + ); +}; -loader.prototype._loadAutotiles_chunked = async function (chunks, makeOnProgress, makeOnFinished) { - core.material.images.autotile = {}; - const keys = Object.keys(core.material.icons.autotile); - const autotiles = {}; +loader.prototype._loadAutotiles_chunked = async function ( + chunks, + makeOnProgress, + makeOnFinished +) { + core.material.images.autotile = {}; + const keys = Object.keys(core.material.icons.autotile); + const autotiles = {}; - await this._loadImagesFromChunks(chunks, keys, autotiles, makeOnProgress, makeOnFinished); - core.loader._loadAutotiles_afterLoad(keys, autotiles); -} + await this._loadImagesFromChunks( + chunks, + keys, + autotiles, + makeOnProgress, + makeOnFinished + ); + core.loader._loadAutotiles_afterLoad(keys, autotiles); +}; loader.prototype._loadAutotiles_afterLoad = function (keys, autotiles) { - // autotile需要保证顺序 - keys.forEach(function (v) { - core.material.images.autotile[v] = autotiles[v]; - }); + // autotile需要保证顺序 + keys.forEach(function (v) { + core.material.images.autotile[v] = autotiles[v]; + }); - setTimeout(function () { - core.maps._makeAutotileEdges(); - }); - -} + setTimeout(function () { + core.maps._makeAutotileEdges(); + }); +}; // ------ 加载额外素材 ------ // loader.prototype._loadTilesets_sync = function (callback) { - core.material.images.tilesets = {}; - this._setStartLoadTipText("正在加载额外素材..."); - this.loadImages("tilesets", core.tilesets, core.material.images.tilesets, function () { - core.loader._loadTilesets_afterLoad(); - callback(); - }); -} + core.material.images.tilesets = {}; + this._setStartLoadTipText("正在加载额外素材..."); + this.loadImages( + "tilesets", + core.tilesets, + core.material.images.tilesets, + function () { + core.loader._loadTilesets_afterLoad(); + callback(); + } + ); +}; loader.prototype._loadTilesets_async = function (onprogress, onfinished) { - core.material.images.tilesets = {}; - this.loadImagesFromZip('project/tilesets/tilesets.h5data', core.tilesets, core.material.images.tilesets, onprogress, function () { - core.loader._loadTilesets_afterLoad(); - onfinished(); - }); -} + core.material.images.tilesets = {}; + this.loadImagesFromZip( + "project/tilesets/tilesets.h5data", + core.tilesets, + core.material.images.tilesets, + onprogress, + function () { + core.loader._loadTilesets_afterLoad(); + onfinished(); + } + ); +}; -loader.prototype._loadTilesets_chunked = async function (chunks, makeOnProgress, makeOnFinished) { - core.material.images.tilesets = {}; - await this._loadImagesFromChunks(chunks, core.tilesets, core.material.images.tilesets, makeOnProgress, makeOnFinished); - core.loader._loadTilesets_afterLoad(); -} +loader.prototype._loadTilesets_chunked = async function ( + chunks, + makeOnProgress, + makeOnFinished +) { + core.material.images.tilesets = {}; + await this._loadImagesFromChunks( + chunks, + core.tilesets, + core.material.images.tilesets, + makeOnProgress, + makeOnFinished + ); + core.loader._loadTilesets_afterLoad(); +}; loader.prototype._loadTilesets_afterLoad = function () { - // 检查宽高是32倍数,如果出错在控制台报错 - for (var imgName in core.material.images.tilesets) { - var img = core.material.images.tilesets[imgName]; - if (img.width % 32 != 0 || img.height % 32 != 0) { - console.warn("警告!" + imgName + "的宽或高不是32的倍数!"); - } - if (img.width * img.height > 32 * 32 * 3000) { - console.warn("警告!" + imgName + "上的图块素材个数大于3000!"); - } + // 检查宽高是32倍数,如果出错在控制台报错 + for (var imgName in core.material.images.tilesets) { + var img = core.material.images.tilesets[imgName]; + if (img.width % 32 != 0 || img.height % 32 != 0) { + console.warn("警告!" + imgName + "的宽或高不是32的倍数!"); } -} + if (img.width * img.height > 32 * 32 * 3000) { + console.warn("警告!" + imgName + "上的图块素材个数大于3000!"); + } + } +}; // ------ 实际加载一系列图片 ------ // loader.prototype.loadImages = function (dir, names, toSave, callback) { - if (!names || names.length == 0) { - if (callback) callback(); + if (!names || names.length == 0) { + if (callback) callback(); + return; + } + var items = 0; + for (var i = 0; i < names.length; i++) { + this.loadImage(dir, names[i], function (id, image) { + core.loader._setStartLoadTipText("正在加载图片 " + id + "..."); + if (toSave[id] !== undefined) { + if (image != null) toSave[id] = image; return; - } - var items = 0; - for (var i = 0; i < names.length; i++) { - this.loadImage(dir, names[i], function (id, image) { - core.loader._setStartLoadTipText('正在加载图片 ' + id + "..."); - if (toSave[id] !== undefined) { - if (image != null) - toSave[id] = image; - return; - } - toSave[id] = image; - items++; - core.loader._setStartProgressVal(items * (100 / names.length)); - if (items == names.length) { - if (callback) callback(); - } - }) - } -} + } + toSave[id] = image; + items++; + core.loader._setStartProgressVal(items * (100 / names.length)); + if (items == names.length) { + if (callback) callback(); + } + }); + } +}; loader.prototype.loadImage = function (dir, imgName, callback) { - try { - var name = imgName; - if (name.indexOf(".") < 0) - name = name + ".png"; - var image = new Image(); - image.onload = function () { - image.setAttribute('_width', image.width); - image.setAttribute('_height', image.height); - callback(imgName, image); - } - image.onerror = function () { - callback(imgName, null); - } - image.src = 'project/' + dir + '/' + name + "?v=" + main.version; - if (name.endsWith('.gif')) - callback(imgName, null); - } - catch (e) { - console.error(e); - } -} + try { + var name = imgName; + if (name.indexOf(".") < 0) name = name + ".png"; + var image = new Image(); + image.onload = function () { + image.setAttribute("_width", image.width); + image.setAttribute("_height", image.height); + callback(imgName, image); + }; + image.onerror = function () { + callback(imgName, null); + }; + image.src = "project/" + dir + "/" + name + "?v=" + main.version; + if (name.endsWith(".gif")) callback(imgName, null); + } catch (e) { + console.error(e); + } +}; // ------ 从zip中加载一系列图片 ------ // -loader.prototype.loadImagesFromZip = function (url, names, toSave, onprogress, onfinished) { - if (!names || names.length == 0) { - if (onfinished) onfinished(); - return; - } +loader.prototype.loadImagesFromZip = function ( + url, + names, + toSave, + onprogress, + onfinished +) { + if (!names || names.length == 0) { + if (onfinished) onfinished(); + return; + } - core.unzip(url + "?v=" + main.version, function (data) { - var cnt = 1; - names.forEach(function (name) { - var imgName = name; - if (imgName.indexOf('.') < 0) imgName += '.png'; - if (imgName in data) { - var img = new Image(); - var url = URL.createObjectURL(data[imgName]); - cnt++; - img.onload = function () { - cnt--; - URL.revokeObjectURL(url); - img.setAttribute('_width', img.width); - img.setAttribute('_height', img.height); - if (cnt == 0 && onfinished) onfinished(); - } - img.src = url; - toSave[name] = img; - } - }); - cnt--; - if (cnt == 0 && onfinished) onfinished(); - }, null, false, onprogress); -} + core.unzip( + url + "?v=" + main.version, + function (data) { + var cnt = 1; + names.forEach(function (name) { + var imgName = name; + if (imgName.indexOf(".") < 0) imgName += ".png"; + if (imgName in data) { + var img = new Image(); + var url = URL.createObjectURL(data[imgName]); + cnt++; + img.onload = function () { + cnt--; + URL.revokeObjectURL(url); + img.setAttribute("_width", img.width); + img.setAttribute("_height", img.height); + if (cnt == 0 && onfinished) onfinished(); + }; + img.src = url; + toSave[name] = img; + } + }); + cnt--; + if (cnt == 0 && onfinished) onfinished(); + }, + null, + false, + onprogress + ); +}; -loader.prototype._loadImagesFromChunks = async function (chunks, names, toSave, makeOnProgress, makeOnFinished) { - await Promise.all(chunks.map((chunk) => { - const onfinished = makeOnFinished(chunk); - const onprogress = makeOnProgress(chunk); - return new Promise((resolve) => { - this.loadImagesFromZip(chunk, names, toSave, onprogress, () => { - onfinished(); - resolve(); - }); +loader.prototype._loadImagesFromChunks = async function ( + chunks, + names, + toSave, + makeOnProgress, + makeOnFinished +) { + await Promise.all( + chunks.map((chunk) => { + const onfinished = makeOnFinished(chunk); + const onprogress = makeOnProgress(chunk); + return new Promise((resolve) => { + this.loadImagesFromZip(chunk, names, toSave, onprogress, () => { + onfinished(); + resolve(); }); - })); -} + }); + }) + ); +}; // ------ 加载动画文件 ------ // loader.prototype._loadAnimates_sync = function () { - this._setStartLoadTipText("正在加载动画文件..."); + this._setStartLoadTipText("正在加载动画文件..."); - if (main.supportBunch) { - if (core.animates.length > 0) { - core.http('GET', '__all_animates__?v=' + main.version + '&id=' + core.animates.join(','), null, function (content) { - var u = content.split('@@@~~~###~~~@@@'); - for (var i = 0; i < core.animates.length; ++i) { - if (u[i] != '') { - core.material.animates[core.animates[i]] = core.loader._loadAnimate(u[i]); - } else { - console.error('无法找到动画文件' + core.animates[i] + '!'); - } - } - }, "text/plain; charset=x-user-defined"); - } - return; + if (main.supportBunch) { + if (core.animates.length > 0) { + core.http( + "GET", + "__all_animates__?v=" + main.version + "&id=" + core.animates.join(","), + null, + function (content) { + var u = content.split("@@@~~~###~~~@@@"); + for (var i = 0; i < core.animates.length; ++i) { + if (u[i] != "") { + core.material.animates[core.animates[i]] = + core.loader._loadAnimate(u[i]); + } else { + console.error("无法找到动画文件" + core.animates[i] + "!"); + } + } + }, + "text/plain; charset=x-user-defined" + ); } + return; + } - core.animates.forEach(function (t) { - core.http('GET', 'project/animates/' + t + ".animate?v=" + main.version, null, function (content) { - core.material.animates[t] = core.loader._loadAnimate(content); - }, function (e) { - console.error(e); - core.material.animates[t] = null; - }, "text/plain; charset=x-user-defined") - }); -} + core.animates.forEach(function (t) { + core.http( + "GET", + "project/animates/" + t + ".animate?v=" + main.version, + null, + function (content) { + core.material.animates[t] = core.loader._loadAnimate(content); + }, + function (e) { + console.error(e); + core.material.animates[t] = null; + }, + "text/plain; charset=x-user-defined" + ); + }); +}; loader.prototype._loadAnimates_async = function (onprogress, onfinished) { - this._loadFileFromZip('project/animates/animates.h5data', this._saveAnimate, true, onprogress, onfinished); -} + this._loadFileFromZip( + "project/animates/animates.h5data", + this._saveAnimate, + true, + onprogress, + onfinished + ); +}; -loader.prototype._loadAnimates_chunked = function (chunks, makeOnProgress, makeOnFinished) { - this._loadFileFromChunks(chunks, this._saveAnimate, true, makeOnProgress, makeOnFinished); -} +loader.prototype._loadAnimates_chunked = function ( + chunks, + makeOnProgress, + makeOnFinished +) { + this._loadFileFromChunks( + chunks, + this._saveAnimate, + true, + makeOnProgress, + makeOnFinished + ); +}; loader.prototype._saveAnimate = function (animates, onfinished) { - for (var name in animates) { - if (name.endsWith(".animate")) { - var t = name.substring(0, name.length - 8); - if (core.animates.indexOf(t) >= 0) - core.material.animates[t] = core.loader._loadAnimate(animates[name]); - } + for (var name in animates) { + if (name.endsWith(".animate")) { + var t = name.substring(0, name.length - 8); + if (core.animates.indexOf(t) >= 0) + core.material.animates[t] = core.loader._loadAnimate(animates[name]); } - onfinished(); -} + } + onfinished(); +}; loader.prototype._loadAnimate = function (content) { - try { - content = JSON.parse(content); - var data = {}; - data.ratio = content.ratio; - data.se = content.se; - data.pitch = content.pitch; - data.images = []; - content.bitmaps.forEach(function (t2) { - if (!t2) { - data.images.push(null); - } - else { - try { - var image = new Image(); - image.src = t2; - data.images.push(image); - } catch (e) { - console.error(e); - data.images.push(null); - } - } - }) - data.frame = content.frame_max; - data.frames = []; - content.frames.forEach(function (t2) { - var info = []; - t2.forEach(function (t3) { - info.push({ - 'index': t3[0], - 'x': t3[1], - 'y': t3[2], - 'zoom': t3[3], - 'opacity': t3[4], - 'mirror': t3[5] || 0, - 'angle': t3[6] || 0, - }) - }) - data.frames.push(info); + try { + content = JSON.parse(content); + var data = {}; + data.ratio = content.ratio; + data.se = content.se; + data.pitch = content.pitch; + data.images = []; + content.bitmaps.forEach(function (t2) { + if (!t2) { + data.images.push(null); + } else { + try { + var image = new Image(); + image.src = t2; + data.images.push(image); + } catch (e) { + console.error(e); + data.images.push(null); + } + } + }); + data.frame = content.frame_max; + data.frames = []; + content.frames.forEach(function (t2) { + var info = []; + t2.forEach(function (t3) { + info.push({ + index: t3[0], + x: t3[1], + y: t3[2], + zoom: t3[3], + opacity: t3[4], + mirror: t3[5] || 0, + angle: t3[6] || 0, }); - return data; - } - catch (e) { - console.error(e); - return null; - } -} + }); + data.frames.push(info); + }); + return data; + } catch (e) { + console.error(e); + return null; + } +}; // ------ 加载音乐和音效 ------ // loader.prototype._loadMusics = function () { - core.bgms.forEach(function (t) { - core.loader.loadOneMusic(t); - }); - // 直接开始播放 - core.playBgm(main.startBgm); -} + core.bgms.forEach(function (t) { + core.loader.loadOneMusic(t); + }); + // 直接开始播放 + core.playBgm(main.startBgm); +}; loader.prototype._loadSounds_sync = function () { - this._setStartLoadTipText("正在加载音效文件..."); - core.sounds.forEach(function (t) { - core.loader.loadOneSound(t); - }); -} + this._setStartLoadTipText("正在加载音效文件..."); + core.sounds.forEach(function (t) { + core.loader.loadOneSound(t); + }); +}; loader.prototype._loadSounds_async = function (onprogress, onfinished) { - this._loadFileFromZip('project/sounds/sounds.h5data', this._saveSounds, false, onprogress, onfinished); -} + this._loadFileFromZip( + "project/sounds/sounds.h5data", + this._saveSounds, + false, + onprogress, + onfinished + ); +}; -loader.prototype._loadSounds_chunked = function (chunks, makeOnProgress, makeOnFinished) { - this._loadFileFromChunks(chunks, this._saveSounds, false, makeOnProgress, makeOnFinished); -} +loader.prototype._loadSounds_chunked = function ( + chunks, + makeOnProgress, + makeOnFinished +) { + this._loadFileFromChunks( + chunks, + this._saveSounds, + false, + makeOnProgress, + makeOnFinished + ); +}; loader.prototype._saveSounds = function (data, onfinished) { - // 延迟解析 - setTimeout(function () { - for (var name in data) { - if (core.sounds.indexOf(name) >= 0) { - core.loader._loadOneSound_decodeData(name, data[name]); - } - } - onfinished(); - }); -} + // 延迟解析 + setTimeout(function () { + for (var name in data) { + if (core.sounds.indexOf(name) >= 0) { + core.loader._loadOneSound_decodeData(name, data[name]); + } + } + onfinished(); + }); +}; loader.prototype.loadOneMusic = function (name) { - var music = new Audio(); - music.preload = 'none'; - if (main.bgmRemote) music.src = main.bgmRemoteRoot + core.firstData.name + '/' + name; - else music.src = 'project/bgms/' + name; - music.loop = 'loop'; - core.material.bgms[name] = music; -} + /* var music = new Audio(); + music.preload = "none"; + if (main.bgmRemote) + music.src = main.bgmRemoteRoot + core.firstData.name + "/" + name; + else music.src = "project/bgms/" + name; + music.loop = "loop"; + core.material.bgms[name] = music;*/ +}; loader.prototype.loadOneSound = function (name) { - core.http('GET', 'project/sounds/' + name + "?v=" + main.version, null, function (data) { - core.loader._loadOneSound_decodeData(name, data); - }, function (e) { - console.error(e); - core.material.sounds[name] = null; - }, null, 'arraybuffer'); -} + core.http( + "GET", + "project/sounds/" + name + "?v=" + main.version, + null, + function (data) { + core.loader._loadOneSound_decodeData(name, data); + }, + function (e) { + console.error(e); + core.material.sounds[name] = null; + }, + null, + "arraybuffer" + ); +}; loader.prototype._loadOneSound_decodeData = function (name, data) { - if (data instanceof Blob) { - var blobReader = new zip.BlobReader(data); - blobReader.init(function () { - blobReader.readUint8Array(0, blobReader.size, function (uint8) { - core.loader._loadOneSound_decodeData(name, uint8.buffer); - }) - }); - return; - } - try { - core.musicStatus.audioContext.decodeAudioData(data, function (buffer) { - core.material.sounds[name] = buffer; - }, function (e) { - console.error(e); - core.material.sounds[name] = null; - }) - } - catch (e) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + core.loader._loadOneSound_decodeData(name, uint8.buffer); + }); + }); + return; + } + try { + core.musicStatus.audioContext.decodeAudioData( + data, + function (buffer) { + core.material.sounds[name] = buffer; + }, + function (e) { console.error(e); core.material.sounds[name] = null; - } -} + } + ); + } catch (e) { + console.error(e); + core.material.sounds[name] = null; + } +}; loader.prototype.loadBgm = function (name) { - name = core.getMappedName(name); - if (!core.material.bgms[name]) return; - // 如果没开启音乐,则不预加载 - if (!core.musicStatus.bgmStatus) return; - // 是否已经预加载过 - var index = core.musicStatus.cachedBgms.indexOf(name); - if (index >= 0) { - core.musicStatus.cachedBgms.splice(index, 1); + name = core.getMappedName(name); + if (!core.material.bgms[name]) return; + // 如果没开启音乐,则不预加载 + if (!core.musicStatus.bgmStatus) return; + // 是否已经预加载过 + var index = core.musicStatus.cachedBgms.indexOf(name); + if (index >= 0) { + core.musicStatus.cachedBgms.splice(index, 1); + } else { + // 预加载BGM + this._preloadBgm(core.material.bgms[name]); + // core.material.bgms[name].load(); + // 清理尾巴 + if (core.musicStatus.cachedBgms.length == core.musicStatus.cachedBgmCount) { + this.freeBgm(core.musicStatus.cachedBgms.pop()); } - else { - // 预加载BGM - this._preloadBgm(core.material.bgms[name]); - // core.material.bgms[name].load(); - // 清理尾巴 - if (core.musicStatus.cachedBgms.length == core.musicStatus.cachedBgmCount) { - this.freeBgm(core.musicStatus.cachedBgms.pop()); - } - } - // 移动到缓存最前方 - core.musicStatus.cachedBgms.unshift(name); -} + } + // 移动到缓存最前方 + core.musicStatus.cachedBgms.unshift(name); +}; loader.prototype._preloadBgm = function (bgm) { - bgm.volume = 0; - bgm.play(); -} + bgm.volume = 0; + bgm.play(); +}; loader.prototype.freeBgm = function (name) { - name = core.getMappedName(name); - if (!core.material.bgms[name]) return; - // 从cachedBgms中删除 - core.musicStatus.cachedBgms = core.musicStatus.cachedBgms.filter(function (t) { - return t != name; - }); - // 清掉缓存 - core.material.bgms[name].removeAttribute("src"); - core.material.bgms[name].load(); - core.material.bgms[name] = null; - if (name == core.musicStatus.playingBgm) { - core.musicStatus.playingBgm = null; - } - // 三秒后重新加载 - setTimeout(function () { - core.loader.loadOneMusic(name); - }, 3000); -} + name = core.getMappedName(name); + if (!core.material.bgms[name]) return; + // 从cachedBgms中删除 + core.musicStatus.cachedBgms = core.musicStatus.cachedBgms.filter(function ( + t + ) { + return t != name; + }); + // 清掉缓存 + core.material.bgms[name].removeAttribute("src"); + core.material.bgms[name].load(); + core.material.bgms[name] = null; + if (name == core.musicStatus.playingBgm) { + core.musicStatus.playingBgm = null; + } + // 三秒后重新加载 + setTimeout(function () { + core.loader.loadOneMusic(name); + }, 3000); +}; -loader.prototype._loadFileFromZip = function (url, save, convertToText, onprogress, onfinished) { - core.unzip(url + '?v=' + main.version, function (data) { - save(data, onfinished); - }, null, convertToText, onprogress); -} +loader.prototype._loadFileFromZip = function ( + url, + save, + convertToText, + onprogress, + onfinished +) { + core.unzip( + url + "?v=" + main.version, + function (data) { + save(data, onfinished); + }, + null, + convertToText, + onprogress + ); +}; -loader.prototype._loadFileFromChunks = async function (chunks, save, convertToText, makeOnProgress, makeOnFinished) { - await Promise.all(chunks.map((chunk) => { - const onfinished = makeOnFinished(chunk); - const onprogress = makeOnProgress(chunk); - return new Promise((resolve) => { - this._loadFileFromZip(chunk, save, convertToText, onprogress, () => { - onfinished(); - resolve(); - }); +loader.prototype._loadFileFromChunks = async function ( + chunks, + save, + convertToText, + makeOnProgress, + makeOnFinished +) { + await Promise.all( + chunks.map((chunk) => { + const onfinished = makeOnFinished(chunk); + const onprogress = makeOnProgress(chunk); + return new Promise((resolve) => { + this._loadFileFromZip(chunk, save, convertToText, onprogress, () => { + onfinished(); + resolve(); }); - })); -} + }); + }) + ); +}; diff --git a/libs/maps.js b/libs/maps.js index 4fbbb8b..35e6b8d 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -2192,6 +2192,7 @@ maps.prototype.showBgFgMap = function (name, loc, floorId, callback) { ////// 隐藏前景/背景地图 ////// maps.prototype.hideBgFgMap = function (name, loc, floorId, callback) { + this.removeGlobalAnimate(loc.x, loc.y, name) this._triggerBgFgMap('hide', name, loc, floorId, callback); } @@ -2455,7 +2456,7 @@ maps.prototype.setBgFgBlock = function (name, number, x, y, floorId) { if (/^\d+$/.test(number)) number = parseInt(number); else number = core.getNumberById(number); } - + this.removeGlobalAnimate(x, y, name) var values = core.getFlag('__' + name + 'v__', {}); values[floorId] = (values[floorId] || []).filter(function (one) { return one[0] != x || one[1] != y }); values[floorId].push([x, y, number]); diff --git a/libs/utils.js b/libs/utils.js index cd5e576..40fe703 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -1,4 +1,3 @@ - /* utils.js 工具类 @@ -6,1335 +5,1488 @@ utils.js 工具类 "use strict"; -function utils () { - this._init(); - this.scan = { - 'up': { 'x': 0, 'y': -1 }, - 'left': { 'x': -1, 'y': 0 }, - 'down': { 'x': 0, 'y': 1 }, - 'right': { 'x': 1, 'y': 0 } - }; - this.scan2 = { - 'up': { 'x': 0, 'y': -1 }, - 'left': { 'x': -1, 'y': 0 }, - 'down': { 'x': 0, 'y': 1 }, - 'right': { 'x': 1, 'y': 0 }, - 'leftup': { 'x': -1, 'y': -1 }, - 'leftdown': { 'x': -1, 'y': 1 }, - 'rightup': { 'x': 1, 'y': -1 }, - 'rightdown': { 'x': 1, 'y': 1 } - }; +function utils() { + this._init(); + this.scan = { + up: { x: 0, y: -1 }, + left: { x: -1, y: 0 }, + down: { x: 0, y: 1 }, + right: { x: 1, y: 0 }, + }; + this.scan2 = { + up: { x: 0, y: -1 }, + left: { x: -1, y: 0 }, + down: { x: 0, y: 1 }, + right: { x: 1, y: 0 }, + leftup: { x: -1, y: -1 }, + leftdown: { x: -1, y: 1 }, + rightup: { x: 1, y: -1 }, + rightdown: { x: 1, y: 1 }, + }; } utils.prototype._init = function () { - // -} + // +}; ////// 将文字中的${和}(表达式)进行替换 ////// utils.prototype.replaceText = function (text, prefix) { - if (typeof text != 'string') return text; - var index = text.indexOf("${"); - if (index < 0) return text; - var cnt = 0, curr = index; - while (++curr < text.length) { - if (text.charAt(curr) == '{') cnt++; - if (text.charAt(curr) == '}') cnt--; - if (cnt == 0) break; - } - if (cnt != 0) return text; - var value = core.calValue(text.substring(index + 2, curr), prefix); - if (value == null) value = ""; - return text.substring(0, index) + value + core.replaceText(text.substring(curr + 1), prefix); -} + if (typeof text != "string") return text; + var index = text.indexOf("${"); + if (index < 0) return text; + var cnt = 0, + curr = index; + while (++curr < text.length) { + if (text.charAt(curr) == "{") cnt++; + if (text.charAt(curr) == "}") cnt--; + if (cnt == 0) break; + } + if (cnt != 0) return text; + var value = core.calValue(text.substring(index + 2, curr), prefix); + if (value == null) value = ""; + return ( + text.substring(0, index) + + value + + core.replaceText(text.substring(curr + 1), prefix) + ); +}; utils.prototype.replaceValue = function (value) { - if (typeof value == "string" && (value.indexOf(":") >= 0 || value.indexOf("flag:") >= 0 || value.indexOf('global:') >= 0)) { - if (value.indexOf('status:') >= 0) - value = value.replace(/status:([a-zA-Z0-9_]+)/g, "core.getStatus('$1')"); - if (value.indexOf('buff:') >= 0) - value = value.replace(/buff:([a-zA-Z0-9_]+)/g, "core.getBuff('$1')"); - if (value.indexOf('item:') >= 0) - value = value.replace(/item:([a-zA-Z0-9_]+)/g, "core.itemCount('$1')"); - if (value.indexOf('flag:') >= 0 || value.indexOf('flag:') >= 0) - value = value.replace(/flag[::]([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)/g, "core.getFlag('$1', 0)"); - //if (value.indexOf('switch:' >= 0)) - // value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)"); - if (value.indexOf('global:') >= 0 || value.indexOf('global:') >= 0) - value = value.replace(/global[::]([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)/g, "core.getGlobal('$1', 0)"); - if (value.indexOf('enemy:') >= 0) - value = value.replace(/enemy:([a-zA-Z0-9_]+)[\.:]([a-zA-Z0-9_]+)/g, "core.material.enemys['$1'].$2"); - if (value.indexOf('blockId:') >= 0) - value = value.replace(/blockId:(\d+),(\d+)/g, "core.getBlockId($1, $2)"); - if (value.indexOf('blockNumber:') >= 0) - value = value.replace(/blockNumber:(\d+),(\d+)/g, "core.getBlockNumber($1, $2)"); - if (value.indexOf('blockCls:') >= 0) - value = value.replace(/blockCls:(\d+),(\d+)/g, "core.getBlockCls($1, $2)"); - if (value.indexOf('equip:') >= 0) - value = value.replace(/equip:(\d)/g, "core.getEquip($1)"); - if (value.indexOf('temp:') >= 0) - value = value.replace(/temp:([a-zA-Z0-9_]+)/g, "core.getFlag('@temp@$1', 0)"); - } - return value; -} + if ( + typeof value == "string" && + (value.indexOf(":") >= 0 || + value.indexOf("flag:") >= 0 || + value.indexOf("global:") >= 0) + ) { + if (value.indexOf("status:") >= 0) + value = value.replace(/status:([a-zA-Z0-9_]+)/g, "core.getStatus('$1')"); + if (value.indexOf("buff:") >= 0) + value = value.replace(/buff:([a-zA-Z0-9_]+)/g, "core.getBuff('$1')"); + if (value.indexOf("item:") >= 0) + value = value.replace(/item:([a-zA-Z0-9_]+)/g, "core.itemCount('$1')"); + if (value.indexOf("flag:") >= 0 || value.indexOf("flag:") >= 0) + value = value.replace( + /flag[::]([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)/g, + "core.getFlag('$1', 0)" + ); + //if (value.indexOf('switch:' >= 0)) + // value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)"); + if (value.indexOf("global:") >= 0 || value.indexOf("global:") >= 0) + value = value.replace( + /global[::]([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)/g, + "core.getGlobal('$1', 0)" + ); + if (value.indexOf("enemy:") >= 0) + value = value.replace( + /enemy:([a-zA-Z0-9_]+)[\.:]([a-zA-Z0-9_]+)/g, + "core.material.enemys['$1'].$2" + ); + if (value.indexOf("blockId:") >= 0) + value = value.replace(/blockId:(\d+),(\d+)/g, "core.getBlockId($1, $2)"); + if (value.indexOf("blockNumber:") >= 0) + value = value.replace( + /blockNumber:(\d+),(\d+)/g, + "core.getBlockNumber($1, $2)" + ); + if (value.indexOf("blockCls:") >= 0) + value = value.replace( + /blockCls:(\d+),(\d+)/g, + "core.getBlockCls($1, $2)" + ); + if (value.indexOf("equip:") >= 0) + value = value.replace(/equip:(\d)/g, "core.getEquip($1)"); + if (value.indexOf("temp:") >= 0) + value = value.replace( + /temp:([a-zA-Z0-9_]+)/g, + "core.getFlag('@temp@$1', 0)" + ); + } + return value; +}; ////// 计算表达式的值 ////// utils.prototype.calValue = function (value, prefix) { - if (!core.isset(value)) return null; - if (typeof value === 'string') { - if (value.indexOf(':') >= 0 || value.indexOf("flag:") >= 0 || value.indexOf('global:') >= 0) { - if (value.indexOf('switch:') >= 0) - value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)"); - value = this.replaceValue(value); - } - return eval(value); + if (!core.isset(value)) return null; + if (typeof value === "string") { + if ( + value.indexOf(":") >= 0 || + value.indexOf("flag:") >= 0 || + value.indexOf("global:") >= 0 + ) { + if (value.indexOf("switch:") >= 0) + value = value.replace( + /switch:([a-zA-Z0-9_]+)/g, + "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)" + ); + value = this.replaceValue(value); } - if (value instanceof Function) { - return value(); - } - return value; -} + return eval(value); + } + if (value instanceof Function) { + return value(); + } + return value; +}; ////// 向某个数组前插入另一个数组或元素 ////// utils.prototype.unshift = function (a, b) { - if (!(a instanceof Array) || b == null) return; - if (b instanceof Array) { - core.clone(b).reverse().forEach(function (e) { - a.unshift(e); - }); - } - else a.unshift(b); - return a; -} + if (!(a instanceof Array) || b == null) return; + if (b instanceof Array) { + core + .clone(b) + .reverse() + .forEach(function (e) { + a.unshift(e); + }); + } else a.unshift(b); + return a; +}; ////// 向某个数组后插入另一个数组或元素 ////// utils.prototype.push = function (a, b) { - if (!(a instanceof Array) || b == null) return; - if (b instanceof Array) { - core.clone(b).forEach(function (e) { - a.push(e); - }); - } - else a.push(b); - return a; -} + if (!(a instanceof Array) || b == null) return; + if (b instanceof Array) { + core.clone(b).forEach(function (e) { + a.push(e); + }); + } else a.push(b); + return a; +}; utils.prototype.decompress = function (value) { - try { - var output = lzw_decode(value); - if (output) return JSON.parse(output); - } - catch (e) { - } - try { - var output = LZString.decompress(value); - if (output) return JSON.parse(output); - } - catch (e) { - } - try { - return JSON.parse(value); - } - catch (e) { - console.error(e); - } - return null; -} + try { + var output = lzw_decode(value); + if (output) return JSON.parse(output); + } catch (e) {} + try { + var output = LZString.decompress(value); + if (output) return JSON.parse(output); + } catch (e) {} + try { + return JSON.parse(value); + } catch (e) { + console.error(e); + } + return null; +}; ////// 设置本地存储 ////// utils.prototype.setLocalStorage = function (key, value) { - try { - if (value == null) { - this.removeLocalStorage(key); - return; - } - - var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function (chr) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4) - }); - localStorage.setItem(core.firstData.name + "_" + key, str); - - if (key == 'autoSave') core.saves.ids[0] = true; - else if (/^save\d+$/.test(key)) core.saves.ids[parseInt(key.substring(4))] = true; - - return true; + try { + if (value == null) { + this.removeLocalStorage(key); + return; } - catch (e) { - console.error(e); - return false; - } -} + + var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function (chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4); + }); + localStorage.setItem(core.firstData.name + "_" + key, str); + + if (key == "autoSave") core.saves.ids[0] = true; + else if (/^save\d+$/.test(key)) + core.saves.ids[parseInt(key.substring(4))] = true; + + return true; + } catch (e) { + console.error(e); + return false; + } +}; ////// 获得本地存储 ////// utils.prototype.getLocalStorage = function (key, defaultValue) { - try { - var value = JSON.parse(localStorage.getItem(core.firstData.name + "_" + key)); - if (value == null) return defaultValue; - return value; - } catch (e) { - return defaultValue; - } -} + try { + var value = JSON.parse( + localStorage.getItem(core.firstData.name + "_" + key) + ); + if (value == null) return defaultValue; + return value; + } catch (e) { + return defaultValue; + } +}; ////// 移除本地存储 ////// utils.prototype.removeLocalStorage = function (key) { - localStorage.removeItem(core.firstData.name + "_" + key); - if (key == 'autoSave') delete core.saves.ids[0]; - else if (/^save\d+$/.test(key)) delete core.saves.ids[parseInt(key.substring(4))]; -} + localStorage.removeItem(core.firstData.name + "_" + key); + if (key == "autoSave") delete core.saves.ids[0]; + else if (/^save\d+$/.test(key)) + delete core.saves.ids[parseInt(key.substring(4))]; +}; -utils.prototype.setLocalForage = function (key, value, successCallback, errorCallback) { - if (value == null) { - this.removeLocalForage(key); - return; - } +utils.prototype.setLocalForage = function ( + key, + value, + successCallback, + errorCallback +) { + if (value == null) { + this.removeLocalForage(key); + return; + } - var name = core.firstData.name + "_" + key; - var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function (chr) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4) - }); - var callback = function (err) { - if (err) { - if (errorCallback) errorCallback(err); - } - else { - if (key == 'autoSave') core.saves.ids[0] = true; - else if (/^save\d+$/.test(key)) core.saves.ids[parseInt(key.substring(4))] = true; - if (successCallback) successCallback(); - } + var name = core.firstData.name + "_" + key; + var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function (chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4); + }); + var callback = function (err) { + if (err) { + if (errorCallback) errorCallback(err); + } else { + if (key == "autoSave") core.saves.ids[0] = true; + else if (/^save\d+$/.test(key)) + core.saves.ids[parseInt(key.substring(4))] = true; + if (successCallback) successCallback(); } - this._setLocalForage_set(name, str, callback); -} + }; + this._setLocalForage_set(name, str, callback); +}; utils.prototype._setLocalForage_set = function (name, str, callback) { - if (window.jsinterface && window.jsinterface.setLocalForage) { - var id = setTimeout(null); - core['__callback' + id] = callback; - core.saves.cache[name] = str; - window.jsinterface.setLocalForage(id, name, str); - } else { - var compressed = str.length > 100000 ? LZString.compress(str) : lzw_encode(str); - core.saves.cache[name] = compressed; - localforage.setItem(name, compressed, callback); - } -} + if (window.jsinterface && window.jsinterface.setLocalForage) { + var id = setTimeout(null); + core["__callback" + id] = callback; + core.saves.cache[name] = str; + window.jsinterface.setLocalForage(id, name, str); + } else { + var compressed = + str.length > 100000 ? LZString.compress(str) : lzw_encode(str); + core.saves.cache[name] = compressed; + localforage.setItem(name, compressed, callback); + } +}; -utils.prototype.getLocalForage = function (key, defaultValue, successCallback, errorCallback) { - var name = core.firstData.name + "_" + key; - var callback = function (err, value) { - if (err) { - if (errorCallback) errorCallback(err); - } - else { - core.saves.cache[name] = value; - if (!successCallback) return; - if (value != null) { - var res = core.utils.decompress(value); - successCallback(res == null ? defaultValue : res); - return; - } - successCallback(defaultValue); - } - }; - if (core.saves.cache[name] != null) { - return callback(null, core.saves.cache[name]); +utils.prototype.getLocalForage = function ( + key, + defaultValue, + successCallback, + errorCallback +) { + var name = core.firstData.name + "_" + key; + var callback = function (err, value) { + if (err) { + if (errorCallback) errorCallback(err); + } else { + core.saves.cache[name] = value; + if (!successCallback) return; + if (value != null) { + var res = core.utils.decompress(value); + successCallback(res == null ? defaultValue : res); + return; + } + successCallback(defaultValue); } - this._getLocalForage_get(name, callback); -} + }; + if (core.saves.cache[name] != null) { + return callback(null, core.saves.cache[name]); + } + this._getLocalForage_get(name, callback); +}; utils.prototype._getLocalForage_get = function (name, callback) { - if (window.jsinterface && window.jsinterface.getLocalForage) { - var id = setTimeout(null); - core['__callback' + id] = callback; - window.jsinterface.getLocalForage(id, name); - } else { - localforage.getItem(name, callback); - } -} + if (window.jsinterface && window.jsinterface.getLocalForage) { + var id = setTimeout(null); + core["__callback" + id] = callback; + window.jsinterface.getLocalForage(id, name); + } else { + localforage.getItem(name, callback); + } +}; -utils.prototype.removeLocalForage = function (key, successCallback, errorCallback) { - var name = core.firstData.name + "_" + key; - var callback = function (err) { - if (err) { - if (errorCallback) errorCallback(err); - } - else { - if (key == 'autoSave') delete core.saves.ids[0]; - else if (/^save\d+$/.test(key)) delete core.saves.ids[parseInt(key.substring(4))]; - if (successCallback) successCallback(); - } +utils.prototype.removeLocalForage = function ( + key, + successCallback, + errorCallback +) { + var name = core.firstData.name + "_" + key; + var callback = function (err) { + if (err) { + if (errorCallback) errorCallback(err); + } else { + if (key == "autoSave") delete core.saves.ids[0]; + else if (/^save\d+$/.test(key)) + delete core.saves.ids[parseInt(key.substring(4))]; + if (successCallback) successCallback(); } - delete core.saves.cache[name]; - this._removeLocalForage_remove(name, callback); -} + }; + delete core.saves.cache[name]; + this._removeLocalForage_remove(name, callback); +}; utils.prototype._removeLocalForage_remove = function (name, callback) { - if (window.jsinterface && window.jsinterface.removeLocalForage) { - var id = setTimeout(null); - core['__callback' + id] = callback; - window.jsinterface.removeLocalForage(id, name); - } else { - localforage.removeItem(name, callback); - } -} + if (window.jsinterface && window.jsinterface.removeLocalForage) { + var id = setTimeout(null); + core["__callback" + id] = callback; + window.jsinterface.removeLocalForage(id, name); + } else { + localforage.removeItem(name, callback); + } +}; utils.prototype.clearLocalForage = function (callback) { - core.saves.cache = {}; - if (window.jsinterface && window.jsinterface.clearLocalForage) { - var id = setTimeout(null); - core['__callback' + id] = callback; - window.jsinterface.clearLocalForage(id); - } else { - localforage.clear(callback); - } -} + core.saves.cache = {}; + if (window.jsinterface && window.jsinterface.clearLocalForage) { + var id = setTimeout(null); + core["__callback" + id] = callback; + window.jsinterface.clearLocalForage(id); + } else { + localforage.clear(callback); + } +}; utils.prototype.iterateLocalForage = function (iter, callback) { - if (window.jsinterface && window.jsinterface.iterateLocalForage) { - var id = setTimeout(null); - core['__iter' + id] = iter; - core['__callback' + id] = callback; - window.jsinterface.iterateLocalForage(id); - } else { - localforage.iterate(iter, callback); - } -} + if (window.jsinterface && window.jsinterface.iterateLocalForage) { + var id = setTimeout(null); + core["__iter" + id] = iter; + core["__callback" + id] = callback; + window.jsinterface.iterateLocalForage(id); + } else { + localforage.iterate(iter, callback); + } +}; utils.prototype.keysLocalForage = function (callback) { - if (window.jsinterface && window.jsinterface.keysLocalForage) { - var id = setTimeout(null); - core['__callback' + id] = callback; - window.jsinterface.keysLocalForage(id); - } else { - localforage.keys(callback); - } -} + if (window.jsinterface && window.jsinterface.keysLocalForage) { + var id = setTimeout(null); + core["__callback" + id] = callback; + window.jsinterface.keysLocalForage(id); + } else { + localforage.keys(callback); + } +}; utils.prototype.lengthLocalForage = function (callback) { - if (window.jsinterface && window.jsinterface.lengthLocalForage) { - var id = setTimeout(null); - core['__callback' + id] = callback; - window.jsinterface.lengthLocalForage(id); - } else { - localforage.length(callback); - } -} + if (window.jsinterface && window.jsinterface.lengthLocalForage) { + var id = setTimeout(null); + core["__callback" + id] = callback; + window.jsinterface.lengthLocalForage(id); + } else { + localforage.length(callback); + } +}; utils.prototype.setGlobal = function (key, value) { - if (core.isReplaying()) return; - core.setLocalStorage(key, value); -} + if (core.isReplaying()) return; + core.setLocalStorage(key, value); +}; utils.prototype.getGlobal = function (key, defaultValue) { - var value; - if (core.isReplaying()) { - // 不考虑key不一致的情况 - var action = core.status.replay.toReplay.shift(); - if (action.indexOf("input2:") == 0) { - value = JSON.parse(core.decodeBase64(action.substring(7))); - core.setFlag('__global__' + key, value); - core.status.route.push("input2:" + core.encodeBase64(JSON.stringify(value))); - } - else { - // 录像兼容性:尝试从flag和localStorage获得 - // 注意这里不再二次记录 input2: 到录像 - core.status.replay.toReplay.unshift(action); - value = core.getFlag('__global__' + key, core.getLocalStorage(key, defaultValue)); - } + var value; + if (core.isReplaying()) { + // 不考虑key不一致的情况 + var action = core.status.replay.toReplay.shift(); + if (action.indexOf("input2:") == 0) { + value = JSON.parse(core.decodeBase64(action.substring(7))); + core.setFlag("__global__" + key, value); + core.status.route.push( + "input2:" + core.encodeBase64(JSON.stringify(value)) + ); + } else { + // 录像兼容性:尝试从flag和localStorage获得 + // 注意这里不再二次记录 input2: 到录像 + core.status.replay.toReplay.unshift(action); + value = core.getFlag( + "__global__" + key, + core.getLocalStorage(key, defaultValue) + ); } - else { - value = core.getLocalStorage(key, defaultValue); - core.setFlag('__global__' + key, value); - core.status.route.push("input2:" + core.encodeBase64(JSON.stringify(value))); - } - return value; -} + } else { + value = core.getLocalStorage(key, defaultValue); + core.setFlag("__global__" + key, value); + core.status.route.push( + "input2:" + core.encodeBase64(JSON.stringify(value)) + ); + } + return value; +}; ////// 深拷贝一个对象 ////// utils.prototype.clone = function (data, filter, recursion) { - if (!core.isset(data)) return null; - // date - if (data instanceof Date) { - var copy = new Date(); - copy.setTime(data.getTime()); - return copy; - } - // array - if (data instanceof Array) { - var copy = []; - for (var i in data) { - if (!filter || filter(i, data[i])) - copy[i] = core.clone(data[i], recursion ? filter : null, recursion); - } - return copy; - } - // 函数 - if (data instanceof Function) { - return data; - } - // object - if (data instanceof Object) { - var copy = {}; - for (var i in data) { - if (data.hasOwnProperty(i) && (!filter || filter(i, data[i]))) - copy[i] = core.clone(data[i], recursion ? filter : null, recursion); - } - return copy; + if (!core.isset(data)) return null; + // date + if (data instanceof Date) { + var copy = new Date(); + copy.setTime(data.getTime()); + return copy; + } + // array + if (data instanceof Array) { + var copy = []; + for (var i in data) { + if (!filter || filter(i, data[i])) + copy[i] = core.clone(data[i], recursion ? filter : null, recursion); } + return copy; + } + // 函数 + if (data instanceof Function) { return data; -} + } + // object + if (data instanceof Object) { + var copy = {}; + for (var i in data) { + if (data.hasOwnProperty(i) && (!filter || filter(i, data[i]))) + copy[i] = core.clone(data[i], recursion ? filter : null, recursion); + } + return copy; + } + return data; +}; ////// 深拷贝1D/2D数组优化 ////// utils.prototype.cloneArray = function (data) { - if (!(data instanceof Array)) return this.clone(data); - if (data[0] instanceof Array) { - return data.map(function (one) { return one.slice(); }); - } else { - return data.slice(); - } -} + if (!(data instanceof Array)) return this.clone(data); + if (data[0] instanceof Array) { + return data.map(function (one) { + return one.slice(); + }); + } else { + return data.slice(); + } +}; ////// 裁剪图片 ////// utils.prototype.splitImage = function (image, width, height) { - if (typeof image == "string") { - image = core.getMappedName(image); - image = core.material.images.images[image]; + if (typeof image == "string") { + image = core.getMappedName(image); + image = core.material.images.images[image]; + } + if (!image) return []; + width = width || 32; + height = height || width; + var canvas = document.createElement("canvas"); + var ctx = canvas.getContext("2d"); + var ans = []; + for (var j = 0; j < image.height; j += height) { + for (var i = 0; i < image.width; i += width) { + var w = Math.min(width, image.width - i), + h = Math.min(height, image.height - j); + canvas.width = w; + canvas.height = h; + core.drawImage(ctx, image, i, j, w, h, 0, 0, w, h); + var img = new Image(); + img.src = canvas.toDataURL("image/png"); + ans.push(img); } - if (!image) return []; - width = width || 32; - height = height || width; - var canvas = document.createElement("canvas"); - var ctx = canvas.getContext("2d"); - var ans = []; - for (var j = 0; j < image.height; j += height) { - for (var i = 0; i < image.width; i += width) { - var w = Math.min(width, image.width - i), h = Math.min(height, image.height - j); - canvas.width = w; canvas.height = h; - core.drawImage(ctx, image, i, j, w, h, 0, 0, w, h); - var img = new Image(); - img.src = canvas.toDataURL("image/png"); - ans.push(img); - } - } - return ans; -} + } + return ans; +}; ////// 格式化时间为字符串 ////// utils.prototype.formatDate = function (date) { - if (!date) date = new Date(); - return "" + date.getFullYear() + "-" + core.setTwoDigits(date.getMonth() + 1) + "-" + core.setTwoDigits(date.getDate()) + " " - + core.setTwoDigits(date.getHours()) + ":" + core.setTwoDigits(date.getMinutes()) + ":" + core.setTwoDigits(date.getSeconds()); -} + if (!date) date = new Date(); + return ( + "" + + date.getFullYear() + + "-" + + core.setTwoDigits(date.getMonth() + 1) + + "-" + + core.setTwoDigits(date.getDate()) + + " " + + core.setTwoDigits(date.getHours()) + + ":" + + core.setTwoDigits(date.getMinutes()) + + ":" + + core.setTwoDigits(date.getSeconds()) + ); +}; ////// 格式化时间为最简字符串 ////// utils.prototype.formatDate2 = function (date) { - if (!date) date = new Date(); - return "" + date.getFullYear() + core.setTwoDigits(date.getMonth() + 1) + core.setTwoDigits(date.getDate()) - + core.setTwoDigits(date.getHours()) + core.setTwoDigits(date.getMinutes()) + core.setTwoDigits(date.getSeconds()); -} + if (!date) date = new Date(); + return ( + "" + + date.getFullYear() + + core.setTwoDigits(date.getMonth() + 1) + + core.setTwoDigits(date.getDate()) + + core.setTwoDigits(date.getHours()) + + core.setTwoDigits(date.getMinutes()) + + core.setTwoDigits(date.getSeconds()) + ); +}; utils.prototype.formatTime = function (time) { - return core.setTwoDigits(parseInt(time / 3600000)) - + ":" + core.setTwoDigits(parseInt(time / 60000) % 60) - + ":" + core.setTwoDigits(parseInt(time / 1000) % 60); -} + return ( + core.setTwoDigits(parseInt(time / 3600000)) + + ":" + + core.setTwoDigits(parseInt(time / 60000) % 60) + + ":" + + core.setTwoDigits(parseInt(time / 1000) % 60) + ); +}; ////// 两位数显示 ////// utils.prototype.setTwoDigits = function (x) { - return (parseInt(x) < 10 && parseInt(x) >= 0) ? "0" + x : x; -} + return parseInt(x) < 10 && parseInt(x) >= 0 ? "0" + x : x; +}; utils.prototype.formatSize = function (size) { - if (size < 1024) return size + 'B'; - else if (size < 1024 * 1024) return (size / 1024).toFixed(2) + "KB"; - else return (size / 1024 / 1024).toFixed(2) + "MB"; -} + if (size < 1024) return size + "B"; + else if (size < 1024 * 1024) return (size / 1024).toFixed(2) + "KB"; + else return (size / 1024 / 1024).toFixed(2) + "MB"; +}; utils.prototype.formatBigNumber = function (x, digits) { - if (digits === true) digits = 5; // 兼容旧版onMap参数 - if (!digits || digits < 5) digits = 6; // 连同负号、小数点和后缀字母在内的总位数,至少需为5,默认为6 - x = Math.trunc(parseFloat(x)); // 尝试识别为小数,然后向0取整 - if (x == null || !Number.isFinite(x)) return '???'; // 无法识别的数或正负无穷大,显示'???' - var units = [ // 单位及其后缀字母,可自定义,如改成千进制下的K、M、G、T、P - { "val": 1e4, "suffix": "w" }, - { "val": 1e8, "suffix": "e" }, - { "val": 1e12, "suffix": "z" }, - { "val": 1e16, "suffix": "j" }, - { "val": 1e20, "suffix": "g" }, - ]; - if (Math.abs(x) > 1e20 * Math.pow(10, digits - 2)) - return x.toExponential(0); // 绝对值过大以致于失去精度的数,直接使用科学记数法,系数只保留整数 - var sign = x < 0 ? '-' : ''; - if (sign) --digits; // 符号位单独处理,负号要占一位 - x = Math.abs(x); + if (digits === true) digits = 5; // 兼容旧版onMap参数 + if (!digits || digits < 5) digits = 6; // 连同负号、小数点和后缀字母在内的总位数,至少需为5,默认为6 + x = Math.trunc(parseFloat(x)); // 尝试识别为小数,然后向0取整 + if (x == null || !Number.isFinite(x)) return "???"; // 无法识别的数或正负无穷大,显示'???' + var units = [ + // 单位及其后缀字母,可自定义,如改成千进制下的K、M、G、T、P + { val: 1e4, suffix: "w" }, + { val: 1e8, suffix: "e" }, + { val: 1e12, suffix: "z" }, + { val: 1e16, suffix: "j" }, + { val: 1e20, suffix: "g" }, + ]; + if (Math.abs(x) > 1e20 * Math.pow(10, digits - 2)) return x.toExponential(0); // 绝对值过大以致于失去精度的数,直接使用科学记数法,系数只保留整数 + var sign = x < 0 ? "-" : ""; + if (sign) --digits; // 符号位单独处理,负号要占一位 + x = Math.abs(x); - if (x < Math.pow(10, digits)) return sign + x; + if (x < Math.pow(10, digits)) return sign + x; - for (var i = 0; i < units.length; ++i) { - var each = units[i]; - var u = (x / each.val).toFixed(digits).substring(0, digits); - if (u.indexOf('.') < 0) continue; - u = u.substring(0, u[u.length - 2] == '.' ? u.length - 2 : u.length - 1); - return sign + u + each.suffix; - } - return sign + x.toExponential(0); -} + for (var i = 0; i < units.length; ++i) { + var each = units[i]; + var u = (x / each.val).toFixed(digits).substring(0, digits); + if (u.indexOf(".") < 0) continue; + u = u.substring(0, u[u.length - 2] == "." ? u.length - 2 : u.length - 1); + return sign + u + each.suffix; + } + return sign + x.toExponential(0); +}; ////// 变速移动 ////// utils.prototype.applyEasing = function (name) { - var list = { - "easeIn": function (t) { - return Math.pow(t, 3); - }, - "easeOut": function (t) { - return 1 - Math.pow(1 - t, 3); - }, - "easeInOut": function (t) { - // easeInOut试了一下感觉二次方效果明显点 - if (t < 0.5) return Math.pow(t, 2) * 2; - else return 1 - Math.pow(1 - t, 2) * 2; - }, - "linear": function (t) { - return t - } - } - if (name == 'random') { - var keys = Object.keys(list); - name = keys[Math.floor(Math.random() * keys.length)]; - } - return list[name] || list.linear; -} + var list = { + easeIn: function (t) { + return Math.pow(t, 3); + }, + easeOut: function (t) { + return 1 - Math.pow(1 - t, 3); + }, + easeInOut: function (t) { + // easeInOut试了一下感觉二次方效果明显点 + if (t < 0.5) return Math.pow(t, 2) * 2; + else return 1 - Math.pow(1 - t, 2) * 2; + }, + linear: function (t) { + return t; + }, + }; + if (name == "random") { + var keys = Object.keys(list); + name = keys[Math.floor(Math.random() * keys.length)]; + } + return list[name] || list.linear; +}; ////// 数组转RGB ////// utils.prototype.arrayToRGB = function (color) { - if (!(color instanceof Array)) return color; - var nowR = this.clamp(parseInt(color[0]), 0, 255), nowG = this.clamp(parseInt(color[1]), 0, 255), - nowB = this.clamp(parseInt(color[2]), 0, 255); - return "#" + ((1 << 24) + (nowR << 16) + (nowG << 8) + nowB).toString(16).slice(1); -} + if (!(color instanceof Array)) return color; + var nowR = this.clamp(parseInt(color[0]), 0, 255), + nowG = this.clamp(parseInt(color[1]), 0, 255), + nowB = this.clamp(parseInt(color[2]), 0, 255); + return ( + "#" + ((1 << 24) + (nowR << 16) + (nowG << 8) + nowB).toString(16).slice(1) + ); +}; utils.prototype.arrayToRGBA = function (color) { - if (!(color instanceof Array)) return color; - if (color[3] == null) color[3] = 1; - var nowR = this.clamp(parseInt(color[0]), 0, 255), nowG = this.clamp(parseInt(color[1]), 0, 255), - nowB = this.clamp(parseInt(color[2]), 0, 255), nowA = this.clamp(parseFloat(color[3]), 0, 1); - return "rgba(" + nowR + "," + nowG + "," + nowB + "," + nowA + ")"; -} + if (!(color instanceof Array)) return color; + if (color[3] == null) color[3] = 1; + var nowR = this.clamp(parseInt(color[0]), 0, 255), + nowG = this.clamp(parseInt(color[1]), 0, 255), + nowB = this.clamp(parseInt(color[2]), 0, 255), + nowA = this.clamp(parseFloat(color[3]), 0, 1); + return "rgba(" + nowR + "," + nowG + "," + nowB + "," + nowA + ")"; +}; ////// 加密路线 ////// utils.prototype.encodeRoute = function (route) { - var ans = "", lastMove = "", cnt = 0; + var ans = "", + lastMove = "", + cnt = 0; - route.forEach(function (t) { - if (t == 'up' || t == 'down' || t == 'left' || t == 'right') { - if (t != lastMove && cnt > 0) { - ans += lastMove.substring(0, 1).toUpperCase(); - if (cnt > 1) ans += cnt; - cnt = 0; - } - lastMove = t; - cnt++; - } - else { - if (cnt > 0) { - ans += lastMove.substring(0, 1).toUpperCase(); - if (cnt > 1) ans += cnt; - cnt = 0; - } - ans += core.utils._encodeRoute_encodeOne(t); - } - }); - if (cnt > 0) { + route.forEach(function (t) { + if (t == "up" || t == "down" || t == "left" || t == "right") { + if (t != lastMove && cnt > 0) { ans += lastMove.substring(0, 1).toUpperCase(); if (cnt > 1) ans += cnt; + cnt = 0; + } + lastMove = t; + cnt++; + } else { + if (cnt > 0) { + ans += lastMove.substring(0, 1).toUpperCase(); + if (cnt > 1) ans += cnt; + cnt = 0; + } + ans += core.utils._encodeRoute_encodeOne(t); } - return LZString.compressToBase64(ans); -} + }); + if (cnt > 0) { + ans += lastMove.substring(0, 1).toUpperCase(); + if (cnt > 1) ans += cnt; + } + return LZString.compressToBase64(ans); +}; utils.prototype._encodeRoute_id2number = function (id) { - var number = core.maps.getNumberById(id); - return number == 0 ? id : number; -} + var number = core.maps.getNumberById(id); + return number == 0 ? id : number; +}; utils.prototype._encodeRoute_encodeOne = function (t) { - if (t.indexOf('item:') == 0) - return "I" + this._encodeRoute_id2number(t.substring(5)) + ":"; - else if (t.indexOf('unEquip:') == 0) - return "u" + t.substring(8); - else if (t.indexOf('equip:') == 0) - return "e" + this._encodeRoute_id2number(t.substring(6)) + ":"; - else if (t.indexOf('saveEquip:') == 0) - return "s" + t.substring(10); - else if (t.indexOf('loadEquip:') == 0) - return "l" + t.substring(10); - else if (t.indexOf('fly:') == 0) - return "F" + t.substring(4) + ":"; - else if (t == 'choices:none') - return "c"; - else if (t.indexOf('choices:') == 0) - return "C" + t.substring(8); - else if (t.indexOf('shop:') == 0) - return "S" + t.substring(5) + ":"; - else if (t == 'turn') - return 'T'; - else if (t.indexOf('turn:') == 0) - return "t" + t.substring(5).substring(0, 1).toUpperCase() + ":"; - else if (t == 'getNext') - return 'G'; - else if (t == 'input:none') - return 'p'; - else if (t.indexOf('input:') == 0) - return "P" + t.substring(6); - else if (t.indexOf('input2:') == 0) - return "Q" + t.substring(7) + ":"; - else if (t == 'no') - return 'N'; - else if (t.indexOf('move:') == 0) - return "M" + t.substring(5); - else if (t.indexOf('key:') == 0) - return 'K' + t.substring(4); - else if (t.indexOf('click:') == 0) - return 'k' + t.substring(6); - else if (t.indexOf('random:') == 0) - return 'X' + t.substring(7); - return '(' + t + ')'; -} + if (t.indexOf("item:") == 0) + return "I" + this._encodeRoute_id2number(t.substring(5)) + ":"; + else if (t.indexOf("unEquip:") == 0) return "u" + t.substring(8); + else if (t.indexOf("equip:") == 0) + return "e" + this._encodeRoute_id2number(t.substring(6)) + ":"; + else if (t.indexOf("saveEquip:") == 0) return "s" + t.substring(10); + else if (t.indexOf("loadEquip:") == 0) return "l" + t.substring(10); + else if (t.indexOf("fly:") == 0) return "F" + t.substring(4) + ":"; + else if (t == "choices:none") return "c"; + else if (t.indexOf("choices:") == 0) return "C" + t.substring(8); + else if (t.indexOf("shop:") == 0) return "S" + t.substring(5) + ":"; + else if (t == "turn") return "T"; + else if (t.indexOf("turn:") == 0) + return "t" + t.substring(5).substring(0, 1).toUpperCase() + ":"; + else if (t == "getNext") return "G"; + else if (t == "input:none") return "p"; + else if (t.indexOf("input:") == 0) return "P" + t.substring(6); + else if (t.indexOf("input2:") == 0) return "Q" + t.substring(7) + ":"; + else if (t == "no") return "N"; + else if (t.indexOf("move:") == 0) return "M" + t.substring(5); + else if (t.indexOf("key:") == 0) return "K" + t.substring(4); + else if (t.indexOf("click:") == 0) return "k" + t.substring(6); + else if (t.indexOf("random:") == 0) return "X" + t.substring(7); + return "(" + t + ")"; +}; ////// 解密路线 ////// utils.prototype.decodeRoute = function (route) { - if (!route) return route; + if (!route) return route; - // 解压缩 - try { - var v = LZString.decompressFromBase64(route); - if (v != null && /^[-_a-zA-Z0-9+\/=:()]*$/.test(v)) { - if (v != "" || route.length < 8) - route = v; - } - } catch (e) { + // 解压缩 + try { + var v = LZString.decompressFromBase64(route); + if (v != null && /^[-_a-zA-Z0-9+\/=:()]*$/.test(v)) { + if (v != "" || route.length < 8) route = v; } + } catch (e) {} - var decodeObj = { route: route, index: 0, ans: [] }; - while (decodeObj.index < decodeObj.route.length) { - this._decodeRoute_decodeOne(decodeObj, decodeObj.route.charAt(decodeObj.index++)); - } - return decodeObj.ans; -} + var decodeObj = { route: route, index: 0, ans: [] }; + while (decodeObj.index < decodeObj.route.length) { + this._decodeRoute_decodeOne( + decodeObj, + decodeObj.route.charAt(decodeObj.index++) + ); + } + return decodeObj.ans; +}; utils.prototype._decodeRoute_getNumber = function (decodeObj, noparse) { - var num = ""; - var first = true; - while (true) { - var ch = decodeObj.route.charAt(decodeObj.index); - if (ch >= '0' && ch <= '9') num += ch; - else if (ch == '-' && first) num += ch; - else break; - first = false; - decodeObj.index++; - } - if (num.length == 0) num = "1"; - return noparse ? num : parseInt(num); -} + var num = ""; + var first = true; + while (true) { + var ch = decodeObj.route.charAt(decodeObj.index); + if (ch >= "0" && ch <= "9") num += ch; + else if (ch == "-" && first) num += ch; + else break; + first = false; + decodeObj.index++; + } + if (num.length == 0) num = "1"; + return noparse ? num : parseInt(num); +}; utils.prototype._decodeRoute_getString = function (decodeObj) { - var str = ""; - while (decodeObj.index < decodeObj.route.length && decodeObj.route.charAt(decodeObj.index) != ':') { - str += decodeObj.route.charAt(decodeObj.index++); - } - decodeObj.index++; - return str; -} + var str = ""; + while ( + decodeObj.index < decodeObj.route.length && + decodeObj.route.charAt(decodeObj.index) != ":" + ) { + str += decodeObj.route.charAt(decodeObj.index++); + } + decodeObj.index++; + return str; +}; utils.prototype._decodeRoute_number2id = function (number) { - if (/^\d+$/.test(number)) { - var info = core.maps.blocksInfo[number]; - if (info) return info.id; - } - return number; -} + if (/^\d+$/.test(number)) { + var info = core.maps.blocksInfo[number]; + if (info) return info.id; + } + return number; +}; utils.prototype._decodeRoute_decodeOne = function (decodeObj, c) { - // --- 特殊处理自定义项 - if (c == '(') { - var idx = decodeObj.route.indexOf(')', decodeObj.index); - if (idx >= 0) { - decodeObj.ans.push(decodeObj.route.substring(decodeObj.index, idx)); - decodeObj.index = idx + 1; - return; - } + // --- 特殊处理自定义项 + if (c == "(") { + var idx = decodeObj.route.indexOf(")", decodeObj.index); + if (idx >= 0) { + decodeObj.ans.push(decodeObj.route.substring(decodeObj.index, idx)); + decodeObj.index = idx + 1; + return; } - var nxt = (c == 'I' || c == 'e' || c == 'F' || c == 'S' || c == 'Q' || c == 't') ? - this._decodeRoute_getString(decodeObj) : this._decodeRoute_getNumber(decodeObj); + } + var nxt = + c == "I" || c == "e" || c == "F" || c == "S" || c == "Q" || c == "t" + ? this._decodeRoute_getString(decodeObj) + : this._decodeRoute_getNumber(decodeObj); - var mp = { "U": "up", "D": "down", "L": "left", "R": "right" }; + var mp = { U: "up", D: "down", L: "left", R: "right" }; - switch (c) { - case "U": - case "D": - case "L": - case "R": - for (var i = 0; i < nxt; i++) decodeObj.ans.push(mp[c]); - break; - case "I": - decodeObj.ans.push("item:" + this._decodeRoute_number2id(nxt)); - break; - case "u": - decodeObj.ans.push("unEquip:" + nxt); - break; - case "e": - decodeObj.ans.push("equip:" + this._decodeRoute_number2id(nxt)); - break; - case "s": - decodeObj.ans.push("saveEquip:" + nxt); - break; - case "l": - decodeObj.ans.push("loadEquip:" + nxt); - break; - case "F": - decodeObj.ans.push("fly:" + nxt); - break; - case 'c': - decodeObj.ans.push('choices:none'); - break; - case "C": - decodeObj.ans.push("choices:" + nxt); - break; - case "S": - decodeObj.ans.push("shop:" + nxt); - break; - case "T": - decodeObj.ans.push("turn"); - break; - case "t": - decodeObj.ans.push("turn:" + mp[nxt]); - break; - case "G": - decodeObj.ans.push("getNext"); - break; - case "p": - decodeObj.ans.push("input:none"); - break; - case "P": - decodeObj.ans.push("input:" + nxt); - break; - case "Q": - decodeObj.ans.push("input2:" + nxt); - break; - case "N": - decodeObj.ans.push("no"); - break; - case "M": - ++decodeObj.index; - decodeObj.ans.push("move:" + nxt + ":" + this._decodeRoute_getNumber(decodeObj)); - break; - case "K": - decodeObj.ans.push("key:" + nxt); - break; - case "k": - ++decodeObj.index; - var px = this._decodeRoute_getNumber(decodeObj); - ++decodeObj.index; - var py = this._decodeRoute_getNumber(decodeObj); - decodeObj.ans.push("click:" + nxt + ":" + px + ":" + py); - break; - case "X": - decodeObj.ans.push("random:" + nxt); - break; - } -} + switch (c) { + case "U": + case "D": + case "L": + case "R": + for (var i = 0; i < nxt; i++) decodeObj.ans.push(mp[c]); + break; + case "I": + decodeObj.ans.push("item:" + this._decodeRoute_number2id(nxt)); + break; + case "u": + decodeObj.ans.push("unEquip:" + nxt); + break; + case "e": + decodeObj.ans.push("equip:" + this._decodeRoute_number2id(nxt)); + break; + case "s": + decodeObj.ans.push("saveEquip:" + nxt); + break; + case "l": + decodeObj.ans.push("loadEquip:" + nxt); + break; + case "F": + decodeObj.ans.push("fly:" + nxt); + break; + case "c": + decodeObj.ans.push("choices:none"); + break; + case "C": + decodeObj.ans.push("choices:" + nxt); + break; + case "S": + decodeObj.ans.push("shop:" + nxt); + break; + case "T": + decodeObj.ans.push("turn"); + break; + case "t": + decodeObj.ans.push("turn:" + mp[nxt]); + break; + case "G": + decodeObj.ans.push("getNext"); + break; + case "p": + decodeObj.ans.push("input:none"); + break; + case "P": + decodeObj.ans.push("input:" + nxt); + break; + case "Q": + decodeObj.ans.push("input2:" + nxt); + break; + case "N": + decodeObj.ans.push("no"); + break; + case "M": + ++decodeObj.index; + decodeObj.ans.push( + "move:" + nxt + ":" + this._decodeRoute_getNumber(decodeObj) + ); + break; + case "K": + decodeObj.ans.push("key:" + nxt); + break; + case "k": + ++decodeObj.index; + var px = this._decodeRoute_getNumber(decodeObj); + ++decodeObj.index; + var py = this._decodeRoute_getNumber(decodeObj); + decodeObj.ans.push("click:" + nxt + ":" + px + ":" + py); + break; + case "X": + decodeObj.ans.push("random:" + nxt); + break; + } +}; ////// 判断某对象是否不为null也不为NaN ////// utils.prototype.isset = function (val) { - return val != null && !(typeof val == 'number' && isNaN(val)); -} + return val != null && !(typeof val == "number" && isNaN(val)); +}; ////// 获得子数组 ////// utils.prototype.subarray = function (a, b) { - if (!(a instanceof Array) || !(b instanceof Array) || a.length < b.length) - return null; - for (var i = 0; i < b.length; ++i) { - if (a[i] != b[i]) return null; - } - return a.slice(b.length); -} + if (!(a instanceof Array) || !(b instanceof Array) || a.length < b.length) + return null; + for (var i = 0; i < b.length; ++i) { + if (a[i] != b[i]) return null; + } + return a.slice(b.length); +}; utils.prototype.inArray = function (array, element) { - return (array instanceof Array) && array.indexOf(element) >= 0; -} + return array instanceof Array && array.indexOf(element) >= 0; +}; utils.prototype.clamp = function (x, a, b) { - var min = Math.min(a, b), max = Math.max(a, b); - return Math.min(Math.max(x || 0, min), max); -} + var min = Math.min(a, b), + max = Math.max(a, b); + return Math.min(Math.max(x || 0, min), max); +}; utils.prototype.getCookie = function (name) { - var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)')); - return match ? match[2] : null; -} + var match = document.cookie.match(new RegExp("(^| )" + name + "=([^;]+)")); + return match ? match[2] : null; +}; ////// 设置statusBar的innerHTML,会自动斜体和放缩,也可以增加自定义css ////// utils.prototype.setStatusBarInnerHTML = function (name, value, css) { - if (!core.statusBar[name]) return; - if (typeof value == 'number') value = this.formatBigNumber(value); - var italic = /^[-a-zA-Z0-9`~!@#$%^&*()_=+\[{\]}\\|;:'",<.>\/?]*$/.test(value); - var style = 'font-style: ' + (italic ? 'italic' : 'normal') + '; '; - style += 'text-shadow: #000 1px 0 0, #000 0 1px 0, #000 -1px 0 0, #000 0 -1px 0; '; - // 判定是否需要缩放 - var length = this.strlen(value) || 1; - style += 'font-size: ' + Math.min(1, 7 / length) + 'em; '; - if (css) style += css; - var _style = core.statusBar[name].getAttribute('_style'); - var _value = core.statusBar[name].getAttribute('_value'); - if (_style == style) { - if (value == _value) return; - core.statusBar[name].children[0].innerText = value; - } else { - core.statusBar[name].innerHTML = "<span class='_status' style='" + style + "'></span>"; - core.statusBar[name].children[0].innerText = value; - core.statusBar[name].setAttribute('_style', style); - } - core.statusBar[name].setAttribute('_value', value);; -} + if (!core.statusBar[name]) return; + if (typeof value == "number") value = this.formatBigNumber(value); + var italic = /^[-a-zA-Z0-9`~!@#$%^&*()_=+\[{\]}\\|;:'",<.>\/?]*$/.test(value); + var style = "font-style: " + (italic ? "italic" : "normal") + "; "; + style += + "text-shadow: #000 1px 0 0, #000 0 1px 0, #000 -1px 0 0, #000 0 -1px 0; "; + // 判定是否需要缩放 + var length = this.strlen(value) || 1; + style += "font-size: " + Math.min(1, 7 / length) + "em; "; + if (css) style += css; + var _style = core.statusBar[name].getAttribute("_style"); + var _value = core.statusBar[name].getAttribute("_value"); + if (_style == style) { + if (value == _value) return; + core.statusBar[name].children[0].innerText = value; + } else { + core.statusBar[name].innerHTML = + "<span class='_status' style='" + style + "'></span>"; + core.statusBar[name].children[0].innerText = value; + core.statusBar[name].setAttribute("_style", style); + } + core.statusBar[name].setAttribute("_value", value); +}; utils.prototype.strlen = function (str) { - var count = 0; - for (var i = 0, len = str.length; i < len; i++) { - count += str.charCodeAt(i) < 256 ? 1 : 2; - } - return count; + var count = 0; + for (var i = 0, len = str.length; i < len; i++) { + count += str.charCodeAt(i) < 256 ? 1 : 2; + } + return count; }; utils.prototype.turnDirection = function (turn, direction) { - direction = direction || core.getHeroLoc('direction'); - var directionList = ["left", "leftup", "up", "rightup", "right", "rightdown", "down", "leftdown"]; - if (directionList.indexOf(turn) >= 0) return turn; - if (turn == ':hero') return core.getHeroLoc('direction'); - if (turn == ':backhero') return this.turnDirection(':back', core.getHeroLoc('direction')); - if (typeof turn === 'number' && turn % 45 == 0) turn /= 45; - else { - switch (turn) { - case ':left': turn = 6; break; // turn left - case ':right': turn = 2; break; // turn right - case ':back': turn = 4; break; // turn back - default: turn = 0; break; - } + direction = direction || core.getHeroLoc("direction"); + var directionList = [ + "left", + "leftup", + "up", + "rightup", + "right", + "rightdown", + "down", + "leftdown", + ]; + if (directionList.indexOf(turn) >= 0) return turn; + if (turn == ":hero") return core.getHeroLoc("direction"); + if (turn == ":backhero") + return this.turnDirection(":back", core.getHeroLoc("direction")); + if (typeof turn === "number" && turn % 45 == 0) turn /= 45; + else { + switch (turn) { + case ":left": + turn = 6; + break; // turn left + case ":right": + turn = 2; + break; // turn right + case ":back": + turn = 4; + break; // turn back + default: + turn = 0; + break; } - var index = directionList.indexOf(direction); - if (index < 0) return direction; - return directionList[(index + (turn || 0)) % directionList.length]; -} + } + var index = directionList.indexOf(direction); + if (index < 0) return direction; + return directionList[(index + (turn || 0)) % directionList.length]; +}; utils.prototype.matchWildcard = function (pattern, string) { - try { - return new RegExp('^' + pattern.split(/\*+/).map(function (s) { - return s.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); - }).join('.*') + '$').test(string); - } catch (e) { - return false; - } -} + try { + return new RegExp( + "^" + + pattern + .split(/\*+/) + .map(function (s) { + return s.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&"); + }) + .join(".*") + + "$" + ).test(string); + } catch (e) { + return false; + } +}; utils.prototype.matchRegex = function (pattern, string) { - try { - if (pattern.startsWith("^")) pattern = pattern.substring(1); - if (pattern.endsWith("$")) pattern = pattern.substring(0, pattern.length - 1); - return new RegExp("^" + pattern + "$").test(string); - } catch (e) { - return false; - } -} + try { + if (pattern.startsWith("^")) pattern = pattern.substring(1); + if (pattern.endsWith("$")) + pattern = pattern.substring(0, pattern.length - 1); + return new RegExp("^" + pattern + "$").test(string); + } catch (e) { + return false; + } +}; ////// Base64加密 ////// utils.prototype.encodeBase64 = function (str) { - return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { - return String.fromCharCode(parseInt(p1, 16)) - })) -} + return btoa( + encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { + return String.fromCharCode(parseInt(p1, 16)); + }) + ); +}; ////// Base64解密 ////// utils.prototype.decodeBase64 = function (str) { - return decodeURIComponent(atob(str).split('').map(function (c) { - return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); - }).join('')); -} + return decodeURIComponent( + atob(str) + .split("") + .map(function (c) { + return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); + }) + .join("") + ); +}; utils.prototype.rand = function (num) { - var rand = core.getFlag('__rand__'); - rand = this.__next_rand(rand); - core.setFlag('__rand__', rand); - var ans = rand / 2147483647; - if (num && num > 0) - return Math.floor(ans * num); - return ans; -} + var rand = core.getFlag("__rand__"); + rand = this.__next_rand(rand); + core.setFlag("__rand__", rand); + var ans = rand / 2147483647; + if (num && num > 0) return Math.floor(ans * num); + return ans; +}; ////// 生成随机数(录像方法) ////// utils.prototype.rand2 = function (num) { - num = num || 2147483648; - num = Math.abs(num); + num = num || 2147483648; + num = Math.abs(num); - var value; - if (core.isReplaying()) { - var action = core.status.replay.toReplay.shift(); - if (action.indexOf("random:") == 0) { - value = parseInt(action.substring(7)); - if (isNaN(value) || value >= num || value < 0) { - console.warn('错误!当前random:项超过范围。将重新随机生成!'); - value = Math.floor(Math.random() * num); - } - } - else { - console.warn('错误!当前需要一个random:项。将重新随机生成!'); - value = Math.floor(Math.random() * num); - } - } - else { + var value; + if (core.isReplaying()) { + var action = core.status.replay.toReplay.shift(); + if (action.indexOf("random:") == 0) { + value = parseInt(action.substring(7)); + if (isNaN(value) || value >= num || value < 0) { + console.warn("错误!当前random:项超过范围。将重新随机生成!"); value = Math.floor(Math.random() * num); + } + } else { + console.warn("错误!当前需要一个random:项。将重新随机生成!"); + value = Math.floor(Math.random() * num); } - core.status.route.push("random:" + value); - return value; -} + } else { + value = Math.floor(Math.random() * num); + } + core.status.route.push("random:" + value); + return value; +}; utils.prototype.__init_seed = function () { - var rand = new Date().getTime() % 34834795 + 3534; - rand = this.__next_rand(rand); - rand = this.__next_rand(rand); - rand = this.__next_rand(rand); - core.setFlag('__seed__', rand); - core.setFlag('__rand__', rand); -} + var rand = (new Date().getTime() % 34834795) + 3534; + rand = this.__next_rand(rand); + rand = this.__next_rand(rand); + rand = this.__next_rand(rand); + core.setFlag("__seed__", rand); + core.setFlag("__rand__", rand); +}; utils.prototype.__next_rand = function (_rand) { - _rand = (_rand % 127773) * 16807 - ~~(_rand / 127773) * 2836; - _rand += _rand < 0 ? 2147483647 : 0; - return _rand; -} + _rand = (_rand % 127773) * 16807 - ~~(_rand / 127773) * 2836; + _rand += _rand < 0 ? 2147483647 : 0; + return _rand; +}; ////// 读取一个本地文件内容 ////// utils.prototype.readFile = function (success, error, accept, readType) { + core.platform.successCallback = success; + core.platform.errorCallback = error; - core.platform.successCallback = success; - core.platform.errorCallback = error; + if (window.jsinterface) { + window.jsinterface.readFile(); + return; + } - if (window.jsinterface) { - window.jsinterface.readFile(); + // step 0: 不为http/https,直接不支持 + if (!core.platform.isOnline) { + alert("离线状态下不支持文件读取!"); + if (error) error(); + return; + } + + // Step 1: 如果不支持FileReader,直接不支持 + if (core.platform.fileReader == null) { + alert("当前浏览器不支持FileReader!"); + if (error) error(); + return; + } + + if (core.platform.fileInput == null) { + core.platform.fileInput = document.createElement("input"); + core.platform.fileInput.style.opacity = 0; + core.platform.fileInput.type = "file"; + core.platform.fileInput.onchange = function () { + var files = core.platform.fileInput.files; + if (files.length == 0) { + if (core.platform.errorCallback) core.platform.errorCallback(); return; - } + } + if (!readType) + core.platform.fileReader.readAsText(core.platform.fileInput.files[0]); + else + core.platform.fileReader.readAsDataURL( + core.platform.fileInput.files[0] + ); + core.platform.fileInput.value = ""; + }; + } + core.platform.fileInput.value = ""; + if (accept) core.platform.fileInput.accept = accept; - // step 0: 不为http/https,直接不支持 - if (!core.platform.isOnline) { - alert("离线状态下不支持文件读取!"); - if (error) error(); - return; - } - - // Step 1: 如果不支持FileReader,直接不支持 - if (core.platform.fileReader == null) { - alert("当前浏览器不支持FileReader!"); - if (error) error(); - return; - } - - if (core.platform.fileInput == null) { - core.platform.fileInput = document.createElement("input"); - core.platform.fileInput.style.opacity = 0; - core.platform.fileInput.type = 'file'; - core.platform.fileInput.onchange = function () { - var files = core.platform.fileInput.files; - if (files.length == 0) { - if (core.platform.errorCallback) - core.platform.errorCallback(); - return; - } - if (!readType) core.platform.fileReader.readAsText(core.platform.fileInput.files[0]); - else core.platform.fileReader.readAsDataURL(core.platform.fileInput.files[0]); - core.platform.fileInput.value = ''; - } - } - core.platform.fileInput.value = ''; - if (accept) core.platform.fileInput.accept = accept; - - core.platform.fileInput.click(); -} + core.platform.fileInput.click(); +}; ////// 读取文件完毕 ////// utils.prototype.readFileContent = function (content) { - var obj = null; - if (content.slice(0, 4) === 'data') { - if (core.platform.successCallback) - core.platform.successCallback(content); - return; - } - // 检查base64 + var obj = null; + if (content.slice(0, 4) === "data") { + if (core.platform.successCallback) core.platform.successCallback(content); + return; + } + // 检查base64 + try { + obj = JSON.parse(LZString.decompressFromBase64(content)); + } catch (e) {} + if (!obj) { try { - obj = JSON.parse(LZString.decompressFromBase64(content)); - } catch (e) { } - if (!obj) { - try { - obj = JSON.parse(content); - } catch (e) { - console.error(e) - } + obj = JSON.parse(content); + } catch (e) { + console.error(e); } + } - if (obj) { - if (core.platform.successCallback) - core.platform.successCallback(obj); - return; - } + if (obj) { + if (core.platform.successCallback) core.platform.successCallback(obj); + return; + } - if (core.platform.errorCallback) - core.platform.errorCallback(); -} + if (core.platform.errorCallback) core.platform.errorCallback(); +}; ////// 下载文件到本地 ////// utils.prototype.download = function (filename, content) { + if (window.jsinterface) { + window.jsinterface.download(filename, content); + return; + } - if (window.jsinterface) { - window.jsinterface.download(filename, content); - return; - } + // Step 0: 不为http/https,直接不支持 + if (!core.platform.isOnline) { + alert("离线状态下不支持下载操作!"); + return; + } - // Step 0: 不为http/https,直接不支持 - if (!core.platform.isOnline) { - alert("离线状态下不支持下载操作!"); - return; + // Step 1: 如果是iOS平台,直接不支持 + if (core.platform.isIOS) { + if (core.copy(content)) { + alert( + "iOS平台下不支持直接下载文件!\n所有应下载内容已经复制到您的剪切板,请自行创建空白文件并粘贴。" + ); + } else { + alert("iOS平台下不支持下载操作!"); } + return; + } - // Step 1: 如果是iOS平台,直接不支持 - if (core.platform.isIOS) { - if (core.copy(content)) { - alert("iOS平台下不支持直接下载文件!\n所有应下载内容已经复制到您的剪切板,请自行创建空白文件并粘贴。"); - } - else { - alert("iOS平台下不支持下载操作!"); - } - return; + // Step 2: 如果不是PC平台(Android),则只支持chrome + if (!core.platform.isPC) { + if ( + !core.platform.isChrome || + core.platform.isQQ || + core.platform.isWeChat + ) { + // 检测chrome + if (core.copy(content)) { + alert( + "移动端只有Chrome浏览器支持直接下载文件!\n所有应下载内容已经复制到您的剪切板,请自行创建空白文件并粘贴。" + ); + } else { + alert("该平台或浏览器暂不支持下载操作!"); + } + return; } + } - // Step 2: 如果不是PC平台(Android),则只支持chrome - if (!core.platform.isPC) { - if (!core.platform.isChrome || core.platform.isQQ || core.platform.isWeChat) { // 检测chrome - if (core.copy(content)) { - alert("移动端只有Chrome浏览器支持直接下载文件!\n所有应下载内容已经复制到您的剪切板,请自行创建空白文件并粘贴。"); - } - else { - alert("该平台或浏览器暂不支持下载操作!"); - } - return; - } - } + // Step 3: 如果是Safari浏览器,则提示并打开新窗口 + if (core.platform.isSafari) { + alert( + "你当前使用的是Safari浏览器,不支持直接下载文件。\n即将打开一个新窗口为应下载内容,请自行全选复制然后创建空白文件并粘贴。" + ); + var blob = new Blob([content], { type: "text/plain;charset=utf-8" }); + var href = window.URL.createObjectURL(blob); + var opened = window.open(href, "_blank"); + window.URL.revokeObjectURL(href); + return; + } - // Step 3: 如果是Safari浏览器,则提示并打开新窗口 - if (core.platform.isSafari) { - alert("你当前使用的是Safari浏览器,不支持直接下载文件。\n即将打开一个新窗口为应下载内容,请自行全选复制然后创建空白文件并粘贴。"); - var blob = new Blob([content], { type: 'text/plain;charset=utf-8' }); - var href = window.URL.createObjectURL(blob); - var opened = window.open(href, "_blank"); - window.URL.revokeObjectURL(href); - return; - } - - // Step 4: 下载 - var blob = new Blob([content], { type: 'text/plain;charset=utf-8' }); - if (window.navigator.msSaveOrOpenBlob) { - window.navigator.msSaveBlob(blob, filename); - } - else { - var href = window.URL.createObjectURL(blob); - var elem = window.document.createElement('a'); - elem.href = href; - elem.download = filename; - document.body.appendChild(elem); - elem.click(); - document.body.removeChild(elem); - window.URL.revokeObjectURL(href); - } -} + // Step 4: 下载 + var blob = new Blob([content], { type: "text/plain;charset=utf-8" }); + if (window.navigator.msSaveOrOpenBlob) { + window.navigator.msSaveBlob(blob, filename); + } else { + var href = window.URL.createObjectURL(blob); + var elem = window.document.createElement("a"); + elem.href = href; + elem.download = filename; + document.body.appendChild(elem); + elem.click(); + document.body.removeChild(elem); + window.URL.revokeObjectURL(href); + } +}; ////// 复制一段内容到剪切板 ////// utils.prototype.copy = function (data) { + if (window.jsinterface) { + window.jsinterface.copy(data); + return true; + } - if (window.jsinterface) { - window.jsinterface.copy(data); - return true; - } + if (!core.platform.supportCopy) return false; - if (!core.platform.supportCopy) return false; + var textArea = document.createElement("textarea"); + textArea.style.position = "fixed"; + textArea.style.top = 0; + textArea.style.left = 0; + textArea.style.width = "2em"; + textArea.style.height = "2em"; + textArea.style.padding = 0; + textArea.style.border = "none"; + textArea.style.outline = "none"; + textArea.style.boxShadow = "none"; + textArea.style.background = "transparent"; + textArea.value = data; + document.body.appendChild(textArea); + textArea.focus(); + textArea.setSelectionRange(0, textArea.value.length); + var successful = false; + try { + successful = document.execCommand("copy"); + } catch (err) { + successful = false; + } - var textArea = document.createElement("textarea"); - textArea.style.position = 'fixed'; - textArea.style.top = 0; - textArea.style.left = 0; - textArea.style.width = '2em'; - textArea.style.height = '2em'; - textArea.style.padding = 0; - textArea.style.border = 'none'; - textArea.style.outline = 'none'; - textArea.style.boxShadow = 'none'; - textArea.style.background = 'transparent'; - textArea.value = data; - document.body.appendChild(textArea); - textArea.focus(); - textArea.setSelectionRange(0, textArea.value.length); - var successful = false; - try { - successful = document.execCommand('copy'); - } catch (err) { - successful = false; - } - - document.body.removeChild(textArea); - return successful; -} + document.body.removeChild(textArea); + return successful; +}; ////// 显示一段confirm ////// utils.prototype.myconfirm = function (hint, yesCallback, noCallback) { - main.dom.inputDiv.style.display = 'block'; - main.dom.inputMessage.innerHTML = hint.replace(/\n/g, '<br/>'); - main.dom.inputBox.style.display = 'none'; - main.dom.inputYes.blur(); - main.dom.inputNo.blur(); - core.status.holdingKeys = []; + main.dom.inputDiv.style.display = "block"; + main.dom.inputMessage.innerHTML = hint.replace(/\n/g, "<br/>"); + main.dom.inputBox.style.display = "none"; + main.dom.inputYes.blur(); + main.dom.inputNo.blur(); + core.status.holdingKeys = []; - core.platform.successCallback = yesCallback; - core.platform.errorCallback = noCallback; -} + core.platform.successCallback = yesCallback; + core.platform.errorCallback = noCallback; +}; ////// 让用户输入一段文字 ////// utils.prototype.myprompt = function (hint, value, callback) { - main.dom.inputDiv.style.display = 'block'; - main.dom.inputMessage.innerHTML = hint.replace(/\n/g, '<br/>'); - main.dom.inputBox.style.display = 'block'; - main.dom.inputBox.value = value == null ? "" : value; - main.dom.inputYes.blur(); - main.dom.inputNo.blur(); - setTimeout(function () { - main.dom.inputBox.focus(); - }); - core.status.holdingKeys = []; + main.dom.inputDiv.style.display = "block"; + main.dom.inputMessage.innerHTML = hint.replace(/\n/g, "<br/>"); + main.dom.inputBox.style.display = "block"; + main.dom.inputBox.value = value == null ? "" : value; + main.dom.inputYes.blur(); + main.dom.inputNo.blur(); + setTimeout(function () { + main.dom.inputBox.focus(); + }); + core.status.holdingKeys = []; - core.platform.successCallback = core.platform.errorCallback = callback; -} + core.platform.successCallback = core.platform.errorCallback = callback; +}; ////// 动画显示某对象 ////// utils.prototype.showWithAnimate = function (obj, speed, callback) { - obj.style.display = 'block'; - if (!speed || main.mode != 'play') { - obj.style.opacity = 1; - if (callback) callback(); - return; + obj.style.display = "block"; + if (!speed || main.mode != "play") { + obj.style.opacity = 1; + if (callback) callback(); + return; + } + obj.style.opacity = 0; + var opacityVal = 0; + var showAnimate = window.setInterval(function () { + opacityVal += 0.03; + obj.style.opacity = opacityVal; + if (opacityVal > 1) { + clearInterval(showAnimate); + if (callback) callback(); } - obj.style.opacity = 0; - var opacityVal = 0; - var showAnimate = window.setInterval(function () { - opacityVal += 0.03; - obj.style.opacity = opacityVal; - if (opacityVal > 1) { - clearInterval(showAnimate); - if (callback) callback(); - } - }, speed); -} + }, speed); +}; ////// 动画使某对象消失 ////// utils.prototype.hideWithAnimate = function (obj, speed, callback) { - if (!speed || main.mode != 'play') { - obj.style.display = 'none'; - if (callback) callback(); - return; + if (!speed || main.mode != "play") { + obj.style.display = "none"; + if (callback) callback(); + return; + } + obj.style.opacity = 1; + var opacityVal = 1; + var hideAnimate = window.setInterval(function () { + opacityVal -= 0.03; + obj.style.opacity = opacityVal; + if (opacityVal < 0) { + obj.style.display = "none"; + clearInterval(hideAnimate); + if (callback) callback(); } - obj.style.opacity = 1; - var opacityVal = 1; - var hideAnimate = window.setInterval(function () { - opacityVal -= 0.03; - obj.style.opacity = opacityVal; - if (opacityVal < 0) { - obj.style.display = 'none'; - clearInterval(hideAnimate); - if (callback) callback(); - } - }, speed); -} + }, speed); +}; ////// 生成浏览器唯一的 guid ////// utils.prototype.getGuid = function () { - var guid = localStorage.getItem('guid'); - if (guid != null) return guid; - guid = 'xxxxxxxx_xxxx_4xxx_yxxx_xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - localStorage.setItem('guid', guid); - return guid; -} + var guid = localStorage.getItem("guid"); + if (guid != null) return guid; + guid = "xxxxxxxx_xxxx_4xxx_yxxx_xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + var r = (Math.random() * 16) | 0, + v = c == "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); + localStorage.setItem("guid", guid); + return guid; +}; utils.prototype.hashCode = function (obj) { - if (typeof obj == 'string') { - var hash = 0, i, chr; - if (obj.length === 0) return hash; - for (i = 0; i < obj.length; i++) { - chr = obj.charCodeAt(i); - hash = ((hash << 5) - hash) + chr; - hash |= 0; - } - return hash; + if (typeof obj == "string") { + var hash = 0, + i, + chr; + if (obj.length === 0) return hash; + for (i = 0; i < obj.length; i++) { + chr = obj.charCodeAt(i); + hash = (hash << 5) - hash + chr; + hash |= 0; } - return this.hashCode(JSON.stringify(obj).split("").sort().join("")); -} + return hash; + } + return this.hashCode(JSON.stringify(obj).split("").sort().join("")); +}; utils.prototype.same = function (a, b) { - if (a == null && b == null) return true; - if (a == null || b == null) return false; - if (a === b) return true; - if (a instanceof Array && b instanceof Array) { - if (a.length != b.length) return false; - for (var i = 0; i < a.length; i++) { - if (!this.same(a[i], b[i])) return false; + if (a == null && b == null) return true; + if (a == null || b == null) return false; + if (a === b) return true; + if (a instanceof Array && b instanceof Array) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + if (!this.same(a[i], b[i])) return false; + } + return true; + } + if (a instanceof Object && b instanceof Object) { + var obj = {}; + for (var i in a) obj[i] = true; + for (var i in b) obj[i] = true; + for (var i in obj) { + if (!this.same(a[i], b[i])) return false; + } + return true; + } + return false; +}; + +utils.prototype.unzip = function ( + blobOrUrl, + success, + error, + convertToText, + onprogress +) { + var _error = function (msg) { + console.error(msg); + if (error) error(msg); + }; + + if (!window.zip) { + return _error("zip.js not exists!"); + } + + if (typeof blobOrUrl == "string") { + return core.http( + "GET", + blobOrUrl, + null, + function (data) { + core.unzip(data, success, error, convertToText); + }, + _error, + null, + "blob", + onprogress + ); + } + + if (!(blobOrUrl instanceof Blob)) { + return _error("Should use Blob or URL as input"); + } + + zip.createReader( + new zip.BlobReader(blobOrUrl), + function (reader) { + reader.getEntries(function (entries) { + core.utils._unzip_readEntries( + entries, + function (data) { + reader.close(function () { + if (success) success(data); + }); + }, + convertToText + ); + }); + }, + _error + ); +}; + +utils.prototype._unzip_readEntries = function ( + entries, + success, + convertToText +) { + var results = {}; + if (entries == null || entries.length == 0) { + return success(results); + } + var length = entries.length; + entries.forEach(function (entry) { + entry.getData( + convertToText ? new zip.TextWriter("utf8") : new zip.BlobWriter(), + function (data) { + results[entry.filename] = data; + length--; + if (length == 0) { + success(results); } - return true; - } - if (a instanceof Object && b instanceof Object) { - var obj = {}; - for (var i in a) obj[i] = true; - for (var i in b) obj[i] = true; - for (var i in obj) { - if (!this.same(a[i], b[i])) return false; - } - return true; - } - return false; -} + } + ); + }); +}; -utils.prototype.unzip = function (blobOrUrl, success, error, convertToText, onprogress) { - var _error = function (msg) { - console.error(msg); - if (error) error(msg); +utils.prototype.http = function ( + type, + url, + formData, + success, + error, + mimeType, + responseType, + onprogress +) { + var xhr = new XMLHttpRequest(); + xhr.open(type, url, true); + if (mimeType) xhr.overrideMimeType(mimeType); + if (responseType) xhr.responseType = responseType; + xhr.onload = function (e) { + if (xhr.status == 200) { + if (success) success(xhr.response); + } else { + if (error) error("HTTP " + xhr.status); } - - if (!window.zip) { - return _error("zip.js not exists!"); + }; + xhr.onprogress = function (e) { + if (e.lengthComputable) { + if (onprogress) onprogress(e.loaded, e.total); } - - if (typeof blobOrUrl == 'string') { - return core.http('GET', blobOrUrl, null, function (data) { - core.unzip(data, success, error, convertToText); - }, _error, null, 'blob', onprogress); - } - - if (!(blobOrUrl instanceof Blob)) { - return _error("Should use Blob or URL as input"); - } - - zip.createReader(new zip.BlobReader(blobOrUrl), function (reader) { - reader.getEntries(function (entries) { - core.utils._unzip_readEntries(entries, function (data) { - reader.close(function () { - if (success) success(data); - }); - }, convertToText); - }); - }, _error); -} - -utils.prototype._unzip_readEntries = function (entries, success, convertToText) { - var results = {}; - if (entries == null || entries.length == 0) { - return success(results); - } - var length = entries.length; - entries.forEach(function (entry) { - entry.getData(convertToText ? new zip.TextWriter('utf8') : new zip.BlobWriter(), function (data) { - results[entry.filename] = data; - length--; - if (length == 0) { - success(results); - } - }); - }); -} - -utils.prototype.http = function (type, url, formData, success, error, mimeType, responseType, onprogress) { - var xhr = new XMLHttpRequest(); - xhr.open(type, url, true); - if (mimeType) xhr.overrideMimeType(mimeType); - if (responseType) xhr.responseType = responseType; - xhr.onload = function (e) { - if (xhr.status == 200) { - if (success) success(xhr.response); - } - else { - if (error) error("HTTP " + xhr.status); - } - }; - xhr.onprogress = function (e) { - if (e.lengthComputable) { - if (onprogress) onprogress(e.loaded, e.total); - } - } - xhr.onabort = function () { - if (error) error("Abort"); - } - xhr.ontimeout = function () { - if (error) error("Timeout"); - } - xhr.onerror = function () { - if (error) error("Error on Connection"); - } - if (formData) - xhr.send(formData); - else xhr.send(); -} + }; + xhr.onabort = function () { + if (error) error("Abort"); + }; + xhr.ontimeout = function () { + if (error) error("Timeout"); + }; + xhr.onerror = function () { + if (error) error("Error on Connection"); + }; + if (formData) xhr.send(formData); + else xhr.send(); +}; // LZW-compress // https://gist.github.com/revolunet/843889 -function lzw_encode (s) { - var dict = {}; - var data = (s + "").split(""); - var out = []; - var currChar; - var phrase = data[0]; - var code = 256; - for (var i = 1; i < data.length; i++) { - currChar = data[i]; - if (dict[phrase + currChar] != null) { - phrase += currChar; - } - else { - out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); - dict[phrase + currChar] = code; - code++; - phrase = currChar; - } +function lzw_encode(s) { + var dict = {}; + var data = (s + "").split(""); + var out = []; + var currChar; + var phrase = data[0]; + var code = 256; + for (var i = 1; i < data.length; i++) { + currChar = data[i]; + if (dict[phrase + currChar] != null) { + phrase += currChar; + } else { + out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); + dict[phrase + currChar] = code; + code++; + phrase = currChar; } - out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); - for (var i = 0; i < out.length; i++) { - out[i] = String.fromCharCode(out[i]); - } - return out.join(""); + } + out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); + for (var i = 0; i < out.length; i++) { + out[i] = String.fromCharCode(out[i]); + } + return out.join(""); } // Decompress an LZW-encoded string -function lzw_decode (s) { - var dict = {}; - var data = (s + "").split(""); - var currChar = data[0]; - var oldPhrase = currChar; - var out = [currChar]; - var code = 256; - var phrase; - for (var i = 1; i < data.length; i++) { - var currCode = data[i].charCodeAt(0); - if (currCode < 256) { - phrase = data[i]; - } - else { - phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar); - } - out.push(phrase); - currChar = phrase.charAt(0); - dict[code] = oldPhrase + currChar; - code++; - oldPhrase = phrase; +function lzw_decode(s) { + var dict = {}; + var data = (s + "").split(""); + var currChar = data[0]; + var oldPhrase = currChar; + var out = [currChar]; + var code = 256; + var phrase; + for (var i = 1; i < data.length; i++) { + var currCode = data[i].charCodeAt(0); + if (currCode < 256) { + phrase = data[i]; + } else { + phrase = dict[currCode] ? dict[currCode] : oldPhrase + currChar; } - return out.join(""); + out.push(phrase); + currChar = phrase.charAt(0); + dict[code] = oldPhrase + currChar; + code++; + oldPhrase = phrase; + } + return out.join(""); } diff --git a/main.js b/main.js index a9242ca..0295c32 100644 --- a/main.js +++ b/main.js @@ -276,7 +276,7 @@ main.prototype.init = function (mode, callback) { coreData[t] = main[t]; }); main.core.init(coreData, callback); - main.core.resize(); + core.resize(); // 自动放缩最大化 if (!main.replayChecking) { if (core.getLocalStorage("autoScale") == null) { @@ -492,7 +492,6 @@ main.prototype.selectButton = function (index) { main.prototype.importFonts = function (fonts) { if (!(fonts instanceof Array) || fonts.length == 0) return; var style = document.createElement("style"); - style.type = "text/css"; var html = ""; fonts.forEach(function (font) { html += @@ -910,7 +909,7 @@ main.prototype.listen = function () { ////// 点击“开始游戏”时 ////// main.dom.playGame.onclick = function () { main.dom.startButtons.style.display = "none"; - main.core.control.checkBgm(); + main.core.checkBgm(); if (main.levelChoose.length == 0) { core.events.startGame(""); @@ -923,13 +922,13 @@ main.prototype.listen = function () { ////// 点击“载入游戏”时 ////// main.dom.loadGame.onclick = function () { - main.core.control.checkBgm(); + main.core.checkBgm(); main.core.load(); }; ////// 点击“录像回放”时 ////// main.dom.replayGame.onclick = function () { - main.core.control.checkBgm(); + main.core.checkBgm(); main.core.chooseReplayFile(); }; diff --git a/project/animates/hand.animate b/project/animates/hand.animate index 09c9514..936d7d4 100644 --- a/project/animates/hand.animate +++ b/project/animates/hand.animate @@ -1 +1 @@ -{"ratio":2,"se":"attack.mp3","bitmaps":["data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","","","","","","",""],"frame_max":8,"frames":[[[0,0,0,30,120]],[[0,0,0,50,255]],[[0,0,0,70,255]],[[1,0,0,80,255]],[[1,0,0,90,255]],[[2,0,0,90,120]],[],[]]} \ No newline at end of file +{"ratio": 2.0, "bitmaps": ["data:image/png;base64,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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAUbElEQVR4nO2ceXwURRbHf1XdM5M74VBQDoVlBSPhEIgEkvTM5OAwgiwiuougi4K6y8KqeLIgrLsu6i4qoKIIniss14LBkGOmpxNuiAgRFBYP5FQBIecc3fX2jxjlCGQSZobsfub7+cznM139Xr/X9bq6jq4qIEyYMGHChAkTJkyYMGHChAnzP4T63LDrLrcPlwK/3A5cCHWG4pdvgmFIsH0JJs02ALj6aKSfkjcH1Y8g0ywCoAzo0OHcNNvEfVX+6HJGJqXHVTFNset8bmhsU/QCSbMIgHN+uwH1pr+R2LpBZSYAhrZNscu4uLYpev93KCkdLMqA9vHnpjvfSurZkK5w3bfVKLp3cmNtOmdnJTZW5/8aoyx1UVP0xIbx+4zi8dsaq+d4LmtdU+wFmmbxCgIA+8QD94vPbOfVBc4lfS7+epHRgpuob2NsOf9uH8CY8UojXQwKzSYA2saDXnD2wbnpBGncRRUtrAXMEpTe7c3+2mJM/MU+1blG6d7W35ZW0Gg2AQAAdm27bPXd7r8+K43L2kV1zGYJFjOci3IUf2yoc2054FR7QLA01ddA0bwCYHm3Oj3tFw+dmWa/feNmdWVWUn3yzndHxMMSDVgigcjImX4ZkdnDgrPNSuIV0HYfO3XpXl8azSoAAKBtOjLWsWzgsjPTBIt8pu6/c/n4eOfyCT0BwGrvfS3MMYAlBtwSn3LutRxLbn/grOPFg5+CLIGZpdfB5e6N8Uvp3qbhJnETCFoACp+6rt6ntiHsd27bw6WI1s5Vg39ugkrR+376L8d2Jh71AACQOaY/zPGAOQEwx0NJ7nJ2U1aKtSi9OrYEAHXxOJmbIjNhjoT9fsdXYMxvn5TubRJn3NEtKPVF0AKQ9Zd9ZfqK5Oz86Z0b3UkSLHqVzX7TS3XHjMcuUdc+UFs38KjOXI7uCgBMbt0VplaA3BIwt4JzzVNz63Scq6eO5ab4/eCSCQBEtLwGcgwgR0Lp0b4dGDvojy9KUtsb1L+mJdmnaX7JN5agvoLkkVsLbEkdkn0r0mY3Ri9jxJqXCeZW6toJCwDAnvN6KXj8fQBAPKozpBjQ90XxJLe6FnIrwNQKMLcCt1x5l9IvkanqDJnJ8fcoKX17g0tmx+pHx3NzbCTMsRBy1GZw3kXbdfi0P76oz6TM4MOWL2383ftH0OsA8yhtjeDSQW+u/aT6wnXR/upp648cV6w33ayue6r2Vcbj4Sz4+zXgsX0hxUJEWA6BtxgKuUVtAKSWgKklXI7XhLVPhmZNTelFppajnXn/GMfl+DGQ4wApDraben4C7t9tG/8e5uLDV93epBv3k5BUwpYRrnkCfMnApE6VXueQF+uTcSy//Xnn0tt+assLFl0CnnC1YkvJczrnmcFiQIh6g8tRVyrW1DZcTojhUoIFvAXAEwDpx5+pFSC3GACpZQI3t7qBW1r+GVI8an+xsI2afwxcAgA4lz5Qb99BnaFw8dGIHdKta6yBzotzCVkrKCKn6EGSpFKYIyZ7t4yqKlygnDUWw82RzyPyynx17SM5tQmx34EnHGesZTtrav9qxaZcabfZWlqt1m7gcZEkx+0kFrsR8pUaSVElJMVsIyn2c+Ix3xKPEXVPPOQWsKYNlMBjoKT27w8uoS4AAOLO9VN9WbnSqly9W9t5JCPomQLA/6ZAAFASr0D+G9YKHhUZwyxRgCVi6/pvdqTYbJoAAOfax1VIkWA8EoAFinVAd8YsrQkRhxiXv3K5dhiC2AFA2sAg7QSXvmQs4iTwg4Uo8mqQ6EagZA6kAwQl7cZWIL0zI180CY+HkdtizRxnBQnP09PGPGvLedJ2pn/O14cr1l5XvQPdO4MPWPRWKPIkpAEAAKVvx5YFi4ec4JZIMEscYIohYrErSkoPvAYpehr4mQFIbaMV7/xWgKuc89dttpHHGmPL6Vg7lJF4ULH2i4XhSWTwtIbhBolqQy3ZMitjyORZdbKO9+97wn5jmyeEr6JM6vHSwIDf+AUIeQAAwF02aSSPjFvOIhLATDGAOQFMjjmlbfjPJ+ARAIsAYxYIJr+fkTF64aXaU9UPuwhDzLKl9+kM4enN4DarxRtus2dPWKGqM3h64i80rlemkve0h3d6IiIQ9+gvlyUAAOD5+m+HuCWuHTPFAXI8mCkWjEcDUvQGtXjH9ozM30wJtE2nY00Wg/6kktqrC6jmKuhV3zJRdTX0SkA/DZe2uY1t1LzvAm33srP8b8nxK+coZ/UkhXdpkvfbt0n/YQ3pFSoZ1dsqnfmLVGfBuyOD7Y+jaNkHwvPlHnLvJqraSlSukvHDqpWXel0l8YrL9kA3iLpYkXNfGfrMmWne4ytIP1VEesWmckfeQtWZ/3avUPnjKFj2gnB/sYtqyoiqt9CF5JzOeQ0Ocyvd27ZX/BqLPZ+QRmzpvNvMsdGWfJjjdnNzbIXdZnucmWK9xevLNjIe+Tv7kLv3hNIfR8EHL9iUvkOJqvZLEb2GAYCSlmh+etZUIardj/GoY8/abDPFhfSVpLYdweiQtuvbC8o0RMiLzEdv39OJmeIXcVMcbBlWKze1drmKNz+defOEi477BwtH4fsfWFMSU8HFVwCEy7WNSMCTmXP/4Prkld7tZQiRBKLPtV1Ha0LsbuNYOTul3g/feR88+p7nu7wvvT+sLyv6cO4fQu3XuTjWveU0Kks9RsW27x0fvabWJ6P0u6ajcmP7NKVXuw5Nfd3Uhxy4S53Prx7btOfUpvHdWERcHkXETh0+YeUxQJZs1pRrwc0tXcVb/pM9/OGXg+mDPzBuelIIPodz9Ldl97gDAPTyj7M4eY7bBo2NgzAEhPgasYdKtACX05C9gir3zhbcnMCYKQHcFAtmii3RSkofyBo+ZXeofLgYReveW2FLTUwnRLaG4YMUtS/DqvzJgDC8IGObtuULPRh2g1oCzsS16Yt+9oy07UyyAMx80lW85ZvsWx9pFpkPACB9DpjUWujGwKycuzMgfKS6Zp7Qv6uqdjjX9n98QtfOwucm8nlMMHw3wGfszZla+vqlmg1pJew+suw/TI7tIkW22qQWbZiYNWJKWSjtN0Th2oV51tTENNIrIkk/vcflKjlOegXIVwXSKyF8Hgiv9/CwyevHBMpmwEtA4eoXbmOEkYLEYckc6/oxOQ5g6Rs+OXHIqnTp4nJt9jS3zAcAJjx/BdF8ENq7SnYcJwJIACQIwuAgnd03bPL6/YG0GfAAZA1/ZDmA5eqaBdEGGasY56a6c9b0vhEAOwzD+DzQdgNB5i2/KylY/cIJZWB3NwSBDAIRIATtzJm4dkowbAbte4Bt2MQqvbzsWeE5CQCwWvsxMNYfwBHBae7FtS8jhgDAPCQIgACDb1TOvSumBMtcwEtAwcJbO5El5kkmx3SBFA0iN9L6d+wMYXQEk+HSNldl5UwKaY+3UZBRTDplEgkM+c0rtoYVLo2ABKDwxf4jyRwxnpmjImEyg0lmQLYAkgWMm1G8Yf+XVqVVRyY1fK3LDTFsBei2IXc+f0Mo7DUpAOo4MOrStTXJ5mTI5sGCs04MPIJxCZDkH3+m2kBwCxSlx/WMM9Q2uprvgCEAMNDnAKoqv/mgnOnlI6M7TywMpr0mBcD2NgjY+z2AtQDWqnN6SoY5OhWM3UeMtbUN7JoAS3xbJrdoBykGtbMQGMAYWDMvBiZ4joAxN+c8VgD5FZ/P1oXnVI3wVBwVvqq1VOV2uUq/2nvbE5v3nan30/DEyXZMKzt8wdHVc2lSAH6cVdwdHFFgzPv0O9/v1Xbs1ABoAFC0slUfRen5KuNSHBiPZUwG2M9BaNa0gAfMLBgYiNODOfe+/xlIB4QBCN0DMk5A0CnlxvYR2seH3HVqPw9R+J/5QBMDoH16rAbABRdFZP7q5VIAyeqaF6LJZMm1Kn16ASwBrPkHwF1uaQl4TWBse85dr28EsEfbsCcowxBAkKel2IY9UmUfMsnmKv70E4C+YoyBNfM6gBtyZ4BFuYq3VT42ISVTW78raJkPhGheEGOAVvLJARAF9WYCAWPoyThjjHEwzm9Z+9bdau7Ckeet3AkUIZyezkCgHQCgqguabU3MiA8EWGfGOcA4OONgkN7JfS1HXT3X3j/Q9oI+GupY9/KbYAKAgFZSWqVYk9u4XNuGAVgVbNtNQuLXgLFtf52X/0etuHTXmady52Ulf/hi6hSh65HDH9n8bCDMBTUAjtxnXuZkdAbVfTJlABntidFoNMMAqB/Ob5uq9OEQ5csAaqGk90jRindtqjuf8/vCrQC2XkYX/ce5+o9nDdk68xakippte6lmB6n5i+v97He5Kcx9Zbpevukb36mi/XTi3x0VJZEpaYkxSmpwFmcAIeyWOtfNt1nTezvBzADkfWrxjjkZg+55LVT2/cHx0SsqhBdEbkCvhtArZ2WP+kdQH5aQVMLO3OfaWVO7zAP5ANIB0q9joNGhsO0vjryF99b2UwDGCGAGOIzpBe/fsyKYdoNeAhyrpo6xZna/FyI+HXL0p1rx/hOADDAGAv8wY/Bv/xFsH/zBuW6hCvKCyAMY1YBRAfgqQb5ykK8S5Kn6V/aE/FcDbTeoAShccvcqLsckKErPr10bj8zLHD6jtO6cM+91FeCAxMfZs3/7TTD9aAhH3qIXrdbet9oHjb9NK/54e1160b/u7w+9/PfwVLSDtxrkc4N5vU9kPrRtc6BsByUABQsyBsMcNZWbop7IHLO03laD46P588DkG0CMMoZOsAfDD39wFiweaU3v+zCEJ0Wgan/G4EnZWvGur+qTdcxNGUse9z3QDZDX+F3W9N3N67uGOqdny/w5N033R7Ywd84So8pVYlRt2e/4aOFl2bfBmf92L2f+IpXcH5Oo2UCiqpCM8pX/VtISr21It+iZ6wcUzuy6umD6LzuFwNWGKfxLUqNmChStflbVywuOGpXFJKq2lDnWvdmolZSXijPvrUTnukWqXlV6SknvrSjpPRVRsXa4cer9jcbxVx1K6i/9/iDjfOq6bs7pXc7bbickNOUJUNUZvGDldFX/YTXp5YVkVJaQqN5c5sh/MyQloShvoeLIW6iK6u27nHmvqACgpCfFKGmJ7ZS0bslK2nWKODjzLmVg59Rg+3JZhibXvTfhWZu9dxo3xw+EFPU1k2MWMx7RjjFzb7W4rJJxdnewKuai3AUP2ezKLaCKri5ty97aZrF7f0bO4/edK6sM7NQRoE6AsV7bcNAIhj+XJQB5i3+jWu09+w0e80YyOPtM0/ZRUe7L+Vwym8FkMC5BgH2YkX13wJqohblzbyADc2225FYMeg9AP6kVb90F8gHCDW547rP9avYF5/wo/a6WtG1HAh6EkE1NrCN3/qBfk6/64OAxr92rlXz5RV06g9sMie6CwLsAYEvvc7ta8NYtAnxpRvbYJveYC9fMTSLSn7em3hhJZPSEUR1v6Pqd4DWvkl4NCC8Y3BDC/QaAC86CqMt8JfEKIMJ0lfbxkaNN9elMQh4AQ/cOff6feydrG74+UZdWuHLqEojql+zZjx5y5r0EIgHGfD4lvcdAMHOCWvDOaAF8ywhLmblmjc028aJPYmHu/Ouh66MAYSPDA0E+r9CruoH0eIIOMB/PvnXGra6Vkz4pVPcs48JtYsKNwndGFWSNXZZ9sWtre74HgKNKr6uuAJEJMjuqlR5t1GfIMwnpK2jV31L+MOLxTWdNR1cXj5N90dHLsm9/ZQQAOD+arYKZYbMlMwKL0Yp3VwiSijhjmbUjJ7UuEwGAAASBIGrnEAofiAwoad0ZGdIvXK4N+0noELo+csidM0+6j34wGaS/CNJnDRr9nBMQhrZ+7/r8d36dzMk7mxkeMF/NZxkTix70956U7m37ATipfXrsiwaF6yG0C7VTOli0TQc9Z6blvzNqwaCxyybWHTs/nKaCR4BxM8DMICY9ZB80aYeqzuDwdnAIYqttSr/7AdaVCEsAcQcEgYSvwqluKswe/oeR6uIZ8oChNy4nYXRS1c0nLVLFIPvoV70/+ZHarQ+IYlAbuK3axi9qAKBwQdZUZniHwut5L3PK5jf9vq/ubeJArJO2+9jOxuZJyL6IKTe1s4AZZ32SXLcgK8lseKfUHTuX/z4eegWYXgkYlRBG5Qb7oEk7AMBmmymEqCnLGDz+RR7ZoxtEDeyDx71Geo2HjCrdpZaUyu7jdwKA7Z6ZuqXN8FuFfvzP5KtATaX3+jPtaus/LwUZn/048za5Lj1rYuHzUnVlDjP0MUXPJfX29960T78tb0rmAyEKgNKnnQUC7bWNZ7ciLEe8u233rP55nZV+shd8FYBeDujlyLh52rSznI04PqXuP/nK14IMkFG+GkbFETKqYR89y3umfFSHCcuF+/Rjwnv6jnN90jbu/w662AghoCR3/GkDcNsjpVUZD2+3MZ+4wzk9Keidq6AHQOl1lQWCbtK2HT7vHWmbqZ21upC8lT3hqwB85SDf6bHnyZ+5YtFz8lmQDtJPF1LNya/Jd9pXn/2cif/cKryV9e4Rqm39yqdtOaBB0FVK3/Zn5UXGU7sfg9mX4O8m4k0l+CWAKAkeX7Ffst6qNHgrIbzl5fZRiy+6Q5V95LQtIANZw/+0R9M2C/JWrb+Q7PDJ6y66skvbflCDoC7n2Zj2+YFzH5JAE/RmqLbz2PaGpWph7urWkLzgx/iIBq+7fp+upPwSIKokbzmY0Esuyc+PD+9rWCrwhLwfcFF8XpBulNlnbvXvqRMGAByBtxKCRPNZb9YImk0A1BnXyOTzIOPRT/1fN2yIcnDfCXgqMXjSuv/JTTaazb6hZLKMIK/RuFW4ZBzRth4meKuD5FXwaTYlgHTjjoyn9zVupxTdOA4A8HoOB8OnUNBsSgAEGr1qUttZ268gwxuUPT3D+EnRzO4TG5ZqnjSLEqDOuKZlU3WVxCuYEHQgkP6EkmYRANvMAyebrMxkMyP9sk5ruRSaRQAuCdnslRkatZtimDBhwoQJEyZMmDBhwoQJEyZMmDCXg/8CxoFcKsBvx0cAAAAASUVORK5CYII=", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII="], "frame_max": 16, "frames": [[[0, 0, 0, 30, 120, 0, 0]], [[0, 0, 0, 35, 153, 0, 0]], [[0, 0, 0, 40, 187, 0, 0]], [[0, 0, 0, 45, 221, 0, 0]], [[0, 0, 0, 50, 255, 0, 0]], [[0, 0, 0, 55, 255, 0, 0]], [[0, 0, 0, 60, 255, 0, 0]], [[0, 0, 0, 65, 255, 0, 0]], [[0, 0, 0, 70, 255, 0, 0]], [[0, 0, 0, 72, 255, 0, 0]], [[0, 0, 0, 75, 255, 0, 0]], [[0, 0, 0, 77, 255, 0, 0]], [[1, 0, 0, 90, 255, 0, 0]], [[1, 0, 0, 90, 255, 0, 0]], [[1, 0, 0, 90, 170, 0, 0]], [[1, 0, 0, 90, 120, 0, 0]]], "se": {"1": "attack.opus"}, "pitch": {"1": 100}} \ No newline at end of file diff --git a/project/animates/jianji.animate b/project/animates/jianji.animate index 2720aaf..fb9fe34 100644 --- a/project/animates/jianji.animate +++ b/project/animates/jianji.animate @@ -1 +1 @@ -{"ratio":2,"bitmaps":["","","","","","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJKSURBVHhe7dpNTxNBHMfxAhox0QRNTPSgV+PJiy/DA569E6+ePXD2LCYai0k1JFKpPEgL8rS4FEIrpnApiGmaGpOmBqUgpC07D3aawfgKZhLz/Vxm5re3ncx/ZtqNAQAAAAD+Y1rrLtuFa+blMwGeBUFwxnbhSzKpezodHWM1+DI4qLuZAI+mpyuXbJdJ8CEIyr1/SxHc+fcUlCse3TWtjnEy8mJl/dft0Vl12Q6ZBNdMGUpnxWc7hA+LuWho+L26Z/qUIg9m8gc3n6SkON0buCk7Zk5CM6tifSglQxvBtfHwsP/pmJTDGXXFRnAp9fHHtXehOBh6K5s2gkum7o8siYGwIFV8Sj2wMVxKzB3eSgWRfJWWihuyB8839NnMqhhotqR6MSl3bQyXgkD3Lm/J46W8PB6fVddtDFfae0HPyAcRtlv9Zl6UuRN4sLamzpeqorFTOVGp5ahzQ4ZDnRNRRlbMKhgPo912020fwZVkoK8Wy+J36XskR+eixzaGS68X5ZZZBVNho1Uu614bw5XEvL5R+BodfqtGcmxBPbIxXHo2ITaUXQW1Wu2CjeGK+bdssyTq1b1IZrLqoY3h0stJmejsBSuNk0JZ99kYrrTffdfml6j6sy7EfE7ctzFciqfVHdXeDMwqsBFcyxdlvH4kRKWuTz/ogmt7+yKcyDaapizZCC6Z70k/bbcWstvqoo3gmlLqXGGn2W+H8GF/X/e1yxA/0gGAAxz7PGPDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAs1jsD8fsSMjMXLQKAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPYSURBVHhe7dxLT5xVGAdwpKKkiYmX1oTExIULozHxMxhjYqILdeta070foBt3rkSUgsO0OIW0XMZhrgwX33BrwULAcilWKQ6ptRKRDpeBmfe5eE49NX4Bz0vG/y+ZzDnPmQXvec6VMDQAAAAAAABAHVPVx1wRfLOdjwRELAiCx10RotLXp6ceFrQBsyEq589rIxIQoWy29IwrIglRCILN5n+WIvDn36egubWDd+27NuBkFImp2T9fvzosz7oqkuCbXYZy07TgqhCF8bmwrSsj79sylqIIFL4vv/zFINOjvQE3Zc/sSagwQ7NtgzzpQuDbt5N77305wNyVl7MuBD4NTmy3JCep3NbPxy4EPtl1v+c7+ri1jyWWlnMuDD51j+y90jMScntSFTfkCHTMa9PwNfqwf4y1M8W3XRh8yt+WJy+kVOM51eSoPOfC4IvZC05dKvD49JJqe5LZha1G9w7/tSDQ5kRRNXtNNTUdvuHC4Is9EcWGuHxrM5TeUTrAzTgCiUBeuLFGPLtKfGWc+10YifDFjvrECO+X7pJkprhmN2fMBM8SI/Lm8s8hrZeIL+f4D5sAJMGz4RtU+XVH9PoK02Agr5kE2NPQ/yMJ7mEjY0f75WL46S/3Q9n6nTlW4LK9IfeZo6r7SH0TkRbTCU2uGol5czsOlqh6UBGdW6Wwp8ifuWWofmeBfUDX+SdipMXTvLa7L7prDqTJKX2Qn5SzLgn1yTxco31A84p09D/St6JPFK+THB+zLG9yrXOIb9Z7AprM60Sts20DXN0ukxxVze14JjwIFvXpuk7CSZMoSMvwTMhVUi39RhLP8LZrAh/saG8dYNoti9ZYdGKRqvlZedU1gw+dKfloZoXFzoIdsxxdKtI+liHPzF4ge4dqZoHqDxscdmd4wCQBv6r2pX2IP1/cIBHT6/uHJOZeUEkHesY1gw+xDB9Va6o2CeslCttTfNM1gQ/xnLxVukdsViG1U+GbLB+m5/W0a65PJ22zu5jjROX471nw4wZRPMe9rqk+mec8URud/XrTwi1aNj+XmQWi3Vl6gD9l8awjrWe2dnjPJmF8gWpfZ8O3XRP4MrZA55hZdsuhdGX4vskF7gU+2aVoa5vH7GZ8ZZQrXxXledcEvlwMtLlGfHf9DlFvgZZdGHxavSMvHtWo0j3Chw+/fwz+haF8sPQT1TqGaMKFwCe7AW/ek09iea5gM46I7fjMFMdbr4bvuBD4ZpLQ2J7ioqtCFNJpPR1LyVOuClG4kJSXXBGiEgSKfw4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPWtoeEvT/ukTdlu2cUAAAAASUVORK5CYII=","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAScSURBVHhe7dzLT9xVFAdwpFqrxrdt0sSVG6MxMel/0Lgx0YUuXLlw1xj/CRa600QLtLyH0gEKwwzMwDDD8PqVZ0EgQHkIDRShNQK1pcOb+d1zjvfi1fgPcH8N+X42c3/nsuF35p57z/wY8gAAAAAAAOAUE5Hn7BBcMzcfCQiY53nP2yEEJRKRM8cDycNqCEpBgeQjAQFKJlfftEMkIQiet3Luv1IE7vz/FDQ6v/u5eZU8nIwCMTDy5OPGDn7LXiIJrpky1D6oJuwlBKFn1C+uauMvzRilKADpX7PvF8VI/bs3oFN2zJyE0kNqpDhG/TYErrX0b39xLUpUleLzNgQuxfo2Lzb3q2xxEx3aELhk6n5dr7pSGCGubOVvbRhcqunc/qCu06eSZhF0yAEoG5cXOobV103dJOVxumfD4FLqHr9YGhcJtYs0d/HbNgyu6L3gzI009QxOiZQ0E9mwkW9f4aR5npwLZ0SSwyLxQf+yDYMr5kRUmaDsbys+13epXXTGAQh7/O7YvKKROUUNPdRkw0iEK+ZdH+6kndWHitsGKGc2Z6wEx8Kd/MnMkq8WVhXVttNfJgFIgmMdY2r/j8csd2ZJxTz+SCfAnIaQBBfMu7024//w+7rPaxtElWnKmg45oo+q9kfgpI3r7tibUke7+yyjc8qvy9CPtgxhFbgSaqX5rR2WLX0gbR6Qp6l+Po+9wKHIrJzN3FF8eEg8s0K58gTdRQIcK47S0WZW8cGR7o6H/F1vUt5AEhwKp/lix5BPR0pk9U/FoTbatFPggnm3F0ZJbWVZcsTSN6mOUiP8oZ0GF0pb5MrQLLFZBY91ObqRUTsoQw6Zm633At7eE70KRKaXya9po6iO46NqV0rjFJ1cVsz6ru/sKdZ9wX6rJ+/YaThp5rFlZZsuQzkRk4SFVeWXxOmunQYXQu00/GCdRVchMUvhZpL2WsflZTt9Opn6a4eBM6ugSq+C/cN/VsHislI6KfV2+nTSv+cztdFVJcgbm/PN/dergKUmqZ7iT1kcMiuyOEa89kg3BVrPhMpVJP1P7TS4UBTjS70TZicQ2cr6rMvSuh6iL3CptEXtrm2QqULS0EX71zN8wU6BC1dT/FrLbRalE7BwX6n6tJqxU+BKRSvdmr3PcpBTXNNJe8ffPwZ3dN3PD+ljqdLbwdSiUmUJ1WenwJVQK18ammZZeagolCTdIWAzdq66Xe1sPGFJDCm/qMk//v4xOHQzw68kB483Y74epz0bBldM2alIqP7FZZa6TuVHuuR1OwWumI8jqlPE/dOKy1rowIbBpatRvjwyy1LWIlI5yK/aMLh0q4NyXRMs4Qwt2RC4VBCRs3UZEfOty1P/rOBZVZ6kqehtltoMNdoQuBbtJSpqEinAg/tgVKflq1K9GYcz/I0NgWuFUcoVNh0/uMHHE0HQHfKF4qhIY7d//D+JIACxPposRWMWnOFhfunnBpFol7xnQ+CSqf/lcequSeF/UATGHEV/acSRNFCVCQq1DdP39hJcM6Xop3piewlBWHrAn12L8Xf2EoJQ30GP0JgBAAAAAAAAAAAAAAAAAMDJy8v7G+ppS3n2R3dTAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANMSURBVHhe7dlLT1NREAfwqtFEjboxJm6Nn8Bv4M5ENy5cu3PhypUuSXRrogJqESgBBKVcUlrKowVBjFSjEAXRiBF8JopGEbEFeufhOXq+Auc25f9b3Tuz6p3MnEdjAAAAAAAAUMVUdYt7BACIlMYwjiKFAlQEFAE2OY1ha1oJUATY5DCKKgCuKgAAAAAAAAAANhd7H4Q7oYi1Dclh9whRyT+Rc+iEiNgP35EPL71fpAsoQkQmJ3X76AyVVkp804XAt0SGX/1YJln6w3XohAgkZ3VH7hHJ2hrTzALXowgRqA94/ZvpguIqc6bAF10YfGkflINDEyGvk+qHL0TN/XLepcAHO3ZqA6alZdEyi45PU2nwqRx0afAhntIzE7MstgvsotyWp99YDzyyH9usBfK7qKYLVKfnOWzt4wBF8Cjey8GzeRIxX32lSNKR41JmTPe7NGy0BnMwa+ozY6isaovw+gOFN3t5xqXBh0Q/Fz59FTVTSG0rtGW5mJnUXS5dnSppztouaDZdUFr73wVz80SmKJ0uXZ3M79zqHitCc5rHnr4M7fc3XSDamqVfyaRuc2nYaLYj63tYPn43hwLj3hSVG7PhMZcGH+p65MjolF0JVJeWQzFj6at5xJbUp3iK/nxcZDuF9O4wl27k5IBLgQ/XBmRv6r4omQK8XiDqHKQXLgW+NGb4zuyC6GqZpDXPxZqaytowVD0z97cmzLaUzHLwfI6oIU3jLgW+JDJyZGJa9N1n4kSWzQkBi7F3Lf20svhTND1BYV13eMKFwZe2nOzOPvy3GMuNXi66MPhix05jmh7MzYt25ClMDus+lwJf7HVEywDLg2mShhSvujD4dC2Qo49nRRtSqk0PZY8Lg093hrg8PCXanuO3LgQ+1SR1R0dOtTbJUvX/FVSqW1l+HtwXvZ3jLhcC34JR5rpu1ZoK+z9j02gZ1FNxsxi35+S0C4FvtQGXa7v//XGD64komBPygfpAtWskPOlC4FvPOD+L42AWnUJBdl65qxoM6yEXAp/s/L/VyyOtA/zGhcA3uxW92oUtaaSa0pzoK/Al9wq+2VF0uZPFvUIU3n6S49d75Kx7hSh0DvF3HMwAAAAAAAAAAAAAAAAAAGDjxWJ/Ae8wTjJnuOHhAAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI9SURBVHhe7drLa1NBFMfxaFFRUXfudOGf0LUb165ciDvd+0eo4FbQPmn6ClrtI02ITZPa2BJ8tN1YsYpQLBXxgV1EQTBSbe45x1w4/4JzL+b7Wc35ZRUm98zMzWQAAAAAAP8xM9vnQwBIlGVoR4liAlKBSUCHswxb0zRgEtDhaEUpwKsKAAAAAAAAAAAAAAAABBRfV+HKSsKyZTvrQyQhu24Hxip2xkskIVeR6XYr6vKyM6Sp98ZPQa4qxY5aD9pfdr8PU2GsLPWXm3LDS4QW//r7S/Lny3e95BFC6ytqd/1Fq9mejNMeIbShUtT81JB3qnrII4TUs6DHi/VII5FqRy3KaTJSlqm321H0uyWDTEIC4h3a+LzoXktkY0uveYyQxsvavfpa7cPX6NdYVS97jJBy1ehnc1dtbjVqDkzpKY8Ryr2aHq2smO00Ih0s2w+PEUq8AI/MRc8a39QePI5a+SU74R8hlHzeunILopsfI82WZNdjhNRT0HM77acgWzIbXdFjHiOkqUXZe/NebaIm2x4hpOt5O/h8w6w3L1petyMeI6ThimwUnqjdr8mMRwitUBfpmzW7nrL/MzpG7pFdHGovxhM1veIRQustyF7vrCgv6hLSPiGf7C+YzSy3LniE0IpP5dUQB7PkrK3p4dvTZoUl7hQlIu7/ww9l+e6CbHmE0OKt6J0ZtqSJGp2T8fk1ueklQotb0a1JUS+RhO3Pen6gqFe9RBImF6XBwQwAAAAAAAAAAAAA8O9lMn8BWYFAb1I8LpQAAAAASUVORK5CYII=","","","","","","","","","",""],"frame_max":20,"frames":[[[5,0,0,50,255,0,120]],[[6,0,0,50,255,0,120]],[[7,0,0,50,255,0,120]],[[8,0,0,50,255,0,120]],[[5,0,0,60,255,1,60]],[[5,0,0,60,255,1,60]],[[5,0,0,60,255,1,60]],[[6,0,0,60,255,1,60]],[[7,0,0,60,255,1,60]],[[8,0,0,60,200,1,60]],[[5,-8,-8,60,255,0,60]],[[6,0,-8,60,200,0,60]],[[6,0,-8,60,255,0,60]],[[6,0,-8,60,255,0,60]],[[7,0,-8,60,255,0,60]],[[8,0,-8,60,255,0,60]],[[8,0,-8,60,255,0,60]],[[9,0,-8,60,255,0,60]],[[9,0,-8,60,200,0,60]],[[9,0,-8,60,50,0,60]]]} \ No newline at end of file +{"ratio": 2.0, "bitmaps": ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAACxElEQVR4nO3ZvU+TURQG8HPb8hUqAgajcfMjMQ7GhTi4OBjjIIksLM4anf0DGHU0QY0DaIwhURIVMSGaBqsFSWogoIl8aLEgAyGKtFLb0t73Pg4gqZtLe9/0Pr+t0/u0p+fc01sRIiIiIiIiql4AlO0MfhOo1IP44ftANBoN2c7gvIEBBEVEBMKOsKW7GwEWYEvFzoBS7e3fdosSiLAIVgrQ2Ghy26MINp7vrNJNKD6TOS8iAnF7O6poByildr7xhV+F5ccvTasS5fQosjKCRER0Lj0fDpvI9kuOIhtG4sVbfS9Mp4i7o8jqD6OCyvZkC+FPAGqUUgCgSseUC6yNIBGRjcWmxOF9mLj91LwV+feMcIXVAnR1KS/vZW8oyKm+YdNmM4stVgsgImKQj+/fi0zuN5ZtZ3ESANX/Wl+OTXmmd8hcsZ2n0qx3gFIKWmdHv6cMaoO4s3NZ5wjrBRARybfuSjTUqqtdZ0TSdWbWdp5K8s3uHY2iXrWaNbMpkv6pjnaeC/BMqCQAwf5XOgYAjyI6yX/QLBgfNw0LKzo3t1QwT94UO23ncQ4A1T/sLQHAs1jxMwBfnFHl5Ks3qJRCTUPg5Oyilzl+UA4NRPR125mc9HDE+wAAQ7HcZjKJett5yslXHfCXMYGO6YTeOHEkFJpcwDXbeZx0d1BPmO0uWF1dDdvOUy6+7AARkZb6wNmPX710+7FQaPJL2yXbeZx077n3AACGRnOFqSSabedxDgA1PV9cWUtpHYnri7bzlINvR5DI1lo6kQh2tDQFg7lC8b7tPM56P+P1pjJaL6XQYjuLs36s69jgWC5fbXdEvh5BpXpuBk8f2BMYezeHql1Jfc8YUzc1l79gO4fT1tfR7MIlHRGRH1Tb2uc3/3OYsQBERERERERERERERERERERERERERERERERERERERERERERERHb9AXknLrdt6dK0AAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAEsElEQVR4nO3bzU9cVRgG8Oe9d5hhYCgJUK2tpCqWNnzWYrsohgNRk2psE7to/AuMSzcuamLq0mWTahfGJiYmJjTGRTWlSWsm169KIEZkAAcBpQgWgfLR+bhz5845LsAGa5PWls65d+77281qnpnnnPeembkDMMYYY4wxxhgrXUop0p3Ba4xiPRG/+R4Qj8dDujME3vnzygQAKPCO0OXUKWVwAeuKdg3Y7ODBa9UgKIBL0FJAZaXMbowipeP5A2vzSah/NPUKACgE+3RU1B1ARLdWvLPmzPRekjUECvQo0jKCAMDNriZjMXl54yGPIh2+6s+/f+4L+SoQ3FGk9YORQ5kzGSc2opQqIyKllKLNYyoItI0gALj5+7aJp3eowQ8+lxbw72tEUGgt4MQJKtiFzHuk0HnuotyuM4suWgsAAKns/sceUalsWs3ozqKD9gKOd22/nnXx1lM7Ef7ognxDd55i014AESnXzXyTtqUySZ299WVdQGgvAADsmqqJynJ6/cVDwEpYjunOU0yeOXtf+U5GHFOtwAXsFDUcP2LM6c5UDJ7YAQDw/GFyl1ZU/+F2ozyt5GA8HtcdqSg8UwARFZ6MGUemrheclga144bx3FHdmYrBMwUAQGcn5RJJWmysN6EUzgThd2RPFUBEKlxJz07NymzzE6jvveye1p0pcIQQ+ORKIZm1pbzwtZ1LTMqIEEJ3rIfGUzsAACzLgpR0LDlTyLQ2mKHRSXUaWC+GFdHHF93RrCNV3/d2bnzqRl2pFnDHHaD7xQohEDHotcnZQqptjxkauVb9zsIC0FSiJfyHECIshNB6AunoEPTpJbfPdaXqu2o7347INt0L46ETQvzz5uuOAgCYW5CHxn7LLy2tum7fVffd1v2izCvZtsqdRpADj3xF8cLLPQOD48bJ6krDME337ZyLdt2ZHiohBHlthe1pFl0/T7hfrqZdNzErX2rvECGvZSxp+1pFuO2ZLrG85g5dGbRzc4uyU3emreS5zwG3e7QGTsYhfNZrvLmzzhienFdVrQdEhe5cW8XzBViWBYMwfvbDHtlYHzpZG3U78i4OlMoY8nwBADCesP5MZYDu7h5nV134p4Ef4qH5JTSXQgn++cMEYTbrYNexo92pggTIQM3SCsoA5HVHexC+2AEA8GvCmkilIZUCTAOoqgDlCv4/lvqmAAAAIeFsrPdoBGQSoi0dwl+v4TZ3De+lH0WSw9bycgrzcuP+uW0VMPIO9upN9WDuZfV4pgAAsNfwSyaLNABEywECapua/HsxvmsBRCSLEeReTU9buJnFUM5FAQAiYRiuqWp057pfvpyf4wkrn7UxBQCxqCJStM+vR1JfFgAAK4uYy+WxEjIJpgFzbhllujPdD98WMD1tYTmNYQU4sSiMkPLnkdS3BQBAcsiSWRs/RiKQihDdvdt/Y8jXBQDAQL+VI2AsVg6KVGG/7jz/l+8LAAAiLJompohQ5beLcUkUYFkWysP4o8zEX7ML/jqSlkQBwHoJtdVIkkGP684SaC0twtjbIgL1Jw/PaWwW5bozBF57u977mhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjrAj+Bo+bqycM3zaoAAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAE+ElEQVR4nO3bS2xUVRgH8P93pjMtdJgyfYUCqYm2BjUxIYSwMMBKibEhQlKUQGiiYIxuJS4MXA4uxLgShWAUA5vyMkQeChEMFIJaRNRACyW19BGglmfb6cx0Ovd8LiikEAwK7Zx7Z77fbtLF/G//97zmzgBCCCGEEEIIIbIXM5PtDF6jMvVG8s/3gCNHjuTZzpDzdu7kAACAISPCFsdhJQXclrE1YKSZMzuLQGBASrBSQGGhSQxPRWzj/XPWyJ1QY3OsBgAYub07yugIIKK7d3yqL9W146ApJlBOT0VWpiAASCd6W8Jhc2j4pUxFNvzYOPT55n1mAZC7U5HVg1GK4p/FU+EmZg4SETMzjZymcoG1KQgA+tsjrVWT+NSG3aYBuHeNyBVWC1i0iNykG19HjBc2f2/KbGaxxWoBAGA42VhRzrHEAHfZzmKD9QIWzinrTqSxsjyK0Fd7zdu282Sa9QKIiNPp+HGGYTA23v2wLkdYLwAAksUTWiPj6M2ZzzBuhcw523kyyTN77x9Omfy+GPoVA0ihcuE81W07UyZ4YgQAwIszKB1PmhMzplGwd8g0O45z50+euUnGgqcu7tgxU2Ai3B8KcKD7Jr+ycE7wgO1MY80zIwAAZs+mwfYu3KieSkin8XUuPEf2VAFExKEwTb90lVPTKlG+47D7he1MY81TBQBAy1F9+UwH9VSWKRqfb+pOtpr8EetB1vFcAVprMNP8jh4z+NyTlNfWyt8AQLaW4LkCAGDZS+qPc53UU1ocUKUl7rya2vemwmMbhtHywAIcx7F6sY7jwAzhnSvX3OS0J1Sg7e/xG5qbgVrLucbCv42AQsdxrI0OrTWO7v7wQHMbNZdNVKq0KP3yivedmmez8MnZPXfU8DwbBjCgtbZ+safPm3ejEbOuKEzjfzqL7du+XLuiqhJxrbXtaKPm/rucAMTgkfn2o/V606/nqX7COKJIoVvbl+A625lG24MKIK21sRHmfrs2anfLJt11sdv8Pr06EPhgrVPR3o2CbN0RedKCJU546RurVvcNuO2/NA0OnW4xK21nGk2e3IaO9HwVYtdjhBPHacvkMtUZS3FkyXInax5fer4ArTXyFO3ftXcNV5QE6qdG3aqBJC/PlmnI8wUAwL7t+nT3NWD1Kp0uLw62b1q/JvjnBV5k+7wyGnzzgwlSaLwR41mffLwmmRpiUgFUX2jHOABx29kehy9GAAB8t33twStXkXYNEAoSJpdC9Q36f1vqmwIAgIi2xeLMDKCkiFRIIbr4LSdoO9fjeGgBXnoosqdet128gjOue/v1lFLkxWM8326qx/NfRoBnCgCAW5fo26s3uQcASqJEBFTX1vp3MX5oAUTkiVPxHQ0Nmi/foK19CU4BQCSMYDJonrKd61H5ag24Y/82Hb9+C4eYGRXFrIjpVb+eC3xZAAB0tNBv/QlcLMhXCOUh/9RfKLSd6VH4toCGBs1tPVRvmPsnFSNQwLzMdqZH4dsCAGDPVp2+3kubiyJwXYXo3Ln+W4x9XQAAbPxU9yrQ7kkTEZhQ4b+Dme8LAAClcC4/RIdVAFP8thhnRQFaa0wM4+fCEM6ebDLVtvP8H1lRAHC7hKcraa/Ko1m2s+S0xYud4PzXnZDtHDmt5jUnajtDzqurs/e9JiGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEyJB/AHiHvpAVg10xAAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAFEUlEQVR4nO3bX2xTVRwH8O/v3q7r2sKgMKTbAqJDIaDhQRRiZFyIEKOJYQ+YaAKSkGCML5iQCJIsGBcBI3sAMUR42JuQiFEiwYz1dmCGExUCigILAuPfYJR1tNtoe8/PB/4ECAnC/px729/nbVmafu++55x77ukKCCGEEEIIIYTIX8xMujO4jTFUbyR/fBewbdunO0PB27GDTQAAQ2aELrW1bEgBNw3ZPeBu06efLQWBASlBSwGhkOq9tRSxjvcvWHfvhFqPpd4AAEZh746GdAYQ0Z0Rn+nOtG/foyIEKuilSMsSBAC53uTxcFg13vpRliIdmlqzm7btUguAwl2KtD4YZahnY08m/BczFxERMzPdvUwVAm1LEABcPz28rWos//blTtUM3HuPKBRaC1i4kJw+p2ctMV7etluV6cyii9YCAEBxX2t0DKd609yuO4sO2guomVV2qTeHFcEA/Ft/UO/pzjPUtBdARJzL9ewvCSh2HGy+c1hXILQXAAB9kWFtI4L07sRKRpdf/a07z1Byzd57z1FVfPk80j4DCADRmnnGFd2ZhoIrZgAAzJ9KOWa1b+oEMq/2qtPV1dW3f+WaQTIYXHVx8bgKJH1IhwNM3b1q/oJXihof/ipvc80MAIDqarpxNcFdVRWMGzfwTSF8juyqAoiI/cPo+c4kchMrMWJ7k9OgO9Ngc1UBAFCB5vPHzlJXRYQo6Oe34idVsW3bumMNGtcVYFkWGPTm5SRnJz0J34WT/AsA5GsJrisAABbNMw6c6qDukaWmURFVU53gzCq4bMMwUB5YgG3bWi/Wtm2kU7w6mXKyT5WTcSFZ9G08Dqq1bVcOmP544AUx80jbtrUdCViWhdSZn7eeaKeOUaWGMWGMM3na3FnvzwaUrkyD5Z4CbNtGLBaLEFGXZVmOrlAAsGyZ5cChpmSKM1Oe9vkMgxa1HuHSfLsX3D8DiIgScMl623pi39Jfj/GRkJ8RHe1Mu3KdN+jONNDuL8AAYOge/betWWLlYnbztY4kX5wy3vS99nr1uMNtCOfbLHC1VetikfUb9zal+9S1P09lcrtbnO90ZxpIrt9VvPoiJdoThFNtOFxeZnSHQly6dnNsvO5cA8X1BViWBb9JG+IHbQ6XGEerojy6K8Vf5csy5PoCAOCL1XN+bDsLNDY2q0ipL7n0ndn+nw6oNbqfVwaCZ74wYZjYeSGhag60xHN9fcowfXip5TCGA0jqztYfnpgBAFC/eu6mE2eQzeWAQMCgZ8fB15lWnt+WeqYAACCiVYmkUgygcoxhBkyU122xi3Xn6o+HFuCmD0XWr5zz+6GTaMpmARAweRz8yYRaoTtXf/yfGeCaAgDg0j/GZ2cuqn8JQGWUDAOYUVvr3UO6hwYnIlcdgDU0WHz8nLH8crfqISKURVCcDjgv6M71uDw5cjZ8bCXPXcIWpRQ/U8EmMX3k1ecCTxYAAEdajF2d3TgUCppU4kfw+4M8Qnemx+HZAhoaLP7jtLHSYdVZVY6iMHvzpNSzBQDAuuVW5lwHffBEGbI5A9HFi733ZOzpAgBgydtzOkyiuqoofKMmqnrdeR6V5wsAANOk/aEAfW36MMlrN+O8KMCyLIwdRTtGBhHbaTszdOd5FHlRAHCzhJnPGZ/7/FSjO0tBq6uzi1d8GivRnaOgffhJrFx3hoJXX6/v/5qEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEGKI/Afnj8m61gkdGQAAAABJRU5ErkJggg==", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAEvUlEQVR4nO3cy29UdRQH8O+5d6aP6YuUUinloYU2RjHRBFYmBhYsBNNIE1nqygT/ABeuGnasXACm0fAIISFpQa1MKIjSoalGi1VRS4GWUugjKYS29jUznfv7/Y6LtqQlqCXQ+d2Zez67mbuY751zz/ndO/dmACGEEEIIIYQQ2YuZyXYGv3HS9UHy5ftALBYL2c4QeE1N7AIAGNIRttTXsyMFmJO2NWCx7dsHSkBgQIpgpQAFBSYxP4rYxucH1uIzoY7u6XcAgBHss6O0dgARPTriU5OpwcaLppRAgR5FVkYQAKjExK3CQvPd/EsZRTZc7vCOHIuavUBwR5HVC6MUxQ/HU4XXmTlMRMzMtHhMBYG1EQQAU3eLb29Zy52ffWXagKVrRFBYLcC+faSTOn6QGG8eazFrbGaxxWoBAMBwsqOinKcTMzxoO4sN1gtQ99aakYTCx4aRc/Sc2W87T7pZLwARsVLx9tWrDHuKGh79WBcQ1gsAAMnSoturC+n9smKDv3PMDdt50sk3594tPSZ3oJuSOWFgVQ6X1e1yRm1nSgdfdAAAvF1NKi/XtNZUAven+MGiTb7JuBJ8s3NEpDflOXv67wMb1jpO8w/ezvlNxmqwFeabAgDAjh2YnU2ayc0ViuMJigbhPrKvCkBEnFtMr04niKvWIb+x1TQtbLIaLEiYmU5d0lP3hpSJtutUS4/JzeZO8FUHAAu/B9G7k0k21RvZHevlYUAea0m7i7+o+PCo4Z+6tPoyZrYys4MsHEVP7ID5nbWGmenhGH/qeZor14DGk/zjmTOgJsu5VsK/FeAFZg6nO8wCIuKXV4cO9I+QV1pEzmsbOeKVmIPvzZ2SZlUXLCkAM5MxpoKIHhCRZysUAGzbRl7/APV5GqjZ5IbyI86HF9q5jDm7bhk83gFERCNPeN+Kwirn9atdhvNDhqvXm8jQOF+2nel5e/yLdgE4to/+Bfu2Uqp3mLzJWcaWdU64vMxUXbmGkmw6I1pSACLyiEjbCvMkJQX04m9dzI4LvFFFkf4h0xPEW5fWMDMdOqvV+IThlDbc9ruabfnZvGI71/Pii1n/X4iI80L0UfcgMzNhaxXCDyZMRzaNoYxw5Kw2kzPMKc38R5/2Tkb1WdvXK89DxuyAG8bhvhHNIQeoWstuKAe7o1dQajtXoByN6sRsitkw8817ymto1n/azvSsMqYDAMBxqHbkoTYMoGaDGyoIYfO5To7YzrWi/LbYnTivT8WTc11wq0+p4+f1aduZnsVyOsBXBbh71fngRr/uIgDVLzmuy7w7kx9l+d8CEJGv7skeOECms9fdOThmpogI6ysQmYioXbZzBc73v6r9WmszPuGZY1E94rdRuVwZtQgv1n7O/WJ4FK0lRSEqyENxwyUO5MO9Vp2IcV5K6aGbd5Q6fUH9ZTtPIF2/YzYlUip+8pKeqa/P/CvjjOR5pu5ar0p9/o1qs53laWXFERMK0dclBc4nbpi2Z+pinPGYmaLt+vihRm+P7SyBxcxOQ7P+1naOp5EVI2gBEZlKx9l7tNkU2c6yXFlVAACoraW4Mii3nSPwYjGWP4cSQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQmS7fwAFKQ1wNfC3BwAAAABJRU5ErkJggg==", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAGBElEQVR4nO3aW2wUVRgH8P83u92WXqHl0nIRLLRSKWhEgvHCsBoeAGMEI775rA8++GDiC6ImJjwoD4ghRsAQEhIuGmyhXBSWSUWsgNwXKDfLJZRraWm3uzvnnM+HAimEWwPsmZ05v7dm0+x/9r/fmTOzAxiGYRiGYRiGYRj+xcykO4PXWJl6I/Phe0AsFgvrzhB4q1dzCADAMBOhy7x5bJkCemTsHNDbpElnSkBgwJSgpYCCAtV9cyliHe8fWL13Qk3xzrcBgBHs3VFGJ4CIbn/j0x3ps6s2qVICBXop0rIEAYDobj9WWKh+v/mnWYp02NrkLlpar2YBwV2KtF4YpSnxfSJdeJiZc4iImZl6L1NBoG0JAoAb/xWfGFPOu3/4VTnAneeIoNBawJw5JJMyMZ8Yry1tUIN0ZtFFawEAoDjZVDGYO7u7+KzuLDpoL2D2lEGt3QKfKUZkSZ36SHeeTNNeABGxEInGsv6KXUGLb9+sCwjtBQBAsrToRFkhfTiwWOF6RB3RnSeTPLP3bmhWuWfilIzkAP0jPHD2NOuq7kyZ4IkJAIDpVSTyctW26mHAxRt8qddLnsn4NHjm4IhIjsyzZp6+CIwot6x1f7rRmy8prcGeMs8UAABTpyKVSqqO0RWCE91UH4TfkT1VABFxbjGN6+wmrhyKfqu2qdW3XtIaLEiYmVZskTdazglV3yjTDc0q18+T4KkJAG7dD6J3O5Ksqp7h0LXjfB4wj7Vk3KZdInH+quKdh6T4JaZqmdmCD5eie05ALBbTeqDMTFeu8QLXlTxsEKgtyTvWrAGt7inBV+55QMw8IBaLabslQEQ8tiz81elWckuLyBr/DOe7JWr++z1bUl9NwR0HE4vFwMylRHQ9Go1q338vq5PxWVGqARFie9Gex1w1/Q264qffDe6eACKia/DIt6yw0nrxn0OK+4UVVw1X+efaeKvuTE/a3QVYAKxoNCp1hLnbnFpKHz9PbkeKMWaolTN4oKrcvg8lZkeUQSs2qopNO1yZEswtF4RaVi8vPfy/jCeGmWnhWina2hWnpWJnr0g1/K2e153rSfH8to6IODdEH8fPMjMTaiuRc6ldNZllKINs28aitVJ1dDGnJfP+k9JdXi/Xsg+uC7LiABzHQSiMH0+2Sg5bQGU5h8IRzKjfjlLd2QKjeqJNS+plMpVmVsx8tEW4i9fJA7pzPa6smAAAaN7jsGXhk9YrUjGA6hGhcEEYo+t2c77ubE+Vl0521RNtWrZebk4ke6bg2Ekhlm2QK3XnehyPMgGeKaB5j8OtR+jz+ClxigBUPWuFQswzsvlRlocWQETa7wn1tnl9dO+u5tCnZ6+qBBFheAXy2/PFNN25AmXMOLvwjz3iOymlamt31dJ62eqlpbIvsuYk3NuJw05n0zbrt/NX8G9JUZgK8lC8eAsH8uFebcaMt0MrYmpaWshLR08JsXKjOKg7U+BU19o1h06pD7rTIrl8i+yaNy/7royzLnBvFWU48t470dYwWd+8MIpzhr4kY7oz9VVWF+A4DgDs6UqisaSAfgqFaVK2noyz2nPj7ddTaTW1rlFsWLjKnak7T19k9QTcQoS/Xp4c5bcmWt+Gc625uvP0hS8KGDIAKuWiPRqNqvIwffFznSrSnelR+aIAx3EQVtjXngC+/jKaSgnOmmXIFwUAQDzuQCrstwhYMPfNCw3bVUR3pkfhux1DzQR7Sk4OKO0iefSA06Q7z8P4ZgJuSQg0ui4gBPJqJ9qePz7PB+yrlrjDktGVGwGki7G68zyM7woAgOaDzm4w4AoMGmnbuuM8kC8LAAChELcI6NeGIbqzPIhvCzh20LmsABYCY20PT4FvCwCAcAg7iYDL13mg7iz34+sCjh5w3EgOOoWgGt1Z7sfXBQBAhLBXMqxxE+w83VnuxfcFFBdDhSxcl4wJurPci+8LcBwHqTLsFxL9vLgl9X0BANDiOAhZaC3qwCjdWe4WiAIAoLwMx7qTGKk7R6BNfsUurRpnD9WdI9BqJtivevnCzDAMwzAMwzAMwzAMwzAMwzAMwzAMw/CP/wF2HoX6r8Lf8QAAAABJRU5ErkJggg==", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAEIElEQVR4nO3azW9UVRgG8Oc9d2Y6mUKKaQKUFIVS/EhMNDoJwY1RI4klQRek0QUL2ZCwwRULN01du9KqmCBVFwTrILGNsbRptdGA2AKW1Noa6geFAP1wnGln2um957wumiYs0E5b5NyP9/cXPDfPvOfMOfcCQgghhBBCCCHCi5nJdgYhhAAAhixHAJTtAMIumQIRcQz5a+oHUoKIOFmKfECuKoQQQgghhBBCCCGihZlJ7oQs+7TT1NvOEHldP5o3ojAJvvwqgplp8m9d/eeEPhqFEnxpYIDjvVe84kxRf2A7S2SdaNfD0znPZGf1uzIJFrQNceLsec/Mz2vvym+6RUqwoCWjSxM5zxTmtG4/p9+ynede8+UmfKeqStp2aYg5Flfqie385kdfmaO2M0UKM9M7Ge1lc4YXtOG+Qa/4db+psZ3rXvH9BBARJxx1eHicmZnw+DYkJ7NmVPaD+4iZqSWjTb7AvKCZB8e0+0mHzoShBN9PALA4BbEYvhi7pTmmgLrN7MQSaOj4FtW2s61VIAoAAKpVr10cJrguUJly6OlHOX4jZ3pt51qrwBRwKE2uUvhh4i8GA3h4qxOrjGFH+wCnbGdbi2UL8NM6625Sz3b1M5dKAAjY9RhXTN02x23nWotyJsA3BRxKkwuDvp/HPCYAO7crx2FuaGtjx3a21Vq2ACIy9yNIuQ7uU89fGFEYnzJMRKitQSqX8l60nWu1ArMHLCEiZlD66rXFyXyqnmOK1cd+Wioj4dgZb/babW2MYT7VrYvvnzUbbWdajcBNwJJShdpy8ZfF9fHJHZzYYEyP7UyrEdgCjjSo/FSeT438wXioFsp1qK6piQP7PIHEzOpEhzaeZv5p1PM+/NLrs51ppQL9iyEiA6b0hSFGVSUo7tCuoG3GgS4AAA7uU5d+vW5mUymlqh9gpyXj7bWdaSUCXwAAODG1uX+Y8EgNHCeuPrOdZyVCUcCBPVS8Oa2/I1ZUleJEWzdX2c5UrlAUQERcVXKeOzfKvHUTnOysuWU7U7lCUQAANDaSzhfphYSjCFDJ49+b9bYzlSM0BQDAkf3qm9+vs1v3IKOiwJdt5ylHqAoAgJG8WjcxRcjmUBeEdwWhK6C5kRYKrhncspEoP21abedZTqAOLSuR6dX65rRSU/vhNPvsSv1OoZuAJTMl9Wo8BtR38QHbWf5LaAt4/SX6fEEbN5vnVj9fT4S2AADYsJ5qFSlq6/FesZ0lsk736cvHzug52zn+TagnAABq4vTMXEklM91cZzvL3YS+gN27ab4yaXoKrum0neVuQl8AEfGNl9We7Iza2cT+e2Pmu0D/h2Yisy5pWtPnTbPtLJHFzPT2Se3bA1kkXB03e987bQ7bzhFpJzv1pJ8PZkIIIYQQQgghhBBCCCGEEEIIIcLjH6hasFBmwYEeAAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAEbElEQVR4nO3a/2tVdRzH8df7c+527764ra3JdjcmTU3NKIlhTSPvTVJKmkFjrC+yZoIQhPTDon4a+0GiLyQEkVGwIjAwxdJfhrIdtFr4Be3LNpYta0yduS9X9+267Z7Pu58GIdbu3Oxzzrnvx1/wHK99zj3n3AsIIYQQQgghhPAvZibTDUIIAQAMuRwBUKYDhFlyCkSKY8itqRvICCLFyaXIBeRVhRBCCCGEEEIIIURqsW0btm2bzkhtb77TVmK6IeW9+1FbdSqcBFf+KsK2bVwb0zl/xfRzfh/BlQNEo1GU5VifX46hLj6pXzPdcye5+guQ13e3frb+QZQpC19nh9QH0WjUdNKCc+UJmJERVjt+7QWCFrZe6Ne7/Hg5cvUATfXRxKVBJManQOECVLV36nrTTQvN1QMAQFaIan/7g9kKKLW0GC82vNVWa7ppIbl+gCfW0nDfMGEyzijII1VSyC+9vbct33TXQnH9ANFoFGlK7flzgJlBuKcI6ddG+Qu/fB64+i5oBjPToeO6NRg/QenpQO8V7fT04vvNlarR63dGrj8BAEBEfPUafr48rNlSQDgfygrg4fYfkWu6bb48MQAAUKlqoJxIRiIBhEKKVpQhMDiu3zfdNV+eGWBnBU0rQnzNQxuIAZQuVlbIQnj3x3bQdNt8zDqAm34uOF2kNh9p51Xr10UAAlaVIf36sG4w3TUfyZwA1wyws4KmodH5S09iCQEoLSalgEcaG23PnOSbzRpORPr/CEnW9iq18WS3Klt6/2OFRITCfATHQ06F6a7b5bn/HCJiBq3t6eWVkUgkeG8JW8T0hlefCzw3AAC8+qw6e74PN/qu6ge2PPW4lZGOzG9Oc57prtvhyQEAYDKowme6kKkZq19+fkNaNrPnb0k955PDzpcdvzs6PpW42HLaaamrs11zw5Asz54AANjxtHrhVBcQUCpclMPLCpbrPaab5srTAxCRBlPFqU5QbhaWrF4TiXrtw9jTAwDA9ip19vxFPZadrQJ338UrOwYejZhumgvPDwAAVkAVnewg3FeKNCtdHTHdMxe+GGDbJproH3K+VawoN5ND+4+xZ96S+mIAIuLcSSt6oou5vARWbExfMd2ULF8MAAA1NeSMTNDGUJoiQIU+/U4vMt2UDN8MAAC7qpXdfYGnV5QzguN8znRPMnw1AAB0j6jswSFC7DrKD5/hTNM9s/HdAE01NDU8oX8KLyYaGdLNpntm47lH92QdaHOc/iGlBqthNbnslfo/+e4EzBidVLVpAWDZUd5muuW/+HaA+ifpqylHT8dGuNlNX6vezLcDAEDeIipVpGh/a+IZ0y0p6+Bx59zeQ07cdMe/8fUJAIDiNFoXn1ShA8e43HTLrfh+gMpKupEV0q3j07rFdMut+H4AIuJLW9Wm2Kha3sjsur/XdUF3QhORzg7p5oofdJPplpTFzPTePse1D2QpoadPb/nwoH7FdEdK29fiDLj5wUwIIYQQQgghhBBCCCGEEEIIIYR//A27N2QQjsDu1wAAAABJRU5ErkJggg==", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAESUlEQVR4nO3a3W8UVRgG8Oc9u9tu7Zbttg3SYtIEqb0wwZslimAKEkm0sYUIVYRqNCCJppd6I+l0bvTGC0n8INGkF0aIhUYlIVZJSQiKpmlEG0uwlISkSpG13bL93I85r1ebGIN2S4tnZvb9/QXP5Ml7zpyZAwghhBBCCCGE8C9mJtMZhBACABiyHAFQpgMIs2QKRJFjyKupG0gJosjJUuQC8qlCCCGEEEIIIYQQorhYlgXLskzHKG679ltVpjMUvfaD1iPFMAmuvBVhWRZmF3TZrVne7PcSXFmAbduoKVPnkrPYmslxs+k8d5Orf4C07u18rbEeNaQwEA7RV7Ztm4604lw5AXklMTp6PQGEFDbenOKn/LgcubqAEx/YzuQ0nHQOFIsgPvIbbzOdaaW5ugAAKA3Ru+M3mVWA6N5KPNbyvLXZdKaV5PoCNqzHzMQMIZsBKsqJqlbx1n0HrYjpXCvF9QXYto0A0elEisEAVlciOLfAHX7ZD1z9FpTHzDRwiTu/+NRGMAgkpljfSODXhx6gHq+/Gbl+AgCAiPjiKGYnZxiKgFgESgXQMHIN95jOtlyeKAAAaC0d2fhEV8zRQEmIUFcDlUrzi6ZzLZdnCjgUp6wibnz9DUsxgOooqRKF2N5XrJDpbMuxaAFuui6YXaNaes/x7sOHuwgA1tYgODfDLaZzLUchE+CaAg7FKcsO/hi64jQBQHWMiICGPXss12RcqkULICL9fwQp1MstavsPl2nLgY7OBwFgVQShhZC+33SuO+WZPSCPiJiZHr5yjVu7urqitVWsiGmnV88FnisAADqeUT+OjCE7ltDtb79lB0uCKB28inLTue6EJwsAgHSpqhscRrVmPPvhESsQZn7BdKai89Ep5/gvVx1nPpMb+GlUv9nU5L3N2LMTAAAHnlb7Bi6BgkrF4fDjFbXeO5h5ugAi0mCKDwyDohHesmu/1ezVzdjTuk/npidTmr/8Ljf/3me5uOk8S+HpCcgLBNWaC0OEDfUoVWF11nSepfBFAe07aG58wjkfgKJomS7rOcNR05kK5YsCiIij6cC2/iHmxnoEkjP6hulMhfJFAQDQ1kZOao62l5cqAlT44291helMRel4n5O5MKz5k6+dUdNZCuGbCci7nFKRySQheQvrTg2y6/+Y+a4Au40y16f0z3WriVITutt0nsV47uheqJNnHWd8Qqk/dyNgu+yT+t/5bgLyptPquVAQWP8Nt5vO8l98W8BLT9KJjKOzyRR3u+m36j/5tgAAqKyg+xQp6unP7TSdpWj1nnMuHv3cmTed49/4egIAoDZEj86nVfjkGV5nOsvt+L6ATZtooTys+2ezus90ltvxfQFExL+3qh3JadVgMbvueV0X6G6wiXQkrLvj32tv3+T1Mmamd445rj2QFYXRMd38fq9+1XSOonasz0m4+WAmhBBCCCGEEEIIIYQQQgghhBDCP/4CTd5lVmiUUUoAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAEKklEQVR4nO3a3WscVRgG8Oc9k2x2tklTUjExTUmoxoSQRolRrKBDKBZEUMESilJEb4r+AXojlHjlhZcKBT9yoaRSG6pVIW3Ix1ClkQRNoZZGA8VKiLQuMR+bze7OOa8XdUEkmsSkPTOz7+9u7p7hmffMmQ9ACCGEEEIIIUR8MTPZziCEEADAkOUIgLIdQNglUyBKHEO2pmEgJYgSJ0tRCMirCiGEEEIIIYQQQojS4nkePM+zHaO0tXZ4ru0MJa+j02sohUkI5V8RnuehEHBZroC9cS8hlAX4vo9UOf2SzaNJGzTbznM7hfoDSEu79/Bdu5ACYbZMYcb3fduRtl0oJ6DIcTG5lAEcwp7MKprjuByFuoArEz5n8+DAAG4C9elFNNnOtN1CXQAAOArjyxkGKaAyicaW/d5e25m2U+gLqK1BfiVP0BpIJAC3Ak37O72E7VzbJfQF+L4PBfy0krt1vCMJVQjwSFzuB6HeBRUxM83eZO/I892sFLCyCl7OIF27Gz9GfWcU+gkAACLiry6iLpu/dcUkEyBSqEn/gXLb2bYqEgUAAO2hgVffHK1nBhwFVKVAOY0HbOfaqsgUcKyLCoq45/zQqAMAbgXIIbjtD3mROYe1rBs+TL8LFupUT/8QHx8eGSMA2JmCKuTRYjvXVmzk6glNAce6qMAaempavwQAbhIgYHdbW3R3ROsWQETmTgTZqFeeUQfHr9KLnwyMdANARQIqcLjGdq7/K3LrJxExMz368zXz+tjYWG2ly0RMrXF5LoiME2eC5es39HVjzJNtHd7jzR1eJLekkZuAolyFqp+4zA2G+a2J8VFVxtHfkkbO+2f1ycszQZDNB5/Ppc0TjY2yDN1RzKw++lKbfEHrqWn94f3t3oO2M21WZJcg4K8dGlPXxBVS1ZX8whtvjxyWm7EFfV8HSwvLhr/4Nsi8+6lutZ1nMyI9AUVOmaq7MEXo3AdXufSd7TybEYsCjh6ilbm0vuCQomrXpE4NcbXtTBsViwKIiKtzTve575nb74Uzv2x+s51po2JRAAD09JBeXKGDO11FgEp+8I2psp2pJJ0c1PnJacMfn9MztrNsRGwmoOjqoqqcXyDML2Df2UlO2c6zntgV0NtD+Ws3zKX6u4kW06bPdp71hOZd/3Y7PaL1XFqp3w/D6Q3ZK/W/i90EFC3l1JHyMuC+83zUdpb/EtsCXn6KPstrU5hf5L4wfVb9p9gWAAC7qqhBkaJTw8FztrOUrAFf/3DijM7azvFvYj0BAHBPOT2Wzank6SHeZzvLWmJfwIEDtLojaYYzBTNoO8taYl8AEfHss+rQ/JJqPs4cuvMNXaDboZfIVCZNX9dF02s7S8liZnqnX4f2gawkzPxqnn5vwLxmO0dJ6x/UN8P8YCaEEEIIIYQQQgghhBBCCCGEECI+/gRzvlwQpJY4BAAAAABJRU5ErkJggg==", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAACx0lEQVR4nO3bzUtUYRTH8XOeURocZWwTJtVCsvYhgdEmAiFa1CKsjUGroH+gXTL7lhlG2QSBhmmSaVhiFBVR9m6UibUow8CGwRlT5+U5p02zyxxTe+7c+/v8Bd/L4Tx37uUOEQAAAAAAAPiXqrLrBgAAIiIlHEdEZFwHgFvYAgg4Jfw09QIMAQIOR5EH4FUFAAAAAAAAAAAAAAAAAAAAAPxHqsr4ZMWxC/2613XDeiid/wfU0tOOAa1znRFo8QF7TVVDrjvW0rIb4KWzN1tjWq7clm4vNa1WMUeQZy72ZAPnxNLGl+PS6rolsFSVz/XZzFRCjrpuWQulcxP+jZlVhRsnPtsOVd3muiew2vvyc19m7EcR2eC6ZTVKbgMKMhtM7eiY1ovqDT/dlEvKxX7b9W4yn1/M2fMYggOqai7fspLNWft6Qs647vkXJXsEERExs5Byw+h7NtFKOd0xKMddNwVSfDCfnlsQvfk4P9fWJVtd96xESW9AQajM1Nx/wbR7B1VwhMdc96yELwbQ0sTz0wn7sIwNR8M20j2sUddNxfLFAJhZo5nQvoFnqrt2Uig5J99dNxXLFwMgImpuZpua5/3VEcNEJnzpkVS5bgqkriGbfftJ9OodO+m6pRi+2YCC8ZSpnE0zJWeprv+5VrjuWY7vBhBr5uyHKXlTu4k5lZC4657l+PbxveeetdMJY34coVCMWVz3LMV3G1CQzphj5WVE2+9qi+uWv/HtAE4c4OtZK7lkSuNeflHn2wEQEVVX8RbDhrtH8oddtwRW7wP7qr3PLrjuWIqvN4CIaHM571nImHDPsDe/KfL9ABobeTESlpGfORly3fInvh8AM+u3Q6YpmTb1raqeu17PBa2HGLNUhiXe8ERirlsCS1X5bKf17ANZIEx+lYNtvXLKdUegdQ7ZGS8/mAEAAAAAAAAAAAAAAAAAgH/8AmptCPOAdnt5AAAAAElFTkSuQmCC"], "frame_max": 17, "frames": [[[0, 0, 0, 60, 255, 1, 60]], [[1, 0, 0, 60, 255, 1, 60]], [[2, 0, 0, 60, 255, 1, 60]], [[3, 0, 0, 60, 255, 1, 60]], [[4, 0, 0, 60, 255, 1, 60]], [[5, 0, 0, 60, 255, 1, 60]], [[6, 0, 0, 60, 255, 1, 60]], [[7, 0, 0, 60, 255, 1, 60]], [[8, 0, 0, 60, 255, 1, 60]], [[9, 0, 0, 60, 255, 1, 60]], [[10, 0, 0, 60, 255, 1, 60]], [[11, 0, 0, 60, 255, 1, 60]], [[12, 0, 0, 60, 255, 1, 60]], [[13, 0, 0, 60, 241, 1, 60]], [[14, 0, 0, 60, 227, 1, 60]], [[15, 0, 0, 60, 213, 1, 60]], [[16, 0, 0, 60, 200, 1, 60]]]} \ No newline at end of file diff --git a/project/animates/jianji2.animate b/project/animates/jianji2.animate new file mode 100644 index 0000000..4991c6f --- /dev/null +++ b/project/animates/jianji2.animate @@ -0,0 +1 @@ +{"ratio": 1.0, "bitmaps": ["data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAv60lEQVR4nO29S4ylSXbf9z8nIr7Hfear3t1TPdOaGXNIUw9KojiWDYGSCBiGwYUNy95qYWjrjRdeeW0YMCx45YUMyIJlyDAtg4YFmzJAE6RI0CIJWuaQImc4j35XZeXjvr5HxDnHi++7WVk13TM9Q2qysit+ja6b9+bNzO/eG/+IE+cVQCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk/k00E1fQOZPmZc/UXv52/TSt196wmuGv+kLyPzJIBoHNI3/fIIA9g+TDV+NNzCVf8VX+GqTBXDLIRpEYPzy3D6M/f2A339zf3//XM0CyNxmmBnAIIKr1eA6+wFP+4H/4nNEEsxeXzMoC+CWQQCYCcwMZobaOLiZQKMYhicSYDYMdxtXg+FLmClgBlV7QTSvoxCyAG45RIMYQAQmxnWLx5hAhqt9gBHABqgBpgqiYQVR1ddy8ANZALcUGv43GlYD2q8IDgYbRDCuACAbbkcxGABSghEDpEj7X6n2XR6j14EsgFuOYwdmwBGBmGA0iIOIAFOo2aiX5x4iwzDrKxmYCAp6Hcc+gCyAW8dg0Yz/scHIQMQgU7ASwAxyDqQKGEENwCgMtWEnMEpkiAG8sD9QfNIyQNf+/sfdv61kAdxCzACFgcwGWx4E6VJgj8iO4KLAicJEAhNHsIMwQWwwj5Rs2DwLAQqYXhvIn5WR/SnJArhVjEEsACYEEwOxOnKuCHBUaiidMbwQKnWhQCUOVLUWpYd2TIWoZ2xiF3qIemYRY6jFwXRyo6vU8SiMQVxX3iQ89ySR7T2s+x32j/ad+NMiC+DWQC/dAgzAk3OOXF16X9S+KAr4qnCMo1BPD4rZtCDvU5LNLnZnTYrt1pKUpe+20vWb1EqEdA4M9gXUGQAFQ2FEEAgYgxBevhKDjbe3e8nIArgl0DVLnTB4fxw5EEjE0Ai0iZJKBsGZISVlcVb7oqink3C4JLzdpSSb2G43fXu66pqzAu6yROCGpGdfSKQEkEBNQUxQb4h9P+wfrg1wGzOIhpXAxsduJzkZ7pZA174iotH7w2BieDCcEbyR80KFI6OS2M9cXSyL+eHSzxbL+fLEERUxpWbbtK2qdZ2LfRv7zaptz3fadRs0qpb6UASBZyQkNF2HKAlKz/OHZBzuBCCJ3OoYQhbALYTGKDCzg3MOjj0cCGQ23AqBReHJuWCuMEgoURRTqoplMTmYuGpeGkd2RJ7czARYW7fZ9c12EzfPWu1DIukubLWJQGfskBwgtDd9Rk+SAW3sMRhIt1MEWQC3EGYeBr5zIGKwc+OqwIANLk4Gg8mh9B4eDiUH9OvGUZuqua+9F1NnmCxQv3lyeHLgHJMCupN+08gODXW2itsPL+P2cqdx01CSBEAJYCJ4A9QMbYq3WgB5D3ALIQCmBiPFENAdBj/vvTVEIDcGw4IDkYc6B9MgKWC7DQaJCbv1tplT021amZ5Ui8PKlUfiLCahtQoQqFhMvFCKJo3EhpgEZFAziBHMRi8RDDS6h25bnCCvALeQfe6PH2d+zzysBMzPP1DnBhPJOzjyCOzgmGBqUFOwdyA1yKZD2mzcwsrJNNQTdqFWWL/pN03UBGWDeGDdtxt1HIUG8TkaVppWEwQAs+H5VmCvhMFgepX3CFkAtxEGiAnOe8AGk8QRDybQCDEPZpHzcMRgN5hNNvr3mRmaEkGkLBMJwzS2HYiJyVCFUPKm2aQEUYK3DtqBmQnGppo8OQM77CwiQeEcQU2ep1vbkF1qCgDXvUivlhiyCXRL2U+qOs62BIWpga8ZH0wMIEGZ4W3I/6ExDwgpgURdGVzhikKbbithVvRIEnfNTqlPnJhc8FXFLqTYddGzZweqTcXMLKkhOuakZHCOAd3HBobCG1UFGKMIXk2yAG4joz8ydRHkGQaG0JDbv6/vYgyBLGcMEoIyD/sGs8GDZEDsejGrGwtUNLsuGPmJE/RTv4jJu5bIknfsweQZ5Nq2ixMr0ryeLqP2SCTrmNoNOw9lhbtWW6AGgAgmCqNrm4PvV7T8IyYL4Jayz3LGuBk2e7Ha6+q+DtmgLIwkApjBew8yIImaOY7r3TYx0aL09XQeioOui6t132io637TN9tQBN/2nVa+tBS7LrZuY0E9FC6QK8lx11kEmMeEOowmkIKIYXh1yy6zAG4jdq2Xg45xWaJhph2hccwpeFwZZDSBDDEmEBmEFMIAF97iptsmS34+PXzz4Wx25M6ePvmwOfugrKreHMVQBnRtSzPyRTAqyPnSjKBRoggFgSmIxLkwuqkEZATTBDAB8mrZ/nvyJvgzzielMYOHarKymiCwhzeHtNkWb7jjw/vLO58nH+jp+vzb78ePTkOo+ugIrFYccnVEasW23W2U0CYS4TIUm9Q25H0iRxAVCAyqCSklqAhMvusKXrqymyGvAJ9xXh5eg2k+FMcM5ZTDo0RAWU76p936nDaFf7A4eeskzB5T7HHWrD7yVSWNtLH1tCMALcfGmBolOCdJgzAYHoJhY84kY/0B8CrPs/z9n5L5LHJlLREBPNQIoCxQzOb9k/7s2en50+9MQhHenN+7N0OxSG3rPLGt+tV6FdfPeoq9OcA7Eo3RL1Etq57vcmtFwQVMhsJ7ejUtnyvyCvDaMmS3kQ2RXbACiODA4DK0Z93l2aKbHN6tj+88nD6I2j3tTuWyL0ORBDEWRQEywAlg4iZfvP/mj6vy9Nvb03/+0e7ZWSiDEAOiPQj2YscKPO9AcdNBsiyA15SxrH4cgAZVgWKI5hoSeo7tRbt+cuRms5rdtE6oCkgnULQSy0LVW7LOKyUP1+/OV2sOBVsyeBSSpAc5wBGDHMHkxTaM+3YsIjcbJMgCeA0xM8g487o+Yd9SkYgRtYODg/Msp/3l5rEcb+9NFideTh67nX7n0slFklUx89Nl1LY11XOF7M77zR9xKoroUm9kzjNLHGMOMIWOVcjPL2K4kRv2kGYBvOaYDq1TBj0MxcFGhmiKAC+7ZrerZif1o/nxo6RRnvXvdgR0aGR3UM0XCUpn6fwyMjattEXHqCOSK0MQpCE+YUQgx7AX9gSvxuYgC+A1Z98Z4oXHrqq8LD6T1XrXtetFCAc1/GJus7KcYjNBaEoO99jzMbb8zgrpSeNEetImUhQmBxQMTg5qQ4qGAWOJpb1QZ3yTZAFkPpFhW2x40l5smxSSFhzRgTbblfNu3gfvLouiOKxCxadx5TSQEBk8Ode2OzjHAiI4XPXmeuXSpLMAMp8AQYhkbbE75fb8vNvEsiqrUBWzSV9tQdQk060CfV1Vx2VaryC6YwcC06QX23gaO9AZIJqGbFQaItdD47ohf+njVqEfFVkAmY+FiKAM61jbczSrpF3Luw1P6skhJeciAa02PYRXVT2pyj6EKC16ScZGuwBnHgEQK1QUpioMFuWxayOunW1wg2QBvO7sm01c3d1311UoA1tr+22/vQCZVigKMdpG68WXNXZt18dePyqbOF3HXS+eQJ4FcKJd51xEHcCF5+BaRZOSpOQRERhDHp/lOEDmZjHYkLR2TQQEgBQAjJwP5LhI8LC27XqS9sKgWjOIfOBOtWlj07QUpXAlggvgBDirihnVswqguqrmm27L52lzLmKgMOiO8wqQuQmuDsug/XFJdq2t+uCqLIzgiP2ymNa9xj45tOp7iaSiUPguVd6HibI24qyZVHNAFKnritoqLHkWTsJ8USQ1X9DhsqxKa7C7oH6npRuvxLDbbm90Q5wF8NpzrcnVaJzTVWcJeDbyptZLFDh2EAEMcJq0BEVHzg2/QxVshokVbk7lbOIqkKGY1fUiImkIrgwxlI5kp1cTf14BMjeMYugu/ZxhUKoSBJaavoOoFL110XkvHh4MlIFd0bVt5ML1KIbTacgA16s3H+tLWW225D7q3LTZ7NZ9mE/cJnatlTYWzgzctDs0C+B1Z1+8DoxCGPYDw6pASVKKrvBliCF68o3qsFLURVlo6rbKRMQUJCbjCBCSVTzTC2v0QjbNettsEgRzcWiRxMBgDE228gqQuRGu/O9mQ2GMjRVlNp4XYPusHbLgS9RlXahuOiMDMyFqskSpT2PiRCA/6XedeJgsMQl35gde+0Cpo8TmxbOhYYEFBvx4nhmuN9a9ObIAMh/PuB9wAgvmnDOypIJkimSxbzq6jJaELKC93HYTsD92y9nEHMz0ZDaZFOe7dRJoskA9PAuzh+5rhl/ut35DZAG8poxNGwZXJNF43vC4ARYDE1AaOy9U1eQm6yQXXALkAO+CEHmpQglVAnnggTuaHJezg36z6wTaVK6qKufmzGVsKW5FdceBoLJv6bI/5+xm34dcEfa6sz9fmJ6fNezJwQOYoKzfmN/53P3p0YOSXSAFSA1soNinQqI4U0NFRXk8W95bVNOHRVnN15fN5eZs+8xFjoflrCoTMycB+gjoUCk2lCHc9BY4rwCvITS2URxOlrQxU5/GVYDBKJwHR3EThOK4XtyviopJ2Xnnh/GrupiVk0mzbde+KDZByDnQJHgHVxRF12DTyqavUU4rDVUdyTfS1OWs6qlgEe/G7NC8B8jcMIShzSIIcEwgI7AQyJS9Mbqu7dvUraJpTGpwzEiqys5NQdjSaDdt427XNbuzxiytsekP6ICOJovjuQ8LpSIqT9AledKz7uDcEHi7+QUgC+B1Zd/fH47BIBAPR67ChrPHPKCO2Z03q7N1t32vc7GLZI5SZIDjs835hwbqPQVESDqX5qxv29Sp9i0amVlZOqv4yKbzg8Xd6sCq3Qdx9ayxiGhjddgrYALlPUBmYB8PGAdlgaKcTOqTalJZz7rrKLWefTGr50vHTFz4DQL3Qoqt7WwTmzZ6WMuxqPzE1lhvz3ZnH3ap33pXFOyKXQSGQvz933wFWkbkFeA1xcbSRzbGPidtOFjeYEogY4YjIkeNcpTKOVf7IjiC30HBHIaAmQMOpgeemjQvqwot4qV6ksC1nPbNdhIvnhrhdIPu2QXFnTo/7DlMX0jAuymyAF5X7OqcUyiGyZh5iNMyA0bEu9jFTbtbb1PbkwXurfdgbHuTnkWRRNHvtkVZHy48u9B07UWb2l0RajHP6Ps+/WH3zvvWMbR0fTGdipFBo8BYXoUtQBbA64ldO/nRwDYcfUQGsBnYeTTWxVW/bYipd1SgpSQpdRsFSShKcc6hbxt35OaHs2JytO12Zy3iKkwnEjWBGKgWc5Fem7oqsJMWvXTD+cbD0cNDM64bJgvgNWXoHj2geL4pNlE0feNqV2CVdmcGE4UioCx6S9E8SAkkfbSAogi+LPo+9puuWaNkEU0wMyRTiPYwBgRApDR0qjYeTpxUywLI3ARjCRgN7UowCoEFQ5t1JZihgHPTKHFn0FRwMWHnKgi1AMWkalASz65vRU4dlCJpBwMsAQQUyZIzVSHv+t2uhQ88ZtgNqRBK+z3AzZbJZwG87oxeHwLARmBiKCux54DowOSKoq5DMk1gYlUhBinBQwmy074JzkHd0AqdjTyD/aSuD5quXSe1PsUexAXUhuoz2Himwc2+cgBZAK8hYxcGEAwKBj+3/QGICXpNgr5rjVQMSH2zFcMwYj2xkJgZGwQEZYOSQB2ABLDBSvZF5UIRrbEkCQSC9DIGvwiAwkYv0LAI0Y3FBLIAXnMMBlMDgT0TsxLMU+iTJDjnaGjowz0P3X3AJoCZJ8cMNRVYMn1eW+yMnWMXmt32vE99G6EgA8TSmAf6PAT8wqmSN0QOhL12jBFYFbAZnAGOCKJGANdkDCb2GBxDBRHYGeAMCGP+ThJlb1SzKnsDeUNghXNGMCVJkna9WUwY2iHqtba4dq0E8+p6sgAyN4HakJkZfAGBqIg0ThEKY3IwUpXGVFUlOi9WU5KJpeQiovSpbUSiMMEHH6qgzE4JIIgRxbIugyscjPmqwuxV5BWIxWX+lcHAVf3J/rhSwtCjUIfqLs8OThmlOjgzN6Fy5rwrL9JmHcka5z0K+PpkevzQ+oh1v3t/K21rDj6ZJIAx9bVv2zUVCC7BBESePFmrfR9VZCg02/cbfbXIe4DPMAQMXZkxNKdVHjaejhlGCqahmN2BQWpuUcymi6K6FzWly2hrdsOGWSRCu86kT8SGYl5OqCNhpB6SNKaY9MAvpqRWJg/RwLbu1lsQCRNDoa9C3tvHkgXwWYUAEKGaFNiHXnk4Yn6MASgkCUgJjhwcgQP7iTNCjLoWaGRXAg4Qlb6L3QcmQs65UBTFjFR3qRclsCs4TOtqOotd1ySXSnK0YUeie5+/2Cs38+/JAviMsk9wEx3cmw4OJXswGKIKIQJMHZScQsXYaStdj9StkkvOkfdgTggM70tR5cY59t67ksBsfeoL9gguTGfT6SEZdNvuUi9pa0RSVJUgdkh9vNH34fuRBfCZZaz8ggMTo+IKfdO4gqwIRHBiqfDBOLhJNN1ESFpJt2ELR8EXzplqHE/jtkDYxgjnTRz81idt190Gh345rYtqht5w2W9XO4078xDQ4DUCGOwc2BTyip4TnAXwGYSAMe9GQckQ4GDa+bthMa1dcdD2zXplm430qr23nbCaOMCcSZPiZS+K3iSaueG0eWaYE0Qz0z71ksQd8WJ2NFksHbnyfHf5ZGftFoUXDgxjIKZ+bH6rN94A93uRBfAZhswQlNyCivIAYXrk5icdpO/iLopBrPJiZGL76lwi6dkakQhxDDDDEUNVASVQNLDAzaicHYXZ0RSh7CU2SWJ03qXoAdDwu/Sq8J1Ads0d9YqRBXDD7Hvl/4l3iWOA9Xq7HYAQ1BXTsji8UyweUKdy2m1OV7qNrgiizIBJASUHoE8xomfiqKKFc8JEcAZYZ9A+BlbTWsvZYTVb1t5NU+x00zbNznbifIVeBUYKlcF0Er3hE/A+BZ9dAfzQSYY/2A/+MH/mhXrwP6VkSLpW1jV0fQMcADLr275pOip3KUm74hiFC0kW4RK7CbvKu7JcNZtmXi6UvQ9t7He7tFNvrmS2DjFxjeDnblIvinJZBFchiW77Zrumbe+K0noTEBSahhejOuT4qClejbS3j+ezIYDr4byPea9fjvZ98sfBVzPn9WcxBk/KkMa1D94P32fnhsyCH9LWpX2Eat+a8Af9+fFfBl+lGewbDwb2Q/PbQFAy3VGbIjSph5ZcoNtuC+Oirst6Ym5CpBT7pttu05qWYTYREYdkflZMaVnMTypjX8AKby5IRWTa7VKk1FGSJDqkV9P+vVCYXk+CeDW59QLwoRjc3OMod2PcfX//J3/iJ66yHQFAyABi2OiZ+OKXvwQiRvAeEIJGGXJjMBSJ/+b/8+tuioL/4pd/PHpH0MLhV3/z18NP/vmfjG3q8Zu/89sAAVFkSLNnhsQIU4P3HtcL/4aiE4KqQlSQVEc3IcHsB7ORh4Au4fjgEE8vztykqF3Tt3Lvzn3pYwczQcmBapSTk8l86frYs7nz0vumbbfcJ0GJQEt/YM6YprXnXd/EVTrXL9x5q95t1oeqFIOWaVnM51P23mkqCvFMleNT7OLG2rMdxbZNSUzHyQDD5CDjvD+sBK8ut14Ae1466efao7hqwbTvgKym8GCUhQPb0BcnthElAork8Md/8Efhx97+UvzGt7/u3+iXVZ2Iv/ZPf2N57+69fusES5vo7/2L/9f6VqhQir0mkAqMCUmH2c8PfnaAGTqWHV6/pj1DT/4fbp60caNZcaDCuYm6sBNNAgUKFxC8d5I0XDbblrp+c749i71TlK4IEz8JdVlPKq58F/u26dvtJm6bk9kdPl89K495HtRUfFEdFK5gIriuS/Gy2/RRlVum0wvabVtOokrDpld1FLzBoFC72US3T8OtF8De9HXXhj/R0PFgOOhh2Ihdtfw2wBHDJ4P2HZwITBTv/PG3w7/+hR+P/9sv/s/Vz/6Zr/rf+if/+/xtPDy8X9y7Nw/VhA4f4Txtk58f7N5tnp0/a1eXF+ly9zStbOrL9Gy3DmFSR6HBXGJRSFSgKoeTEqFDF+bhagAD2ADDUCI4sDewPh0KQB3R7GABmF32u4ZVazA7WBQ0bRRj2u2A3Xqz0kO38MehXFY+zEofgjHFs/XqvLM+9ZD+4OCOPH32IZ24AyzmixA1FXUxIXGG82bbnDbnp621OqOF9k564kqs3SHK0CdaDbDR27Nf0Qyv9hJw6wUAG0Uw3u67zpANA45trHWlwfyAKOoQ4Noeu4tNuPuFKv7CL/7C5Ke//Jf4t/+X/2P+F+it4+l3mvs/P/3qyeP5/TffPHhwDLP6w/XZR99ef/iNbz85c48f3AtTX03rxm2rJOeX7SbOqJbL9c6Ws4PEBmjbYSddKPw0pnEDYSYYTmXfj4ixKa3ReGzop3vJRDSer0VgpilMidiak5Pj5MBgcYgxIXXRt9zGg2JZ3SlOJgeTxbJSLgzKm2bbdNKfbalpltMDaXdnLm67yb3qTjUPk3ntKr8ovW5jg1Zie5Gas0vX7RbLQ9lZApgQex3ES0NxjQ474OcfzC3g9gsA+yN9gH2t69UxPwqULkDEkFQRu4jtah0O5mX8zh9+o/rXlp/zv/OLvzT/N/D45N7X072fXnz13t3J0ePP333jzv35naO7izuHl0+fPjtdn58+A7u6qKcTrfq42x595dFj7OIdefpksfr9p9/4pxs79/fcnRO3ka4AK+BsglLP1hsrimmyyiHSsCnc18K+sCK8cPu9GXLshxeuwMY5B02RTBMclVhfrlxhRVFz8Hf9MsyL6WGprihRlNGSfNRcPnuaVqvoU1MjIO6ayX1/VE1DPT+cLqb9tuWCvNv1DW/Ttrtod7sn8Wy7vHNXIhmiGCQlqCmYGTyeKGl6/fqzAH4k7LsZ7Asb9Nrj3hiuBbbPLsPhbBm//vVvTz5/9Cafvf/H86/gwfGjbnH/p5efv/vm4u6bbx0+vH9vdnL06PD+cRUmZd/E+OSd959dri82m7htD5bLCq5+NPfHJ7YI2NTiC56nX/vtX/6vN0io/SIlRx8W6nHn4PCvhCJo03TtdLU53fWxea8/XZWLqVz3+evebPshAgFX/n4zcCLUKVhlHu26md53B/VitpwXLtSmogw4UyFyZrt+vdmm9cog3YJn5dLX1dSVy1moy4JCSa2KN8a62yQxpajSNdT19WyGZAq7qiAZ7HuCgciu7t+2DPsbFwA5HjqF7c8MuTo6k5BSwvOB8ZLD/Nr7TASwju638QNycKEEx2997V9OvrJ8iy8/eGf+U3hw8sb68N7Dwy8dP56dfOFkefzg8Ohkef/O/Tv3jx/MPZfu8pvvPvngg3cvTp+dvdemvk9euDiZzu5/+fMPHx3UgQur4USfbM6encaL3710Dk99QucToik2peJZ88FvUAdMosdPv/GVv/n1d7/xS115iAttQUP7zXEGH4fND9godi96MoDVMFXGYksok947CPfuFEU9iQKJpglVEVfNenfaX678DmCnaUpFOce0PqyWi0WY1B6uJLDte/VEbftnzeVaA9C4ZG5ad5paISic0dXmWzHa+nT9c7sdM/+eGxbA0IWAePBjE10fCcMbKunFbMK9P37/NK9D4lWhDAICC6KDq0t4N4Wffx4PTu7uJvf+8tFP33vrzv237s+Oj+8vjpd3Fsd3T04eLIrpbEKzeYHzTXf2x9987zvvvXfedv3FNm37w7vHs/mDo4duVsxmi8kkTCreWtv2JXFFxclv/LPf/W82E0PjgV4EgEFojICOzWa/9u4f/hLBEDWCaV+QPmA/ZIhoLxoyoAwl3Cr5B3SYHh/c/0pR1kcdafPu5ZMnrabNxenF5QZtF7VH4LKY0mR55+DwrkbFrJxx6YKPKtaJdD1kt+523fn2YiNlknI6ja30jcAslKV1fQdXlddWH0BUhh4/+mqmOnw/bkQA5BnOeTAzFrMF2DHMEZiH0DvZENIJLuBv/o2fQ0oJ0+kMqe3gROGJ4YND23ZYnV2Gn/urPxv/2a/+sj/o6vI3/q9fnj/A8fFBWNx7UB4ff/HO4y88PLn38PjO0dHicH5UTMK0quswqSfBTw+9tWD51rvP3vmDP3z3bHVxelmTHX350eGb89nbR288eFQc1bOubdrN08vVh6cfnZ3R9slliMJvLt/7iX/7ryD9uRNc9LvxXC0dvU3D9OyU8D/+/f8egKGPCo3Pz+Md34mXJsxPvxSoGcg5TCYTzCPSG7j/xbvV8edO+83Z6e7sydPm4sOeLEWmchYOihMfFouirOcIC2/mNVB0cGJqqY19cxab7UXcXp7Gi5WS6szV1PW7dLq9MBllqzDQGi/ELJzn0fa/XTP/nhs3gdg5EBPIMdjR6LUZ3tD5bIZms8ZycQDrE7wSKg34zte/Hn7sc1+Mv/CP/mH1H/7s3/L/1X/2n8/v4/g4Vcf3/sbiL9x5fPDw8cOjhyeTUB88vHv/7vGdk4Pp/cMZZqHErAzQZNb0nYnK5snTZ2enH310enFxPr2zqMPD5UH55p3Z4ujgYX10OEflwoQXPJkufXk24Xj5Yf9B/ODDLq7pjLegyqMMNVIXEeM+92UMurGhwd4z8pJtfGX3/5A28xhxjVHA9QSNWnpn9dE/vmg3b3yQzlYKxXQyv0fzyUTZ/QGpPd11vaa+c/NJ9TMhuS6mvjmLl/2q6bfvydlpDNRzVQqg6NzgyxdcT2P77kGuai9tfm8XNyIAtmGgs2EY9Mwgx3COwQTsu4c1zQ7L+QIaE77zzrvhS298If4P/+C/q//9n/p33K/8o/91/lV86Xj3f3/r3n+w+GvHbxzf+8LDo7sPT2YHy+X84Gh2cjgJk7osD6alX0wrLOoShSswqR22bbc5e3rZXKzaTd+2/u7h7P6smpeLip7apt+1F6s/fraKs+b08KCez45myymFyi8Plov71NvZapeeuPR06GdDY5dvG05cB7677Tfhe/g4f5j0CQKIh8MqyLDiiN/Tj77pkdyD2bJ60B9VgYtJE/Qbpy6+f0FbaGC4mhF6lVV/+asVCdKqf7RjxJXvUlFPREhFA0GZ0YqMp7hcM20+Rq+3efADN7oCvPjG7VtvMDAUcSjBJeDDr30z/Mav/1r463/5r/P/+ff/p/lP0uOT5l98dO/nDn/m7uePHn3+jZOHx9NQLZcHy3uPHj44KA8XE9Sls8o7cWTatRrRa99rr+a0ih2gBJGoXWw2u9p6kNrs7sGsYS0DzdJ6e9Zu++b0PF5+eLFd3TnbXC4X1WzmnfNcOX/sDu8/0Sdfu+YHGfJg8OL+5BNe6p/8nbMh19/AcC4gMrAuFLM6yNll81sT5wLJLvZG6JygdwJxg3nmAUyZZRqLk4M3T8K3nn0A58p1p70kCPqk8EVAtITCh2GXcrvH+PfkhgQw9oah50OIDfBK8GB4ZVgTEVcr//53fn/6F/mtu/XvPjv5jw7+zeOH87tvff7+4zfuHhwvF9PZyeJ4Pi/ndVkezQvUfoajRYlpxZQ686umbVf9Ri761HNkKwOkcMGHQJAdJd+5c9tdnMrFebH1flKVJ47MowbEfHXWrC8vTT502/XTgzRdTkNVO0LovRbz2ZTKrkMbI7ZtMwSB1OC8G04/uXITvjR+PvVg+iTTaPC4DE4DAPskOFY0rEhzxlo0EhgJhuj0Spxsg8NBGEiBTxsS6p02rcZWIOIIqJyHmCK4AANdLWZXkYo/cXHLp09N/FFw43uAqygWDcXZQT12p+e+2T7zX+bPPfjKweO3v7h880t/5ujh/cPiYHF8cHx0cHi4mB0eTifzyQRHVYWKvVZMKRD7KRPXcOi9iXfUiyRV6XqYWOoCuYJK79ziYFa2FGcTkTltsF5j12267UcK6RmuKpaTaWuu3kjXddpdPulWq9AaT60s6sXsMFqJAv4/rZT/i6gMCANmCOLGFzZ0P2YQ/qQ5kcMJ7teS6sasy6voshHEBFESdgaAGAQ3yE+eb1CJCDo0r8KFRJDsnu4sItLQvpAxpDOwEZSeb9A/wwvATQmAXnClAYP/uU8JcdWFfrt1f5a++PZfffvPf/UrJ29/7s2D+w/fuHP/qKzKWXW4qKwOniZVobOq4EUVDBFQUwYcjKEtRe5M0ZMKOVymbvOkv3hq3mbHtpht2219XM4ny8liEhu+U82L4rLfrt9vTz86p6Zdo215tdp4732X+s5M5e3Hn9fSB/zB1//AYXV+UcfpdLZcrh/Q7D9ZggwkajB0u+7vYtR05wAPQvc9h9D3yeXGkKw3ZIzaEDGhYTATG4h6EDNIgbZL4/u5bwI0XsjeTh9XgmRAp8Pf61iA/V5GMbRIGf4onkvns8uNrgBDBHdcyskgMaFKbI/8m5/7t97+Sz/zUw9/7Mffvv/4/ny2LCfz6cJXfl7cP55gWjAKYnh2KD2TmGmfokVTpoJh7AGOrvJcFpugBNqi222tffbs/NSf+IM7266b1dVkXpY1TxPNEVzZOaO+d05kvWus7R48etRy4ZE0WZsihEjuP/5cr1EVXVrF8402H55BtFMScTCkQP4/duRA7ABJ/21N7mP3xNdvFUDE0Gz2+mztQKjJIZAbEt/IEDFkXBoPYojSgZUhCkifoCYgMAj+akNupi8EG4e/aVdp5Gx4LqzxGWSA8md9+N+QAEQEIsPHfe/OffjAiJrw3tk3XbEp528df/HB4+kbjx8uHh1MDw/nIZAHYvDeKbwJIB6GYZ02z1CnFBN02/cSmRw4IQHW9lqG0tVlPTm0xZ2m6z7YQrrLdPqel1VYYnk0bXxVudK50teTspyfuLnNUHenm2eX5++ctue66aCUQIComokqoqi2PSz1vnLOZjSrC2LuLUpv2nMIYo5hFv/O3/n5v43khnQxiIHMjEFQSeoIFrtOeqd/77w2dPtPY4ysTlPAH/2T38KPPXj757u4233Unu8+4O2vncsWCRG99NjtdlBRiBAcu2GwE8MwzOz7et8rEZINqcs8RHO3q+3wnKuxPsjyerjuT5dXS1Q3Hgl27CC9oCgdahT86OBEi2S+UBfDdDENZTEpAzyZmcaYuGmSJoeIlJIpmLaOFcyiSr2mpruMjj2pmcYUVchESwoTNz0+CVpNebl6url4ukbT9e3F6Qoc2cBzW5yISUikoqQ8n8yWibWiyNtt3/VJUvIuBIH2olFDHVDbopwylQfV5DAQT9fNdnOR2meREXtNRtG6KrlBjKLDVJzU0LZCorpuNn04qP7BfuAbxpymvVs1JSzr2c+sPzr9IGm32fWr01Oc+fruYfLsIJ1is96gj0MH5rKoxrwc2Q/70Y052PdDVuwY1KJ9urJd/W289NXrwI1vgpMoHBG0T4BFReotYtM+XX304Wr97NHR8fQgFGXhHAOeg/akIpIACKlJbDbGAuWoxmppfXraUGBp2XRH/a7xIiiDZ7CrinJauso74lC362YVN882iNqii+dN+4FASSBwRDSbTOfE5D1hsqiqshVpml3XBB+IhdmBfHBuVpVuWoSiSpr+bivW9gVvdpZSl6TTpDvaxOgb/G1pu2R9Sta00u92yRvJ/M2Tf3xaRFxUQHJ4nhqNYeNLgfD1i+/8nk+C0hV6ztt2fnKcdkgI3sN6HkytsRyzT9041IHnM/loydveTXttwP+AOUifRW5YAAbvhg2bqOHNR2+JvL8BkV9/a/f+k+V7//L3q9JBD48fzubzg4IKgZFzxhYcBxShMumTNF3bxzaRGJahLnpL/a7dNhtuTj+Kz9Z9a0Lk3EF5dK+a1lXUhLIsioNicbyKzS4l2qzSthdoV/pCdmnr2nUjUFIHj177FEVNxCKrF6iZpJS2cZs2pT9/Urr/kguPzgE7FvRkEB4Kb/qLhODp7/HUwdcOtKwQ4hxEDlYKmmDovI01Dc8jTaYKMYI7KLY1QlEVpWebpgsWwDE2TYMkAucLhIIgMUKSDl4h4Or3PPdjfowAMjcngOe+DwOIwN5DiHBq64YQ3lcpQv/B/4fdZtd9Yfnw/OHDh/cWR8s7k7vHs8IjFFXhmDzFVSdeoRUFA6t35YwQG65TlDmwPEt+u6Wm21HTnaf2HWmImQCnHCZlPSmC5yqi7MXJpms0eYuTooqb9UWc+XmtScmidNT3vUsqGjWZqkjbp1Qhruf4h03oAc9DSaQbTkEcPDSG9aKHJYWqwulQucajcyaxoQ8Cd7UrptH3PmyAHcEV5KfTyeSIzMyirokM0Oc99pmGHCr9rqL6l32YeeB/HDduAu0zG5UIxoSTx4/i++++d5HEkOxebD78vcun69Nnjy4/uPvw3v2HR+eHd8tQeMdc1rNlRep9MOeqUJSeWF0fhVLUqldaOJo+xPK+j7Y6TfJsi7bvg6JB21ZWIunWk4j2qdfLtOs6SR0HJ41j2a3XhRaNUQder9bbs+35xa7dnXdROnZekyT9/J/70q9Z6dCVBnNDeoLuXfRmUCdoQo/kh145V14vw2ir74OBe+jKVWnD+UGFq6uZryu33azPEz2vIb5KPh56j39MpOF2pif/qLkxAew/FmF7LgAazq+998aj9MG7H15s0G6/+rk/+6T15bNf+ebvfPRode908c60XhRTd1gvZncO7z2qpssJJwMZHClcELNCzMqEIjjHSxVoa94rT3fsdzvqu4smdhHbviXFWpv0UTzbmoWzdWpjk1oVqHRdY1Nfz2a+msTU96fb1fmz7cW7DeK6Z6DnZMezLyLw0AMHGK7/KsdfMZ64OA74sfzlyvYecyb2EXG6+sHhaBYhgxr6s353vu27i07brgwV4B20izBVkBpEBtfnd9v0eeB/Gm58BXgBAxIZOok4fng/TahK3/LP4gW2l/M3l3N/ePyMNEzansKvfPOfHzxa3X/qknPBlzTxpa+LMhRwrhTnZuIPJr6skNR2fZu2iNuN9dpy7IUSbZqN9C61a+v02fnZh5f97t0Vts2lbDXBokBQwDNBuUCFLbp4iovNv/fv/q0YWSGBsOYecythSgDG3j5Xr2Xsi2M2zNh2/WUOfvlhvA/fN6KrbeuwZyUIQdS5RsjBWYXOFJb2/TaH011UFCZy65PSbopXqH7t+ZLNY4IZg3AyPYRTQ9+0voKrKjhe8qRaVpOTmop6TgtUVLqDYjIvmIswGBkMs5LN4JQ0SdLkSHqI7lKnwhaFzIQtRU2p0ba9lN3lTrs2Mcm2b2MrcQdC6CXGCEGLlGQ459xhqMBFwpCTb0zPMyVtb2vb1eB/oVjkpVwae/GlX90ZAlND8Mrx2NPfDKI6tlMcfr/3HqrDHuNVbkL7qvIKCuBFppMZYAYeI6Negdi2fsFVFdSRK1immExO3Pxo4ouK92cyEMzMUPsAkSTGBDHo3mAQQAxKakllnEMjqSYGtn3TN9J37F0QKBrp4zq2jWhEATcBdCVsQ0SW+Ko6a+D5ZnMvgBf4OAF81zux72T04jOGloc6VpZdf8zy4P8heYUE8HEQptMp2Dmo6lU7EI2COpRIXY+7J3fx9OmHboqyLOF47+8TDKNi4mskJAwv1Y2ddwyyP7/QgKQJySRGiDk4ipZMYN7MoKYQVYlsiQzwBk+wqGxjsYhdRVvNPsUb+ikEkPnR8YoLAJjOpjAQnPdIKcGHcLXckwHHx0fw5MBJULoAlWEJkHGgVaGAJAGIhvioY+h4dKeaYb1egwDwNTMjSoKpgp3DZrUeBvkYX+I02t5kUBoFYFkAt5VXaxP8Mexz2VVkWPpTGiOlo78Rw4AGM1qVsWEUYDyYBj0pyA+eFiEAw5FtQzqAGZLb2+cKHpuYEQ/uSFUZPFOmV+dc7bsfKJ773Z+b/vZ9m1u98jPOa8YrL4D9HPn8QOPnsUwDDScYXkU5n/d3Hjwsiv0p5vvBum9Jsn9s30LRMBZ97+1rM4yNp57b28BVG8Nsc382eOUFsM9kfDmHRUc/uqR4FeYHngtAR3Nmv4LsA07PXY/DLY+P7ut6920Ur0JL+3Oyrn7+erbkviF55rby6gvg+9jVKSWw0ZUGXuzLMJgz15MA9rO7YYjWvtDUDBiCsWMw6hPtme9Z5J65Tdwak/STAvvT6eSFAOh+hv5u1/r4+DW7HQC22+3V7/pBhjR9V+5N5jbyyq8Aez5pqEka+u48t4L2Rvrzu/ZCgGkUwMu5Yj/o9eTB/5ng1gjgk4jpExpPjeyF8XJZYiaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMplMJpPJZDKZTCaTyWQymUwmk8lkMpnMp+L/B/fTMg2sKoY0AAAAAElFTkSuQmCC", "data:image/png;base64,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", "data:image/png;base64,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"], "frame_max": 21, "frames": [[[0, 0, 0, 100, 255, 0, 0]], [[1, 0, 0, 100, 255, 0, 0]], [[2, 0, 0, 100, 255, 0, 0]], [[3, 0, 0, 100, 255, 0, 0]], [[4, 0, 0, 100, 255, 0, 0]], [[5, 0, 0, 100, 255, 0, 0]], [[6, 0, 0, 100, 255, 0, 0]], [[7, 0, 0, 100, 255, 0, 0]], [[8, 0, 0, 100, 255, 0, 0]], [[9, 0, 0, 100, 255, 0, 0]], [[10, 0, 0, 100, 255, 0, 0]], [[11, 0, 0, 100, 255, 0, 0]], [[12, 0, 0, 100, 255, 0, 0]], [[13, 0, 0, 100, 255, 0, 0]], [[14, 0, 0, 100, 255, 0, 0]], [[15, 0, 0, 100, 255, 0, 0]], [[16, 0, 0, 100, 255, 0, 0]], [[17, 0, 0, 100, 255, 0, 0]], [[18, 0, 0, 100, 255, 0, 0]], [[19, 0, 0, 100, 255, 0, 0]], [[20, 0, 0, 100, 255, 0, 0]]]} \ No newline at end of file diff --git a/project/animates/sword.animate b/project/animates/sword.animate index 21cc63a..26a8fc2 100644 --- a/project/animates/sword.animate +++ b/project/animates/sword.animate @@ -1 +1 @@ -{"ratio":2,"bitmaps":["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAD6SURBVHhe7dQ9SsVAFAXg+MNTeAhaWCrWLsHGUlCwsHMXgo2NjZ31a1yBVtaCrSvQ1i24hSSegbuEBAS/Dw7M3JnqZEgHAAAAAAAAAAAAAP/NOI5rySI5GobhNDlJ9uuYqaXo9RR83Pf9U/KevGV/kxwkW+2D1FWmkmKXKfYuZf8k38lrZpeZHSaLusaU2ktOyRcp+zP5Sl6yv858t53VNaaWcrdT9mPSXvpHskrxO3XMnNpvJYW3F/+Q9XmNmVv7raT055R+n/VejZlbyt5M6VfJbdYbNWZureyUvkzOagQAAAAAAAAAAAAAAAAAAAAAAAAAAADwd3XdL135q9NaPZ6+AAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ4SURBVHhe7de7alRRFMbx3DSIgqiNIBJsBUUESyutBAsLO9/CWtL4BtorlgFBRGIEEQwxMSBiMWouGo2TCyaTC0lmJjM5ey+/HVfeYPZB8P+DNefsS/WdxZ5zugAAAAAAAAAAAAAAAAAAAID/lZkdVnX7ELmkkA+C1rU3xngthHBf1xsa9+1vQmcdhK7qUdAXFPh4URSjur+r6vdt6DQP/ZDqkkL/ZlZs6jqh8WnfghzU1UcOQlclmop3fBk5KPA+hXxRYb9LiWtsujR0Oe5b0Gke+hUF/TaFLtHrh29BDgr9jEJOoReqeur2RPfTvgWdpnzTG8yAQm6oYgq8uWfWLvaD1y+vkNko3G6FPJ9CT7ZbZpVVs9m1/Ydw3bchB3X9+dTxqVLwk4tmH1T1VnjlW5CDGj11/XDq+HTgfFwye/rVbKpmNjzDx1N2Cn8jhb+qF8mRObOX381m1sPww4od8y3IQZn3KPzdogjNyorZ8xmzaXX9cjOe8y3IxcNvNtq2OV41ezFrttYMv30ZOSn8dOavqBrjC3+PnfVGvOfLyE0P4HH6qhr9Zfbmp7p/Lg74EnJT+LdbeyGk4F/PhfhgMp7yJeSm9/yTavza2HyIYwuhPTRkvb6E3NT5fQr/2cRS2HhfDfVB/Qn7EnJLf7rq/pvTq6H9uRa2fBplSOGrTixvhdrUWqj7NMqi8HsV/shsLez5FMq004qXq+th14cok879/upO+FKp2GGfQll09PSsNOLVxXq85VMoUzr7F7fDIx+iTOnNR8fP2UGOnvKl8NPx8+RTPOpTKFt6CH4LAAAAAAAAAAAAAAAAAAAAAAAAAACAf1RX1x9x4x3SPdhnTAAAAABJRU5ErkJggg==","","","","","","","","","","","","","","","","","",""],"frame_max":5,"frames":[[[0,8,32,30,100]],[[0,-16,32,50,130]],[[0,-24,40,80,150]],[[0,-48,24,90,180],[1,-8,40,100,255]],[[0,-56,24,100,200],[1,-8,24,100,255]]]} \ No newline at end of file +{"ratio":2,"bitmaps":["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAD6SURBVHhe7dQ9SsVAFAXg+MNTeAhaWCrWLsHGUlCwsHMXgo2NjZ31a1yBVtaCrSvQ1i24hSSegbuEBAS/Dw7M3JnqZEgHAAAAAAAAAAAAAP/NOI5rySI5GobhNDlJ9uuYqaXo9RR83Pf9U/KevGV/kxwkW+2D1FWmkmKXKfYuZf8k38lrZpeZHSaLusaU2ktOyRcp+zP5Sl6yv858t53VNaaWcrdT9mPSXvpHskrxO3XMnNpvJYW3F/+Q9XmNmVv7raT055R+n/VejZlbyt5M6VfJbdYbNWZureyUvkzOagQAAAAAAAAAAAAAAAAAAAAAAAAAAADwd3XdL135q9NaPZ6+AAAAAElFTkSuQmCC","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ4SURBVHhe7de7alRRFMbx3DSIgqiNIBJsBUUESyutBAsLO9/CWtL4BtorlgFBRGIEEQwxMSBiMWouGo2TCyaTC0lmJjM5ey+/HVfeYPZB8P+DNefsS/WdxZ5zugAAAAAAAAAAAAAAAAAAAID/lZkdVnX7ELmkkA+C1rU3xngthHBf1xsa9+1vQmcdhK7qUdAXFPh4URSjur+r6vdt6DQP/ZDqkkL/ZlZs6jqh8WnfghzU1UcOQlclmop3fBk5KPA+hXxRYb9LiWtsujR0Oe5b0Gke+hUF/TaFLtHrh29BDgr9jEJOoReqeur2RPfTvgWdpnzTG8yAQm6oYgq8uWfWLvaD1y+vkNko3G6FPJ9CT7ZbZpVVs9m1/Ydw3bchB3X9+dTxqVLwk4tmH1T1VnjlW5CDGj11/XDq+HTgfFwye/rVbKpmNjzDx1N2Cn8jhb+qF8mRObOX381m1sPww4od8y3IQZn3KPzdogjNyorZ8xmzaXX9cjOe8y3IxcNvNtq2OV41ezFrttYMv30ZOSn8dOavqBrjC3+PnfVGvOfLyE0P4HH6qhr9Zfbmp7p/Lg74EnJT+LdbeyGk4F/PhfhgMp7yJeSm9/yTavza2HyIYwuhPTRkvb6E3NT5fQr/2cRS2HhfDfVB/Qn7EnJLf7rq/pvTq6H9uRa2fBplSOGrTixvhdrUWqj7NMqi8HsV/shsLez5FMq004qXq+th14cok879/upO+FKp2GGfQll09PSsNOLVxXq85VMoUzr7F7fDIx+iTOnNR8fP2UGOnvKl8NPx8+RTPOpTKFt6CH4LAAAAAAAAAAAAAAAAAAAAAAAAAACAf1RX1x9x4x3SPdhnTAAAAABJRU5ErkJggg==","","","","","","","","","","","","","","","","","",""],"frame_max":5,"frames":[[[0,8,32,30,100]],[[0,-16,32,50,130]],[[0,-24,40,80,150]],[[0,-48,24,90,180],[1,-8,40,100,255]],[[0,-56,24,100,200],[1,-8,24,100,255]]],"se":{},"pitch":{}} \ No newline at end of file diff --git a/project/animates/thunder.animate b/project/animates/thunder.animate index f5447fe..9383a1b 100644 --- a/project/animates/thunder.animate +++ b/project/animates/thunder.animate @@ -1 +1 @@ -{"ratio":1,"se":"124-Thunder02.ogg","bitmaps":["data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","","","","","",""],"frame_max":16,"frames":[[[2,0,-56,50,150,0,0]],[[2,0,-40,70,200,0,0]],[[2,0,-8,100,255,0,0]],[[3,0,-8,100,150,0,0]],[[3,0,-8,100,255,0,0]],[[2,0,-8,100,255,0,0]],[[2,0,-8,100,160,0,0]],[[2,0,-8,100,255,0,0]],[[3,0,-8,100,255,0,0]],[[3,0,-8,100,200,0,0]],[[0,0,-8,100,255,0,0]],[[0,0,-8,100,150,0,0]],[[1,0,-8,100,200,0,0]],[[1,0,-8,100,150,0,0]],[[0,0,-8,100,100,0,0]],[]]} \ No newline at end of file +{"ratio":1,"bitmaps":["data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAABUhElEQVR4nO39+6+e13XnCX7XWns/l/d+riQPdaEk27JJxUmschJ3pSJ32l13VF9Q9AxQM4NBA5MGeuaXARpoYH4YSf/CDLqAqfltGtPdMKs6U91JVarL3WUl7iTlRGnHMSnrYooixXPIc33vz2Xvvdb8cEiLSuxETmxJpN4PQPCQ5/Dl8z7v9/vstfdeey1gxYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLHiY4XR6a8VH3dWH9JfiVOR270/vXT/fr74wI+8DLz0PjeQYcXHhpUBfmxOtfzivXt37TLo4v7p1ztz0O7T77+nO9dhuz3YpW3Y1YswvAy8DNjKCB8PVgb4QLxf9Jcug67ug3aeBdU3jQdniI4XRjoBlyN63z2txmY8hLo59LhPhn0oXoGuTPDxYGWAP5f3hP+DJ/0BeP0Jo9gD6wS8VoKFSKI3Xs4h5sEuEeViFhxsGUg7hhRGltp9pHn7TtqZX0hrT0MvX4HSygQfKSsD/EiMXgTo0mXQ16+Dv/I06JaZ6AScybH4dSd5O3CTBJdncD7BLbV1WcxYHFFiM1KoNU0yl4dFRkHMWjc/jseuiSh34iUgXb0CexmkH/W7/aSyMsCf4T3hX90HrZcmsQfOiSS0Y5eSOPbsObAvuoWnQD4kFDmFLCbnWeDYEnkRbVKMkRFKcfUiosk81Sla3eikjcs6ZDKLx9Wn02lItDLBR8HKAAB+aKizDR6Yyanw4ToduHaxzBx1MrMmN5/lGaHQiJITSkHqWKIcBC8CRCAlkZbJagVVxrYIGea6xDInLBcybXQyaJ4cUQCQVuHQR8Mn3ADvCf/+Ex/b4AsdsCSTqiEHB2+1+VZQ5NrmQahw5kttUzeDdFjRY419Mu4yUJjBgwEwUgs05HkJYJZSmrGTcSs0TdzM2nlatOgs1wnNbol4DUhXrkBXE+MPF/dRX8BHx/tj/EsADbZMtnJwtSTXFnAhWkZtk+c+z4sQyuC4UybqGKhHiQZM6IthwIkGUOoKozCfcqtEzWvMiFuYLZRsqkRjhpYuWUbG4gaZdWvTpZINzOwrb5NdBOxlGFYm+PD4BI4APzrG94Dcf+KbNrkUeRYoFAJfckzdFNEXkp4kHUnCQBKNOGFAlvripJdvYZivW1HdpUqXCBHWhlrnRjJTwQnYDkxwN8D2KXOHiW1cLxfzhrrLokV7XNFqPvAh8wkbAU7FjxfAVwEebJkIkWgLV3rzbYVMSmRJ2oyQF9FiKYFLpdTlRP0M6LugQyiNJGJkmoZOpYdCeoPn7Mz6X8N293F0NSJVe1g0e1hM3+ST+Q3sx4BcQWJG5khTjDFAtUUhYd0QVCntPAvd/TKAl41Wo8CHwyfIAEYvvgjCN8DrpUlRkaAkP6tmfsS9LKHJa0+FYyq7KStCSh1WV4qgY1F7APqSMITSmos4ffIn7uXnbHT+P8CTvYs09H14IhAU1j2Lkn6BtsMc59FYrE5o0R7j7nzXvl8f0/eObiC2Y1qAi+ViCd+wheImEl4nMyB9Aofmj4RPyH02unwZ/JXr4KwHWWzD8RJeDTkKy5lRwKEjdezmcJ2QUs+DOpq0y8wdDugSUR+mI042RJRB0bFB/oStrT9Pa6PnaT0bwVuEOQ/LAF0eI0zuWqsJKctgvk8+RSSNWLguUt6FHVzFr3/nn9F/bQ0dR7JZFqnCHsLu30d6+eVHYqeY8F6q1MeST8AI8J74597ccAhnARmhKlxWFoFDxyXqivqeGQ1ZqZ8l6jPQZZWOGEom9Cilrqn0ncMgW7Nh76Ktb/wN2pQheSIYLdDw3Op4gGrvVZwc3ETtCrj8vGXUgSOBkiGGgMbmWIQFnZhhY22IvxNrvNEoblCLW9N/x06+8Q0yAOmjvnPv5/2Jf3+aH5HsR5dxmb9mX1Oij6eZH/ERwOgywF95/lT8bgRfOMrIWxGl7cKokwXfN03DDDRCxIiNR96sD0OPS3TIoetydG0J77rW7z+ta4MvpM1sTYrupkh/HUxzNDf/Z9vd/zb2T16nExJEBaI5qGRAtoW+dCEGC6mlKeewrACniKUmLM0wT4nuNnV6c9mmt69X2eE/v0aTa9co3H8jH9X9A3544t+XAXzj3k9d2oZdAXDxCuwlwAhkv/b8r/mbk5x/663/Z2NmtDLAh87phHfveciz/pZzo44v3EYGVJ3Y5a7ErAs0QxfdiFtZy4B1CbYBwlo2wLofYlg+bmvFFgZuaLlF4/651Cs2tCzOeNfrCSEg7v4W3n3ja/h+W2GqjLkRlolRA2iVNBFzggPEay4dLihTMuNpDHaSgCkZz8gwiw517mEhUTsTO7kxWR7duPWbk3/6+/+0Ba4oPjQTPLApiCt0+fJl3N8fWZ8ZHVdEFy4Axwuj9S7ZjRvApW3oyfXT69t9DvK3XrfOf+X+G7v2zX8yewWvpA/v2n98HlEDvLfaA8B1huZF53kpvRIFelLFgQgNMqX1lLDhE2+4YJvisdV53HYGz2GneIwG+bb2fEfZl1GcgJCxOO9QMqXjP6bDq/9vvNacYGyGGUSnxjxWsrk6LEm5jo6iUlJlKANJGeSJzRxFmCnniMnSrDUZuwaL4FvN8wyHRrN33rWwH/9xszb3zcmrX9cruGIAfkrLoz882/W+6B9M/Es58bJ9TzfnF7D9gDTfhpRm2UCoixHwK3+Ik2depdlP75p/Mjyyc4BLl0G/M3tT1vtD52zL91OvsKLtasj67GjkjNZS1E2nsuVj2spKPtv9tD3Zf57OZeetX/RUfDdmWWFEIsQELZi0PaLFd/8Z3rrzTdw0xRSEqYpOVOjEiCYQngaOlWapoYSYWFQY1qTaMnaxgqbcLEb2TazaGCSLZYumBdplnWsbjHpbiKGkpjO7pOd6sJPLa8CVK/efoj+hieWPFv3ezGiwBd7KwSczSJlNRTZZ5kbSLFk2OiXCDISywl6/pMIRP57gXA+bIZqPY9z57wIiYPZxf8Y+ggY4ffp//Tr42ac+xdySa21ZNCwdtNxzmoaOZISoW6y06VS3ysf4ye7T9sTgOZzpnE09v5Yyn0US54iM1SuizVHd/UPsvfOv6Xp1B/uWMIbnicEmKjox8pOINA1OFmJSBYQgzmJiMRKY8wUqAJSgUZsUCNEoD9xYME9RgeQrC58/oPTlfwojvGTAy/eF/qDgP6D4f/iRTAPwVYAvA9h6AfTGHFRvGV/dJxpsGT0o+ioNRfoLFyrvorB3yKXskmvUKEcQDiVlDGayXjlImxARVdxZEpqbO4j4zsd/Fejjbc+/FKerPr88M1dnR1mRbRSEpicu72eB1k3jpkTakoRtl2gzG+Gx839HP9990jY7m6l0ZRTnjBRiHpK4RrO4TifXfx3fm92iOyHIsRKdgHCSBJNgaSYO0ygyE0NVeVQs1Ehj0QwJWNy7ri4WXSBrYEFgHKHRKLVmyWWIN+bQ9YoSvgz98ZdAf/TRzGvX3vuM/7P9U8H/9adB/8pMtibg9l5Yk5bg5I07DhwSXFI4ksaDc58l+EUefBbJs8GZOJdVcHCQgrHWHek2ORRVw7fqGm/wGN9/rKLll19B+rgn+D1yI8CLAGEfFLfAWdgUdua5zgsFuqRxIJARma6T0ppzab27QRvleuqWa9GLNxZSpJZSoRJ1Zsu3/hm9dfhdebee0z4JjhR0lAjH5DE2STM4mS1aVMxNlShvzNCyTeKiP4j17Mi6+eYPBNAsjRoAXUdW9czmYxhmpNiGrldQfBn60suwlz+waIwMp4K/dhl0BTidsOL0eCb2AAC0PjOKY/Abm0QyNPnjJblRgkstiRuapApCDuzzRtqQs2ZwIHgOkpkiNyZftj4XSh5BCmnhnac897ZZrNuGKyxvl3I9zdPcVW4yP0D8Ru90pejjziNmgNMn4c6zoOnb4KxrQi08EzIxdBTUN9JhZjZyXtdHn9bHz75gnyq3Ui/rqVclcJU1POP2nd/hOwf/Vm8vj92+AUfm7CA6HCS2QyI5br1NTWRRE5aDEu0EeTsIFNoMcWqD5I6gT/U37erVe5d2CUBOWJ8ZHeQwNISdHdju67BLgF39Muyll0+XED/Ie7yfuv3SPmhnDgJAezOjCyA63jJCnyicgNdnxpoT9zbhmEy4RsZsmYvIKLfMFvCOghgcy1K4oSjeyEWCJ9OckTIkzRiSCSjniDzP0C+3dasYYagJqOd8tznQSWpt3zKbjzxs9yEJLh4xA5yuVa/fNF4rwfMElzMyylFog64o98RsCLNR2ZGNzuPYKs+Evt/UIs+JRH08et3Nbl3Bu+MbdELgsTmdRodjYzqIzu5CcGQBYyTMQajzQHVTIrS5RXSRDpbQLx+QHtxfG792LzK5fC8c6T8gjHMw/BPgMmBfBfAXP/lP5zfXLp+OchdxldfLizTfAvdycN0ccdXf5MGSeEYQxcL1pSMAvIQmd5Tl3qNAnTpepDBQkUX4wOyiKhMzMYPUII7hmDKfkuaskhEhY6NuZ8365VlsZyUKGGI6xK36wN6OS71ekzvJ3CwB/Z/Wx/sT55EzwGUAVyuiog8uonFSOGljnjtXoEaPDX1HPCx32u2N52w724pFt+spnUh747f5ePdf4E47wcIEIRIaOF4Y2SxxmprnKYJM277Nui2WtaBpHdpuB3G+JJ3vQ69tw/DK6YbQVx+8sJcB/IgJ4QcR/v3JK14AXQT4wgXw4e6G1CU4CxPZjENZyIZksnSp03GdBOeDy52FnBOVpFnJhA5F9MmkSwklmXUikHMkcQ7QBIhTMMAqEIOJV3KmmjnmfPsX8SR5dNiZmaKp39W96i7f0Yr32HgpUjflfBCv5rBr2w9HYaRHygAG4KV90GDLaNkSFR6sgPNwro1alMIlIrquRK//eNronoldn6mIZum1/5bu3v1faawLRAhgDDVKSiTJBFG9hGDaikdLCwpLzEJw/bbbQWxzpEtL6NVXYFfuVXt4+Sf3ruhFgK5cBn3lOjgD5HBsMs0goXvGd9LC5Wnolj3ymsxRLDNp21yUCoF0jNFxUbow9AAdOOa+dG0tzeE0oRCHnAWSDMQKVTNLOHUAEZgi2I84f+4f4VJ+3jrv/gEOlncwTXfpsN6V3VjZbSNMIrBIMbW1WNyZU8IrH+/Vn/s8UgZ4kDyCFOCiBKWQnDdyMPMMzgAtKBNpQ1RpEMeHqf3UP/Dr07exmFZoGSAQBBAhggfBa4TzmZOKwZZVZNqzQwDbS2h3CT093P6TTGB779zCyXXw3sy4OEcyHZqjCWWDFm7kkbWumzWGvNNaDkXhNBV15E4O6RJpj6L2QbFPoH4+wHrvXNwsN9J6OHaYv6uJIBn34VMNDXMKsZUIwCjCiGHljmU//3+hz46eQf+d37U74TZNmrfpbphglxp6R0H7KYVx0fGLsunVV1sk9E5HwA8+mf/oeGQNcEoNoDj9UgAEEFjZDSyPAVYd+pAPWy/9mFVja77wf6Un/uj/ZTen1ykZwQNWRqMOJ+o5tp6G1M1M5jHnyiW49drCoiK+cbrb+RMVPgDc28nm+VMmwxbOMvP5EvlAkCezvDJ0iojSG3VAVgLoWJBuh7VnUfsw6juVHhS9wZNxc/hcPDd8Utc7j9Eg66o/eT3NlgcFrMucWlh719rlbavjmEJYIj3xAgafuUzn4IEbv2fH+39Eh4t3aGEHuKMx3Va43eBwGODHeUB1coKwA6TdV6EPQ/gDPKIGWO+SjQOs8IWSQpkQNSGCqXX9yJ1npBPN6cl3dEpkXG4mh16T1U0efu7/xI9f+//YrcPXLBGotNMZXc0JlajUDDTZMgvLvAmFK9JiG3oJ0CuXYbjyVzHBnxL+vbPJ+0u4MiNfE3Iky31BZYzo+gZddugZoec09Z1ylxJ6BOtatB4reuLQzwfo55txsP2L4Vy5lko3lMx1U8ePxD32K64DqE3uWDs+QCqfZAwCkdYWtp4kf/ZZKqspwlu/o8eL72G8+A7fDSd4JyV7N8HdTB53Y07H67XNDzKqAYTdV5EepqJfj5QBCKdlOW/cANYfM00tJVMLxNIIsIxRlxjLUXXHjv0FdJvEfPTtbEGSbPv5MMi3q9xSES/+I37s+m/Cv/u7pqKUFIjkLCJp9MIRRtpfstXerAiwegG7eJvwNQBf/bHTmO+t5d87rINt8IV9sOQmR2PykS3zFRVZYWWy0JXG91QxMNGhJB5aq0NWGjBZz1R7pFw65cLn1h1+LmyuXwpr+ZZ2ym0rwpK1PUa7+L4fRxLufVp7Gxc023hM8o3HCMsTjSd3KfTXuOxvk5vuW7jxB3Yy/Q7t1d+j/XaCd6F0E0Q32cc9M3e0RZiOGTX2Hj7xA4+YAQDg2jbsIqDSkiabpQy9tkGo2HihTJMEOlq8g5swOGrRXQZ0sr4r9tTkzM8ms63KlZ0iu/D3+Gy5Qf6t37CbTklTZCOFGRRsiU2ZoCBNRFkLeua84eolwuUrhq/hg5Y4eW+Cu7N3OsGVsUm1Ta6u51mXezl1UVStdcWon4GHMIx8wjorjxi2xqAhqfU5UQfEpall5RrKwafa/rkvxy0/VK8JaI44Hv9JNpv+iczrEwqaSF1X8E4Jy7dVzv+qbg2fpu65p5Gl2tL+davvfgv7k2/z7vxt3EHCHZDtQugmEd1W5w5SxOTmDPXBAYVr16BXHjLxA4+gAS5ege08D5s/ZWm92w/zxhqurUIuEzPKY2M5oLndZsodzlGBgKnBbnrcmUpa/0Lq6U6Q4RnOz3xRNooh+bf+O74RFiTmIBpJlMSrJd+FODVw3QP7FnxpH8tLF9FeuQTYFbsXB/8wQby3rPnlF0DfmZ0e0Zw+Zq6YUKZmuTS+bHKUvkavUAy8pTVANizopku0DsMaK4ak6IuiY2a5zy3r7Vi+/ovtYHQpdYtRdIs9V0/+2M+P/8hPqgOqY4sGhhZKbajQtIx2sS9x8q68VYyS3/w53USSsPst3k/7GIcWcxgmUDuIYneM451U6cGCsvFsgWo5RnvtGtIVPJwlXR6WucoHxmB05TJ4b2ZO+uRrNyuKxnUdy4DNjwjYMtVzPtEOJT3DwmeEbJAPsJb1rNN/3HrlRsrXn05u9Gkulvto0rGr3/h1ulXd5MMUMLaIQ4DuAHrHiPdarfbZyiNymLoJ1bfuWvv4gBIu3S94BZyK4/11iE4ePKLp4evKip6giBy6Xn1HlQbO4kgjrQtj07W0RYYNSlhn2JASeqRW+A4Vxbpmm5+PxdoX27L/BLt6onH6Xb/Y/wM3Xr4t82ZKCwNqYizVsGTBQg0VDJU5DWYciGH5UH07kQoJLaAtkywT2rkSH4nJcSs4mdtimi261WIf7fFblF4G0sMofuARHAEIwIsXYXu/QfqlCjGVbZt6oEILtA6GFOEjIQmSg7Sm1qJD54snbcRC2kypbieow4SzUKW08Rw6FQX+3P/OPfXGf01ufh2ZCeUULQ9GOau6gktnSi6xuaZns80Rqmll7eQW4pWLlP7NFvQbrxguAfZfnp5TAADePQe3U8KXZtksUNktqBMjuhx5QEhDSW5koE1ntCkJW6TYcmprpBjArINARbmG/Mxfb8q1L4Ss97hJ2Xe0vEPt5DuyOP6OP5m9wcdxSTMSzECYKnRijGnLNDfGkoBaTYOJJjGf6pmYCUWVGGFoNaJxjhYWdV45N6vUllnZrW698U74xoUL6ZW3Hl7xA4/gCHDKA+eAn7rl3Lzj0VvP+4Jiltp+HnnIoA1S2vKGsyDazkqcZ8OGy2xYjGzoeuSKXsy6j2lZno2u3GDnQh5v/Bb2T/6A9s1oYoQji7iDaLdj5F3x2JdEJzPYvKtYHDKFtTnCcN1ifwZ9PSfDBaD9LljOm0xq+Gy9KnxdlnDomMaBAw3JZI2gGxZoU6CbLvGmqW2yYiQJfUnosLMsH1A2+nzw5/9m4/tPsiCynbyp9eHv+/Hxd91xc0QnKdLYDCcmOALRsTJOkug8pbhwTupWEZQQXQYlFTWFmcQEIJH6oGotGHUV6rrfLZpqRs18bu3vTynhIQ597vOIGgD4YZUgLFheFsgra3ueeCANrYFoSyK2SOkMJWw7xUbWt61sHUPfsdz3tVNmkP7TbTb6tPZcVqS9b/Lx7m/TnTSlYxiOTXEnBdol4G6M6UjFjYtos7ZAJUT1sVjoKNI2Id6aAlkX1Hbg1ChH1nQkZj34NIRhREoblrApoE0CNrm1TTasuWQjKHp5hjLrW5afU7/+M0G2fkmld1Zo/i7Szf9eZiffdZM4o3Go6TgxjkE4AOFAhQ4T6wnEpi2wTLAG7AJJVI0wYZixNx8AElMzpKULmiULQnmTm7UHLULRp3Z0y9prU0rXLj385RwfYQMADx6NXC9NCkeCEp5rKyxHJxj6RRPXEtN6xm7LUjojRlsIaVsyXis3sFVu2ZDNxOdwg0+33cGnNRtuZe7kezz//j/jW+0JHVnAsUUcRMU+JzpQxQkTptHR3JJVzqhx3poqR6xBCTlgbD5LKIJR3zQOhWgdwIYabbmATRNsSmsbrBgJ0EeiTjFKna3Ph3z9F4LrXzAuRxlSYzi+qvHWP8/m47dlog2dwNMxgANzuGtG+8HFQ4BPEttMWSoShNZiih5gOdUAKyhPzgAgREAzWJEomiGpWauGtnCobY62GlGzex0BFeLDboJH3ADA+0ohAjKw013VpJR7sbIi9AqJA4204UQ2TLHlo22rYiMDNrtP2mPSR09a85SbG+3EontBy61nyM9uS/POb8neco+OkWiaGhxa0pPU0HFqcULEM1NdOseVArUKGmUEzWBq0YGoTIyBJVkT1k1T26LEm0TYQLQ1AYaI1vPOOuUWiu1fbPKtL0UZPu6p6GR0/FbQN69QU73p6uUhz4wxSaAjI+yrwx0lupsQj8i7cSQs1KXG7u1TsIICg0kgSBDPICMwWoFyIlYYBaiYtOAUiKXODcslsPQZ5rOW6sUta5+MFK48xCb4BBgAeHDZ8T97AfSd0mRtE+5gf5pnxaAoMnTqhIEAowy6YaabLmGTE2148GZnA2f9lq2JWC/PLc82Up71jc99QfuaWG983R2GGS9TjVkmaVkd0WF7RIftjE80pgWTWyaKDcyq6KTxxDF4dUqpJPI9VVpj0g0YNslsAwlrMBtwRDcvrRx8KpVnvxT99l+DDM7mtDxKdvM3NO5908Xq0NUarUqwmTEdq6ODKNgHYx9sR8HSTAXLjH1oKSknR0mSCPg0xY/go8EBEEdgAhOSgokNCUkVkaENGypiniXGWBMmWmC6mGNZH6CeRwrXLl1JV65cfuhM8AkxwH0eqBaxDb5oJmOijGsrDE0nlnnXRwxNsSaEdQq6mSVaN8V6nmO7WLOtcse2OCPnnPn1z6X+2UvoaIDe/F2aLPa5Rk1VquISoEV9h07qAznWFtW9Jcg6kTUsp7NMdZYZrGeGoRDWUsIawUaeMGBnvXJgnY2fjcUTfzdlwycztgjs/mHQm/8/l+Y3JIUlBWI00WwJoUl0OCamQxUcgnGisJkBjREiAaYJzAyBwTOQqZEnICfAgdSbMmUMRg7JCxWLiBrQxAXPLNnSCBMCjlqzA2U9jFk64bad69GwfhUI51Y7wR93yF6GwV5B+upl2M7bZNlzsNRAl1mujhA1p4hkLSLVyqiUeI42LWJN88VtmsQF5q5Az/VdFwXUfKKzz3LxzN+zjcPvhXp8g5expgFZDPmQ1qVD680+T9splkhoXUERoilFJA4QZeSk6BljkGc24sz63Q0drH8+9s79spbdLeZi6Gi2G+zd/5HSnd/NUnOX1QIUBE0wJQc1hhmB9DR7tasKMFHJinj/zTPBUYQzQyaGjICcgRwE7z17K6Mrh+y752M5+KyuWUIId2S8/x3ba+7KIRRTYuoWgAcLUoLWxSDiaaQv7UO7l6F25eE4B3CfT5gBAIBOP6ArphcB2wNwrkfY2obVydKwslRnTVTj1pmvotoCjDlSmjnjaXtMkwCM2OmovUvz+WtufHJJN848z2tnLkm5dVHL8bttG5fJYiWj8nyzNntbJtM3/dQqamTLHJVAUVEbZkgWwapaZH3qDp4O6/2nrX/286lXnGEXNSFqxOHbojf+Wx+O/1g0zVhhsCgwJrtfc4eUzDOoY8nMlLwT9FgRzGD3spOEDUIZMhFk5i33DiUM3vU0y9Y075zTvH8uZDwgKZ7QjsvAaW6teh4d/Bu5GWY4ASw3NklIxuYjGrRZDu1uI129Cr0KGB6iHgefQAPc53Q0ePFVJLwASzMz3YQlosQxj+yoDampSbIlO55RzZMgOvRmJ4hYo5bWwzGNU8Bmt+Xs6E3ioGxP/Cz1z1wsXWqT1VWrzROx7F1Ab/AZ2qimHKULQWmUF0apCpFrUjh1nU0u1j6rPd9jF1JCSA1RRiQoLO949D/LQAaM/wQWG5jMoQbAGIQER4YCApDCM1mpCZEzKBHgMgAClgxO1lDmG9btnNEyH2mRZUny9egtsVkJ7q+LcCk0PxalbnD5WpTeuWxr2rM2TcmbwbMSyHxQRuWAylo0IaK5sIV44wWwvfLwVLd+WK7zp8ifXSWKLdxjidyyb1lbIfMtSlDo9OE7mtDniJEC616xAbP1fIQzBozcjm2t/Syd7TyN4fbTVnTXzDlnaOZR66q1OLdkCsRAmhXGAYzcG+UDZl+wRA0Uo8KgYBbSKFaUXcRIIAViBTt4A2n8JtL429qGE0scWGPUGCsKRIgkSJQhUUbJ9407T1Hmh/CubyIlRJy67rlYFMPopGDudJglA6Z3k073RA+/4at8QPSpv0tFyGuhTsPT21l7999kk/EfyEE7xrER3U3Qd5zIW5VL1wXybuzT8WIfcz9H8zBlha4MAOAHq0SXwRcf6BozbOFkQlJllmUlHCUqymhl1NgjuGFmGMWITUe6wUbr5LEuOTZoaMPOeVofvWDnuiP1XpGca9hUBU4t70CoME6O2HsidkQpJSJKECcUEywFRtuIGRXIMyKXnV5pamCIitndlEJtFm9rXN7hMPmO1Lqk5M+C8zNgcmTFEOh+xgrrmHei4Dxy2TFxHZIiI5Cdru8c/hGad3/b2uUhW3NX1Brgyb9r+Wf/D9ZpqabJGDr7XhH2v8Hj5es4jEvaN8YtI3ozir6xJH1HM38HJSb1zOpv9ik+LMuin+AQ6EHemxe8CNC5y2RX90HTbaRBY6IZQmghUSd1mQ8WZn4mLSYV2Vg8xlA+UsW6RWzEYEc0oVG7h0HzNu1RhztuAz2fFy4dR+0+FvtbfyMN/QBesiSaMcVAyl0VCIkKERGT8wZQBHGNwouBQQpQCg18h9HdSU4b0liy5WeVh59OjjIi8krcAXXXmcu+46ptkczACkPNqTdwlILq0U2Ek6vUzK5R/fSvSO/M58E3/iVqbQzE4L3fRtP/bJTHfzkrMEq83AQ6n7YSBW0u/gShnWNuLq3BZOhYOiFZYRUtz/bQXtw/Vf7D8HRdGeB9nM4LcAV2Wh0ZdvkypafXwNe/CVpsnXDcHkh9B7VzVlGOhU80bZow8UwniejYE69pqyMyGi330SdQl/YwEEe5Ju/ases0h1b6UczK86l79gt+pC2rIOS+m7w1oBTUgjHNZpkJiU6OUlv0ouuekzxDTu00Wj2TpHPSdsyRGigyY99RByF4x1rmRNN3Q1Xv25KcmarZ4pYs0lK0OkCq972GCVk4gb3dWPXEv0ejz/+nKN/9PWp2v2ltSCT7v0fN4EJygyfYbT2hWZoKfM9EK6zrNZqEwAOIDvLIXcuQj4P5MCPZmSO+BNDDMBl+GEz6kfHii8YvAXjpXomHa/cqM6xVoJOn4VDDl2R5lVPRWTa95LinoGGeMBCSgSEOzFwfKXWZuDRDhxm5IbksEy8D62Tn0aeaNO9Ylq8j8yP4cmiZ30Kn2KaORUJ9Yk0GoJ1DXWbih5Qhmt38bRw3xxTjBNpMLJEnOv9L6HfOwN38n7AfFrZU0tB/0rzvmZvu8nJ52zUawNaaS0oMgcBMqAP/+Jew+eSvYLOZgW78Bqp2mXj7l2Pn8b9lvawkNFOX3v5NquZv83x+De+Git4KYq+B8b2QyXWUdkdyzN5qqX5Y2r6uDPCBea/+5kv384tumxSfJVmr4eu+5VWgohOsTEY9z9YjSz1AupzQVdIOGUoocmLKofDKmvkOF2kJZwGOAWd0LzcnA1EHLAWkXSClBVCOUGY95OU2Ov0zloOAfIBifguLd79Jh0/9XTvbWYN//dfpRjtDRYSGGA13NJGDaeQUazAIngGXAAeGGJIQiVdCUQ5t9NTfxBNnP08bk9ct7n47xSf+wzDaeJZ8uyDb+z2u9/5HOamu074avWMZXgtiryWvby3F71nEpJyj6m4jPAzNv1cG+Evx3sGWL78APjgA1+fNVyNyKVruKmRO2pITlV59ETmWECrEUJBSpkg5q3gj5KyasTlv0BwKZ0YCAjEDMFg0JWEmIzgYBFAhY1PAiO4dwleAAfSfQnexq7PYoCVIo6atOTRsaI2hMBAEggifGJ5YHchxougNlLNwFwkjGDbWz9q5z/3H9ETvPDp1iGLrrcs80eIdjXe+ns0Of8/diYHeUcb3orNr8PpmVHd7VszGWZxXu7Od9qWHoDjuygB/Jd4rTrv3POTSlnHhSOqhudECviJkrkGmWZtnKfMUkJlEz845iikLIXph52HwrMk7cmLKbAwmVkJiBAMxgSEQUYhByQCDQYmgSQEwwAZThYpw4qQxIEYvWaOEAFBKbEqWKEHEA04luRDhyDlJsMw5lAk6ZNAGB5zlaGecYvPxv4FzP/NrdG7RJmrqCJ0mq+9Q+84/zXfnt/j7SfGaZXStofRmKGW3cvOTou4vsPdq2H31+fRx73m8mgT/lbi3enRvQ+34RUr4BtJ6RCp6CCVRs1C4FHNnClf1TLw6RyBJlJyngsnMZQESWKUiFufApCA1JvIgKDGxsRGxshHAsESmmRkb1CiaJGdCMKfQNkWLmUsS8xjMojmkkEzhgaSOWBuKIRNSEfHkagmOPbKgrivEM5gGYxJjypFQ3P59O8me1P5T/z71Xd/RIgbAMd1Po4YokopRJgQAm75vaXKHKjz/0X0sPwYrA/xEoNOqcC8bvQjo8Yukx98A7zyLmL2OiD54f2xSKMjWSXxrZG3OlTfWhnjYNZq3kSVFQiwJJaACDokoE3ClIElGJmDHMMdm1RymQubImVeyWVGDs0Jp5pQ9dEbQKLB+gCZPdr9RUcgzHgloSZBWjE29i2R5Quh2zbdqzI6Rs1rPgD4Ug9kbtGx+Ed3+WbiUhMZjJMpg4pBCQgJDAaQUWpuXOZDrA2HPx7vp98oAP1Heb4TdLwOXTqA39kE7zxGtnYCu3gZf3AKNAXosEG4uwJMFoRiWBDktMbdoQOci0aI7JqQRFhU465w+cXMFGoZJD8gDdAzCqAB4UVinMXsLwFZOihx4uiLdc8CoMAOAcU0kgRAbI5TgxTGJWzNBi5Yyn2qKlKvLLVCfKM2UuZKAZnHdqt1Xqfns34PLc0G1TyEGRBVEiwgGjWacKDOdYQYqzlnvgXvyEXwQH5iVAX4qvGcE4HRPYfcV4OuXQZe3ka7uEwHAZ3DaNuCNOSjNTyOK3epU6OcAdDHC3hNG04boQnP6ynoBcDdOv74BYL00m74FnMvIAMIlAFdwFWvlJTvo3evcOHtvqrc3Bz3/PGHtBCQXwIslucbMOgDBNEOKS4NbKNGSkRoFx3iIsPy+ttUEZW/TsWlK8ZgWtkQtzjVGFpQQzZDOUT+1XdiN3qo47op7T7/TvBgjXDntGfBnWhn9EH7QV+MS0bkHy+0vAWzf+97p/4HLb8FeuvftawBdxKUfKr5Ll0GXtmFXXwdhDtRbZmsJljqkqTRLlCsikiDdOxQvUQjKpSEbqiznaus7BWVdmNaowKgMqdFkDUGDekvzfWjtzC5tk10GfoJVsn86rAzwofFeKPCA6v+UUN9Lpf+BSa68BOClP/tyL+J+z4EfmOU+l36YsS4/0D7pWVB907hNd101Ouuq2vLcKMuaNnecFUbwRGCDkoKtPGdu+Lng4RipVXORm1hhnoAK4IVDqsmhbeoiWkAqnia9eu5P9Uf4mLIywAfkp9vt/D3h3y+Q+9K9P1/CpfeL+fK9368BX38efO6BUGNnDtoBcIL3QilcOh0pHmyfNH0bnG1DthdnfGgsX8/Rsarta+IhkQ2RMBCjPhXU6W1pb/hzqVueY98pBfUEYXkLE1MszGGWKCxhvIzwTddTgIfuvn7a+ebjHv8DKwN8YO6L/ydnhAcb3F2hy7j8gyc0Dq7yJVzCXvsmXQ2XCReAC/f/2T5w3Jwa5tw5oh0A08Zo3hKV62bTlmh7G5B7P7OYgfYAaE583DO2mnjTwy3nlU+xKLKADht6pH6ohiFFXSfiDWIbDc7Z1ui5dnPjOep11jzd/RYtts7D3v1d3CbChEATgUyT54UQNZMZ4hinzf5efkgaZKw2wj50jC4DfPkycHIdXE+Mj88TXQDQ9nd52jCV7VlKpXHRPy28e1wZDwAMANQJhD4Qa3CTQL4ANYmoC6DJjXJH1kSjLoB5WzFKQHKQtR2m2sR5OG0WeYleDrIeGgyM0GfFQBlD4zSUjLfzvm2vPavnP/+P9Fkrkd38Bs32fksOyi6WR1fpOgneac2+D2ffJ5F3FxkOh1NanPzgPMDHewPsPqsR4EPF6GsAnzwPXnQg5bpJZwuyKZBjb9ypz/GoABc943kLjq2xgqSfg1iJKm+kAawKFiXqi3FqQcLGBqBXA212+uBNCsrgyFrPeQ1KFhwbHCllSYuS2Lrcoq+KPrEOQNYT444ROr6b1rs7vPYz/3t8xg9Q3PqWze78C9mvb2IyNzoRhxMlOhKy4wCbVBmW3RNqF7cQv/7O/SrRDwcrA3xonIoflyHTsfnuIWU9wFdAVrB5F+Cia8VRxtaCu4CYwVM0iYAIg6UFh0ScsbETk4aSeBMyAkcAjSSiKFoQTA3k1DMDnBLEw5wF8UrIS9au72KU2LpoUCJSqUIFFciLM9zbeM7OXPqP8LmUI7v9vbQ4/KPsqN6jCUBzEYwNOFLTQzg7RnJTwmJ5Ir3gN5G+9s7HPwHuQVYG+FA4DXtOngejghsRcptbhxhdDyopWtET+CTiDOAIODU4l9qMKHdm5iSYA1Q8QayFM2KRSI4MxKSnxU5aMjhVJlhKgGMmNBAPiEE8DFnep26xKeubz9mFzpYNj67RfLmPdvQ5W1v/jG0Mn8ZaPkTZqPL4bZ0d/4k/nn2PDgGaKmFMhrvKdAdKd5XikTLNHfcaB8TuQ9Qa6T4rA3xYXAZ2vwXZWYMnoOgZ+pphlJsNo6LLprk06uFFkpJzYp7VZUrJ58oZ1DwTOUSIMYRhDkpezNjIWMDKmULBCaop86y6NJMCXgieM8o3ftbOnv0V/dTmZ+iclHD1FM3okkbHQFsniwZMp0iY0nx2JEEnvFzepuM4odOy8IxDM7udwLchYb9O/mQNtjhI1O4C8eWHsFDuygAfAgbgG/ugb/wMuKjMNYw8+thzwY1YsAHDkBI6gBQpmfOUPCJ7wJwjzgATIi7I1BPBLMIRwRPgmODIM7s+WAbMXIKYOcQGCTVifgbdYst6T/8qnupdwBBK0IXG5a7OZ3dpMX2LTo6u2rhd+FqBQIbYNkhMRlRzSAEhTTGF6Jghd1VolzXstXl1BHOzeTptj4RXHz7xAysDfKjsAHAlkUVjmBO4lMUgXTbqE1EfhB4bchg7GISEc2Fk+QZ6xUbqF31k99btXDFCzh6+s4ncrSNPDuAOKOuQUwEdvGPTXAjDHe331pFXY6tm38dxdUCLg2/x7vgNmQSz2Ey11uCaxKfiN0ZkQyKjiIRAsJoEMyI5icChWTxYenc8mPUnoxLLjWNqn38ViR6SVZ8/zcoAHxLfAPD8HhBHZurg2CHnKB0jdAw6fPJv4nPbn7MnyFOuMMcgZwIZPImBz+CNiMxwmvDjwZYAtXsxBwHRQGRQS0hFF7J+jspQWzO7g/nNb+Lm+Nu4Xt/GPE5RtzOrAUpRKLJIiKSRmEIiCQaLII2c0CZOTZb8QhmzBEwpYozCTTsLWjSlVTeeovZv/uuHV/zAygAfGl8G8MYafFbQljS2Y6znk+MNVh2AqTy4imr/Ku2ZoXAFcvbmaYS8XKOa2Ix6KKDEvoB3PVCYmfXXQWvPUCd5SGo4sqXWO0KzRLj9mt08+RPaq+7SQZhj2dylE6g2SkhwCEYUjTW1nJJoFqJL0dSiE0SAWzK0CmsCUIUQFnmRLU4Ey65H3dmyZv42xd2HXPzAaiPsQ8LoP/kH1vvlGiNk2PKGxxj6hBPbAWPIhA5n3CePAgYSAAkQMjAcJCvMp5YiAhL49OQXIlo2mAlSuQX3zN/DY83MFsdv0v5sD+P6Nu6GOY2j6kITFp7RxMitSYrsJAZqDZIlJUTipBGSOCIakCRSLLw1c2kDXFZbQI0GITc0m4L4b3+LEgB9WDa7/jxWI8BPFwYu0/PnkP9CH70U0csJo8wjS5FnSfQ2GR8iaRkqczynQtt7/9CQwZCBIY2R2P3NJVMz49OoR6BsaOsTxNfGeG12R07MrBFDBdW5OZ6zcWUc6xau4SwGmE8aLVGRWUjQNmvhsywFhZqjpLCULS3VEYkoD2uCUHcsnhwifqqi9I9fgT3sbZEeZDUC/OQhAAZcFgD4tefX2FVfyf+36/+wvL2Boi1QWoO0DGS90jgtqedyKzQgF6CDgJIVHSLqGCyH3hsJ+PTFFQoiViWomZoDx6SIIArerFFBA8VcjZZIqJSsMoe2dXUIVESKUFmDYnH6egsAmYMNC9LjfTMpSKWBhoC0tWXpzhx69YD03N9Heunl+1l7j4b4gZUBPizoeZj7+xdBly4BVzvgiwujdg4/DvCjAbKGkHlFBzUKB+rCULCaNwaTgRIACGCajEksEIwUaposN0kKRCdoyailYHXMUbOgPmoRPCGqUlpbQ6rz09Nhd+8CZ+5d3F0A85xsUJhND8gubUNPrsN2ezB8GYqX759peHSEf5+VAf5K3E9j/qDCeK8Q79evgy9tGR87ksfZpO2R8zPLLMArkOdKPicTjWBkAFpAGeYKWNsGJPLWiTBlsphME8FIKITaYrGONl8gzuYIaZ1SNoPeOIDulLBXAfzpFOoH/+7S9umhnYtXYC/hRz/xf7rp4R8eKwN8YP5UYawfwksPJvb/SFO8lwZ96TLo6j4I2+AL+2B53IQOITwnwQiSmjk3qUvoAl0ACyyQu65hDgQ5FWx0ZEVlVghsWZKmA0tpnVIdLRUHpGtPQ69cAb4G/JkJ64Pv4/3X/udd/6PFygB/IX9WsDtz0O7T7793O/dChkvbsKt/wdPz/usCpwdgrl0GXcZpevTzAPa3jF8bg/EY8BhOD7MDwOjTZu/eAvDu6St84VmyP1oYrR+QTcvT0ObqAelXXoUCV/BVXL4n+k+GmP8yrAzwQ3lPnA8+pddnRrEH1gm4HNH77l01NuMh1M2hxQHpjxc/vze6AKfN/C4/+O3LwH+5D/o/b5/+yJV7f33xIuzay6fmuYzTc8Ev/+BlVqL/IKwM8D7e/7Q/uQ6ut4xjDxzbI/dUvskTM2FAtAG74tQEsTZb5lCfUQxkaW0fKe1QurGEYh+KV6Av/YUjwg+/nj//+yuR/1VZGQDAjxJ+4Ug60dy4gCe/9LHiLMtKl7RxRQ6xSJzIjD2U5xYbb8FiEbIutYgIZW4x3aLUzpHWnoZevQJ7VFdTHlY+4Qb44cJvE9xgRA4VvBaWmzZ5zlRYSzmYCjB8ipQZCxslo4RIXppWQt3xVjeV1SnL62w+b+thry0mFOto6biihFegKxN8fPiEGuA94eMF8M4c9KDwnVmWEnKKKDxCpwV1vFHXIB2Idtg4t4QcBCFSNZa25VSL2MwCFqmUuUUsa6Gl10XNvttoQDjYR9ybI528Cn2UdlMfZj5hBni/8HEAxhYYgNvZhriZZalEnqgtJVFXEvUkUR9EfTEM1NBjQseIChgKNkgSqDEaI5u3gikJJjCbwMmkVZpJahatZRX3UJUTtJMMsfc2xa+fLk+uTPAR8wkywHubUCfXwbs9SC8zcR3y3Jgv7wm/SNRNgQYC6gvRyAxDSRgCNICiZ4TSe5RwKC2Y00DBHJrEWChjbELHKnoCJ0eWbBwRJ2h1npwuKiuqrIM6Ngi9dYpfP1mZ4KPmE2KAU/HjBfB6aVI4kpMSfq2Cr70VIijKCl1ycWCtDoXciIF1p7xmakNSDAzoSYGeL9E9+4u6TRmK6XXU0+u0CEvUyrQkxqR1GBPjMLEdqeNDWDo2dmNv7WTe6LxEXC4H3So2CKuR4KPnE5ANanT5MnjnOji7AEkn8BVbNjQUdRdFP6ETAvqENHLRrRFhnZNtsGKdko2I0Degm69Zv/9ZjJ7897AtA+Shjti6pLb7b9xRdcTNyU3MLKJ0kTrEKFiojKplVCpFYp7AzjuwicPaEnZSAdlzsIs3TovnvvxTayj38S5P/lHziI8Ap+K/CAgquJ0SPmBRCncLb9ZDiz4zBtRgTVQ3JPEGa9qE8RonDEHo+y56+Xnrnf0S1rYvoQwhUssmqTYMNyC+w0Qtx+aY2v3v0vj4TUwmN+hwMceRMY7BOFCi/eDoLisOWmfHuWEybmlRlKjTzMK5PsW/ej+tD5aqAdz/5soUwCNtgPfE/8zY/AEh7wxQeqDHCQNEjBi65gzrpthwLW2wYoMUa2AMszUbdjbQ7TxH/XO/ZH1fmhAlFU8U5hz0hGsLarG0rLdBmc+M2UjrOcJyn+rpHYznt3Bw/Da9M93HO0lsLwnvKmgfJQ5lYVMhWna8NeO3Kf7lu6v/8FQN4IH6oAB2ynvZnQCubcMu/mBPAvgkm+ERNcD7xd88gbw9RDdnDJHiuktug4BN1riV5bKlEWu0xIgChr6w4eDztPHEf4CN7sgc5aA6RTQTi7M35Hj+Nh+N36SD9g5mUiArz9owG6IzOG/D/jNpOHyMMp1zqhu0yxM0WUELSphOD+iN6V2+9tYfx++Y2l2X3HGVYy5E1TbQXvmx24qezmuuXQZd3AfhALz+xJ+fqjHPyS5sQLtL6NV96P28pU+yER5BA9wX/1V5ZnzRN08gX9yteyMqRmbYEtOzSDgnRmecYNt34qY10ielHnvrrf08hp/6hzTyQ5OmVZvdjSFOuZndlIOj3+Y32iPsx0aniTkwg6JpwWo99jKQDP3uOV3vndfB4NNUDDaRNVOqb/xrfn34NJbdxzD+1n+jv+FIdmvfHpWUT6aZLY8dtbiB+Bd3VfyzOUqXtsG3zGSrAJ8YJDZT1/NDruYmw3upGgsAHE27hqRGad8suQzR3Tvs8pX37VIDnyQjPGIGOH0q7jwP2T0HP2gnxVo56LJiTWM645TOi/LjZHaeDGd8xzYHT6Qt6VJHznJ3+4vobn0KHgKa7cV2ct2WB/+ze7u5w3fbgLvhBLvk6SRB59GlQOTJWAso+gQaAhiwpiGL9LvnbV0GWnaG5JrdNJ0v3ZHW9G4d6WoAvWlmd5DjeFbRUr010wMKP3yX+D3RA6dNLrb2QQf3hJ8TSWjh2JtnB1+28DXDe09OgzEAZAAMSAtB7AbEWKKdT+bhzLDXLu/tUn9SjfAIrQK9t9SZXYDsLOG18KUmDCmlrVPx0wVRexIRO1nHttY/p9vrX2pHGDm39Qz5smc0P9S096rMTn7X7bf7OFju0i0Q7hjRHpHuBwtjK2Vu8JEkURNQOJGuMYaSMAD7kaoOZreoBElZd1OP+9TNi5Sp0KYL8kzdwlUgVNHqPKKq/OnBlN0H3ssPJrMvApeunR6gOfc06Oo+eKcPlsak7JFDZT4DchFkMaCoSuRZjAUCPKv3ykZtAjwh9iIFDaGK5OpB0Vs2CQ2AtuiPw/NuLezNLO09T/q1Hxjhp7Uy9fHhkRkBDEZXLoP3ZubqDFk3p25hNkQbz+SRn+DAT4na01A8nmU4s/YzcXv7b4fh2meR9QYCJqY732nrG//ffH/2Lp+EGR2Q4q4R9mKy23DYTWz7xG5spVW1IZm0nEnmCSiDpT6i9MkwEEUfpF0CchhYYZLnXLDTgj0IhImp7C4VN+oW358I7Zczq8/1KV65AuAycPHBcwcd8M4ROJRgD0gbzJEn74HMO8tbQqERXRfQUUpdYepwQp4UngjiAhsJoioaEBZCtAgaFlzYvI26dEVe+RrNuItwPKG4/kNHhEfTCI+IAe6FPr8GwS584axsHAYU45YzetzV9DQrfVoUFzK2nfUvxDM7f7sebnyeXL/foflJrQd/EtuDbxWz/d/x+6HCMTHtw3A7wd5Vwi2w7pG4w7rAtCjRGlGqg1HI4VyFrGUUnND1Rh2l2INJh4EcCaJQsKBVcGQHc0AmgJBPTUhyUDV0c+ntbm+dIgCsnYCu3hP9mA9llG9yG8ylBJfncKFBlvcozyKKOoWuwfVyS30j15OU+kroWqJSGJ4MIsqWTCOZtWCec9JpyjFVs4kmm3Jh81p10be8GhvapaJ1GeLjROnq+9K5Hz0TPBIhkAF46QXw7uuQ0QhZ7lA4oCfs1qjRbQbtsOKsZLY9ejZtPfZ36uHWz4nPC4961treb1v97r8uF/NbMk9LRBDFRGiVUIOxMLJ5EreIJVUarB3ztM3mg3gEwIh4g63RJTVaWG2FzbSVaUYoUog5EzmCIAlii9hG5ypfI7ADURDJeOml7HTLBv3ybVvcBTAuwTsgbp25vCgcNeZz1/g8z31KIYf4kpexk1i6BVyfIg0iyZBV+wANHGkXSgVHOCmRIWoSQgJpy2K1Jj7R1sZiNDZHxxxtnCtNkLUzJ/lynayaRoR9oL0AxPZ5pCtPQ+2KPVSlzz8Ij4ABjF7CabgwXTfZ7pCbKYqsRj+qrmfgTU225cw2fA+j/pd4kF1QV1dmQh4Hr2k6fjvT6tiZtkYmcEbmTMgZ4JKDEMMRQwgm1K3EtwO61Qf1CAkwbRpKac3iYoEwiORjg0a6tSctfE0mhYAiAGo1OUJojWKZW6NLpBk6lge40hGHoXVGQ6TFYuHrhn3p2Mfos6YMWRalaCKKaNzxSF1v0gtRB+UGbT/5C/bZN/8VxmzoSY4B59rNMsqz0vLOmZBrC+2dE7fYtVkzc7P5Hk4o0UmETrJAo6R2bI6OqkZOnGBiOWZFQFV4k+ljaIrJXryKnYjLwItXzB6Fglj3eQQMAFy7DFqfGWcbkNnSfGQUIPQKxgDR1ogwSsAgX7NOeS44JkNOJU6umx2+5VQ22Hef0051la2ZmqVErSUM2WGuyeZQWkZJbWIzs5KC1LLeFPUgUNg3S8hh0pJuq7WzFsk5CzXlLrG5HpGEBhx9TckKI4Iym4YEIkcsWADoYC7GWaozmhTSEe9VsrxxMc8SCl5Sx4uUidAtIvWR0Ifa4Okv0NPnv8if3f9uWmSCjWxkg81ndNR9IvR7j1edzlbKuASnJSWfeXVe6PjtNHv7f+Cbk9e565VHyhhYpKFX6geHvsV4BLMxnJs0Gc0HLeSO7TS98R3akxnhhU+nF18xPComeOgNYABe2gfFLXBrJIWDZ4SCkys1oStAlw0d37Gy82kqpW+c5Y5cASRUtv2z5OqFM9fP2PeUF2/ALW+DEAAzMiG2RIBjiDNkdR3zgotpyDCvO1YXS7SzJWJnZGmRAU0Lq/1Ue8tBJAcNgFhpbE3OWWHklChQLcHIWQJnLKwCyQGXqHAw5Kx5JimWrqVShDpG6FFEz0H7FKnfG2Lzwq/as1mJwZv/PM21xWDtQupvf6EdrX227fl1deTAqSYNlUtIhpQ1mQpj9Ck/eu4/yTon37Wzu7/De+PvowfYwIz7DPSTQ48gHVIUqbGsziAZKsHwDLWTM7i0DcNlmF0xehTCoYfeAMC9wrM1URunnHjglJwzDRlxlqWkGZM57oDLp8wRMy0rASjBbzKLKaRoLe9Hai54WTwpbvIq3PyGuHbKLoG8AEVS6sRG+3nG/QQcZTXGSJgt0VQbo7xu22VM1knOw/o2xGFhUjbgTIw5kZCYtKkRkpyTsSuFJApEW8p8jJmq846Rc0qlEpWsUjK0i6B9gfTZrEeiw3Ofl8d2vojzh99FuPU9xGIrndn+pbC2/qmmzNbVSX5aQ66dI41fLRbTt7lqD6Q5+++2/eJsyrHeenRC1n2mHD1zFt35O3Tm5r/kW0GwFpcYhUD9yNp1XkpCzGghUpcla1Whm3XspIJhB/bVywCu2EOfxfrQG+Cle/E/+gD6feQLoBEQQSi2iTIiYweVggwh6eKGxLrDLE8x90cF1fPGXB7hyoDSgUdnQrZ2Ae7gDzJ/9C3nqiN2ICqh1CNPa9FozUc9qIBDS3w8yPKptbRg61RAkzwVSmy2pkS+axwMElLrVL1zJk5jdAWzl9p5sZQbIyeTQgKKJLEj6gpWdFitK0Q9mPREbNDbweaTv0pP5h0t9v4AdWq0eOxvxf76s7H069H5UpnEEE441icuLm7I8va/yg6aY67CDO3yTnHY3dFy/YvVev8Z7UtRu3qRJe67Tv9n6XHuw6rbfDy/RcN2Rt2gKAmUqyVXRmEtS3BuipY0a6AX93/aWawfDg+9Ad7HDAADJFCLloipVUIdGlrijk3e/e/FMWvJ4OymkTz+JbjB07mjkePumQyaoiFPVJ5VPvs3mqLcVD7+lssmb7k8LZGjoL7nNFKTjRJ8N8EO26gnLtkUjAWRNNxYRACYjROiCCDC7NmSg5IHwZNSZqy5JCoooiRoiUQlJ+lISh3AukxcslI361r/3At2/rFfsTNNrTR7W8PWC3HY2YjO9ZWlMCaDxSWl5k7WvPMbxf78pkw02SKc8MQULTmk5R6hOeRs+nZ5N9+i0eYXms3up9KgOBu65x+nri4kzTekzPuuO7tJg8VR6FrwRWRzAGAtNETERJa6S0rYhl67DMOVh6cj5A/joTfAS4C9dC/L8TEHmwaoSyF69jWRLjRgSg4nCZRXc2MGNZTgrbX8e79O7szPoVh7jrNbv0m2+Zy5tZ8R5two70Za/3zIilGS8oz6o++6YnmXuzFyF4w+EEbiZKMQOobymBmzoFobnaregjIxOwIcJ7hE8Gzsk0XvSDzMCiGUCCiZUGpCRwwlC3dYrJPlKAZPxtHOV3Rj9Cl0grRSrkXya5SJN7YAS0vW9ojj4pZUR3/ojxa7Mpnc4UMAU4AmcJhxQmUGZQEhoUxj1wtTjJo75SQb6Khz1kYbvxBGbjvlw2dt4M5Q6Te5wB8z5jc1smoSRykRhywiLBVxIhYvAgkHpIaHezPpoTfAfS5sQMdjUmaLEtA6n5ZqMmHRw0iUkYGYKaSAHhQFeyuhVu79CTfVjMrHfhHFO7+N5vu/qXz2F5Lf+nnvuuc9Z59JrtyJnc755O7+vi/mt6XbzGkgxsOUsI6Ek8g2capzYq7JLKqBHBEhwBPBm5728gJMHMSRmleknBLnICrEUDiz0hcou+dSt3PeOqNnrdz+Re2aJE4IlCrSeCBxvu8DC1EzoxAOuWoPaTm+Tsf1AR+liIk6nChwTEwnCp054SUnxGRgKEoohpxsvRrTSTiRzeUu1sffl5F0rX/x/4jts59BcZDrRjbQ7OhbJNObxtxwJKBJgmaoqBcztLMZwqUx0kuA4iEOgx5m897jNPvzl++lQPQFJWfoq9BIq7hVCG0ZsM2RtkBYh6GLhL4QOlAroSgYyHubKJ/8VRsdfZvi8ZsK5811N82de0Hzs19U70eg+lht/4+5vfu7btEcclWNaZ4izYiwNMKSEjUqSMLGSCTJIABEDGKAMwLBTLyAU4L3gowLK1yBrFi3vPtkKjaeC2XvM5YVpXAbg9VjaHsoYfyaLGdvucXsNi/MUWsBrUVUIJrXC4zhMDbgWJlOiPQ4eRuTYW7BKiYXsxbEQK6a+qK0DuVNgp0xxTYxNiVh5Nds9PP/N7qQHHgyN2r2bXbybbo+v0FvtBN6U5XeaGG3QsLdGWGCKarff5zah/lI5yNhgAczQM8MkCe1sozoB4+hpbTGKiMCRsw6tEADInRNtUfGJYAOzApRKsqudZ/6Cs62B6CbryDCLC8yzQdPWrH5S60/90vmyzVBO4PN3rH09v/gF9Pv8bKtqTGgFaMAB1AOYWdM6bSrOwlYcvDwMfNwRM2RKRdgv2lZ5ynN+09qVq43TARIDtYlpZNrvk4NYnNH6pPvuWl1QvPUYqFKS1VURGmZRBZGmJnRhAXjyDpOzBMAYwCzpaPKe9RaWyoBOIWjBUqmOITSmmPZQsJZwM6aYdsBm8U2tn7h/47PTJegeQVUt+xk/G/pe5MbeC019loiftMr3r1b4ji8g/mTz1L91ZUBPloeTISTPnkLljuHwtD2QHmPvXVDSoNcpWPQHtnp3kAEdQQoDVqSomTjUhz6vaGtzW7Du0Q9B+uRWtnZsHz7F5p886+3WTEU8qXAarHjP6Z0419wHeYcKZAGgvkOuHgCPu8ad86RDJ9QLnfAEKWoiQzRiBQEgJySRVg6QVq+mwVtKc53uTr8I3+iLVXRsIwVzQ22UKa5MhZKmBNsAcZcDLNEPE2CWQRmbJgrYxFyVP0WzbylIB1oZ2Z2WBHnrWXdDSqKpfVEsNYmbBvhrEu2Q4YdMpzpP4udL/7n+MzBIWixRJr+nr19+Ef0x3FqVxXyeiu40bDdXR/Q7OQ6mv/0VcSH1QCPxByAALx4BYYXKKECbW0TnJmlPFMmaxFDXUi2qGLokKfCE4oUqTS1kgQFlAp1KMzQTYTO+IiGxTo2n/137TPTd9FW74Krm0R3/pecNBFv/Hx0w8+0zH3Q6K+BPvMp16um3nTpzBKQrxN1zxplGZBigiHASEFC5FI0JqW4gIYDSdWdLBz+oV8ub3PVzKhioToqFrGmSQIWJliYYG5CM2WamWFujDmBlqZYJMaCgGVyWCZDFTxqatHQnALWrC0HSDeW0Es3Cdwabfwcmvam1W6Ius6oRkANjU1yFEUNKbGM34S89c+19/g/4MfaBOe30Cs20Fk2nGmTPJGIBfC0MQIID/NE+JEwAED2MgwvvgLFC4hpZpZvwo5mpOwtZohtgGaOaJ5ilgWH3FHMTSgjSJayVIhKjqQdAF1jHQSV6f6bZP0NOz/4Im33/n1yywOj6m6Rjv+XZKDKD55JnA2N/CBijY2EDUyMGBVtC7RLBQQgUZAmC0fQ9q6kULPOvp/Vk2+7eTujql3QMkQsjGgBh4UJpuYxa0nnzDRT5hkZ5pF1bmoLiCzZYqW5ryyhbrhuOi5v2jHCIKcgfQtpgPT9JSn2ode2YbgGAwjn3gK9dRHp+W1EcpbmLUzVxMNl5qzLasN8HRtLkJ0cWaszhOm3cae+hTFFNOIkxNRqZG9PD6A3bn/Un/1fjUfEAMCDJjh+gXCugak39USR0WmpMOcDXGjgMyEHcZ4DfGJ4jZIBMVNyGVHqEqyv0SZ33+DpXcWBBJzP2M4ONmyrs0n97JzkbtmRdBxhsSZVRdYxapvWjJUARj2DVfti2gLs2SixTd+i9vD3/TwuqU6BqljRTIEFQHNzaWYisySYKWxqgjkLzZQxV8YchgUlXoYs1GKuIvItorVVXIRu3g2LMWLhKN4YQ5GdCh9fhuIKcOW9yuswwK5cAy4ByD6Fdsmoi+RqcGwpShAH6zxlw/IxdKHAoIt084ROUouKBVUiqxr1beoh3XiNbLf3F5aw/ljzCBkAeN9IcBk2PSDFNtLpgRIKx2wyyok52ekxwg4kRbiU4Ng7ZxYySlQQ+SlTmqugZqUEMaRIONmDTW6jdX9kndu/h/LC37GSMs/1ARkI1ByI8RrI9ZiSAXFG1txAbA4QVNEioG6XNI9Gc2aaJjotpWiCacsyBdPMTOeJsCC2eXSyyAyLJsXa525JhMaCb1itdYIYPcX1bjce1FAHKPagl+4dYnkJMHrl9J687w4BMJj9kxImh0BRVOySYzJ2gGZ+m0bdn6fHuuetOxgQvfVf4fvNXUwEOE7QiSdZZLnV1CC43r3R5SHmETMAcN8EuHK6VX/tMuziDSjmoOXTFJenZmAtweHIWHNiRyaWIJZ7R0xZk5oqQ1YTIeRGalCokBEoQq1RR/3mhMt3/iUXCOpCAHth0oqgmTF7giUDESxWiKTWKKFSppkJTY0xbgknRDgxsrE6zAyYGemCPJYEqSqOdZ5RRYbaB9ekeBpVKShYgTgwS+OZ6S7IcHAqxIu/Bfu1V2FfBfDyn9OZ5iWAL3pzvkQWhMvIWc/F1PclrfefxWPdcxgMt+D2fsf2ZlfpEMBYnY1hfNImzGOJatki4vabdvGVT68M8PHj9MN/GTBceeB87d8/PV97dQba2QGlGXg0ArVHxKEEZwnSBmu6RdaaQxuamAKTiZHCLLBSlTKaKzAytl6coCBiz4ALLRhizA0IjQEwEJHC0JqjKjLNzTBW0RMDHxnbCTzGxpgY8aIhWopaHQkNJAQXfcO1tRBq8ohQe4ptbnHzAOnGNvTggPTSNuz4T7VjevkvuDMvArT+t00oUtY01hErho7junOy2fmsPdX5rD2jAbb3+3bn8Pf4dtNiosBBYj5wQieV2jxboCnGFHfPfzrhrffu98PII2qAB6H7MarhZSPgdGTYfQW4dpn08hK4MQOhvMoX9rs8zZ6MmafIsBQ4GcpcNaTIKm1iXYra1IzXCNRXQsmMLCi8CEQNrJkxgQxGICAms5pFFwaaKPOJER2D6SRamDBnU4pxaY4rztFkitCGOjZqsTQfTBCnmcV2jLTZIs23SeeA4sppw7uv3ovtf/TT/v28COOd5yEyRXYs1tmKGGphG2yylZ+zJ/vP289KF8XyOo7n12i/PcAeAm5HZ3vR6IArG9cey6VHeGvL0p0+2YPzi4eRT4ABHuSBkQEArhhdAfAiXiLgJe1eBrVrSPNjUycwv8zNCTRAk6m0CbxQ0oljGiqhD1gHAQUxvAEOBDYlGMEIiAqNxLyMxHMGT00wjqpTozhly+aBaOm8b+dm7SAiNo5iw632aJiCQ9IKenxwQ3fmF9KNHgxX/rKtlgDA6BJA9pS5+R0UQ0O/5bTpA50pN+Tx3s/bz7g+eu1dmjQHOG4OcTMucDM4epeM9hzTYWSbtYwaY4T1nNL6bz3c4gce3uXbnwKnodJXAf7K8+CsB0lD85TNi1p6BTl0OKEvgXqcYk9EOrGlDpvlMPVeIUnAZGxKqmAkIm6Saq2ISy/ZXA3zJscCEUv1qMMSrcgsZn4QA5DuN9qbHpBhG7p3HfaVBye1AP6y4caLML50Ea7pWeFyDLOIs9HjsazA04N/x36pe96eToLe/Dv0RnULu82J3TbwXTXsRYe7S8Fh39EkNVZ9/zYFXEN8FKpFfMJGgD+P+6GS6cVXYXvPA18CYbHdtzxZSu0ysnRaNcypkDLWsTD2ORSewU4dJFgiUMK9M/ApSd4ytMksq9ocdZVQe0XbLtEOcgqLArGxftKZ6bk+2ckx2W572mr1CoCLr8K++uqPF+b8KK7hCl3YuswZKIOzMhB6Al3rfo6eLp6wxzVClq/R6/M38Fps7G4kHDLjoBYcJsVJp8SsStYsBPHSJaSvXnv4xQ+sDPBDuLeU+irSjRdg6zMzdaTNsBNHC7QzDx8NC++ci7DMDK5QkDKYVUgiTAFLhURrkJbehSJHWE4RujnCMkcs6nvr9dtQ3JvMXr0Iw5UP2mz7x+ciLlOnMUodCBucSSqLHTmbP26Po4JO39Jry9f5Wqr5wMSOE/jIPB0bYYrWFicV6k8D7fxeJetHQfzAKgT6c3iv0tzOs6DsdUjbB4/ZZJtI5mTSceDSgafNkl3qUEgV9bJSFwAkh+qcUjIkaaDTsxa5fq+P8NqfCW2An56ojF4EZOd5ZGVmvW4P29LDc50n7YvFGVyY3sbd5g16IyqOkqTjQDZJZBMlPyXFcg40g4raG0B81Jr88Ud9AR9f6LQi2ivQ3XNIN4CIPYSncmqmjVWtwzLWtIhHmMfj7gzAzEs5zR3N4jHN8iPM54Utyk1UtbN60KF2ekDhm/3TUuhfvXIqpNOD5fRTF9QlwObeLAxhlKGTbWIdJTC7rtcWr9u/DYbvK9Ju8rKv6g+RpXFiWhxOUT+q4gdWI8AH5L29hGuXTzuzX90/vXdfBvDG/M/ex8/0YN8A8IN4/icwkf3LY/Q1gBcvwHf72M7W7eeyIc6jQT65ld5Sc+Og1mYRdew2ywnlS/CsoZNBk0oLj3J715UBfizei1buq+ClD9SN5T4flXiMXwTcY79qa2tnaM2Vdo4F64t97LcLHAZptc4sdThvCkU77lPbO7D2RBAfZfEDKwN8Argsf/tTZ91/cf7/Ub51zvLeGD1/HmcXezgOLSadEqkpiCSaTgxJa4Q2IWWfAPEDKwM86tCLF7/mD7aQvXnyD+2rEXnveZzh25jemWMmT5KmzHgdx9idrRtX0N0ZdPA4Jdwrivsoix9YTYIfcV6kb2xd1X/8ylcXt+P/Jnz+HGjxLbxLG3RQJKpen1nAEZq33t1on8qpmY8oDHIKl4BH/sl/n9UI8MmAn3/+1+TVV0/U8DV96YHGG3/6B69ehL308kc1Wf/wWRngE4n9SGV/UoS/YsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKj5b/P/7qxRbJch3TAAAAAElFTkSuQmCC","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,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"],"frame_max":12,"frames":[[[0,0,-56,50,150,0,0]],[[1,0,-56,50,150,0,0]],[[2,0,-56,50,150,0,0]],[[3,0,-40,70,200,0,0]],[[4,0,-40,70,200,0,0]],[[5,0,-40,70,200,0,0]],[[6,0,-8,100,255,0,0]],[[7,0,-8,100,255,0,0]],[[8,0,-8,100,255,0,0]],[[9,0,-8,100,150,0,0]],[[10,0,-8,100,150,0,0]],[[11,0,-8,100,150,0,0]]],"se":{},"pitch":{}} \ No newline at end of file diff --git a/project/animates/yongchang.animate b/project/animates/yongchang.animate index c4365f4..2173c5d 100644 --- a/project/animates/yongchang.animate +++ b/project/animates/yongchang.animate @@ -1 +1 @@ -{"ratio":2,"bitmaps":["","","data:image/png;base64,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","data:image/png;base64,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","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABYRSURBVHhe7VkHdJTXlbbjEjtxEjteJ3HiFDu24xLb9HUNjtfYcQWMKKaDaTZgqgwCGYGQqcJ0EMVCIIkiQKgX1KXRaHqXNCqj0Ugzo5mRhEZ9VL739j6slLMn2bObgp3k/875zpv2l3fLd+/95yYJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBggQJEiRIkCBBgoT/C/hN/GbNSM1tDc/K77SN1HzPPUx3X8Mz8p94Rpkeahyme8T5tOFRsTY9bX2w8SnFA9e/f8Lyfe8TlrvEcXT8N4ZOJeEvQRjZPrbgDudo5b3CsO7hxt80Dreucg23x7iH12c7hzVlNY5sSrSN9FywjmqJt41uja4e4z9hfa49qua5ziPWZ9uPV4xpibOObkkpH+XNqx7ustWOcLfVD3MpnMNd+a5h9dGu4RXLnMNrnhOOEg6yPGG5XVx36Bb+vfAHg49S/bTxGfPL7mGmNZ6RroSGEc2l1S90ppW/gWNl03EwbTmSr4RAdykElqRQmJM3wZC8GeqULVAnRkCXvBPlOVEYFKTPW9M/QXf6alxLWY+G5PVwZaxCf9oyVGVOxxXVRBysehWHyVEptcN9JY0j3Gedw+wfuoeZR3t+bfph9cMZ3/yXdojYXNPThm83PmV8wD3cNsk70hHn+k+/3vGbbq6eDHv2CrSkhKErawPai5fCXbIE5QWrkZ2/DbF5JxGlSMQBcz4OlBfzGKsc6XVadFbJ4dKkw6VOhbdaBW+NEs36TBSVnIWsMAp5uXtxoWAx2gtXIydvHbIyyXlJu+BMDIM1cQ0yFVMRWftSd45tVEu+e6Rzn2tE5ev1I4ruF3JH9/uvIV1Ch93Dqu/zjfCNaHu2Ndz7QleFdTyKsldDfukzNBeuQkC5FBWylUjNO4yo0vM4qUzExbLLOKaNx15TNA6ZjvYn15wdLKtOQ7XXhm6fA33uPAySwV12OdIcFsTaVCykxcl39HbC1eZBireBzasqYwv1iYjUHEMnOeYiOTBam4HI/EPYXbgRp/LCeGFKJKqvhEObvQRJta8iv+m5dq13VPPaptGOJ4VU/dM6QhjeN6L+/o4XOl5seylwxjUOtbkrYEjZg8bsCJSqV6FIHoqygh2oLTwIqzwBx7X7kWg8xVbqojoTTSe6j1vP98Z7CnGx1Y0D/X1wA+jq7sDV9ha+o6edrab3EUQ78TKxOtALpbeeF3Zdg5Xe93Q0o96rgcWR02MwnGnntvieZMNpHNSmY1dFMaLMeYjLP4XYki1ILtzEC9P2ovLyNljVc1Bk+21/ne/Zjt0tI5vGiMLOJyfcMrS1rzf42IJb20c77+14secF7zhssb+FltRNcGce5DzrMGoLTsOnSoaXDOC1aeG8Th16Wl0wkQFLBvphIOPpiTVEL7GPOEBsIJYTS4l5xKvEVOKVP2E6sYAoJxqJHmIX0UVsCvSA9QXQ5G9GU2sjvK4qtJKUddRq0GsuQB9lX4DqSVfWYe5P3Ysu2Qeodrwy4PCNDazyj2oebX+m4O6vbUYIjXeNdH2r/fnArzyvsemut6Eo+AityZFoytuBzLxo1GnS0GnJ5xprGQ5WyvjcChnbZNrHwlQH/LynC5U9HUh1aZHmrYONDFZNbCXGMsaWE18nPkV8mHP+0J8jfffg0PoI8Rl6/SqtS+kcyUThjBR/FXo9NWxDs4MtCXSzFT4HW11ehAN0Pzs0qbDqMuAw5QOF4XDnb4bvyg4MlI/HYMs4pF97vmeGf4T3l6JgD237q4cwvEhPNoZ91/8aG2N/l61unAhP0g7053+KdEUYjykORzFJjJkMr/Xa0eypY2HVKjazvJht9NVD3qhCn0sW8FEW1JKRsshwflqPk/GmER8nfoc++39LAB1zGx17L3E0UThCRbR3NaCfpGwXwDd77GxDVXzveZsGpZQRF1oaAZKmKtk+NKmWolexApWpkfAVLkZTzZsw+sexxZ0v9D3pHWu5S+x96FJfHURKdrzI7vO+xp63TaLNTIaXdH6gZB0uqjdSOxmGrJJYKKmLOWEpwGdNNpwmKeip0yGlniLOmtjrdMsGbH7vdXm5Rkwjw80ljhTGo/V24l+9UTr2G8RvEX9B55tE5z9AbCKCsu5Iu4993N/PVpE0HaOP+soLUVC2B73KaNTTatWs44XFG3D5aiSMaSForX4PJY2vs8V9Y9mvm59v/s5XKkkiAvxv8Xtsb7ExNUFsjXEmZGl7OVesR2LZRhxVbMHl0hMwqaMQJ9vKNinCEKHfBYO14Lq2D1BhzaY1h9hM7CVGk5FmE58gg931txj+f4LOdSud9wfEl+j1ZroWCQ0YURRsUS/6qnLRVhkNheogwtXHsV92DlmKfRQ8YVSswxGdQ/eevxY95mmIq3+bzQr8F3uUjyTnfhVOEMZn49i3m9/mj9W+x+ca5yA25TPO5WuQr1+LM+oQXFLsgFm1F1rjR1Cmv9HhKJrXfs4Sz9c3VuLk4CCKhgzQQpR3NpHuuLD7miMwvq2p7UG73X4HGerv2nk0NDTcyfzs4UCATRoYQDRd10IEXYdT+9rqs/OEihy22hjHxqvOsGmKc4gsOw+5fCcyFOHXA+p89lFy0nQMVE3FzsY32VvdY9kDQ488bqwcFYzlt3rf5D+yTWTjTLMRoVkEY9Z29BpXocD0MTK1a2BV7UGfgSZS48eIki1ny1WH2Uc9XWwObbaM9h0Qhh9aC/weDHR5cLjF0TO7xd7xeGUlpfffwQF0jps1Gs1tbW1tdwd8gUcCrewNkpwQuqYozCLrBrvb0U8rqT9c7c3Y4qtjUyyF7F3ZORasOod05REo5BGIVmzGCZLU3KxDnJvmI7UiiC1z/o4NbxvLb3R3xG9ufpd9p2oCe7xiMpujnYvTqREYUC6Hq3oBXJUL4NGEooZS2a6hDkh9GNuVF7GN2s0s2mRPuw9ZtOltJAeiMO4milbTTY6RdflZaKefv9rVxe6n7//qbkMY3mKx3O5wOO5xODwPdbg6Xmr39s3r8mNPV/t1Y4vMC1AxznaZUeQuRJu3Hmfps6rBASicVSxUT0ObKoFk6Ax0ij2IE1mg2oz0nOOAeiEMphnYWjeBveZ4lf2Y/a76xnVGfDK/pSGIfd86kY22TGNLNfNxMe1zzklq2moXopEc0EwS1EkO6FXtg1d3HjaKrD67HkXU5u20XGGLK86yifZiNq2plq3raOUxtPEeYgfxIhl+JfE5MuKPGhrYnbyA3yoMShQF9Q+p/qevfw/xG2F4krC7XRbXzxps7tEtjW2TOjyBDR2uQQs52UfX0BLbibtanWyNPTWwxnCi/UJNLHzUKOxvqMBRmklanVUw67PI+ImwlB3iCartOKkOQ1oWFWn5CtQa5uDzqiA2sf4d9iALovu8UTIkHGB9m/+HmRxgnMmWli1AfOoezlXL4dYFI08lOp9D0JVdhJe6nf7yYnLIflQoz8GlPQmvPhxNFaloLgrzWUynOlTOPKidlSgn43EyiujXaajim7s72KR2T/+zFL2PVeqbftFc2fzj6mr3fdds174nJMpu53dYLNe7pFuIt7Jq9s02e9vdLpvrZ45a96h6k+8tf61/sae6Q9Vq7xMzhRjcFER3ZxvSO1rZElcpn0DvTzQ7cMIUixLzbrjMeTxBk4QzVhm0rmoM0FzgKI7DVfnnuFS2FbnZ+4GiYJh15IDK99kk5wT2aBPVwyHz/OOhWcRvs1AG6KfzYcS5pYtwPDECnbJ1tLstKC3bixwa9z3U0nVqUtCoiEOp/iiOWEt5jMOCkwYqdPoktsq8n620foF99ReRaS+E1W2+XpSFHvd3XeN+mgvcHfUwXrP2Xe1sCMS01PVtb3MMru5tYR/0dLIpgW4+YSDA3ujtZa+LlYrr+J52NqvTxZZ3NQyGdth7VR5roI2MnUbnjCWKyBfys41k8EiLk8+1nupLrbmAy34fzpj2sxDFTug0VGhVn+OqNh5mUx4aygvgEHspPgmVfAeMucc5L6ZmQ7cAEYbp7G1rEHvQO5nfNWSefzxEBihmsO8qp7JH1bNZUNki7MwOgSolEuzqbrQUx6ODaFAno0psQJ+JekplVUUJLtYZcNjnwK7OVoSTHER0tGIvbf70NTdyfHZ0UmvqJAOJeaBzyGDi0YOMqCZW9PejgTS6mX7XQhT9vINYSV2VaCXFoCV+V98fQDetosUUx4vPxKMMIXEpxDPEc53XcLG5AefpPnZSTdpqN+K0eJpKAeNTXUCAIr/VkAWHKgmVsvOoLIiB6+pRDGYcACv5GBdV81mwfip/2TiRPWAfy+8gy9yoTojfbJ/D79AHsZ+YZ/CXFfPYSpoUY5N2obdgC+eF21GZdwAqSluV4sqXUUQbc9FaUSVHnrOCJzQ34iQZ/1BPJ450+3G6xYV0lxU13vrrU7CZWDMkScL4mfQygdY4oohkUSzFA7hMYikZ3zTQjyoqsAM97Zz3dKA30I1ecpDocoQjxLMksVYR5fR5Omn8BSrAZzpaENvqRjxlZiJNwwXmApSbctBsyEGf6gp6ZWdRV3IGFcVHYSnZDd/Vo5znbIKidCmOKGaz2YZJbLiG5Fh0hUPGuTEQFxQyVPo+f0wzh0+QLWJhOauQIqbg0hDOaRBTl0YgWXEAF5SnkKS4jFJFArT6EyjVROEsDTpblKfZEtVpNktznM9V7mTrjHtwTBXeh6o8xJH8iD5dPFwTxTmR+vYDVJhXkCMm+H18ssPAZtcVsbWeAhbqLkKBx46BmssBmauAxzRWILrFiTgytJAeUVNcVFBl1XmUhUepFoX1OxXBAa9sQZ9X/kG/Q7EMVnUoyg27UKM5AWdZPJzyKNRRrfLpQ9CkiYBKGQp3+n6wlB1oKFuGE6Xz2Qo9BR9lwC9S3qZhLOyGD2P85ozfsW/qgth9ipnsGdUsNlW1GFvzVyJZFOSyYMCwClptKOL01D+r9+AL5Re4ooinenAccv02ZJg/RZQ+hIWqF7HlhVN61mS/0x5x6RUfShYGonUxLKwyGTk0tBWLTLBpYQ30sNW1WjbPGssWWPOprb2CJFEk5WHXMmwlOGDLZRvri9gHLS62ghy2lQwvni0ZqLUNq9Ozxcaz7H3zZja1aE7f3KJZgWDVAkQalvME/TqoddvgJO33aQ+h1bgRLdbl3F/zIZqrF6GzcgW6Mw9SBd9BzlhK+1jAVuumsje0QexhzWT+PSHJQ0a5kRAP4fgtBSRFhonsB/Lp7CntTPaOZgELli3jMQnh8FK0DJiWok3/CdJVoTip2krT5C6KnmO4LD+DImUMVNq9kOmpazKsxUXdQlzIfrvTnzmxq0S2CPsUB1gwDUGXLYVIIkMyjw0ZVAyjqaNKzJ7n7ykO7tW1uWHQneLrqYacJecs8djZkt7O648aRLuZ1+Jmq2o1lGHxfLIyks1QbWEf6T5FhPYznKagyNVGcY0iFjrK0hL5PqRpwnCJWuhE43qkmdbCUBaKQZp+kb0eSt08HNTPZssM09grpvf4Q/bx/O4vpecGT8F/xJdOEJmgnMXulc1gv5LP4q+qF7IPlYuwOzEMpuRd6C+jubNyGZz6YKToNuGUbjOO6SPJIVG4IDuNXGU8VKojMOl3w6pZA591KfdrV6JEuRGXtPtwSnsWSdRNlQ70ca5NQb92Pzw0X8RpN2F7yeLBZeowtkB/ii20FLFPnVYco5rioSJfWV6EY+pLOKQ8hkOGSHJcJC7rDyBXcxKlyrMoUyegqDQWKZpj5IzdOK6PoA5tC87q1qLEsg491O8PkOz0FK1Gou4DbNWR5qumsueF7IjILwjjt4bdeOn5c6Bxn1pT0RnRDf6UivMY1Uw2STubrSr+EAevbIAxdQ+QGw4YV6HFRMbVrMc5zUZ8YSJ5MkbgDBk/VbUHCt0h1GoiOVccgkd7EE7tATSoDsOjO4h+VQz6qWuB+O9XnYIKIWfqGGSqYpGlSkYxZYeeptn+Oj2aVCkw0RRr0BDLzkFPv1XRHFKijqPJ/AQuUBZF6yJpso1AlHozTuk3Iqk8GEb1BvRmHqJWaQ+6itchWTefsmUWW6KexsaVT2JPimwXDchXJDv/O4QTREESdaFsKntcP539Vj2PzVYsYBtkHyMqKQwW6pS6sz+jrAjFQEUwmszkDIq2K+b1PMFEGzavR0blErDyjTAaw1FF8tSv3YVO9WnYVZfg0KTBRRN1P9WEDmMO6g3ZqKW1lozvaCinQqyi1jEb5eQgddkl5JLTrlDBj9ccoozbjSjNNkQZtlG0h/EYcwiSjOtgpEzqkEUAGXvRlxqJllySn7Il2KlZyFYoZ7OJuhlstIh603R+j5Dcr0nU/yXwmxMoOgwz2beFIww0KyimsGcNs9h7+rlsmXoh31ywHCfTaeOJ29BLKY7scAyq16FbtwZuy2oYrQvQVTUP12zz0WJZjgIyUqopFBnkiHTFUeTIonkhtbXNZPh25WWYlEkwU/uIsssop179ainVDcqmOOpeoknyvqBjzxhDcMm0HnmGT1CuC4G3OAJ91M8j6zCQTN1O0SfIlC9FpOjtTbPZPMrm10zT2NMio0W3J2RW7Gtok19/iLaMbvh2C02IIm0VNC1qp7FRetoYSdNMzWy2QrMQW0s/xIncNbwwbTMak7eiK20b+q9S8S7eAhSHoUcZgk5hMG0w7LRWkFzoKVp18u1ckx8DX+EZXKNePZB7FI6y7TCrtxE/RRXVGbtyE3zyMIrurejP3YrBLDovSWFv+g7uz/wU5bkf47JyCT5Xf8A2quewJRTpQdop7Df6aexJBQ1XwvB/lJuvrND+bRAPqMQGxEZEVtSSM8rfYz+vDGJPmaewFyzT2LsUaTMr3mcf0VS9jlrDndrFPIZ688yilVyTE4zarI3wpJEhU8PRk7GLZIIMmfI5BjIirxdJkFEH03ZjII0KfvJnCKSEoyt9M9qyNsCR9wnMhSuRSxJ4Vr4Ee0gSPzXNYR9XzmDzy6fyyaYp/FW6j9GGCezRionsflFcxXMdCpzb/2mN/pcgskI4oyGI3SkyQ0yQ2nfZj81T2S9Nk9jTVnKIYQp73fA+m2SYzmZRy7dYO4ctN8ylvvsDvl7UEiVJWOlifCZfjMiij7CHJtLPZR9iL6275B9iu3Ix36xZxDaQlKwlrjDMp8iexeZQizxNPLchh79CDh9FbeRjIhBEdpre4vfQvXyrmmRG3N8N/3Plq8J1h4zkt4loc5EBxH8MDa+x79veYT+sGc9+6pjAfml7gz1a8w57smo8H1Y1gY2pnMSep27kpYogNtYQxF6pnMJ+a57EXxbvrZP5izVB7LmaiWwE9ejD6t5lv2p8iz1S9yb7uf1N/qPacdTBjOV3e8fyu8T1xLVv+COErzOuyxU5RRhFRCKjiBSRKSTBQKwkB1GUftdGMiGGIEHxWkSweC2+ExS/FceJTBvKttt/f85/m+j+R+LPGfH3n/3zGPimm/4b7XBoSBv0uj4AAAAASUVORK5CYII=","data:image/png;base64,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","","","",""],"frame_max":16,"frames":[[[2,0,-24,50,120]],[[3,0,-24,50,120]],[[2,0,-24,50,255]],[[3,0,-24,50,255],[5,-56,40,50,255],[5,0,64,30,255],[5,56,32,40,255]],[[4,0,-24,50,255],[5,56,8,40,255],[5,-32,32,30,255],[5,-56,8,50,255],[5,0,40,30,255]],[[3,0,-24,50,255],[5,-56,-16,50,255],[5,56,-16,40,255],[5,0,24,30,255],[5,-32,0,30,255]],[[4,0,-24,50,255],[5,-56,-32,50,255],[5,56,-32,40,255],[5,0,8,30,255],[5,-32,-16,30,255]],[[3,0,-24,50,255],[5,-56,-48,50,255],[5,56,-48,40,255],[5,0,8,30,255],[5,-32,-24,30,255]],[[2,0,-24,50,255],[5,-56,-64,50,150],[5,56,-56,40,150],[5,0,-16,30,150],[5,-32,-32,30,150]],[[3,0,-24,50,255],[5,-56,-80,50,150],[5,56,-72,40,150],[5,0,-32,30,150],[5,-32,-48,30,150]],[[4,0,-24,50,120],[5,-56,-96,50,80],[5,56,-96,40,100],[5,-32,-64,30,100],[5,0,-48,30,100]],[[4,0,-24,50,255],[5,-56,-112,50,80],[5,56,-112,40,100],[5,-32,-80,30,100],[5,0,-72,30,100]],[[3,0,-24,50,255]],[[2,0,-24,50,255]],[[2,0,-24,50,80]],[[2,0,-24,50,80]]]} \ No newline at end of file +{"ratio": 2.0, "bitmaps": ["", "", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII="], "frame_max": 16, "frames": [[[2, 0, -24, 50, 120, 0, 0]], [[3, 0, -24, 50, 120, 0, 0]], [[2, 0, -24, 50, 255]], [[3, 0, -24, 50, 255], [5, -56, 40, 50, 255], [5, 0, 64, 30, 255], [5, 56, 32, 40, 255]], [[4, 0, -24, 50, 255], [5, 56, 8, 40, 255], [5, -32, 32, 30, 255], [5, -56, 8, 50, 255], [5, 0, 40, 30, 255]], [[3, 0, -24, 50, 255], [5, -56, -16, 50, 255], [5, 56, -16, 40, 255], [5, 0, 24, 30, 255], [5, -32, 0, 30, 255]], [[4, 0, -24, 50, 255, 0, 0], [5, -56, -32, 50, 255, 0, 0], [5, 56, -32, 40, 255, 0, 0], [5, 0, 8, 30, 255, 0, 0], [5, -32, -16, 30, 255, 0, 0]], [[3, 0, -24, 50, 255, 0, 0], [5, -56, -48, 50, 255, 0, 0], [5, 56, -48, 40, 255, 0, 0], [5, 0, 8, 30, 255, 0, 0], [5, -32, -24, 30, 255, 0, 0]], [[2, 0, -24, 50, 255, 0, 0], [5, -56, -64, 50, 150, 0, 0], [5, 56, -56, 40, 150, 0, 0], [5, 0, -16, 30, 150, 0, 0], [5, -32, -32, 30, 150, 0, 0]], [[3, 0, -24, 50, 255, 0, 0], [5, -56, -80, 50, 150, 0, 0], [5, 56, -72, 40, 150, 0, 0], [5, 0, -32, 30, 150, 0, 0], [5, -32, -48, 30, 150, 0, 0]], [[4, 0, -24, 50, 120, 0, 0], [5, -56, -96, 50, 80, 0, 0], [5, 56, -96, 40, 100, 0, 0], [5, -32, -64, 30, 100, 0, 0], [5, 0, -48, 30, 100, 0, 0]], [[4, 0, -24, 50, 255, 0, 0], [5, -56, -112, 50, 80, 0, 0], [5, 56, -112, 40, 100, 0, 0], [5, -32, -80, 30, 100, 0, 0], [5, 0, -72, 30, 100, 0, 0]], [[3, 0, -24, 50, 255, 0, 0]], [[2, 0, -24, 50, 255, 0, 0]], [[2, 0, -24, 50, 80, 0, 0]], [[2, 0, -24, 50, 80, 0, 0]]]} \ No newline at end of file diff --git a/project/animates/zone.animate b/project/animates/zone.animate index 8c2b604..fa88a37 100644 --- a/project/animates/zone.animate +++ b/project/animates/zone.animate @@ -1 +1 @@ -{"ratio":2,"se":"zone.mp3","bitmaps":["data:image/png;base64,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","data:image/png;base64,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","","","","","","","",""],"frame_max":6,"frames":[[[0,0,32,30,100]],[[0,0,16,50,130]],[[0,0,0,80,150]],[[0,0,-8,90,180],[1,24,24,100,255]],[[0,0,-8,100,200],[1,24,8,100,255]],[[0,0,-8,100,255]]]} \ No newline at end of file +{"ratio": 2.0, "bitmaps": ["data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,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", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII=", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAO0lEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNcAkGAAAR9NKNUAAAAASUVORK5CYII="], "frame_max": 18, "frames": [[[0, 0, 32, 30, 100]], [[0, 0, 32, 30, 100]], [[0, 0, 32, 30, 100]], [[0, 0, 16, 50, 130]], [[0, 0, 16, 50, 130]], [[0, 0, 16, 50, 130]], [[0, 0, 0, 80, 150, 0, 0]], [[0, 0, 0, 80, 150, 0, 0]], [[0, 0, 0, 80, 150, 0, 0]], [[0, 0, -8, 90, 180, 0, 0], [1, 24, 24, 100, 255, 0, 0]], [[0, 0, -8, 90, 180, 0, 0], [1, 24, 24, 100, 255, 0, 0]], [[0, 0, -8, 90, 180, 0, 0], [1, 24, 24, 100, 255, 0, 0]], [[0, 0, -8, 100, 200, 0, 0], [1, 24, 8, 100, 255, 0, 0]], [[0, 0, -8, 100, 200, 0, 0], [1, 24, 8, 100, 255, 0, 0]], [[0, 0, -8, 100, 200, 0, 0], [1, 24, 8, 100, 255, 0, 0]], [[0, 0, -8, 100, 255, 0, 0]], [[0, 0, -8, 100, 255, 0, 0]], [[0, 0, -8, 100, 255, 0, 0]]], "se": {"1": "zone.opus"}, "pitch": {"1": 100}} \ No newline at end of file diff --git a/project/bgms/Ascension.opus b/project/bgms/Ascension.opus new file mode 100644 index 0000000..4ea0523 Binary files /dev/null and b/project/bgms/Ascension.opus differ diff --git a/project/bgms/Blind_Alley.opus b/project/bgms/Blind_Alley.opus index 92df164..0e37b2f 100644 Binary files a/project/bgms/Blind_Alley.opus and b/project/bgms/Blind_Alley.opus differ diff --git a/project/bgms/Blood_Stain.opus b/project/bgms/Blood_Stain.opus new file mode 100644 index 0000000..8d34051 Binary files /dev/null and b/project/bgms/Blood_Stain.opus differ diff --git a/project/bgms/Halbmond.opus b/project/bgms/Halbmond.opus new file mode 100644 index 0000000..cf8ae13 Binary files /dev/null and b/project/bgms/Halbmond.opus differ diff --git a/project/bgms/ed.opus b/project/bgms/ed.opus new file mode 100644 index 0000000..604d512 Binary files /dev/null and b/project/bgms/ed.opus differ diff --git a/project/fonts/simhei.ttf b/project/bgms/theme.mp3 similarity index 54% rename from project/fonts/simhei.ttf rename to project/bgms/theme.mp3 index 5bd4687..3d4eeb3 100644 Binary files a/project/fonts/simhei.ttf and b/project/bgms/theme.mp3 differ diff --git a/project/bgms/theme.opus b/project/bgms/theme.opus deleted file mode 100644 index 5a178d6..0000000 Binary files a/project/bgms/theme.opus and /dev/null differ diff --git a/project/data.js b/project/data.js index 5b8e9ed..b3de946 100644 --- a/project/data.js +++ b/project/data.js @@ -2,6 +2,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = { "main": { "floorIds": [ + "chushi", "Caimhome", "jiuguan", "KTV", @@ -11,11 +12,9 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "jiaotang", "shengnvhome", "shinvhome", - "jiedao", + "changguan2", "street01", "street02", - "guangchang", - "guangchang2", "xiaoxiang01", "xiaoxiang02", "xiaoxiang3", @@ -28,10 +27,25 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "yiqu7", "yiqu8", "yiqu9", - "yiqu10" + "yiqu10", + "changguan1", + "yushou", + "zhujuejia", + "guangchang", + "guangchang2", + "guangchang3", + "guangchang4", + "guangchang6", + "guangchang5", + "jiaocheng01", + "jiaocheng02", + "jiaocheng03" ], "floorPartitions": [], "images": [ + "005-Attack03.webp", + "012-Heal01.webp", + "015-Fire01.webp", "HPGaugeEnemy_A.webp", "HPGaugeEnemy_B.webp", "LOGO.webp", @@ -432,19 +446,23 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "face_440110.webp", "green.webp", "hero.webp", + "jianji.webp", "l.webp", "lane1.webp", "light.webp", "lock.webp", "lr.webp", "maba.webp", + "miwu.webp", "null.webp", "other_0001.webp", "other_0002.webp", "other_0003.webp", "other_0004.webp", "r.webp", + "sound.webp", "status.webp", + "statusBackground.webp", "suiji.webp", "tati_020101.webp", "tati_020101a.webp", @@ -776,6 +794,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "tati_120128.webp", "tati_120131.webp", "tati_120132.webp", + "tati_310101.webp", "tati_340101.webp", "tati_340101a.webp", "tati_340101y.webp", @@ -886,22 +905,29 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "8.webp", "7.webp", "10.webp", - "C5.webp" + "C5.webp", + "c6.png", + "2233.png" ], "animates": [ "hand", "jianji", + "jianji2", "sword", "thunder", "yongchang", "zone" ], "bgms": [ + "Ascension.opus", "Asphodelus_Ceui.opus", "Blind_Alley.opus", + "Blood_Stain.opus", "Crawler.opus", + "Halbmond.opus", + "ed.opus", "op.opus", - "theme.opus" + "theme.mp3" ], "sounds": [ "aiy010000010.opus", @@ -926,6 +952,143 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy020000160.opus", "aiy020000170.opus", "aiy020000180.opus", + "aiy020000190.ogg", + "aiy020000200.ogg", + "aiy020000210.ogg", + "aiy020000220.ogg", + "aiy020000230.ogg", + "aiy020000240.ogg", + "aiy020000250.ogg", + "aiy020000260.ogg", + "aiy020000270.ogg", + "aiy020000280.ogg", + "aiy020000290.ogg", + "aiy020000300.ogg", + "aiy020000310.ogg", + "aiy020000320.ogg", + "aiy020000330.ogg", + "aiy020000340.ogg", + "aiy020000350.ogg", + "aiy020000360.ogg", + "aiy020000370.ogg", + "aiy030000010.ogg", + "aiy030000020.ogg", + "aiy030000030.ogg", + "aiy030000050.ogg", + "aiy030000060.ogg", + "aiy030000070.ogg", + "aiy030000080.ogg", + "aiy030000090.ogg", + "aiy030000100.ogg", + "aiy030000110.ogg", + "aiy030000120.ogg", + "aiy030000130.ogg", + "aiy050000010.ogg", + "aiy050000020.ogg", + "aiy050000030.ogg", + "aiy050000040.ogg", + "aiy050000050.ogg", + "aiy050000060.ogg", + "aiy050000070.ogg", + "aiy050000080.ogg", + "aiy050000090.ogg", + "aiy050000100.ogg", + "aiy050000110.ogg", + "aiy050000120.ogg", + "aiy120000020.ogg", + "aiy120000030.ogg", + "aiy120000040.ogg", + "aiy120000050.ogg", + "aiy120000060.ogg", + "aiy120000070.ogg", + "aiy120000080.ogg", + "aiy120000090.ogg", + "aiy120000100.ogg", + "aiy120000110.ogg", + "aiy120000120.ogg", + "aiy120000130.ogg", + "aiy120000140.ogg", + "aiy120000150.ogg", + "aiy120000160.ogg", + "aiy120000170.ogg", + "aiy120000180.ogg", + "aiy120000190.ogg", + "aiy120000200.ogg", + "aiy120000210.ogg", + "aiy120000220.ogg", + "aiy120000230.ogg", + "aiy120000240.ogg", + "aiy120000250.ogg", + "aiy120000260.ogg", + "aiy120000270.ogg", + "aiy120000280.ogg", + "aiy120000290.ogg", + "aiy120000300.ogg", + "aiy120000310.ogg", + "aiy120000320.ogg", + "aiy120000330.ogg", + "aiy120000340.ogg", + "aiy120000350.ogg", + "aiy120000360.ogg", + "aiy120000370.ogg", + "aiy120000380.ogg", + "aiy120000390.ogg", + "aiy120000400.ogg", + "aiy120000410.ogg", + "aiy120000420.ogg", + "aiy120000430.ogg", + "aiy120000440.ogg", + "aiy120000450.ogg", + "aiy120000460.ogg", + "aiy120000470.ogg", + "aiy120000480.ogg", + "aiy120000490.ogg", + "aiy120000500.ogg", + "aiy120000510.ogg", + "aiy120000520.ogg", + "aiy120000530.ogg", + "aiy120000540.ogg", + "aiy120000550.ogg", + "aiy120000560.ogg", + "aiy120000570.ogg", + "aiy120000580.ogg", + "aiy120000590.ogg", + "aiy120000600.ogg", + "aiy120000610.ogg", + "aiy120000620.ogg", + "aiy120000630.ogg", + "aiy120000640.ogg", + "aiy120000650.ogg", + "aiy120000670.ogg", + "aiy120000680.ogg", + "aiy120000690.ogg", + "aiy130000010.ogg", + "aiy130000020.ogg", + "aiy150000010.ogg", + "aiy150000020.ogg", + "aiy150000030.ogg", + "aiy150000040.ogg", + "aiy150000050.ogg", + "aiy150000060.ogg", + "aiy150000070.ogg", + "aiy150000080.ogg", + "aiy150000090.ogg", + "aiy150000100.ogg", + "aiy150000110.ogg", + "aiy150000120.ogg", + "aiy150000130.ogg", + "aiy150000140.ogg", + "aiy150000150.ogg", + "aiy150000160.ogg", + "aiy150000170.ogg", + "aiy150000180.ogg", + "aiy150000190.ogg", + "aiy150000200.ogg", + "aiy150000210.ogg", + "aiy150000220.ogg", + "aiy150000230.ogg", + "aiy150000240.ogg", + "aiy150000250.ogg", "aiy310000010.opus", "aiy310000020.opus", "aiy310000030.opus", @@ -955,6 +1118,170 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy310000280.opus", "aiy310000290.opus", "aiy310000300.opus", + "aiy310000310.ogg", + "aiy310000320.ogg", + "aiy310000330.ogg", + "aiy310000340.ogg", + "aiy310000350.ogg", + "aiy310000360.ogg", + "aiy310000370.ogg", + "aiy310000380.ogg", + "aiy310000390.ogg", + "aiy310000400.ogg", + "aiy310000410.ogg", + "aiy310000420.ogg", + "aiy310000430.ogg", + "aiy310000440.ogg", + "aiy310000450.ogg", + "aiy310000460.ogg", + "aiy310000470.ogg", + "aiy310000480.ogg", + "aiy310000490.ogg", + "aiy310000510.ogg", + "aiy310000520.ogg", + "aiy310000530.ogg", + "aiy310000540.ogg", + "aiy310000550.ogg", + "aiy310000560.ogg", + "aiy310000570.ogg", + "aiy310000580.ogg", + "aiy310000590.ogg", + "aiy310000600.ogg", + "aiy310000610.ogg", + "aiy310000620.ogg", + "aiy310000630.ogg", + "aiy310000640.ogg", + "aiy310000650.ogg", + "aiy310000660.ogg", + "aiy310000670.ogg", + "aiy310000680.ogg", + "aiy310000690.ogg", + "aiy310000700.ogg", + "aiy310000710.ogg", + "aiy310000720.ogg", + "aiy310000730.ogg", + "aiy310000740.ogg", + "aiy310000750.ogg", + "aiy310000760.ogg", + "aiy310000770.ogg", + "aiy310000780.ogg", + "aiy310000790.ogg", + "aiy310000800.ogg", + "aiy310000810.ogg", + "aiy310000820.ogg", + "aiy310000830.ogg", + "aiy310000840.ogg", + "aiy310000850.ogg", + "aiy310000860.ogg", + "aiy310000870.ogg", + "aiy310000880.ogg", + "aiy310000890.ogg", + "aiy310000900.ogg", + "aiy310000910.ogg", + "aiy310000920.ogg", + "aiy310000930.ogg", + "aiy310000940.ogg", + "aiy310000950.ogg", + "aiy310000960.ogg", + "aiy310000970.ogg", + "aiy310000980.ogg", + "aiy310000990.ogg", + "aiy310001000.ogg", + "aiy310001010.ogg", + "aiy310001027.ogg", + "aiy310001030.ogg", + "aiy310001040.ogg", + "aiy310001050.ogg", + "aiy310001060.ogg", + "aiy310001070.ogg", + "aiy310001080.ogg", + "aiy310001090.ogg", + "aiy310001100.ogg", + "aiy310001110.ogg", + "aiy310001120.ogg", + "aiy310001130.ogg", + "aiy310001140.ogg", + "aiy310001150.ogg", + "aiy310001160.ogg", + "aiy310001170.ogg", + "aiy310001180.ogg", + "aiy310001190.ogg", + "aiy310001200.ogg", + "aiy310001210.ogg", + "aiy310001220.ogg", + "aiy310001230.ogg", + "aiy310001240.ogg", + "aiy310001250.ogg", + "aiy310001260.ogg", + "aiy310001270.ogg", + "aiy310001280.ogg", + "aiy310001290.ogg", + "aiy310001300.ogg", + "aiy310001310.ogg", + "aiy310001320.ogg", + "aiy310001330.ogg", + "aiy310001340.ogg", + "aiy310001350.ogg", + "aiy310001360.ogg", + "aiy310001370.ogg", + "aiy310001380.ogg", + "aiy310001390.ogg", + "aiy320000010.ogg", + "aiy320000020.ogg", + "aiy320000030.ogg", + "aiy320000040.ogg", + "aiy320000050.ogg", + "aiy320000060.ogg", + "aiy320000070.ogg", + "aiy320000080.ogg", + "aiy320000090.ogg", + "aiy320000100.ogg", + "aiy320000110.ogg", + "aiy320000120.ogg", + "aiy320000135.ogg", + "aiy320000140.ogg", + "aiy340000010.ogg", + "aiy340000020.ogg", + "aiy340000030.ogg", + "aiy340000040.ogg", + "aiy340000050.ogg", + "aiy340000060.ogg", + "aiy340000070.ogg", + "aiy340000080.ogg", + "aiy340000090.ogg", + "aiy340000100.ogg", + "aiy340000110.ogg", + "aiy340000120.ogg", + "aiy340000140.ogg", + "aiy340000150.ogg", + "aiy340000160.ogg", + "aiy340000170.ogg", + "aiy340000180.ogg", + "aiy340000190.ogg", + "aiy340000200.ogg", + "aiy340000210.ogg", + "aiy340000220.ogg", + "aiy340000230.ogg", + "aiy340000240.ogg", + "aiy340000250.ogg", + "aiy340000260.ogg", + "aiy340000270.ogg", + "aiy340000280.ogg", + "aiy340000290.ogg", + "aiy340000300.ogg", + "aiy340000310.ogg", + "aiy340000320.ogg", + "aiy340000330.ogg", + "aiy340000340.ogg", + "aiy340000350.ogg", + "aiy340000360.ogg", + "aiy340000370.ogg", + "aiy340000380.ogg", + "aiy340000390.ogg", + "aiy340000400.ogg", + "aiy340000410.ogg", + "aiy340000420.ogg", + "aiy340000430.ogg", "aiy350000010.opus", "aiy350000020.opus", "aiy350000030.opus", @@ -978,6 +1305,52 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy350000210.opus", "aiy350000220.opus", "aiy350000230.opus", + "aiy350000240.ogg", + "aiy350000250.ogg", + "aiy350000260.ogg", + "aiy430000010.ogg", + "aiy430000020.ogg", + "aiy430000030.ogg", + "aiy430000040.ogg", + "aiy430000050.ogg", + "aiy430000060.ogg", + "aiy430000070.ogg", + "aiy430000080.ogg", + "aiy430000090.ogg", + "aiy430000100.ogg", + "aiy430000110.ogg", + "aiy430000120.ogg", + "aiy430000130.ogg", + "aiy430000140.ogg", + "aiy430000150.ogg", + "aiy430000160.ogg", + "aiy430000170.ogg", + "aiy430000180.ogg", + "aiy430000190.ogg", + "aiy430000200.ogg", + "aiy430000210.ogg", + "aiy430000220.ogg", + "aiy430000230.ogg", + "aiy430000240.ogg", + "aiy430000250.ogg", + "aiy430000260.ogg", + "aiy430000270.ogg", + "aiy430000280.ogg", + "aiy430000290.ogg", + "aiy440000010.ogg", + "aiy440000020.ogg", + "aiy440000030.ogg", + "aiy440000040.ogg", + "aiy440000050.ogg", + "aiy440000060.ogg", + "aiy440000070.ogg", + "aiy440000080.ogg", + "aiy440000090.ogg", + "aiy440000100.ogg", + "aiy440000110.ogg", + "aiy440000120.ogg", + "aiy510000010.ogg", + "aiy510000020.ogg", "aiy710000010.opus", "aiy710000020.opus", "aiy710000030.opus", @@ -991,9 +1364,68 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy710000110.opus", "aiy710000120.opus", "aiy710000130.opus", + "aiy720000010.ogg", + "aiy730000010.ogg", + "aiy740000010.ogg", + "aiy750000010.ogg", + "aiy750000020.ogg", + "aiy750000030.ogg", + "aiy750000040.ogg", + "aiy750000050.ogg", + "aiy750000060.ogg", + "aiy750000070.ogg", + "aiy750000080.ogg", + "aiy750000090.ogg", + "aiy750000100.ogg", + "aiy750000110.ogg", + "aiy750000120.ogg", + "aiy750000130.ogg", + "aiy750000140.ogg", + "aiy750000150.ogg", + "aiy750000160.ogg", + "aiy750000170.ogg", + "aiy750000180.ogg", + "aiy750000190.ogg", + "aiy750000200.ogg", + "aiy750000210.ogg", + "aiy750000220.ogg", + "aiy750000230.ogg", + "aiy750000240.ogg", + "aiy750000250.ogg", + "aiy750000260.ogg", + "aiy750000270.ogg", + "aiy750000280.ogg", + "aiy750000290.ogg", + "aiy750000300.ogg", + "aiy750000310.ogg", + "aiy750000320.ogg", + "aiy750000330.ogg", + "aiy750000340.ogg", + "aiy800000010.ogg", + "aiy800000020.ogg", + "aiy800000030.ogg", + "aiy800000040.ogg", + "aiy800000050.ogg", + "aiy800000060.ogg", + "aiy800000070.ogg", + "aiy800000080.ogg", + "aiy800000090.ogg", + "aiy800000100.ogg", + "aiy810000010.ogg", + "aiy810000020.ogg", + "aiy810000030.ogg", + "aiy810000040.ogg", + "aiy810000050.ogg", + "aiy810000060.ogg", + "aiy810000070.ogg", "aiy820000010.opus", "aiy820000020.opus", - "attack.opus", + "aiy860000010.ogg", + "aiy860000020.ogg", + "aiy860000030.ogg", + "aiy860000040.ogg", + "aiy860000050.ogg", + "aiy860000060.ogg", "attack.opus", "bomb.opus", "cancel.opus", @@ -1019,9 +1451,9 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = ], "fonts": [ "HATTEN", + "Verdana", "number", - "pala", - "simhei" + "pala" ], "nameMap": { "确定": "confirm.opus", @@ -1057,7 +1489,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "饰品", "饰品" ], - "startBgm": "theme.opus", + "startBgm": "theme.mp3", "styles": { "startBackground": "project/images/background.webp", "startVerticalBackground": "project/images/backgroundvertical.webp", @@ -1091,22 +1523,22 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = }, "firstData": { "title": "秽翼的尤斯蒂娅", - "name": "Eustia", + "name": "Eustia_text", "version": "鸽子窝造塔小队", - "floorId": "street01", + "floorId": "chushi", "hero": { "image": "hero.webp", "animate": false, - "name": "Caim", + "name": "凯伊姆", "lv": 1, "hpmax": 9999, "hp": 1000, "manamax": -1, "mana": 0, - "atk": 100, - "def": 100, - "mdef": 0, - "speed": 0, + "atk": 26, + "def": 16, + "mdef": 100, + "speed": 16, "money": 0, "exp": 0, "equipment": [], @@ -1117,15 +1549,21 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = }, "loc": { "direction": "up", - "x": 5, - "y": 11 + "x": 6, + "y": 6 }, "flags": { "itemDetail": true, - "useBetweenLight": true + "useBetweenLight": true, + "__mdef_buff__": 0, + "popmove": true }, "followers": [], - "steps": 0 + "steps": 0, + "matk": 0, + "spell": 0, + "spelldef": 0, + "mhp": 100 }, "startCanvas": [ { @@ -1441,7 +1879,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = }, { "type": "function", - "function": "function(){\ncore.control.checkBgm()\n}" + "function": "function(){\ncore.checkBgm()\n}" }, { "type": "if", @@ -1481,14 +1919,30 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = ], "startText": [ { - "type": "setValue", - "name": "item:book", - "value": "1" + "type": "setText" }, { - "type": "setValue", - "name": "item:fly", - "value": "1" + "type": "setHeroOpacity", + "opacity": 0 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 500, + "keep": true + }, + { + "type": "function", + "function": "function(){\ncore.getItem('book', 1);\ncore.getItem('fly', 1);\ncore.getItem('postman', 1);\ncore.getItem('I369', 1);\n}" + }, + { + "type": "insert", + "name": "强制横屏" } ], "shops": [ @@ -1657,13 +2111,13 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "lavaDamage": 100, "poisonDamage": 10, "weakValue": 20, - "redGem": 3, - "blueGem": 3, + "redGem": 2, + "blueGem": 2, "greenGem": 5, "redPotion": 100, "bluePotion": 250, "yellowPotion": 500, - "greenPotion": 800, + "greenPotion": 900, "breakArmor": 0.9, "counterAttack": 0.1, "purify": 3, @@ -1671,7 +2125,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "animateSpeed": 300, "moveSpeed": 100, "statusCanvasRowsOnMobile": 3, - "floorChangeTime": 500 + "floorChangeTime": 0, + "yellowGem": 2 }, "flags": { "statusBarItems": [ diff --git a/project/enemys.js b/project/enemys.js index 931f40a..5e8a014 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -1,84 +1,88 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = { - "greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10}, - "blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "slimelord": {"name":"怪王","hp":100,"atk":120,"def":0,"money":10,"exp":0,"point":0,"special":[1,9]}, - "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1]}, - "bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]}, - "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8}, - "skeleton": {"name":"骷髅人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "skeletonCaptain": {"name":"骷髅队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "zombie": {"name":"兽人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"magic":false}, - "zombieKnight": {"name":"兽人武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3}, - "bluePriest": {"name":"初级法师","hp":100,"atk":120,"def":0,"money":3,"exp":0,"point":1,"special":[9]}, - "redPriest": {"name":"高级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "brownWizard": {"name":"初级巫师","hp":100,"atk":120,"def":0,"money":16,"exp":0,"point":0,"special":15,"value":100,"range":2}, - "redWizard": {"name":"高级巫师","hp":1000,"atk":1200,"def":0,"money":160,"exp":0,"point":0,"special":15,"value":200,"zoneSquare":true}, - "swordsman": {"name":"双手剑士","hp":100,"atk":120,"def":0,"money":6,"exp":3,"point":0,"special":4}, - "soldier": {"name":"冥战士","hp":120,"atk":50,"def":8,"money":10,"exp":7,"point":0,"special":0}, - "yellowKnight": {"name":"金骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redKnight": {"name":"红骑士","hp":500,"atk":200,"def":50,"money":0,"exp":0,"point":0,"special":[7]}, - "darkKnight": {"name":"黑骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "blueKnight": {"name":"蓝骑士","hp":100,"atk":120,"def":0,"money":9,"exp":0,"point":0,"special":8}, - "goldSlime": {"name":"黄头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "poisonSkeleton": {"name":"紫骷髅","hp":50,"atk":60,"def":70,"money":80,"exp":0,"point":0,"special":13}, - "poisonBat": {"name":"紫蝙蝠","hp":100,"atk":120,"def":0,"money":14,"exp":0,"point":0,"special":13}, - "skeletonPriest": {"name":"骷髅法师","hp":100,"atk":100,"def":0,"money":0,"exp":0,"point":0,"special":18,"value":20}, - "skeletonKing": {"name":"骷髅王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "evilHero": {"name":"迷失勇者","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "demonPriest": {"name":"魔神法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "goldHornSlime": {"name":"金角怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "silverSlime": {"name":"银头怪","hp":100,"atk":120,"def":0,"money":15,"exp":0,"point":0,"special":14}, + "greenSlime": {"name":"绿头怪","hp":64,"atk":32,"def":2,"money":0,"exp":1,"point":0,"special":[],"mdef":0,"spell":0,"speed":17}, + "redSlime": {"name":"红头怪","hp":84,"atk":27,"def":6,"money":0,"exp":1,"point":0,"special":[],"value":null,"mdef":0,"spell":0,"speed":19}, + "blackSlime": {"name":"青头怪","hp":222,"atk":46,"def":10,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":15,"damage":null}, + "slimelord": {"name":"怪王","hp":790,"atk":48,"def":8,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":20}, + "bat": {"name":"小蝙蝠","hp":46,"atk":49,"def":0,"money":0,"exp":1,"point":0,"special":[1],"mdef":0,"speed":29,"spell":0}, + "bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":1}, + "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8,"mdef":0,"spell":0,"speed":1}, + "skeleton": {"name":"骷髅人","hp":77,"atk":77,"def":7,"money":0,"exp":2,"point":0,"special":0,"mdef":0,"spell":0,"speed":17}, + "skeletonCaptain": {"name":"骷髅队长","hp":226,"atk":66,"def":1,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":18}, + "zombie": {"name":"兽人","hp":444,"atk":43,"def":9,"money":0,"exp":3,"point":0,"special":[],"mdef":0,"spell":0,"speed":27}, + "zombieKnight": {"name":"兽人武士","hp":10000,"atk":100,"def":100,"money":0,"exp":0,"point":0,"special":[22],"speed":10,"mdef":0,"damage2":20,"spell":0}, + "rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3,"damage2":15,"mdef":0,"spell":0,"speed":1}, + "bluePriest": {"name":"初级法师","hp":108,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":270,"speed":12}, + "redPriest": {"name":"高级法师","hp":162,"atk":0,"def":1,"money":0,"exp":0,"point":0,"special":[1],"mdef":0,"spell":308,"speed":14}, + "brownWizard": {"name":"初级巫师","hp":162,"atk":120,"def":1,"money":16,"exp":0,"point":0,"special":[],"value":null,"range":2,"mdef":0,"spell":66,"speed":14}, + "redWizard": {"name":"高级巫师","hp":1000,"atk":1200,"def":0,"money":160,"exp":0,"point":0,"special":15,"value":200,"zoneSquare":true,"mdef":0,"spell":0,"speed":1}, + "swordsman": {"name":"双手剑士","hp":100,"atk":120,"def":0,"money":6,"exp":3,"point":0,"special":4,"mdef":0,"spell":0,"speed":1}, + "soldier": {"name":"冥战士","hp":120,"atk":50,"def":8,"money":10,"exp":7,"point":0,"special":0,"mdef":0,"spell":0,"speed":8}, + "yellowKnight": {"name":"金骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redKnight": {"name":"红骑士","hp":500,"atk":200,"def":50,"money":0,"exp":0,"point":0,"special":[7],"mdef":0,"spell":0,"speed":1}, + "darkKnight": {"name":"黑骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blueKnight": {"name":"蓝骑士","hp":100,"atk":120,"def":0,"money":9,"exp":0,"point":0,"special":8,"mdef":0,"spell":0,"speed":1}, + "goldSlime": {"name":"黄头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "poisonSkeleton": {"name":"紫骷髅","hp":50,"atk":60,"def":70,"money":80,"exp":0,"point":0,"special":13,"mdef":0,"spell":0,"speed":1}, + "poisonBat": {"name":"紫蝙蝠","hp":100,"atk":120,"def":0,"money":14,"exp":0,"point":0,"special":13,"mdef":0,"spell":0,"speed":1}, + "skeletonPriest": {"name":"骷髅法师","hp":100,"atk":100,"def":0,"money":0,"exp":0,"point":0,"special":18,"value":20,"mdef":0,"spell":0,"speed":1}, + "skeletonKing": {"name":"骷髅王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "evilHero": {"name":"迷失勇者","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "demonPriest": {"name":"魔神法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "goldHornSlime": {"name":"小恶魔","hp":126,"atk":48,"def":12,"money":0,"exp":2,"point":0,"special":0,"mdef":0,"spell":0,"speed":16}, + "silverSlime": {"name":"银头怪","hp":100,"atk":120,"def":0,"money":15,"exp":0,"point":0,"special":14,"mdef":0,"spell":0,"speed":1}, "whiteHornSlime": {"name":"尖角怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redSwordsman": {"name":"剑王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]}, - "poisonZombie": {"name":"绿兽人","hp":100,"atk":120,"def":0,"money":13,"exp":0,"point":0,"special":[12]}, - "octopus": {"name":"血影","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null}, - "princessEnemy": {"name":"假公主","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "angel": {"name":"天使","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "elemental": {"name":"元素生物","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "steelGuard": {"name":"铁守卫","hp":50,"atk":50,"def":50,"money":0,"exp":0,"point":0,"special":[18],"value":20}, - "evilBat": {"name":"邪恶蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "silverSlimelord": {"name":"银怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "goldSlimelord": {"name":"金怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "skeletonWarrior": {"name":"骷髅士兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "whiteSlimeman": {"name":"水银战士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "slimeman": {"name":"影子战士","hp":100,"atk":0,"def":0,"money":11,"exp":0,"point":0,"special":[9],"atkValue":2,"defValue":3}, - "yellowGateKeeper": {"name":"初级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0}, - "blueGateKeeper": {"name":"中级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0}, - "redGateKeeper": {"name":"高级卫兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "magicMaster": {"name":"黑暗大法师","hp":100,"atk":120,"def":0,"money":12,"exp":0,"point":0,"special":11,"value":0.3333333333333333,"add":true,"notBomb":true}, - "devilWarrior": {"name":"魔神武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "fairyEnemy": {"name":"仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "dragon": {"name":"魔龙","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null}, - "skeletonKnight": {"name":"骷髅武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "skeletonPresbyter": {"name":"骷髅巫师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "ironRock": {"name":"铁面人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "grayRock": {"name":"灰色石头人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "yellowPriest": {"name":"中级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "evilPrincess": {"name":"痛苦魔女","hp":1000,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[10]}, + "redSwordsman": {"name":"剑王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":1}, + "poisonZombie": {"name":"绿兽人","hp":100,"atk":120,"def":0,"money":13,"exp":0,"point":0,"special":[12],"mdef":0,"spell":0,"speed":1}, + "octopus": {"name":"血影","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null,"mdef":0,"spell":0,"speed":1}, + "princessEnemy": {"name":"假公主","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "angel": {"name":"天使","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "elemental": {"name":"元素生物","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "steelGuard": {"name":"铁守卫","hp":50,"atk":50,"def":50,"money":0,"exp":0,"point":0,"special":[18],"value":20,"mdef":0,"spell":0,"speed":1}, + "evilBat": {"name":"邪恶蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "silverSlimelord": {"name":"银怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "goldSlimelord": {"name":"金怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "skeletonWarrior": {"name":"骷髅士兵","hp":226,"atk":66,"def":1,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":18,"displayIdInBook":null}, + "whiteSlimeman": {"name":"水银战士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "slimeman": {"name":"影子战士","hp":243,"atk":28,"def":5,"money":0,"exp":0,"point":0,"special":[],"atkValue":2,"defValue":3,"mdef":0,"spell":0,"speed":69}, + "yellowGateKeeper": {"name":"初级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blueGateKeeper": {"name":"中级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redGateKeeper": {"name":"高级卫兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "magicMaster": {"name":"黑暗大法师","hp":100,"atk":120,"def":0,"money":12,"exp":0,"point":0,"special":11,"value":0.3333333333333333,"add":true,"notBomb":true,"mdef":0,"spell":0,"speed":1}, + "devilWarrior": {"name":"魔神武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "fairyEnemy": {"name":"仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "dragon": {"name":"魔龙","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null,"mdef":0,"spell":0,"speed":1}, + "skeletonKnight": {"name":"骷髅武士","hp":330,"atk":113,"def":2,"money":0,"exp":4,"point":0,"special":0,"mdef":0,"spell":0,"speed":20}, + "skeletonPresbyter": {"name":"骷髅巫师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "ironRock": {"name":"铁面人","hp":111,"atk":97,"def":37,"money":0,"exp":0,"point":0,"special":[3],"mdef":0,"spell":0,"speed":14}, + "grayRock": {"name":"灰色石头人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "yellowPriest": {"name":"中级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "evilPrincess": {"name":"痛苦魔女","hp":1000,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[10],"mdef":0,"spell":0,"speed":1}, "blademaster": {"name":"剑圣","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "evilFairy": {"name":"黑暗仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "greenKnight": {"name":"强盾骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "bowman": {"name":"初级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "watcherSlime": {"name":"邪眼怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "devilKnight": {"name":"恶灵骑士","hp":150,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":[1,5,7,8]}, - "grayPriest": {"name":"混沌法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "greenGateKeeper": {"name":"卫兵队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "ghostSoldier": {"name":"冥队长","hp":200,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":8}, - "frostBat": {"name":"寒蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "blackKing": {"name":"黑衣魔王","hp":1000,"atk":500,"def":0,"money":1000,"exp":1000,"point":0,"special":0,"notBomb":true}, - "yellowKing": {"name":"黄衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "greenKing": {"name":"青衣武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redKing": {"name":"红衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "blueKing": {"name":"白衣武士","hp":100,"atk":120,"def":0,"money":17,"exp":0,"point":0,"special":[16]}, - "keiskeiFairy": {"name":"铃兰花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "tulipFairy": {"name":"郁金香花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "purpleBowman": {"name":"高级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "bearDown": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"bigImage":"bear.png"}, - "bearLeft": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"}}, - "bearRight": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"}}, - "bearUp": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"}} + "evilFairy": {"name":"黑暗仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "greenKnight": {"name":"强盾骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "bowman": {"name":"初级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "watcherSlime": {"name":"邪眼怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "devilKnight": {"name":"恶灵骑士","hp":150,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":[1,5,7,8],"mdef":0,"spell":0,"speed":1}, + "grayPriest": {"name":"混沌法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "greenGateKeeper": {"name":"卫兵队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "ghostSoldier": {"name":"冥队长","hp":200,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":8,"mdef":0,"spell":0,"speed":1}, + "frostBat": {"name":"寒蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blackKing": {"name":"黑衣魔王","hp":1000,"atk":500,"def":0,"money":1000,"exp":1000,"point":0,"special":0,"notBomb":true,"mdef":0,"spell":0,"speed":1}, + "yellowKing": {"name":"黄衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "greenKing": {"name":"青衣武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redKing": {"name":"红衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blueKing": {"name":"白衣武士","hp":100,"atk":120,"def":0,"money":17,"exp":0,"point":0,"special":[16],"mdef":0,"spell":0,"speed":1}, + "keiskeiFairy": {"name":"铃兰花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "tulipFairy": {"name":"郁金香花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "purpleBowman": {"name":"高级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "bearDown": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"bigImage":"bear.png","mdef":0,"spell":0,"speed":1}, + "bearLeft": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"mdef":0,"spell":0,"speed":1}, + "bearRight": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"mdef":0,"spell":0,"speed":1}, + "bearUp": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"mdef":0,"spell":0,"speed":1}, + "E421": {"name":"蓝头怪","hp":104,"atk":33,"def":8,"money":0,"exp":1,"point":0,"special":[],"value":null,"mdef":0,"spell":0,"speed":19,"displayIdInBook":null}, + "E422": {"name":"新敌人","hp":0,"atk":0,"def":0,"mdef":0,"speed":1,"money":0,"exp":0,"point":0,"special":[]}, + "E425": {"name":"黄骷髅","hp":226,"atk":66,"def":1,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":18,"displayIdInBook":null}, + "E426": {"name":"小偷","hp":377,"atk":53,"def":17,"mdef":0,"speed":34,"money":50,"exp":10,"point":0,"special":[],"spell":0} } \ No newline at end of file diff --git a/project/events.js b/project/events.js index 1e860d2..634691d 100644 --- a/project/events.js +++ b/project/events.js @@ -154,1051 +154,964 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "time": 50 }, { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "引入" - }, - { - "type": "over", - "text": "人生不如意事,十常居七八。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "世间的万物皆被装缀着不公的色彩。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "没错,就像——", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "十几年前的那一天,", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "在都市的角落,同许多的生命共同消逝一般。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "没错,就像——", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "十几年前的那天起以来,", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "无数的生命被那无法逃脱的污泥囚禁一样。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "人生不如意事,十常居七八。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "世间的万物皆被装缀着不公的色彩。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "没错,就像——", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "如今,这一天。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "other_0001.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "这些天,街道不曾下雨。", - "bodyList": [ + "type": "confirm", + "text": "跳过傻逼不能点点点快进的旁白", + "yes": [], + "no": [ { - "name": "", - "px": 100, - "filter": false + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "bg_0000.png", + "memory2": false, + "time": 30, + "style": "引入" + }, + { + "type": "over", + "text": "人生不如意事,十常居七八。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "世间的万物皆被装缀着不公的色彩。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "没错,就像——", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "十几年前的那一天,", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "在都市的角落,同许多的生命共同消逝一般。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "没错,就像——", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "十几年前的那天起以来,", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "无数的生命被那无法逃脱的污泥囚禁一样。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "人生不如意事,十常居七八。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "世间的万物皆被装缀着不公的色彩。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "没错,就像——", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "如今,这一天。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "changebg", + "img1": "bg_0000.png", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "引出" } ] }, { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。", - "bodyList": [ + "type": "confirm", + "text": "我他妈要全跳了", + "yes": [], + "no": [ { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。", - "bodyList": [ + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "other_0001.webp", + "memory2": false, + "time": 30, + "style": "引入" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0001.webp", - "memory1": false, - "img2": "bg_3563.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "扑哧。", - "bodyList": [ + "type": "playBgm", + "name": "Blood_Stain.opus", + "keep": true + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "耳旁再次响起象征着某个女孩子死去的声音。", - "bodyList": [ + "type": "cgtextList", + "textList": "chapter000" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "再一次——", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "再一次。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "1", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "女子们被肢解成单纯的肉块。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "2", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我任由流下的血浸满全身,屏住自己的呼吸。", - "bodyList": [ + "type": "changebg", + "img1": "other_0001.webp", + "memory1": false, + "img2": "bg_3563.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "祈求自己能拥有从猎人手中逃脱的幸运。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "3", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "扑哧。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "4", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3563.webp", - "memory1": false, - "img2": "other_0002.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "直到刚才,我们还坐在去往娼馆的马车的路上。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "5", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "而在这之中的某些人,已经不在这个世上了。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "6", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "不,应该把“某些”换成“几乎所有”才更为恰当吧。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "7", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "恐怕,不久之后我也会变成小巷中血腥的装饰品。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "8", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我是为了得到这种死法,才辛苦苟活至今的吗?", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "9", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "来个人告诉我啊——", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "10", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "谁都好。", - "bodyList": [ + "type": "changebg", + "img1": "bg_3563.webp", + "memory1": false, + "img2": "other_0002.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "来人啊!!", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "11", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0002.webp", - "memory1": false, - "img2": "other_0001.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "少女", - "time": 30, - "wait": 1000, - "sound": "aiy010000010.opus", - "text": "「呃······!?」", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "12", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0001.webp", - "memory1": false, - "img2": "other_0003.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "漆黑的物体充斥了我的整个视野", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "13", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我很快意识到,那是只很大的脚。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "14", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0003.webp", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "必须要出声求救。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "15", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "other_0003.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "可是,耳中却只能听到自己的牙关不停交战的声音。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "16", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 50, - "wait": 1000, - "sound": "", - "text": "我是如此的无助。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "17", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0003.webp", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "逃跑也好,道歉也罢。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "18", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "就连抬头看一眼将要杀掉我的人的面孔都做不到。", - "bodyList": [ + "type": "changebg", + "img1": "other_0002.webp", + "memory1": false, + "img2": "other_0001.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "少女", - "time": 30, - "wait": 2000, - "sound": "aiy010000020.opus", - "text": "「······被杀」", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "19", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "会被杀。", - "bodyList": [ + "type": "changebg", + "img1": "other_0001.webp", + "memory1": false, + "img2": "other_0003.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "会被杀!!", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "20", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。", - "bodyList": [ + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "21", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "少女", - "time": 30, - "wait": 1000, - "sound": "aiy010000030.opus", - "text": "「不,不要······」", - "bodyList": [ + "type": "changebg", + "img1": "other_0003.webp", + "memory1": false, + "img2": "bg_0000.png", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "22", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "changebg", + "img1": "bg_0000.png", + "memory1": false, + "img2": "other_0003.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "23", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "24", + "time": 50, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "changebg", + "img1": "other_0003.webp", + "memory1": false, + "img2": "bg_0000.png", + "memory2": false, + "time": 30, + "style": "场景切换" + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "25", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "26", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "27", + "time": 30, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "28", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "29", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "30", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "31", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "changebg", + "img1": "bg_0000.png", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "引出" } ] }, @@ -1206,2163 +1119,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "type": "playBgm", "name": "Blind_Alley.opus", "keep": true - }, - { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "bg_6004.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "浮游都市,《诺瓦斯·艾蒂尔》。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "《特别受灾地区》——", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "通称,《牢狱》", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000010.opus", - "text": "「放开我!」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000020.opus", - "text": "「我只是在帮那个女人而已!」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_6004.webp", - "memory1": false, - "img2": "other_0004.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000030.opus", - "text": "「你们没听到吗!?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000040.opus", - "text": "「她是被受骗才会被卖到娼馆来的」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000050.opus", - "text": "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0004.webp", - "memory1": false, - "img2": "bg_3601.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000060.opus", - "text": "「给我说些什么啊」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000010.opus", - "text": "「这些话等到了娼馆再说吧」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000020.opus", - "text": "「我来抓你,只是受雇于人而已」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3601.webp", - "memory1": false, - "img2": "bg_3531.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我走进娼馆《莉莉乌姆》的接待室。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000010.opus", - "text": "「这不是凯伊姆先生吗,辛苦了」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000020.opus", - "text": "「委托已经完成了吗?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000030.opus", - "text": "「啊啊,是这家伙没错吧」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000030.opus", - "text": "「没错,就是这个人」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000040.opus", - "text": "「是么」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000070.opus", - "text": "「你,你们要对我做什么」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000040.opus", - "text": "「······」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹用一个眼神,就让男人闭上了嘴。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "然后,向我这边转过身来。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000050.opus", - "text": "「抱歉啊,总是麻烦你去做这些无聊的事」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000060.opus", - "text": "「都怪我们这边的年轻人太没用」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000050.opus", - "text": "「客套话就免了」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000070.opus", - "text": "「这还真是失礼了」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000080.opus", - "text": "「喂,来个人」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "光头男人", - "time": 30, - "wait": 1000, - "sound": "aiy820000010.opus", - "text": "「是」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000090.opus", - "text": "「凯伊姆先生做完工作回来了」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "光头男人", - "time": 30, - "wait": 1000, - "sound": "aiy820000020.opus", - "text": "「是,是,那个······」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000100.opus", - "text": "「我是要你拿些酒来,这个蠢材!」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "喀!", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹扔出的烟灰缸砸中了手下的额头。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "鲜血四溅。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000060.opus", - "text": "「不用这么麻烦」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000070.opus", - "text": "「我接下来要去《菲诺列塔》」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000110.opus", - "text": "「喔唷」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000120.opus", - "text": "「既然如此,我就不留您在这里喝难饮的劣质酒了」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000080.opus", - "text": "「用这些钱去买药」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我将几枚铜钱仍在那个手下的身前。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000130.opus", - "text": "「凯伊姆先生,不用对他们这么好」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000090.opus", - "text": "「无妨」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000100.opus", - "text": "「话说回来,那个要落跑的女人呢?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000140.opus", - "text": "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000150.opus", - "text": "「正好,趁此机会凯伊姆先生也来享受一番如何?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000080.opus", - "text": "「你,你们这些家伙,要对她做什么!?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "咣!", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹给了他一拳。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "一击即倒。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "喀,咚,咯!", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹毫不留情地向男人的脸上踩去。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000090.opus", - "text": "「咕······呃咳······」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "折断的牙齿伴着血泡被吐出。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "这份白色在鲜红色的液体中格外显眼。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000100.opus", - "text": "「你们以为做出这种事······卫兵会坐视不理吗······」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000160.opus", - "text": "「啊啊,不会坐视不理的」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000170.opus", - "text": "「应该会拿出你的钱包,和我们商量如何瓜分吧」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000110.opus", - "text": "「那,那种事······」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "这在牢狱是理所当然的事。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 2000, - "sound": "aiy350000180.opus", - "text": "「怎么,头一回来牢狱么?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "男人点了点头。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000190.opus", - "text": "「为了被骗的女人而来到牢狱,真是个规矩人啊」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000200.opus", - "text": "「······前提是,被骗的人不是你」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000120.opus", - "text": "「你说······我被骗了?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "年轻人", - "time": 30, - "wait": 1000, - "sound": "aiy710000130.opus", - "text": "「那,那是怎么回事!?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000210.opus", - "text": "「不用急,今天晚上会好好告诉你的」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "奥兹抓起男人的脸。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "不过,想要逃脱追击本来就是不可能的任务。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "但即便如此,这种事情还是会一再的出现。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "说谎的女人和被骗的男人。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "在娼馆街,这是令人看到生厌的日常的风景。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000110.opus", - "text": "「我要走了」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000220.opus", - "text": "「好的,下次再麻烦您」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "奥兹", - "time": 30, - "wait": 1000, - "sound": "aiy350000230.opus", - "text": "「之后吉克先生会将谢礼交给您的」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000120.opus", - "text": "「啊啊」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "我背向奥兹走出娼馆。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000130.opus", - "text": "「······?」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3531.webp", - "memory1": false, - "img2": "bg_3601.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "从远方传来微弱的歌声。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "是关卡广场的方向。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "对了。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "今天有觐见圣女的仪式。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "当代的圣女伊莲——", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "广场上的人估计相当多吧。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "还是老老实实去菲诺列塔喝烧酒吧。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "", - "time": 30, - "wait": 1000, - "sound": "", - "text": "正当我这样想着的时候,一个身影自小巷的那头走来。", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3601.webp", - "memory1": false, - "img2": "bg_3531.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "name": "凯伊姆", - "time": 30, - "wait": 1000, - "sound": "aiy310000140.opus", - "text": "「艾莉斯」", - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3531.webp", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "引出" - }, - { - "type": "comment", - "text": "好多立绘,先更这点(吐槽一下)" } ], "chapter01": [ @@ -3375,20 +1131,20 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "time": 30, "style": "引入" }, + { + "type": "cgtextList", + "textList": "chapter01" + }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020106.webp", "px": -300 }, - "name": "艾莉斯", + "index": "0", "time": 30, "wait": 1000, - "sound": "aiy020000005.opus", - "text": "「啊,凯伊姆」", "bodyList": [ { "name": "", @@ -3397,20 +1153,20 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = } ] }, + { + "type": "playBgm", + "name": "Halbmond.opus" + }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020141.webp", "px": -300 }, - "name": "艾莉斯", + "index": "1", "time": 30, "wait": 1000, - "sound": "aiy020000010.opus", - "text": "「正好,我还想要去找你呢」", "bodyList": [ { "name": "tati_020141.webp", @@ -3421,18 +1177,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020157.webp", "px": -300 }, - "name": "艾莉斯", + "index": "2", "time": 30, "wait": 1000, - "sound": "aiy020000020.opus", - "text": "「没想到凯伊姆会主动出现······这是命运吗?」", "bodyList": [ { "name": "tati_020157.webp", @@ -3443,18 +1195,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "3", "time": 30, "wait": 1000, - "sound": "aiy310000150.opus", - "text": "「显然不是吧」", "bodyList": [ { "name": "tati_020157.webp", @@ -3465,18 +1213,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020107.webp", "px": -300 }, - "name": "艾莉斯", + "index": "4", "time": 30, "wait": 1000, - "sound": "aiy020000030.opus", - "text": "「啊,是么」", "bodyList": [ { "name": "tati_020107.webp", @@ -3487,18 +1231,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "5", "time": 30, "wait": 1000, - "sound": "", - "text": "艾莉斯挑了挑整齐的双眉,微微地哼了一声。", "bodyList": [ { "name": "tati_020107.webp", @@ -3509,18 +1249,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "6", "time": 30, "wait": 1000, - "sound": "", - "text": "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", "bodyList": [ { "name": "tati_020107.webp", @@ -3531,18 +1267,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "7", "time": 30, "wait": 1000, - "sound": "", - "text": "给人印象最深的,就是那潭水般的双瞳。", "bodyList": [ { "name": "tati_020107.webp", @@ -3553,18 +1285,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "8", "time": 30, "wait": 1000, - "sound": "", - "text": "在漆黑的瞳孔中,完全看不出感情的波动。", "bodyList": [ { "name": "tati_020107.webp", @@ -3575,18 +1303,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020157.webp", "px": -300 }, - "name": "艾莉斯", + "index": "9", "time": 30, "wait": 1000, - "sound": "aiy020000040.opus", - "text": "「喜欢我的眼睛吗?」", "bodyList": [ { "name": "tati_020157.webp", @@ -3597,18 +1321,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020157.webp", "px": -300 }, - "name": "艾莉斯", + "index": "10", "time": 30, "wait": 1000, - "sound": "aiy020000050.opus", - "text": "「如果想要的话就给你吧?」", "bodyList": [ { "name": "tati_020157.webp", @@ -3619,18 +1339,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "11", "time": 30, "wait": 1000, - "sound": "aiy310000160.opus", - "text": "「用不着」", "bodyList": [ { "name": "tati_020157.webp", @@ -3641,18 +1357,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020111.webp", "px": -300 }, - "name": "艾莉斯", + "index": "12", "time": 30, "wait": 1000, - "sound": "aiy020000060.opus", - "text": "「阿拉,可惜」", "bodyList": [ { "name": "tati_020111.webp", @@ -3663,18 +1375,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "13", "time": 30, "wait": 1000, - "sound": "aiy310000170.opus", - "text": "「那么,找我有什么事」", "bodyList": [ { "name": "tati_020111.webp", @@ -3685,18 +1393,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020101.webp", "px": -300 }, - "name": "艾莉斯", + "index": "14", "time": 30, "wait": 1000, - "sound": "aiy020000070.opus", - "text": "「梅尔特的钱好像被偷了」", "bodyList": [ { "name": "tati_020101.webp", @@ -3707,18 +1411,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "15", "time": 30, "wait": 1000, - "sound": "aiy310000180.opus", - "text": "「钱被偷了?都几岁了还这么没用」", "bodyList": [ { "name": "tati_020101.webp", @@ -3729,18 +1429,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020107.webp", "px": -300 }, - "name": "艾莉斯", + "index": "16", "time": 30, "wait": 1000, - "sound": "aiy020000080.opus", - "text": "「不要对我说啊」", "bodyList": [ { "name": "tati_020107.webp", @@ -3751,18 +1447,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "17", "time": 30, "wait": 1000, - "sound": "aiy310000190.opus", - "text": "「那家伙,该不会说要让我去抓那个小偷吧?」", "bodyList": [ { "name": "tati_020107.webp", @@ -3773,18 +1465,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020157.webp", "px": -300 }, - "name": "艾莉斯", + "index": "18", "time": 30, "wait": 1000, - "sound": "aiy020000090.opus", - "text": "「就是这样」", "bodyList": [ { "name": "tati_020157.webp", @@ -3795,18 +1483,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "19", "time": 30, "wait": 1000, - "sound": "aiy310000200.opus", - "text": "「笨蛋吗」", "bodyList": [ { "name": "tati_020157.webp", @@ -3817,18 +1501,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "20", "time": 30, "wait": 1000, - "sound": "aiy310000210.opus", - "text": "「如果是小钱的话,就当做是买个教训吧」", "bodyList": [ { "name": "tati_020157.webp", @@ -3839,18 +1519,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020125.webp", "px": -300 }, - "name": "艾莉斯", + "index": "21", "time": 30, "wait": 1000, - "sound": "aiy020000100.opus", - "text": "「说起来,被盗的是这个月的上纳金」", "bodyList": [ { "name": "tati_020125.webp", @@ -3861,18 +1537,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "22", "time": 30, "wait": 1000, - "sound": "aiy310000220.opus", - "text": "「你说什么?」", "bodyList": [ { "name": "tati_020125.webp", @@ -3883,18 +1555,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020121.webp", "px": -300 }, - "name": "艾莉斯", + "index": "23", "time": 30, "wait": 1000, - "sound": "aiy020000110.opus", - "text": "「用这些钱买教训,也太过奢侈了呢」", "bodyList": [ { "name": "tati_020121.webp", @@ -3905,18 +1573,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "24", "time": 30, "wait": 1000, - "sound": "aiy310000230.opus", - "text": "「知道了,我去找」", "bodyList": [ { "name": "tati_020121.webp", @@ -3927,18 +1591,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "25", "time": 30, "wait": 1000, - "sound": "aiy310000240.opus", - "text": "「小偷的特征呢」", "bodyList": [ { "name": "tati_020121.webp", @@ -3949,18 +1609,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020105.webp", "px": -300 }, - "name": "艾莉斯", + "index": "26", "time": 30, "wait": 1000, - "sound": "aiy020000120.opus", - "text": "「男孩子」", "bodyList": [ { "name": "tati_020105.webp", @@ -3971,18 +1627,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020103.webp", "px": -300 }, - "name": "艾莉斯", + "index": "27", "time": 30, "wait": 1000, - "sound": "aiy020000130.opus", - "text": "「······而且,背后有翅膀」", "bodyList": [ { "name": "tati_020103.webp", @@ -3993,18 +1645,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020141.webp", "px": -300 }, - "name": "艾莉斯", + "index": "28", "time": 30, "wait": 1000, - "sound": "aiy020000140.opus", - "text": "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」", "bodyList": [ { "name": "tati_020141.webp", @@ -4015,18 +1663,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "29", "time": 30, "wait": 1000, - "sound": "aiy310000250.opus", - "text": "「羽化病吗」", "bodyList": [ { "name": "tati_020141.webp", @@ -4037,18 +1681,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020105.webp", "px": -300 }, - "name": "艾莉斯", + "index": "30", "time": 30, "wait": 1000, - "sound": "aiy020000150.opus", - "text": "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", "bodyList": [ { "name": "tati_020105.webp", @@ -4059,18 +1699,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "31", "time": 30, "wait": 1000, - "sound": "aiy310000260.opus", - "text": "「注意到他逃窜的方向了吗?」", "bodyList": [ { "name": "tati_020105.webp", @@ -4081,18 +1717,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020105.webp", "px": -300 }, - "name": "艾莉斯", + "index": "32", "time": 30, "wait": 1000, - "sound": "aiy020000160.opus", - "text": "「广场那边」", "bodyList": [ { "name": "tati_020105.webp", @@ -4103,18 +1735,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020107.webp", "px": -300 }, - "name": "艾莉斯", + "index": "33", "time": 30, "wait": 1000, - "sound": "aiy020000170.opus", - "text": "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」", "bodyList": [ { "name": "tati_020107.webp", @@ -4125,18 +1753,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "34", "time": 30, "wait": 1000, - "sound": "aiy310000280.opus", - "text": "「偏偏还是广场吗」", "bodyList": [ { "name": "tati_020107.webp", @@ -4147,18 +1771,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_020141.webp", "px": -300 }, - "name": "艾莉斯", + "index": "35", "time": 30, "wait": 1000, - "sound": "aiy020000180.opus", - "text": "「今天是觐见圣女大人的日子」", "bodyList": [ { "name": "tati_020145.webp", @@ -4169,18 +1789,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "36", "time": 30, "wait": 1000, - "sound": "aiy310000290.opus", - "text": "「我知道」", "bodyList": [ { "name": "tati_020145.webp", @@ -4191,18 +1807,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "37", "time": 30, "wait": 1000, - "sound": "aiy310000300.opus", - "text": "「尽量找找看就好」", "bodyList": [ { "name": "tati_020145.webp", @@ -4231,20 +1843,20 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "time": 30, "style": "引入" }, + { + "type": "cgtextList", + "textList": "chapter02" + }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "不蚀金锁成员", + "index": "0", "time": 30, "wait": 1000, - "sound": "", - "text": "「凯伊姆先生,凯伊姆先生」", "bodyList": [ { "name": "", @@ -4255,18 +1867,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "不蚀金锁成员", + "index": "1", "time": 30, "wait": 1000, - "sound": "", - "text": "「您已经和艾莉斯大夫见过面了吗?」", "bodyList": [ { "name": "", @@ -4277,18 +1885,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "2", "time": 30, "wait": 1000, - "sound": "", - "text": "「啊啊,所以才会追过来的」", "bodyList": [ { "name": "", @@ -4299,18 +1903,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "3", "time": 30, "wait": 1000, - "sound": "", - "text": "「看到小偷了吗?」", "bodyList": [ { "name": "", @@ -4321,18 +1921,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "不蚀金锁成员", + "index": "4", "time": 30, "wait": 1000, - "sound": "", - "text": "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", "bodyList": [ { "name": "", @@ -4343,18 +1939,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "不蚀金锁成员", + "index": "5", "time": 30, "wait": 1000, - "sound": "", - "text": "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", "bodyList": [ { "name": "", @@ -4365,18 +1957,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "不蚀金锁成员", + "index": "6", "time": 30, "wait": 1000, - "sound": "", - "text": "「我已经准备撤退了」", "bodyList": [ { "name": "", @@ -4387,18 +1975,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "不蚀金锁成员", + "index": "7", "time": 30, "wait": 1000, - "sound": "", - "text": "「凯伊姆先生还要继续追吗?」", "bodyList": [ { "name": "", @@ -4409,18 +1993,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "8", "time": 30, "wait": 1000, - "sound": "", - "text": "「啊啊」", "bodyList": [ { "name": "", @@ -4431,18 +2011,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3561.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "9", "time": 30, "wait": 1000, - "sound": "", - "text": "做完情报交换之后,我跟男人道别。", "bodyList": [ { "name": "", @@ -4462,18 +2038,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "10", "time": 30, "wait": 1000, - "sound": "", - "text": "「和我想的一样啊······」", "bodyList": [ { "name": "", @@ -4484,18 +2056,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "11", "time": 30, "wait": 1000, - "sound": "", - "text": "在牢狱中最大的广场上,聚集着看不到尽头的人群。", "bodyList": [ { "name": "", @@ -4506,18 +2074,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "12", "time": 30, "wait": 1000, - "sound": "", - "text": "就算是来参见圣女祈祷,这人数也太多了点吧。", "bodyList": [ { "name": "", @@ -4528,18 +2092,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "13", "time": 30, "wait": 1000, - "sound": "", - "text": "自然,我也找不到逃跑的孩子。", "bodyList": [ { "name": "", @@ -4550,18 +2110,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "14", "time": 30, "wait": 1000, - "sound": "", - "text": "是混杂到人群中了吧。", "bodyList": [ { "name": "", @@ -4572,18 +2128,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "15", "time": 30, "wait": 1000, - "sound": "", - "text": "如果已经从广场上脱身了的话,就更难发现了。", "bodyList": [ { "name": "", @@ -4594,18 +2146,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "16", "time": 30, "wait": 1000, - "sound": "", - "text": "只好赌他还在这里了。", "bodyList": [ { "name": "", @@ -4625,18 +2173,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_0000.png", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "17", "time": 30, "wait": 1000, - "sound": "", - "text": "我先移动到了一个视野良好的地方。", "bodyList": [ { "name": "", @@ -4647,18 +2191,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_0000.png", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "18", "time": 30, "wait": 1000, - "sound": "", - "text": "从这里,一眼就可以看到人群的变化。", "bodyList": [ { "name": "", @@ -4669,18 +2209,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_0000.png", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "19", "time": 30, "wait": 1000, - "sound": "", - "text": "广场还是沸腾起来。", "bodyList": [ { "name": "", @@ -4704,18 +2240,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "20", "time": 30, "wait": 1000, - "sound": "", - "text": "抬头望去,原来是在天台之上出现了一个人影", "bodyList": [ { "name": "tati_440101.webp", @@ -4726,18 +2258,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "21", "time": 30, "wait": 1000, - "sound": "", - "text": "但是,与周围的期待不同,现身的是一名中年的神官。", "bodyList": [ { "name": "tati_440101.webp", @@ -4748,18 +2276,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "22", "time": 30, "wait": 1000, - "sound": "", - "text": "骂声四溢。", "bodyList": [ { "name": "tati_440101.webp", @@ -4770,18 +2294,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "23", "time": 30, "wait": 1000, - "sound": "", - "text": "神官则是笑着摆正衣领", "bodyList": [ { "name": "", @@ -4792,18 +2312,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440101.webp", "px": -300 }, - "name": "神官", + "index": "24", "time": 30, "wait": 1000, - "sound": "", - "text": "「从现在开始,举行谒见的仪式」", "bodyList": [ { "name": "", @@ -4814,18 +2330,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440105.webp", "px": -300 }, - "name": "神官", + "index": "25", "time": 30, "wait": 1000, - "sound": "", - "text": "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", "bodyList": [ { "name": "", @@ -4836,18 +2348,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440101.webp", "px": -300 }, - "name": "神官", + "index": "26", "time": 30, "wait": 1000, - "sound": "", - "text": "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", "bodyList": [ { "name": "", @@ -4858,18 +2366,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440110.webp", "px": -300 }, - "name": "神官", + "index": "27", "time": 30, "wait": 1000, - "sound": "", - "text": "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", "bodyList": [ { "name": "", @@ -4880,18 +2384,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440101.webp", "px": -300 }, - "name": "神官", + "index": "28", "time": 30, "wait": 1000, - "sound": "", - "text": "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", "bodyList": [ { "name": "", @@ -4902,18 +2402,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440102.webp", "px": -300 }, - "name": "神官", + "index": "29", "time": 30, "wait": 1000, - "sound": "", - "text": "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」", "bodyList": [ { "name": "", @@ -4950,18 +2446,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030102.webp", "px": -300 }, - "name": "圣女", + "index": "30", "time": 30, "wait": 1000, - "sound": "", - "text": "「不忘感谢与祈祷,神才会拯救我们」", "bodyList": [ { "name": "", @@ -4972,18 +2464,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030101.webp", "px": -300 }, - "name": "圣女", + "index": "31", "time": 30, "wait": 1000, - "sound": "", - "text": "「与我一起,向审虔诚地祈祷吧」", "bodyList": [ { "name": "", @@ -4998,18 +2486,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "32", "time": 30, "wait": 1000, - "sound": "", - "text": "广场上欢声雷动。", "bodyList": [ { "name": "", @@ -5020,18 +2504,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "33", "time": 30, "wait": 1000, - "sound": "", - "text": "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。", "bodyList": [ { "name": "", @@ -5042,18 +2522,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "34", "time": 30, "wait": 1000, - "sound": "", - "text": "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。", "bodyList": [ { "name": "", @@ -5064,18 +2540,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "35", "time": 30, "wait": 1000, - "sound": "", - "text": "她掌握着这条街道,还有在这条街上生活的人的命运。", "bodyList": [ { "name": "", @@ -5086,18 +2558,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "36", "time": 30, "wait": 1000, - "sound": "", - "text": "比起揽得人气,她更想要为了街道的继续存在而献出全力。", "bodyList": [ { "name": "", @@ -5108,18 +2576,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "37", "time": 30, "wait": 1000, - "sound": "", - "text": "也是为了不让《大崩落》的惨剧再度发生。", "bodyList": [ { "name": "", @@ -5130,18 +2594,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "38", "time": 30, "wait": 1000, - "sound": "", - "text": "十几年前的那场悲剧。", "bodyList": [ { "name": "", @@ -5152,18 +2612,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "39", "time": 30, "wait": 1000, - "sound": "", - "text": "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", "bodyList": [ { "name": "", @@ -5174,18 +2630,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "40", "time": 30, "wait": 1000, - "sound": "", - "text": "「······」", "bodyList": [ { "name": "", @@ -5196,18 +2648,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "41", "time": 30, "wait": 1000, - "sound": "", - "text": "这时我才想起,现在不是我在这里看圣女的时候。", "bodyList": [ { "name": "", @@ -5222,18 +2670,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "eve_030101.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "女声", + "index": "42", "time": 30, "wait": 1000, - "sound": "", - "text": "「——っ!?」", "bodyList": [ { "name": "", @@ -5253,18 +2697,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "围观的女人", + "index": "43", "time": 30, "wait": 1000, - "sound": "", - "text": "「羽,羽化病人!?」", "bodyList": [ { "name": "", @@ -5275,18 +2715,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "围观的中年人", + "index": "44", "time": 30, "wait": 1000, - "sound": "", - "text": "「喂,谁去叫下羽狩」", "bodyList": [ { "name": "", @@ -5297,18 +2733,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "惊慌的观众", + "index": "45", "time": 30, "wait": 1000, - "sound": "", - "text": "「你这家伙不要靠近我,要是传染了可怎么办」", "bodyList": [ { "name": "", @@ -5319,18 +2751,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "粗鲁的观众", + "index": "46", "time": 30, "wait": 1000, - "sound": "", - "text": "「你这小鬼赶快滚开」", "bodyList": [ { "name": "", @@ -5341,18 +2769,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3021.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "47", "time": 30, "wait": 1000, - "sound": "", - "text": "「接下来」", "bodyList": [ { "name": "", @@ -5372,18 +2796,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030107.webp", "px": -300 }, - "name": "圣女", + "index": "48", "time": 30, "wait": 1000, - "sound": "", - "text": "「发生什么事了?看上去似乎很嘈杂」", "bodyList": [ { "name": "", @@ -5394,18 +2814,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_130104.webp", "px": -300 }, - "name": "随从", + "index": "49", "time": 30, "wait": 1000, - "sound": "", - "text": "「似乎是某个人逃跑了······具体的我也不是很清楚」", "bodyList": [ { "name": "", @@ -5416,18 +2832,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440103.webp", "px": -300 }, - "name": "神官", + "index": "50", "time": 30, "wait": 1000, - "sound": "", - "text": "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」", "bodyList": [ { "name": "", @@ -5438,18 +2850,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030145.webp", "px": -300 }, - "name": "圣女", + "index": "51", "time": 30, "wait": 1000, - "sound": "", - "text": "「不用在意我,比起那个,我更关心究竟发生了什么事」", "bodyList": [ { "name": "", @@ -5460,18 +2868,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440107.webp", "px": -300 }, - "name": "神官", + "index": "52", "time": 30, "wait": 1000, - "sound": "", - "text": "「对不起,我真的不知道」", "bodyList": [ { "name": "", @@ -5482,18 +2886,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030145.webp", "px": -300 }, - "name": "圣女", + "index": "53", "time": 30, "wait": 1000, - "sound": "", - "text": "「······是吗」", "bodyList": [ { "name": "", @@ -5504,18 +2904,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "男", + "index": "54", "time": 30, "wait": 1000, - "sound": "", - "text": "「恕我僭越,请准许我说明情况」", "bodyList": [ { "name": "", @@ -5526,18 +2922,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320105.webp", "px": -300 }, - "name": "男", + "index": "55", "time": 30, "wait": 1000, - "sound": "", - "text": "「在来觐见的人群中出现了《羽化病》的患者」", "bodyList": [ { "name": "", @@ -5548,18 +2940,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "男", + "index": "56", "time": 30, "wait": 1000, - "sound": "", - "text": "「围观的人群因而产生了骚动」", "bodyList": [ { "name": "", @@ -5570,18 +2958,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320102.webp", "px": -300 }, - "name": "男", + "index": "57", "time": 30, "wait": 1000, - "sound": "", - "text": "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", "bodyList": [ { "name": "", @@ -5592,18 +2976,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030124.webp", "px": -300 }, - "name": "圣女", + "index": "58", "time": 30, "wait": 1000, - "sound": "", - "text": "「羽化病······」", "bodyList": [ { "name": "", @@ -5614,18 +2994,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320107.webp", "px": -300 }, - "name": "男", + "index": "59", "time": 30, "wait": 1000, - "sound": "", - "text": "「怎么了?」", "bodyList": [ { "name": "", @@ -5636,18 +3012,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030125.webp", "px": -300 }, - "name": "圣女", + "index": "60", "time": 30, "wait": 1000, - "sound": "", - "text": "「没什么」", "bodyList": [ { "name": "", @@ -5658,18 +3030,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030141.webp", "px": -300 }, - "name": "圣女", + "index": "61", "time": 30, "wait": 1000, - "sound": "", - "text": "「辛苦了,你的名字是?」", "bodyList": [ { "name": "", @@ -5680,18 +3048,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320102.webp", "px": -300 }, - "name": "男", + "index": "62", "time": 30, "wait": 1000, - "sound": "", - "text": "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」", "bodyList": [ { "name": "", @@ -5702,18 +3066,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440102.webp", "px": -300 }, - "name": "神官", + "index": "63", "time": 30, "wait": 1000, - "sound": "", - "text": "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」", "bodyList": [ { "name": "", @@ -5724,18 +3084,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440109.webp", "px": -300 }, - "name": "神官", + "index": "64", "time": 30, "wait": 1000, - "sound": "", - "text": "「阁下是在工作上相当出色的人呢」", "bodyList": [ { "name": "", @@ -5746,18 +3102,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "65", "time": 30, "wait": 1000, - "sound": "", - "text": "「不敢当」", "bodyList": [ { "name": "", @@ -5768,18 +3120,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320108.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "66", "time": 30, "wait": 1000, - "sound": "", - "text": "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", "bodyList": [ { "name": "", @@ -5790,18 +3138,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030145.webp", "px": -300 }, - "name": "圣女", + "index": "67", "time": 30, "wait": 1000, - "sound": "", - "text": "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", "bodyList": [ { "name": "", @@ -5812,18 +3156,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "68", "time": 30, "wait": 1000, - "sound": "", - "text": "「属下不胜惶恐」", "bodyList": [ { "name": "", @@ -5834,18 +3174,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320102.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "69", "time": 30, "wait": 1000, - "sound": "", - "text": "「接下来属下还要回到工作岗位上,在这里就先告退了」", "bodyList": [ { "name": "", @@ -5856,18 +3192,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030101.webp", "px": -300 }, - "name": "圣女", + "index": "70", "time": 30, "wait": 1000, - "sound": "", - "text": "「鲁基乌斯先生」", "bodyList": [ { "name": "", @@ -5878,18 +3210,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "71", "time": 30, "wait": 1000, - "sound": "", - "text": "「属下在」", "bodyList": [ { "name": "", @@ -5900,18 +3228,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030105.webp", "px": -300 }, - "name": "圣女", + "index": "72", "time": 30, "wait": 1000, - "sound": "", - "text": "「你是怎样看待羽狩的工作的呢?」", "bodyList": [ { "name": "", @@ -5922,18 +3246,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440106.webp", "px": -300 }, - "name": "神官", + "index": "73", "time": 30, "wait": 1000, - "sound": "", - "text": "「圣,圣女大人」", "bodyList": [ { "name": "", @@ -5944,18 +3264,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "74", "time": 30, "wait": 1000, - "sound": "", - "text": "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", "bodyList": [ { "name": "", @@ -5966,18 +3282,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_440102.webp", "px": -300 }, - "name": "神官", + "index": "75", "time": 30, "wait": 1000, - "sound": "", - "text": "「不,不亏是鲁基乌斯卿,相当优秀的想法」", "bodyList": [ { "name": "", @@ -5988,18 +3300,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_030125.webp", "px": -300 }, - "name": "圣女", + "index": "76", "time": 30, "wait": 1000, - "sound": "", - "text": "「是吗。辛苦你了」", "bodyList": [ { "name": "", @@ -6010,18 +3318,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_130124.webp", "px": -300 }, - "name": "随从", + "index": "77", "time": 30, "wait": 1000, - "sound": "", - "text": "「圣女大人······」", "bodyList": [ { "name": "", @@ -6032,18 +3336,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320102.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "78", "time": 30, "wait": 1000, - "sound": "", - "text": "「······」", "bodyList": [ { "name": "", @@ -6054,18 +3354,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3026.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_320101.webp", "px": -300 }, - "name": "鲁基乌斯", + "index": "79", "time": 30, "wait": 1000, - "sound": "", - "text": "「那么,属下就回岗位去了」", "bodyList": [ { "name": "", @@ -6082,10 +3378,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "memory2": false, "time": 30, "style": "引出" - }, - { - "type": "comment", - "text": "下一场景是追捕羽化病少年...做个标记" } ], "chapter03": [ @@ -6098,20 +3390,20 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "time": 30, "style": "引入" }, + { + "type": "cgtextList", + "textList": "chapter03" + }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "0", "time": 30, "wait": 1000, - "sound": "", - "text": "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。", "bodyList": [ { "name": "", @@ -6122,18 +3414,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "1", "time": 30, "wait": 1000, - "sound": "", - "text": "显然,他并没有想到我会捷足先登吧。", "bodyList": [ { "name": "", @@ -6144,18 +3432,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "2", "time": 30, "wait": 1000, - "sound": "", - "text": "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。", "bodyList": [ { "name": "", @@ -6166,18 +3450,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "3", "time": 30, "wait": 1000, - "sound": "", - "text": "「辛苦你了」", "bodyList": [ { "name": "", @@ -6188,18 +3468,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "4", "time": 30, "wait": 1000, - "sound": "", - "text": "「稀!?」", "bodyList": [ { "name": "", @@ -6210,18 +3486,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "5", "time": 30, "wait": 1000, - "sound": "", - "text": "「逃到贫民区是个不错的想法」", "bodyList": [ { "name": "", @@ -6232,18 +3504,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "6", "time": 30, "wait": 1000, - "sound": "", - "text": "「你,你是,羽狩吗?」", "bodyList": [ { "name": "", @@ -6254,18 +3522,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "7", "time": 30, "wait": 1000, - "sound": "", - "text": "「不是」", "bodyList": [ { "name": "", @@ -6276,18 +3540,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "8", "time": 30, "wait": 1000, - "sound": "", - "text": "「什,什么啊······混蛋,不要吓我啊」", "bodyList": [ { "name": "", @@ -6298,18 +3558,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "9", "time": 30, "wait": 1000, - "sound": "", - "text": "「我对令你受惊这件事致以歉意」", "bodyList": [ { "name": "", @@ -6320,18 +3576,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "10", "time": 30, "wait": 1000, - "sound": "", - "text": "「作为回报,麻烦你把从店里偷的钱交出来吧」", "bodyList": [ { "name": "", @@ -6342,18 +3594,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "11", "time": 30, "wait": 1000, - "sound": "", - "text": "「钱?你在说什么」", "bodyList": [ { "name": "", @@ -6364,18 +3612,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "12", "time": 30, "wait": 1000, - "sound": "", - "text": "「你要找的腰上的东西,掉在你身后了」", "bodyList": [ { "name": "", @@ -6386,18 +3630,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "13", "time": 30, "wait": 1000, - "sound": "", - "text": "「哎?」", "bodyList": [ { "name": "", @@ -6412,18 +3652,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "14", "time": 30, "wait": 1000, - "sound": "", - "text": "「呃呀」", "bodyList": [ { "name": "", @@ -6434,18 +3670,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "15", "time": 30, "wait": 1000, - "sound": "", - "text": "「你······你这混蛋」", "bodyList": [ { "name": "", @@ -6456,18 +3688,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "16", "time": 30, "wait": 1000, - "sound": "", - "text": "「······」", "bodyList": [ { "name": "", @@ -6478,18 +3706,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "17", "time": 30, "wait": 1000, - "sound": "", - "text": "「把偷的钱交出来」", "bodyList": [ { "name": "", @@ -6500,18 +3724,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "18", "time": 30, "wait": 1000, - "sound": "", - "text": "「我不知道你在······咕」", "bodyList": [ { "name": "", @@ -6530,18 +3750,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "19", "time": 30, "wait": 1000, - "sound": "", - "text": "「你,你说是我偷的······有什么证据吗」", "bodyList": [ { "name": "", @@ -6552,18 +3768,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "20", "time": 30, "wait": 1000, - "sound": "", - "text": "「你还挺倔的啊」", "bodyList": [ { "name": "", @@ -6574,18 +3786,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "21", "time": 30, "wait": 1000, - "sound": "", - "text": "「不过,给我听好了」", "bodyList": [ { "name": "", @@ -6596,18 +3804,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "22", "time": 30, "wait": 1000, - "sound": "", - "text": "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」", "bodyList": [ { "name": "", @@ -6618,18 +3822,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "23", "time": 30, "wait": 1000, - "sound": "", - "text": "「而且,钱的主人是从前和吉克颇有渊源的女人」", "bodyList": [ { "name": "", @@ -6640,18 +3840,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "24", "time": 30, "wait": 1000, - "sound": "", - "text": "「吉克?」", "bodyList": [ { "name": "", @@ -6662,18 +3858,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "25", "time": 30, "wait": 1000, - "sound": "", - "text": "「他是《不蚀金锁》的主人,这么说你就明白了吧」", "bodyList": [ { "name": "", @@ -6684,18 +3876,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "26", "time": 30, "wait": 1000, - "sound": "", - "text": "「哎?哎?怎么会······」", "bodyList": [ { "name": "", @@ -6706,18 +3894,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "27", "time": 30, "wait": 1000, - "sound": "", - "text": "「再问你一遍,钱在哪里?」", "bodyList": [ { "name": "", @@ -6728,18 +3912,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "28", "time": 30, "wait": 1000, - "sound": "", - "text": "「是,是,是,在我的怀里」", "bodyList": [ { "name": "", @@ -6750,18 +3930,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "29", "time": 30, "wait": 1000, - "sound": "", - "text": "「你没有擅自拿掉一部分吧」", "bodyList": [ { "name": "", @@ -6772,18 +3948,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "30", "time": 30, "wait": 1000, - "sound": "", - "text": "「是,是的」", "bodyList": [ { "name": "", @@ -6794,18 +3966,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "31", "time": 30, "wait": 1000, - "sound": "", - "text": "「那,那个,您是《不蚀金锁》的人吗?」", "bodyList": [ { "name": "", @@ -6816,18 +3984,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "32", "time": 30, "wait": 1000, - "sound": "", - "text": "「算是吧」", "bodyList": [ { "name": "", @@ -6838,18 +4002,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "33", "time": 30, "wait": 1000, - "sound": "", - "text": "「我什么都可以做,请您一定要帮帮我」", "bodyList": [ { "name": "", @@ -6860,18 +4020,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "34", "time": 30, "wait": 1000, - "sound": "", - "text": "「抱歉,我并没有兴趣去帮助他人」", "bodyList": [ { "name": "", @@ -6882,18 +4038,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "35", "time": 30, "wait": 1000, - "sound": "", - "text": "「我什么······什么,都会做的······」", "bodyList": [ { "name": "", @@ -6904,18 +4056,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "36", "time": 30, "wait": 1000, - "sound": "", - "text": "「我一直都是生活在下层的」", "bodyList": [ { "name": "", @@ -6926,18 +4074,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "37", "time": 30, "wait": 1000, - "sound": "", - "text": "「可是,不知何时染上了羽化病······背后长出了翅膀······」", "bodyList": [ { "name": "", @@ -6948,18 +4092,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "38", "time": 30, "wait": 1000, - "sound": "", - "text": "「被寄宿工作的店赶了出来,只得流落到牢狱这里」", "bodyList": [ { "name": "", @@ -6970,18 +4110,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "39", "time": 30, "wait": 1000, - "sound": "", - "text": "「因为独自实在是饿的不行了,所以才会偷这些钱的」", "bodyList": [ { "name": "", @@ -6992,18 +4128,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "40", "time": 30, "wait": 1000, - "sound": "", - "text": "「我明明没有做任何坏事······为什么······会遇到这种事······」", "bodyList": [ { "name": "", @@ -7014,18 +4146,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "41", "time": 30, "wait": 1000, - "sound": "", - "text": "「谁知道」", "bodyList": [ { "name": "", @@ -7036,18 +4164,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "42", "time": 30, "wait": 1000, - "sound": "", - "text": "「呜······呜呜······接下来,要对我做什么?」", "bodyList": [ { "name": "", @@ -7058,18 +4182,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "43", "time": 30, "wait": 1000, - "sound": "", - "text": "「我要把你带到组织那里」", "bodyList": [ { "name": "", @@ -7080,18 +4200,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "44", "time": 30, "wait": 1000, - "sound": "", - "text": "「怎,怎么这样」", "bodyList": [ { "name": "", @@ -7102,18 +4218,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "45", "time": 30, "wait": 1000, - "sound": "", - "text": "「不过,那样做的前提是你不是羽化病人」", "bodyList": [ { "name": "", @@ -7124,18 +4236,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "46", "time": 30, "wait": 1000, - "sound": "", - "text": "「组织也没有笨到把羽化病人招待到家里的程度」", "bodyList": [ { "name": "", @@ -7146,18 +4254,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "47", "time": 30, "wait": 1000, - "sound": "", - "text": "「那么,是要放我逃走吗?」", "bodyList": [ { "name": "", @@ -7168,18 +4272,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "48", "time": 30, "wait": 1000, - "sound": "", - "text": "「我要让你学到教训」", "bodyList": [ { "name": "", @@ -7194,18 +4294,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "49", "time": 30, "wait": 1000, - "sound": "", - "text": "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」", "bodyList": [ { "name": "", @@ -7216,18 +4312,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "50", "time": 30, "wait": 1000, - "sound": "", - "text": "「你的运气不错」", "bodyList": [ { "name": "", @@ -7238,18 +4330,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "51", "time": 30, "wait": 1000, - "sound": "", - "text": "「唔······啊,是的······」", "bodyList": [ { "name": "", @@ -7260,18 +4348,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "52", "time": 30, "wait": 1000, - "sound": "", - "text": "「滚」", "bodyList": [ { "name": "", @@ -7282,18 +4366,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "53", "time": 30, "wait": 1000, - "sound": "", - "text": "「非常感谢」", "bodyList": [ { "name": "", @@ -7304,18 +4384,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "54", "time": 30, "wait": 1000, - "sound": "", - "text": "「唔啊!?」", "bodyList": [ { "name": "", @@ -7330,18 +4406,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430103.webp", "px": -300 }, - "name": "男", + "index": "55", "time": 30, "wait": 1000, - "sound": "", - "text": "「到这里就结束了,羽化病人」", "bodyList": [ { "name": "tati_430103.webp", @@ -7352,18 +4424,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "男", + "index": "56", "time": 30, "wait": 1000, - "sound": "", - "text": "「确认他的翅膀」", "bodyList": [ { "name": "tati_430105.webp", @@ -7374,18 +4442,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "57", "time": 30, "wait": 1000, - "sound": "", - "text": "趁还没有被卷入麻烦的事情之前,赶快离开这里吧", "bodyList": [ { "name": "tati_430105.webp", @@ -7414,18 +4478,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430106.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "58", "time": 30, "wait": 1000, - "sound": "", - "text": "「那边的那个人」", "bodyList": [ { "name": "", @@ -7436,18 +4496,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "59", "time": 30, "wait": 1000, - "sound": "", - "text": "「······有什么事?」", "bodyList": [ { "name": "tati_430101.webp", @@ -7458,18 +4514,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430101.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "60", "time": 30, "wait": 1000, - "sound": "", - "text": "「可以稍微让我问几句话吗」", "bodyList": [ { "name": "tati_430101.webp", @@ -7480,18 +4532,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "61", "time": 30, "wait": 1000, - "sound": "", - "text": "「······」", "bodyList": [ { "name": "tati_430101.webp", @@ -7502,18 +4550,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "62", "time": 30, "wait": 1000, - "sound": "", - "text": "「啊啊,无妨」", "bodyList": [ { "name": "tati_430101.webp", @@ -7524,18 +4568,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "63", "time": 30, "wait": 1000, - "sound": "", - "text": "「感谢您的合作」", "bodyList": [ { "name": "tati_430102.webp", @@ -7546,18 +4586,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "", + "index": "64", "time": 0, "wait": 2000, - "sound": "", - "text": "队长殷勤地致以谢礼。", "bodyList": [ { "name": "tati_430102.webp", @@ -7568,18 +4604,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "", + "index": "65", "time": 0, "wait": 2000, - "sound": "", - "text": "而在他的眼前,少年的衣服已经被他的补下们扯破。", "bodyList": [ { "name": "tati_430102.webp", @@ -7590,18 +4622,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "", + "index": "66", "time": 0, "wait": 2000, - "sound": "", - "text": "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。", "bodyList": [ { "name": "tati_430102.webp", @@ -7612,18 +4640,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "红发的羽狩", + "index": "67", "time": 30, "wait": 1000, - "sound": "", - "text": "「副队长,确认翅膀的持有了」", "bodyList": [ { "name": "", @@ -7634,18 +4658,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "68", "time": 30, "wait": 1000, - "sound": "", - "text": "「保护他」", "bodyList": [ { "name": "tati_430105.webp", @@ -7656,18 +4676,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "69", "time": 30, "wait": 1000, - "sound": "", - "text": "「不要······请原谅,我······」", "bodyList": [ { "name": "tati_430105.webp", @@ -7678,18 +4694,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "70", "time": 30, "wait": 1000, - "sound": "", - "text": "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", "bodyList": [ { "name": "tati_430102.webp", @@ -7700,18 +4712,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "71", "time": 30, "wait": 1000, - "sound": "", - "text": "「可是,可是」", "bodyList": [ { "name": "tati_430102.webp", @@ -7722,18 +4730,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "72", "time": 30, "wait": 1000, - "sound": "", - "text": "「没关系的」", "bodyList": [ { "name": "tati_430102.webp", @@ -7744,18 +4748,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "73", "time": 30, "wait": 1000, - "sound": "", - "text": "「······哥,哥哥」", "bodyList": [ { "name": "tati_430102.webp", @@ -7766,18 +4766,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "74", "time": 30, "wait": 1000, - "sound": "", - "text": "「你是羽化病人的亲属吗?」", "bodyList": [ { "name": "tati_430105.webp", @@ -7788,18 +4784,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "75", "time": 30, "wait": 1000, - "sound": "", - "text": "「只是路人而已」", "bodyList": [ { "name": "tati_430105.webp", @@ -7810,18 +4802,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "76", "time": 30, "wait": 1000, - "sound": "", - "text": "「顺带一提,我也没有打算找你们的麻烦」", "bodyList": [ { "name": "tati_430105.webp", @@ -7832,18 +4820,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430101.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "77", "time": 30, "wait": 1000, - "sound": "", - "text": "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", "bodyList": [ { "name": "tati_430101.webp", @@ -7854,18 +4838,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430108.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "78", "time": 30, "wait": 1000, - "sound": "", - "text": "「我的一个部下就此永久失去了半截胳膊」", "bodyList": [ { "name": "tati_430108.webp", @@ -7876,18 +4856,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "79", "time": 30, "wait": 1000, - "sound": "", - "text": "「我表示同情」", "bodyList": [ { "name": "tati_430108.webp", @@ -7898,18 +4874,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "80", "time": 30, "wait": 1000, - "sound": "", - "text": "「我马上就会消失的,这样就没问题了吧?」", "bodyList": [ { "name": "tati_430108.webp", @@ -7920,18 +4892,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "81", "time": 30, "wait": 1000, - "sound": "", - "text": "「嘛,不要这么慌张」", "bodyList": [ { "name": "tati_430102.webp", @@ -7942,18 +4910,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "82", "time": 30, "wait": 1000, - "sound": "", - "text": "副队长看着羽化的少年。", "bodyList": [ { "name": "tati_430102.webp", @@ -7964,18 +4928,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "83", "time": 30, "wait": 1000, - "sound": "", - "text": "「你与这个人是什么关系?没有被他殴打吗?」", "bodyList": [ { "name": "tati_430105.webp", @@ -7986,18 +4946,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "84", "time": 30, "wait": 1000, - "sound": "", - "text": "「没,没有」", "bodyList": [ { "name": "tati_430105.webp", @@ -8008,18 +4964,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "85", "time": 30, "wait": 1000, - "sound": "", - "text": "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", "bodyList": [ { "name": "tati_430102.webp", @@ -8030,18 +4982,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "86", "time": 30, "wait": 1000, - "sound": "", - "text": "「······」", "bodyList": [ { "name": "tati_430102.webp", @@ -8052,18 +5000,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "87", "time": 30, "wait": 1000, - "sound": "", - "text": "「那个人,是《不蚀金锁》的组织成员······」", "bodyList": [ { "name": "tati_430102.webp", @@ -8074,18 +5018,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "羽化病患少年", + "index": "88", "time": 30, "wait": 1000, - "sound": "", - "text": "「突然说让我拿出钱来,我刚一拒绝他就打我」", "bodyList": [ { "name": "tati_430102.webp", @@ -8096,18 +5036,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "89", "time": 30, "wait": 1000, - "sound": "", - "text": "「原来如此······」", "bodyList": [ { "name": "tati_430105.webp", @@ -8118,18 +5054,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430107.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "90", "time": 30, "wait": 1000, - "sound": "", - "text": "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", "bodyList": [ { "name": "tati_430107.webp", @@ -8140,18 +5072,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "91", "time": 30, "wait": 1000, - "sound": "", - "text": "「当然不是」", "bodyList": [ { "name": "tati_430107.webp", @@ -8162,18 +5090,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "92", "time": 30, "wait": 1000, - "sound": "", - "text": "「我只是从那里接受工作而已,并不是他们的成员」", "bodyList": [ { "name": "tati_430107.webp", @@ -8184,18 +5108,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "93", "time": 30, "wait": 1000, - "sound": "", - "text": "「你的意思是说,少年在说谎吗?」", "bodyList": [ { "name": "tati_430105.webp", @@ -8206,18 +5126,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "94", "time": 30, "wait": 1000, - "sound": "", - "text": "「啊啊」", "bodyList": [ { "name": "tati_430105.webp", @@ -8228,18 +5144,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "95", "time": 30, "wait": 1000, - "sound": "", - "text": "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", "bodyList": [ { "name": "tati_430105.webp", @@ -8250,18 +5162,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430107.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "96", "time": 30, "wait": 1000, - "sound": "", - "text": "「就算我去询问,也无法从他们那里得到事实」", "bodyList": [ { "name": "tati_430107.webp", @@ -8272,18 +5180,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430108.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "97", "time": 30, "wait": 1000, - "sound": "", - "text": "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", "bodyList": [ { "name": "tati_430108.webp", @@ -8294,18 +5198,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "98", "time": 30, "wait": 1000, - "sound": "", - "text": "「真是辛苦啊」", "bodyList": [ { "name": "tati_430108.webp", @@ -8316,18 +5216,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "99", "time": 30, "wait": 1000, - "sound": "", - "text": "「说的是啊」", "bodyList": [ { "name": "tati_430102.webp", @@ -8338,18 +5234,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "100", "time": 30, "wait": 1000, - "sound": "", - "text": "「其实,砍下我部下胳膊的似乎也是组织的成员呢」", "bodyList": [ { "name": "tati_430105.webp", @@ -8360,18 +5252,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "101", "time": 30, "wait": 1000, - "sound": "", - "text": "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", "bodyList": [ { "name": "tati_430102.webp", @@ -8382,18 +5270,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "102", "time": 30, "wait": 1000, - "sound": "", - "text": "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", "bodyList": [ { "name": "tati_430105.webp", @@ -8404,18 +5288,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430102.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "103", "time": 30, "wait": 1000, - "sound": "", - "text": "「那和整条街道的和平也是紧密相关的吧?」", "bodyList": [ { "name": "tati_430102.webp", @@ -8426,18 +5306,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "104", "time": 30, "wait": 1000, - "sound": "", - "text": "「我知道,你们有逮捕干扰狩猎羽化病人的权力」", "bodyList": [ { "name": "tati_430102.webp", @@ -8448,18 +5324,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "105", "time": 30, "wait": 1000, - "sound": "", - "text": "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", "bodyList": [ { "name": "tati_430102.webp", @@ -8470,18 +5342,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "106", "time": 30, "wait": 1000, - "sound": "", - "text": "「那些话,我们会在看守所对你详细说明的」", "bodyList": [ { "name": "tati_430105.webp", @@ -8492,18 +5360,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "107", "time": 30, "wait": 1000, - "sound": "", - "text": "「······」", "bodyList": [ { "name": "tati_430105.webp", @@ -8514,18 +5378,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "108", "time": 30, "wait": 1000, - "sound": "", - "text": "在这里起争执的话,就会被羽狩加害。", "bodyList": [ { "name": "tati_430105.webp", @@ -8536,18 +5396,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "109", "time": 30, "wait": 1000, - "sound": "", - "text": "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。", "bodyList": [ { "name": "tati_430105.webp", @@ -8558,18 +5414,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "110", "time": 30, "wait": 1000, - "sound": "", - "text": "就算逃跑,也没有好的结果。", "bodyList": [ { "name": "tati_430105.webp", @@ -8580,18 +5432,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "111", "time": 30, "wait": 1000, - "sound": "", - "text": "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。", "bodyList": [ { "name": "tati_430105.webp", @@ -8602,18 +5450,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "112", "time": 30, "wait": 1000, - "sound": "", - "text": "发生了什么事······", "bodyList": [ { "name": "tati_430105.webp", @@ -8624,18 +5468,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050101.webp", "px": -300 }, - "name": "??", + "index": "113", "time": 30, "wait": 1000, - "sound": "", - "text": "「我认为,那位先生是正确的」", "bodyList": [ { "name": "tati_430105.webp", @@ -8646,18 +5486,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "114", "time": 30, "wait": 1000, - "sound": "", - "text": "耳边突然响起了一个能够将这阴暗的气息一扫而空的声音", "bodyList": [ { "name": "tati_430105.webp", @@ -8668,18 +5504,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "115", "time": 30, "wait": 1000, - "sound": "", - "text": "羽狩们一起回头。", "bodyList": [ { "name": "", @@ -8690,18 +5522,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "116", "time": 30, "wait": 1000, - "sound": "", - "text": "而在他们视线的焦点处,", "bodyList": [ { "name": "", @@ -8712,18 +5540,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "117", "time": 30, "wait": 1000, - "sound": "", - "text": "伫立着一位女性。", "bodyList": [ { "name": "tati_050101.webp", @@ -8734,18 +5558,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "118", "time": 30, "wait": 1000, - "sound": "", - "text": "在端正的容颜下,代表着强烈意志的双眉十分显眼。", "bodyList": [ { "name": "tati_050101.webp", @@ -8756,18 +5576,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "119", "time": 30, "wait": 1000, - "sound": "", - "text": "身体的柔软与紧紧包裹在其身上的御兽支付,两者显得十分的不搭配。", "bodyList": [ { "name": "tati_050101.webp", @@ -8778,18 +5594,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "120", "time": 30, "wait": 1000, - "sound": "", - "text": "我还是第一次看到女性的羽狩。", "bodyList": [ { "name": "tati_050101.webp", @@ -8800,18 +5612,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "羽狩的副队长", + "index": "121", "time": 30, "wait": 1000, - "sound": "", - "text": "「队长,这是获得《不蚀金锁》情报的好机会」", "bodyList": [ { "name": "tati_050101.webp", @@ -8827,18 +5635,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430141.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "122", "time": 30, "wait": 1000, - "sound": "", - "text": "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", "bodyList": [ { "name": "tati_050141.webp", @@ -8854,18 +5658,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430106.webp", "px": -300 }, - "name": "兰格副队长", + "index": "123", "time": 30, "wait": 1000, - "sound": "", - "text": "「我并没有打算去恫吓他······」", "bodyList": [ { "name": "tati_050141.webp", @@ -8881,18 +5681,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050221.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "124", "time": 30, "wait": 1000, - "sound": "", - "text": "「告诉我那个被砍掉胳膊的队员的名字」", "bodyList": [ { "name": "tati_050221.webp", @@ -8908,18 +5704,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050223.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "125", "time": 30, "wait": 1000, - "sound": "", - "text": "「我会去探望他的」", "bodyList": [ { "name": "tati_050223.webp", @@ -8935,18 +5727,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430104.webp", "px": -300 }, - "name": "兰格副队长", + "index": "126", "time": 30, "wait": 1000, - "sound": "", - "text": "「那个是······」", "bodyList": [ { "name": "tati_050223.webp", @@ -8962,18 +5750,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050101.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "127", "time": 30, "wait": 1000, - "sound": "", - "text": "「我知道,你一直在为有所收获而努力工作」", "bodyList": [ { "name": "tati_050101.webp", @@ -8989,18 +5773,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050105.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "128", "time": 30, "wait": 1000, - "sound": "", - "text": "「但是,正因为我们的工作是为民众提供帮助」", "bodyList": [ { "name": "tati_050105.webp", @@ -9016,18 +5796,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050103.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "129", "time": 30, "wait": 1000, - "sound": "", - "text": "「所以就更不能损害人与人之间的信赖」", "bodyList": [ { "name": "tati_050103.webp", @@ -9043,18 +5819,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_430105.webp", "px": -300 }, - "name": "兰格副队长", + "index": "130", "time": 30, "wait": 1000, - "sound": "", - "text": "「我会铭记在心」", "bodyList": [ { "name": "tati_050103.webp", @@ -9070,18 +5842,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050101.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "131", "time": 30, "wait": 1000, - "sound": "", - "text": "「这位先生,我的部下失礼了」", "bodyList": [ { "name": "tati_050101.webp", @@ -9092,18 +5860,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "132", "time": 30, "wait": 1000, - "sound": "", - "text": "「只要不对我再来一次就好」", "bodyList": [ { "name": "tati_050101.webp", @@ -9114,18 +5878,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050126.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "133", "time": 30, "wait": 1000, - "sound": "", - "text": "「请稍等」", "bodyList": [ { "name": "tati_050126.webp", @@ -9136,18 +5896,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "134", "time": 30, "wait": 1000, - "sound": "", - "text": "「有什么事?」", "bodyList": [ { "name": "tati_050126.webp", @@ -9158,18 +5914,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050101.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "135", "time": 30, "wait": 1000, - "sound": "", - "text": "「我想确认一件事」", "bodyList": [ { "name": "tati_050101.webp", @@ -9180,18 +5932,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050105.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "136", "time": 30, "wait": 1000, - "sound": "", - "text": "「你真的不是《不蚀金锁》的成员吗?」", "bodyList": [ { "name": "tati_050105.webp", @@ -9202,18 +5950,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "137", "time": 30, "wait": 1000, - "sound": "", - "text": "「真的」", "bodyList": [ { "name": "tati_050105.webp", @@ -9224,18 +5968,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "138", "time": 30, "wait": 1000, - "sound": "", - "text": "「如果我说是的话,你有什么打算?」", "bodyList": [ { "name": "tati_050105.webp", @@ -9246,18 +5986,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_050143.webp", "px": -300 }, - "name": "羽狩的队长", + "index": "139", "time": 30, "wait": 1000, - "sound": "", - "text": "「我听过传闻,说他们是用依靠暴力而得的钱在生活」", "bodyList": [ { "name": "tati_050143.webp", @@ -9268,18 +6004,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "140", "time": 30, "wait": 1000, - "sound": "", - "text": "「······这样啊」", "bodyList": [ { "name": "tati_050143.webp", @@ -9290,18 +6022,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3801.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "141", "time": 30, "wait": 1000, - "sound": "", - "text": "「如果能有收获就好了啊」", "bodyList": [ { "name": "tati_050143.webp", @@ -9357,20 +6085,20 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "time": 30, "style": "场景切换" }, + { + "type": "cgtextList", + "textList": "chapter04" + }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120122.webp", "px": -300 }, - "name": "梅尔特", + "index": "0", "time": 0, "wait": 2000, - "sound": "", - "text": "「欢迎光临」", "bodyList": [ { "name": "", @@ -9381,18 +6109,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120101.webp", "px": -300 }, - "name": "梅尔特", + "index": "1", "time": 0, "wait": 2000, - "sound": "", - "text": "「辛苦了」", "bodyList": [ { "name": "tati_120101.webp", @@ -9403,18 +6127,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120107.webp", "px": -300 }, - "name": "梅尔特", + "index": "2", "time": 0, "wait": 2000, - "sound": "", - "text": "「抱歉,又拜托给你了个这么麻烦的工作」", "bodyList": [ { "name": "tati_120107.webp", @@ -9425,18 +6145,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "3", "time": 0, "wait": 2000, - "sound": "", - "text": "「没什么,比想象中完成的更容易」", "bodyList": [ { "name": "tati_120107.webp", @@ -9447,18 +6163,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120112.webp", "px": -300 }, - "name": "梅尔特", + "index": "4", "time": 0, "wait": 2000, - "sound": "", - "text": "「那就好」", "bodyList": [ { "name": "tati_120112.webp", @@ -9469,18 +6181,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120102.webp", "px": -300 }, - "name": "梅尔特", + "index": "5", "time": 0, "wait": 2000, - "sound": "", - "text": "「这是我的一点谢意」", "bodyList": [ { "name": "tati_120102.webp", @@ -9491,18 +6199,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "6", "time": 0, "wait": 2000, - "sound": "", - "text": "「味道有些变化啊」", "bodyList": [ { "name": "tati_120102.webp", @@ -9513,18 +6217,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120107.webp", "px": -300 }, - "name": "梅尔特", + "index": "7", "time": 0, "wait": 2000, - "sound": "", - "text": "「啊,被发现了?」", "bodyList": [ { "name": "tati_120107.webp", @@ -9535,18 +6235,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120111.webp", "px": -300 }, - "name": "梅尔特", + "index": "8", "time": 0, "wait": 2000, - "sound": "", - "text": "「最近,没能到手什么好的原料呢」", "bodyList": [ { "name": "tati_120111.webp", @@ -9557,18 +6253,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "9", "time": 0, "wait": 2000, - "sound": "", - "text": "「去拜托吉克如何?」", "bodyList": [ { "name": "tati_120111.webp", @@ -9579,18 +6271,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120127.webp", "px": -300 }, - "name": "梅尔特", + "index": "10", "time": 0, "wait": 2000, - "sound": "", - "text": "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", "bodyList": [ { "name": "tati_120127.webp", @@ -9601,18 +6289,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "11", "time": 0, "wait": 2000, - "sound": "", - "text": "「那希望你也不要来麻烦我」", "bodyList": [ { "name": "tati_120127.webp", @@ -9623,18 +6307,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120112.webp", "px": -300 }, - "name": "梅尔特", + "index": "12", "time": 0, "wait": 2000, - "sound": "", - "text": "「那 是 两 码 事」", "bodyList": [ { "name": "tati_120112.webp", @@ -9645,18 +6325,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120113.webp", "px": -300 }, - "name": "梅尔特", + "index": "13", "time": 0, "wait": 2000, - "sound": "", - "text": "「再说,凯伊姆是靠着工作来生活的吧」", "bodyList": [ { "name": "tati_120113.webp", @@ -9667,18 +6343,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120113.webp", "px": -300 }, - "name": "梅尔特", + "index": "14", "time": 0, "wait": 2000, - "sound": "", - "text": "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", "bodyList": [ { "name": "tati_120113.webp", @@ -9689,18 +6361,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "15", "time": 0, "wait": 2000, - "sound": "", - "text": "「反正,也已经传到吉克的耳朵里了」", "bodyList": [ { "name": "tati_120113.webp", @@ -9711,18 +6379,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120112.webp", "px": -300 }, - "name": "梅尔特", + "index": "16", "time": 0, "wait": 2000, - "sound": "", - "text": "「这是面子问题啊,面子问题」", "bodyList": [ { "name": "tati_120112.webp", @@ -9733,18 +6397,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "17", "time": 0, "wait": 2000, - "sound": "", - "text": "「嘛,算了」", "bodyList": [ { "name": "tati_120101.webp", @@ -9755,18 +6415,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "18", "time": 0, "wait": 2000, - "sound": "", - "text": "「这样就好了吧?」", "bodyList": [ { "name": "tati_120101.webp", @@ -9777,18 +6433,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120121.webp", "px": -300 }, - "name": "梅尔特", + "index": "19", "time": 0, "wait": 2000, - "sound": "", - "text": "「这是钱包呢」", "bodyList": [ { "name": "tati_120121.webp", @@ -9799,18 +6451,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120102.webp", "px": -300 }, - "name": "梅尔特", + "index": "20", "time": 0, "wait": 2000, - "sound": "", - "text": "「嗯,东西没少」", "bodyList": [ { "name": "tati_120102.webp", @@ -9821,18 +6469,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120111.webp", "px": -300 }, - "name": "梅尔特", + "index": "21", "time": 0, "wait": 2000, - "sound": "", - "text": "「太好啦—这个月的上纳金,我可全部都放在里面了呢」", "bodyList": [ { "name": "tati_120111.webp", @@ -9843,18 +6487,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120113.webp", "px": -300 }, - "name": "梅尔特", + "index": "22", "time": 0, "wait": 2000, - "sound": "", - "text": "「如果没有找到的话,说不定就又会被送到娼馆里了呢」", "bodyList": [ { "name": "tati_120113.webp", @@ -9865,18 +6505,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "23", "time": 0, "wait": 2000, - "sound": "", - "text": "「在那边不是来钱更快吗?」", "bodyList": [ { "name": "tati_120113.webp", @@ -9887,18 +6523,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120106.webp", "px": -300 }, - "name": "梅尔特", + "index": "24", "time": 0, "wait": 2000, - "sound": "", - "text": "「阿拉,你是在说我还能有魅力吗?」", "bodyList": [ { "name": "tati_120106.webp", @@ -9909,18 +6541,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "25", "time": 0, "wait": 2000, - "sound": "", - "text": "「这是客套话而已」", "bodyList": [ { "name": "tati_120106.webp", @@ -9931,18 +6559,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120113.webp", "px": -300 }, - "name": "梅尔特", + "index": "26", "time": 0, "wait": 2000, - "sound": "", - "text": "「欺负人」", "bodyList": [ { "name": "tati_120113.webp", @@ -9957,18 +6581,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120122.webp", "px": -300 }, - "name": "梅尔特", + "index": "27", "time": 0, "wait": 2000, - "sound": "", - "text": "「总而言之,今天帮大忙了」", "bodyList": [ { "name": "tati_120122.webp", @@ -9979,18 +6599,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120107.webp", "px": -300 }, - "name": "梅尔特", + "index": "28", "time": 0, "wait": 2000, - "sound": "", - "text": "「谢礼嘛······」", "bodyList": [ { "name": "tati_120107.webp", @@ -10001,18 +6617,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "29", "time": 0, "wait": 2000, - "sound": "", - "text": "「就记在账单上吧」", "bodyList": [ { "name": "tati_120107.webp", @@ -10023,18 +6635,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120112.webp", "px": -300 }, - "name": "梅尔特", + "index": "30", "time": 0, "wait": 2000, - "sound": "", - "text": "「了解—盛谢惠顾了哦?」", "bodyList": [ { "name": "tati_120112.webp", @@ -10045,18 +6653,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "31", "time": 0, "wait": 2000, - "sound": "", - "text": "喀啷喀啷", "bodyList": [ { "name": "", @@ -10067,18 +6671,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "32", "time": 0, "wait": 2000, - "sound": "", - "text": "门铃响起", "bodyList": [ { "name": "", @@ -10089,18 +6689,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "33", "time": 0, "wait": 2000, - "sound": "", - "text": "喧哗瞬间安静下来。", "bodyList": [ { "name": "", @@ -10111,18 +6707,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "34", "time": 0, "wait": 2000, - "sound": "", - "text": "进来的人是吉克。", "bodyList": [ { "name": "tati_340101.webp", @@ -10133,18 +6725,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "35", "time": 0, "wait": 2000, - "sound": "", - "text": "是掌控着牢狱的组织之一,《不蚀金锁》的头目。", "bodyList": [ { "name": "tati_340101.webp", @@ -10155,18 +6743,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "36", "time": 0, "wait": 2000, - "sound": "", - "text": "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。", "bodyList": [ { "name": "tati_340101.webp", @@ -10177,18 +6761,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340102.webp", "px": -300 }, - "name": "吉克", + "index": "37", "time": 0, "wait": 2000, - "sound": "", - "text": "「各位继续吧」", "bodyList": [ { "name": "tati_340102.webp", @@ -10199,18 +6779,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "38", "time": 0, "wait": 2000, - "sound": "", - "text": "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。", "bodyList": [ { "name": "tati_340102.webp", @@ -10221,18 +6797,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340101.webp", "px": -300 }, - "name": "吉克", + "index": "39", "time": 0, "wait": 2000, - "sound": "", - "text": "「抱歉,今天拜托你去做了无聊的工作」", "bodyList": [ { "name": "tati_340101.webp", @@ -10243,18 +6815,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "40", "time": 0, "wait": 2000, - "sound": "", - "text": "「不用介意」", "bodyList": [ { "name": "tati_340101.webp", @@ -10265,18 +6833,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "41", "time": 0, "wait": 2000, - "sound": "", - "text": "吉克轻轻点了点头,在我右边坐了下来", "bodyList": [ { "name": "tati_z340101.webp", @@ -10287,18 +6851,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "42", "time": 0, "wait": 2000, - "sound": "", - "text": "「逃跑的男人怎么样了?」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10309,18 +6869,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340104.webp", "px": -300 }, - "name": "吉克", + "index": "43", "time": 0, "wait": 2000, - "sound": "", - "text": "「嗯?已经不在这个世上了」", "bodyList": [ { "name": "tati_z340104.webp", @@ -10331,18 +6887,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340107.webp", "px": -300 }, - "name": "吉克", + "index": "44", "time": 0, "wait": 2000, - "sound": "", - "text": "「有什么想要知道的事吗?」", "bodyList": [ { "name": "tati_z340107.webp", @@ -10353,18 +6905,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "45", "time": 0, "wait": 2000, - "sound": "", - "text": "「不,没什么」", "bodyList": [ { "name": "tati_z340107.webp", @@ -10375,18 +6923,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340108.webp", "px": -300 }, - "name": "吉克", + "index": "46", "time": 0, "wait": 2000, - "sound": "", - "text": "「那个无聊的家伙,完全没有趣味呢」", "bodyList": [ { "name": "tati_z340108.webp", @@ -10397,18 +6941,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340114.webp", "px": -300 }, - "name": "吉克", + "index": "47", "time": 0, "wait": 2000, - "sound": "", - "text": "「真希望他也替我负责清扫的部下也考虑考虑」", "bodyList": [ { "name": "tati_z340114.webp", @@ -10419,18 +6959,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "48", "time": 0, "wait": 2000, - "sound": "", - "text": "「真是灾难啊」", "bodyList": [ { "name": "tati_z340114.webp", @@ -10441,18 +6977,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340102.webp", "px": -300 }, - "name": "吉克", + "index": "49", "time": 0, "wait": 2000, - "sound": "", - "text": "「比起那个,我听说了哦。你去追羽化病人了啊」", "bodyList": [ { "name": "tati_z340102.webp", @@ -10463,18 +6995,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "50", "time": 0, "wait": 2000, - "sound": "", - "text": "「消息真灵通」", "bodyList": [ { "name": "tati_z340102.webp", @@ -10485,18 +7013,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340104.webp", "px": -300 }, - "name": "吉克", + "index": "51", "time": 0, "wait": 2000, - "sound": "", - "text": "「梅尔特也注意点」", "bodyList": [ { "name": "tati_z340104.webp", @@ -10507,18 +7031,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340107.webp", "px": -300 }, - "name": "吉克", + "index": "52", "time": 0, "wait": 2000, - "sound": "", - "text": "「你丢钱已经不是一回两回了」", "bodyList": [ { "name": "tati_z340107.webp", @@ -10529,18 +7049,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120132.webp", "px": -300 }, - "name": "梅尔特", + "index": "53", "time": 0, "wait": 2000, - "sound": "", - "text": "「好的—我会注意的。」", "bodyList": [ { "name": "tati_z340104.webp", @@ -10556,18 +7072,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120101.webp", "px": -300 }, - "name": "梅尔特", + "index": "54", "time": 0, "wait": 2000, - "sound": "", - "text": "「吉克还是平常的点单吧」", "bodyList": [ { "name": "tati_z340102.webp", @@ -10583,18 +7095,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120121.webp", "px": -300 }, - "name": "梅尔特", + "index": "55", "time": 0, "wait": 2000, - "sound": "", - "text": "「凯伊姆要再来一杯吗?」", "bodyList": [ { "name": "tati_z340102.webp", @@ -10610,18 +7118,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "56", "time": 0, "wait": 2000, - "sound": "", - "text": "我们用眼神点头示意后,梅尔特开始准备起酒来。", "bodyList": [ { "name": "tati_z340102.webp", @@ -10632,18 +7136,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "", + "index": "57", "time": 0, "wait": 2000, - "sound": "", - "text": "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。", "bodyList": [ { "name": "tati_z340102.webp", @@ -10654,18 +7154,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340101.webp", "px": -300 }, - "name": "吉克", + "index": "58", "time": 0, "wait": 2000, - "sound": "", - "text": "「这是抓捕逃跑男人的报酬」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10676,18 +7172,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "59", "time": 0, "wait": 2000, - "sound": "", - "text": "「下次有什么事再告诉我」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10698,18 +7190,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120102.webp", "px": -300 }, - "name": "梅尔特", + "index": "60", "time": 0, "wait": 2000, - "sound": "", - "text": "「来,久等了」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10725,18 +7213,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "61", "time": 0, "wait": 2000, - "sound": "", - "text": "「话说回来梅尔特,为什么会被那种孩子偷到钱?」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10752,18 +7236,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340102.webp", "px": -300 }, - "name": "吉克", + "index": "62", "time": 0, "wait": 2000, - "sound": "", - "text": "「让我猜猜看」", "bodyList": [ { "name": "tati_z340102.webp", @@ -10779,18 +7259,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340110.webp", "px": -300 }, - "name": "吉克", + "index": "63", "time": 0, "wait": 2000, - "sound": "", - "text": "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」", "bodyList": [ { "name": "tati_z340110.webp", @@ -10806,18 +7282,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120113.webp", "px": -300 }, - "name": "梅尔特", + "index": "64", "time": 0, "wait": 2000, - "sound": "", - "text": "「可惜—」", "bodyList": [ { "name": "tati_z340110.webp", @@ -10833,18 +7305,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120101.webp", "px": -300 }, - "name": "梅尔特", + "index": "65", "time": 0, "wait": 2000, - "sound": "", - "text": "「事实恰恰相反,是那家伙一直在纠缠我」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10860,18 +7328,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "66", "time": 0, "wait": 2000, - "sound": "", - "text": "「完全把你当成新进的女佣了么」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10887,18 +7351,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120121.webp", "px": -300 }, - "name": "梅尔特", + "index": "67", "time": 0, "wait": 2000, - "sound": "", - "text": "「我从前可是很有名的,不会被当成这种下人吧」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10914,18 +7374,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120132.webp", "px": -300 }, - "name": "梅尔特", + "index": "68", "time": 0, "wait": 2000, - "sound": "", - "text": "「······而且,我没法对对我这么钟情的人发火啊」", "bodyList": [ { "name": "tati_z340101.webp", @@ -10941,18 +7397,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340106.webp", "px": -300 }, - "name": "凯伊姆&吉克", + "index": "69", "time": 0, "wait": 2000, - "sound": "", - "text": "「你傻啊」", "bodyList": [ { "name": "tati_z340106.webp", @@ -10968,18 +7420,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340112.webp", "px": -300 }, - "name": "梅尔特", + "index": "70", "time": 0, "wait": 2000, - "sound": "", - "text": "「异口同声呢,不亏是兄弟」", "bodyList": [ { "name": "tati_z340106.webp", @@ -10995,18 +7443,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "71", "time": 0, "wait": 2000, - "sound": "", - "text": "「别用这种称呼,怪恶心的」", "bodyList": [ { "name": "tati_z340106.webp", @@ -11022,18 +7466,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340108.webp", "px": -300 }, - "name": "吉克", + "index": "72", "time": 0, "wait": 2000, - "sound": "", - "text": "「说得没错」", "bodyList": [ { "name": "tati_z340108.webp", @@ -11049,18 +7489,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340105.webp", "px": -300 }, - "name": "吉克", + "index": "73", "time": 0, "wait": 2000, - "sound": "", - "text": "「······说起来······」", "bodyList": [ { "name": "tati_z340105.webp", @@ -11076,18 +7512,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120107.webp", "px": -300 }, - "name": "梅尔特", + "index": "74", "time": 0, "wait": 2000, - "sound": "", - "text": "「怎么了?」", "bodyList": [ { "name": "tati_z340105.webp", @@ -11103,18 +7535,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340107.webp", "px": -300 }, - "name": "吉克", + "index": "75", "time": 0, "wait": 2000, - "sound": "", - "text": "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」", "bodyList": [ { "name": "tati_z340107.webp", @@ -11130,18 +7558,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "", "px": -300 }, - "name": "凯伊姆", + "index": "76", "time": 0, "wait": 2000, - "sound": "", - "text": "「你也说这么无聊的话题」", "bodyList": [ { "name": "tati_z340107.webp", @@ -11157,18 +7581,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340103.webp", "px": -300 }, - "name": "吉克", + "index": "77", "time": 0, "wait": 2000, - "sound": "", - "text": "「不,这是很重要的事情」", "bodyList": [ { "name": "tati_z340103.webp", @@ -11184,18 +7604,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340101.webp", "px": -300 }, - "name": "吉克", + "index": "78", "time": 0, "wait": 2000, - "sound": "", - "text": "「梅尔特,事实是怎么样的?」", "bodyList": [ { "name": "tati_z340101.webp", @@ -11211,18 +7627,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120113.webp", "px": -300 }, - "name": "梅尔特", + "index": "79", "time": 0, "wait": 2000, - "sound": "", - "text": "「啊~是怎么样的呢~」", "bodyList": [ { "name": "tati_z340105.webp", @@ -11238,18 +7650,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_120112.webp", "px": -300 }, - "name": "梅尔特", + "index": "80", "time": 0, "wait": 2000, - "sound": "", - "text": "「我忘记了」", "bodyList": [ { "name": "tati_z340105.webp", @@ -11265,18 +7673,14 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = }, { "type": "cgtext", - "bg": "bg_3551.webp", - "memory": false, "WindowSkin": false, "head": { "name": "face_340107.webp", "px": -300 }, - "name": "吉克", + "index": "81", "time": 0, "wait": 2000, - "sound": "", - "text": "「骗人」", "bodyList": [ { "name": "tati_z340107.webp", @@ -11289,6 +7693,15 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "filter": false } ] + }, + { + "type": "changebg", + "img1": "bg_3551.webp", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "引出" } ], "chapter05": null, @@ -11323,6 +7736,138 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = } ] } + ], + "chapter06": null, + "chapter07": null, + "chapter000001": [ + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "场景切换" + }, + { + "type": "cgtextList", + "textList": "chapter001" + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "1", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "2", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "3", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + } + ], + "chapter00002": [ + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "bg_3531.webp", + "memory2": false, + "time": 30, + "style": "引入" + }, + { + "type": "cgtextList", + "textList": "chapter002" + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + } ] }, "CommonEventTemplate": { diff --git a/project/floors/Caimhome.js b/project/floors/Caimhome.js index f93c9a3..da785fe 100644 --- a/project/floors/Caimhome.js +++ b/project/floors/Caimhome.js @@ -16,7 +16,7 @@ main.floors.Caimhome= "eachArrive": [], "parallelDo": "", "events": { - "3,7": [ + "3,8": [ { "type": "setHeroOpacity", "opacity": 0, @@ -38,1213 +38,11 @@ main.floors.Caimhome= "type": "waitAsync" }, { - "type": "showBgFgMap", - "name": "fg2", + "type": "changeFloor", + "floorId": "zhujuejia", "loc": [ - [ - 0, - 0 - ], - [ - 0, - 1 - ], - [ - 0, - 2 - ], - [ - 0, - 3 - ], - [ - 0, - 4 - ], - [ - 0, - 5 - ], - [ - 0, - 6 - ], - [ - 0, - 7 - ], - [ - 0, - 8 - ], - [ - 1, - 0 - ], - [ - 1, - 1 - ], - [ - 1, - 2 - ], - [ - 1, - 3 - ], - [ - 1, - 4 - ], - [ - 1, - 5 - ], - [ - 1, - 6 - ], - [ - 1, - 7 - ], - [ - 1, - 8 - ], - [ - 2, - 0 - ], - [ - 2, - 1 - ], - [ - 2, - 2 - ], - [ - 2, - 3 - ], - [ - 2, - 4 - ], - [ - 2, - 5 - ], - [ - 2, - 6 - ], - [ - 2, - 7 - ], - [ - 2, - 8 - ], - [ - 3, - 0 - ], - [ - 3, - 1 - ], - [ - 3, - 2 - ], - [ - 3, - 3 - ], - [ - 3, - 4 - ], - [ - 3, - 5 - ], - [ - 3, - 6 - ], - [ - 3, - 7 - ], - [ - 3, - 8 - ], - [ - 4, - 0 - ], - [ - 4, - 1 - ], - [ - 4, - 2 - ], - [ - 4, - 3 - ], - [ - 4, - 4 - ], - [ - 4, - 5 - ], - [ - 4, - 6 - ], - [ - 4, - 7 - ], - [ - 4, - 8 - ], - [ - 5, - 0 - ], - [ - 5, - 1 - ], - [ - 5, - 2 - ], - [ - 5, - 3 - ], - [ - 5, - 4 - ], - [ - 5, - 5 - ], - [ - 5, - 6 - ], - [ - 5, - 7 - ], - [ - 5, - 8 - ], - [ - 6, - 0 - ], - [ - 6, - 1 - ], - [ - 6, - 2 - ], - [ - 6, - 3 - ], - [ - 6, - 4 - ], - [ - 6, - 5 - ], - [ - 6, - 6 - ], - [ - 6, - 7 - ], - [ - 6, - 8 - ], - [ - 7, - 0 - ], - [ - 7, - 1 - ], - [ - 7, - 2 - ], - [ - 7, - 3 - ], - [ - 7, - 4 - ], - [ - 7, - 5 - ], - [ - 7, - 6 - ], - [ - 7, - 7 - ], - [ - 7, - 8 - ], - [ - 8, - 0 - ], - [ - 8, - 1 - ], - [ - 8, - 2 - ], - [ - 8, - 3 - ], - [ - 8, - 4 - ], - [ - 8, - 5 - ], - [ - 8, - 6 - ], - [ - 8, - 7 - ], - [ - 8, - 8 - ], - [ - 9, - 0 - ], - [ - 9, - 1 - ], - [ - 9, - 2 - ], - [ - 9, - 3 - ], - [ - 9, - 4 - ], - [ - 9, - 5 - ], - [ - 9, - 6 - ], - [ - 9, - 7 - ], - [ - 9, - 8 - ], - [ - 10, - 0 - ], - [ - 10, - 1 - ], - [ - 10, - 2 - ], - [ - 10, - 3 - ], - [ - 10, - 4 - ], - [ - 10, - 5 - ], - [ - 10, - 6 - ], - [ - 10, - 7 - ], - [ - 10, - 8 - ], - [ - 11, - 0 - ], - [ - 11, - 1 - ], - [ - 11, - 2 - ], - [ - 11, - 3 - ], - [ - 11, - 4 - ], - [ - 11, - 5 - ], - [ - 11, - 6 - ], - [ - 11, - 7 - ], - [ - 11, - 8 - ], - [ - 12, - 0 - ], - [ - 12, - 1 - ], - [ - 12, - 2 - ], - [ - 12, - 3 - ], - [ - 12, - 4 - ], - [ - 12, - 5 - ], - [ - 12, - 6 - ], - [ - 12, - 7 - ], - [ - 12, - 8 - ], - [ - 13, - 0 - ], - [ - 13, - 1 - ], - [ - 13, - 2 - ], - [ - 13, - 3 - ], - [ - 13, - 4 - ], - [ - 13, - 5 - ], - [ - 13, - 6 - ], - [ - 13, - 7 - ], - [ - 13, - 8 - ], - [ - 7, - 9 - ], - [ - 7, - 10 - ], - [ - 7, - 11 - ], - [ - 8, - 9 - ], - [ - 8, - 10 - ], - [ - 8, - 11 - ], - [ - 9, - 9 - ], - [ - 9, - 10 - ], - [ - 9, - 11 - ], - [ - 10, - 9 - ], - [ - 10, - 10 - ], - [ - 10, - 11 - ], - [ - 11, - 9 - ], - [ - 11, - 10 - ], - [ - 11, - 11 - ] - ] - }, - { - "type": "setBlock", - "number": "starPortal", - "loc": [ - [ - 3, - 10 - ] - ] - }, - { - "type": "moveHero", - "steps": [ - "down:4" - ] - }, - { - "type": "setCurtain", - "color": [ - 0, - 0, - 0, - 0 - ], - "time": 500, - "keep": true - }, - { - "type": "setHeroOpacity", - "opacity": 1, - "time": 500 - } - ], - "3,10": [ - { - "type": "setHeroOpacity", - "opacity": 0, - "time": 500 - }, - { - "type": "setCurtain", - "color": [ - 0, - 0, - 0, - 1 - ], - "time": 500, - "keep": true, - "async": true - }, - { - "type": "waitAsync" - }, - { - "type": "hideBgFgMap", - "name": "fg2", - "loc": [ - [ - 0, - 0 - ], - [ - 0, - 1 - ], - [ - 0, - 2 - ], - [ - 0, - 3 - ], - [ - 0, - 4 - ], - [ - 0, - 5 - ], - [ - 0, - 6 - ], - [ - 0, - 7 - ], - [ - 0, - 8 - ], - [ - 1, - 0 - ], - [ - 1, - 1 - ], - [ - 1, - 2 - ], - [ - 1, - 3 - ], - [ - 1, - 4 - ], - [ - 1, - 5 - ], - [ - 1, - 6 - ], - [ - 1, - 7 - ], - [ - 1, - 8 - ], - [ - 2, - 0 - ], - [ - 2, - 1 - ], - [ - 2, - 2 - ], - [ - 2, - 3 - ], - [ - 2, - 4 - ], - [ - 2, - 5 - ], - [ - 2, - 6 - ], - [ - 2, - 7 - ], - [ - 2, - 8 - ], - [ - 3, - 0 - ], - [ - 3, - 1 - ], - [ - 3, - 2 - ], - [ - 3, - 3 - ], - [ - 3, - 4 - ], - [ - 3, - 5 - ], - [ - 3, - 6 - ], - [ - 3, - 7 - ], - [ - 3, - 8 - ], - [ - 4, - 0 - ], - [ - 4, - 1 - ], - [ - 4, - 2 - ], - [ - 4, - 3 - ], - [ - 4, - 4 - ], - [ - 4, - 5 - ], - [ - 4, - 6 - ], - [ - 4, - 7 - ], - [ - 4, - 8 - ], - [ - 5, - 0 - ], - [ - 5, - 1 - ], - [ - 5, - 2 - ], - [ - 5, - 3 - ], - [ - 5, - 4 - ], - [ - 5, - 5 - ], - [ - 5, - 6 - ], - [ - 5, - 7 - ], - [ - 5, - 8 - ], - [ - 6, - 0 - ], - [ - 6, - 1 - ], - [ - 6, - 2 - ], - [ - 6, - 3 - ], - [ - 6, - 4 - ], - [ - 6, - 5 - ], - [ - 6, - 6 - ], - [ - 6, - 7 - ], - [ - 6, - 8 - ], - [ - 7, - 0 - ], - [ - 7, - 1 - ], - [ - 7, - 2 - ], - [ - 7, - 3 - ], - [ - 7, - 4 - ], - [ - 7, - 5 - ], - [ - 7, - 6 - ], - [ - 7, - 7 - ], - [ - 7, - 8 - ], - [ - 8, - 0 - ], - [ - 8, - 1 - ], - [ - 8, - 2 - ], - [ - 8, - 3 - ], - [ - 8, - 4 - ], - [ - 8, - 5 - ], - [ - 8, - 6 - ], - [ - 8, - 7 - ], - [ - 8, - 8 - ], - [ - 9, - 0 - ], - [ - 9, - 1 - ], - [ - 9, - 2 - ], - [ - 9, - 3 - ], - [ - 9, - 4 - ], - [ - 9, - 5 - ], - [ - 9, - 6 - ], - [ - 9, - 7 - ], - [ - 9, - 8 - ], - [ - 10, - 0 - ], - [ - 10, - 1 - ], - [ - 10, - 2 - ], - [ - 10, - 3 - ], - [ - 10, - 4 - ], - [ - 10, - 5 - ], - [ - 10, - 6 - ], - [ - 10, - 7 - ], - [ - 10, - 8 - ], - [ - 11, - 0 - ], - [ - 11, - 1 - ], - [ - 11, - 2 - ], - [ - 11, - 3 - ], - [ - 11, - 4 - ], - [ - 11, - 5 - ], - [ - 11, - 6 - ], - [ - 11, - 7 - ], - [ - 11, - 8 - ], - [ - 12, - 0 - ], - [ - 12, - 1 - ], - [ - 12, - 2 - ], - [ - 12, - 3 - ], - [ - 12, - 4 - ], - [ - 12, - 5 - ], - [ - 12, - 6 - ], - [ - 12, - 7 - ], - [ - 12, - 8 - ], - [ - 13, - 0 - ], - [ - 13, - 1 - ], - [ - 13, - 2 - ], - [ - 13, - 3 - ], - [ - 13, - 4 - ], - [ - 13, - 5 - ], - [ - 13, - 6 - ], - [ - 13, - 7 - ], - [ - 13, - 8 - ], - [ - 7, - 9 - ], - [ - 7, - 10 - ], - [ - 7, - 11 - ], - [ - 8, - 9 - ], - [ - 8, - 10 - ], - [ - 8, - 11 - ], - [ - 9, - 9 - ], - [ - 9, - 10 - ], - [ - 9, - 11 - ], - [ - 10, - 9 - ], - [ - 10, - 10 - ], - [ - 10, - 11 - ], - [ - 11, - 9 - ], - [ - 11, - 10 - ], - [ - 11, - 11 - ] - ] - }, - { - "type": "setBlock", - "number": "X50030", - "loc": [ - [ - 3, - 10 - ] - ] - }, - { - "type": "moveHero", - "steps": [ - "up:3" + 5, + 2 ] }, { @@ -1286,13 +84,13 @@ main.floors.Caimhome= [ 17,10173,20130,40091,40099,40155, 17, 0,71224,90520, 0,40172, 17], [ 17, 0, 0,71182,71183, 0, 0, 0, 0, 0, 0, 0, 17], [ 17,71681, 0, 0, 0, 0, 17, 17, 0, 0, 17, 17, 17], - [ 17,71689, 0, 0, 0, 0, 17, 17,71606,71631,60111,71678, 17], + [ 17,71689, 0, 0, 0, 0,140, 17,71606,71631,60111,71678, 17], [ 17, 0, 0, 0, 0, 0, 17,71880, 17,71639,71686,71603, 17], - [ 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17], - [120165,120166,120166,120166,120166,120166,120167, 17, 0, 0, 0, 17,120165], - [120173,120174,120174, 90,90212,120174,120175, 17, 0, 0,71336, 17,120173], - [ 0, 17,80007, 0,120073,80011,40110, 17, 17, 17, 17, 17, 0], - [ 0, 17,80003, 0, 0, 0,80010,120165,120166,120166,120166,120167,40118] + [ 17, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 17], + [ 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 17,120165], + [120165,120166,120172,200550,120168,120166,120167, 17, 0, 0,71336, 17,120173], + [120173, 0,120180,200558,120176,90214,120175, 17, 17, 17, 17, 17, 0], + [ 0,120073, 0, 0, 0, 0, 0,120165,120166,120166,120166,120167,40118] ], "areas": "下层", "bgmap": [ @@ -1303,12 +101,12 @@ main.floors.Caimhome= [ 0,70071,70070,70070,70070,70070, 0,70070,70070,70071,70070,70062, 0], [ 0,70070,70062,70070,70070,70071, 0, 0, 0, 0, 0, 0, 0], [ 0,70070,70070,70063,70070,70070,40017,40017,40017,40017,40017,40017, 0], - [ 0,70071,70062,70070,70070,70062,40025,40025,40025,40025,40025,40025, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0,70071,70062,70070, 0, 0], + [ 0,70071,70062,70070,70070,70062,40017,40025,40025,40025,40025,40025, 0], + [ 0,70062,70071,70071,70062,70071,40025,70062,70071,70062,70070, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0,70070,70070,70062, 0, 0], - [ 0, 0, 0,50030,120174, 0, 0, 0,70062,70070,70063, 0, 0], - [ 0, 0, 0,10002, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0,10010, 0,308, 0, 0, 0, 0, 0, 0, 0] + [90078,90078,90078,90078,90078,90078,90078, 0,70062,70070,70063, 0, 0], + [90078,120174,90078,120174,90078,120174,90078, 0, 0, 0, 0, 0,90078], + [90078,90078,90078,90078,90078,90078,90078, 0, 0, 0, 0, 0,90078] ], "fgmap": [ [140,140,140,140,140,140,140, 0, 0, 0, 0, 0,140], @@ -1317,13 +115,13 @@ main.floors.Caimhome= [140, 0, 0, 0, 0, 0, 0, 0, 0,10141, 0, 0,140], [140,71673, 0, 0, 0, 0,140,10165, 0, 0,70624,70625,140], [140,71586, 0, 0, 0, 0,140,140,140,140,140,140,140], + [140, 0, 0, 0, 0, 0,140, 0, 0, 0, 0, 0,140], [140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [140,70630,70631, 0,50062, 0, 0, 0, 0, 0, 0, 0,140], - [140,140,140,140,140,140,140,140, 0, 0, 0,140,140], - [ 0,90207,90206, 0,90204,90206, 0,140, 0, 0,71320,140,110072], - [ 0,90215,90214, 0,120065,90214,40102,140,30114,344,20059,140,110080], - [ 0, 0, 0, 0, 0, 0,80013,140,140,140,140,140,110088], - [ 0, 0, 0, 0, 0, 0, 0, 0,120072, 0, 0, 0, 0] + [140,70630,70631, 0,50062, 0, 0, 0, 0, 0, 0,140,140], + [140,140,140,140,140,140,140,140, 0, 0,71320,140,110072], + [ 0, 0, 0, 0,140091,140092,140092,140,30114,344,20059,140,110080], + [120039, 0, 0, 0,140099,140100,140100,140,140,140,140,140,110088], + [120017, 0, 0, 0,140107,140108,140108, 0,120072,90223, 0, 0,80013] ], "bg2map": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -1333,26 +131,14 @@ main.floors.Caimhome= [ 0, 0, 0,30150,30150, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71694, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 90, 0, 0, 0, 0, 0, 0,71694, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0,80020, 0, 0, 0, 0, 0, 0] + [ 0,120065, 0, 0, 0,120174, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,90244, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "fg2map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [80041,80042,80043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [80049,80050,80051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [80057,80058,80059, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [80065,80066,80067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ] } \ No newline at end of file diff --git a/project/floors/KTV.js b/project/floors/KTV.js index eceffe1..5fd3f57 100644 --- a/project/floors/KTV.js +++ b/project/floors/KTV.js @@ -11,11 +11,201 @@ main.floors.KTV= "images": [], "ratio": 1, "defaultGround": "grass", - "firstArrive": [], + "firstArrive": [ + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "bg_3531.webp", + "memory2": false, + "time": 30, + "style": "引入" + }, + { + "type": "cgtextList", + "textList": "chapter002" + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "1", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "2", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "3", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "4", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "5", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "6", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "7", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "changebg", + "img1": "bg_3531.webp", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "引出" + }, + { + "type": "setHeroOpacity", + "opacity": 1 + }, + { + "type": "setCurtain", + "time": 1000 + } + ], "eachArrive": [], "parallelDo": "", "events": {}, - "changeFloor": {}, + "changeFloor": { + "12,10": { + "floorId": "changguan2", + "loc": [ + 2, + 1 + ] + }, + "10,1": { + "floorId": "KTVF2", + "loc": [ + 10, + 4 + ] + } + }, "beforeBattle": {}, "afterBattle": {}, "afterGetItem": {}, @@ -32,7 +222,7 @@ main.floors.KTV= [ 17,71797,71797,71797,71797,71797,71797,71797,71797,71797, 90, 17, 0], [ 17,90211,90211,90211,90211,71877,90211,90211, 0,90587, 0, 17, 0], [ 17,90541,90542,90543, 17,71761, 17, 17,71288,71116, 0, 17, 0], - [ 17, 0,30216, 0, 0, 0, 0, 0, 0,71257, 0, 17, 0], + [ 17, 0,30216, 0, 0,123, 0, 0, 0,71257, 0, 17, 0], [ 17, 0, 0, 0,71568,71754,20167, 0, 0,71265, 0, 17, 0], [ 17, 0, 0, 0,71887, 0, 0, 0,60160,71265, 0, 17, 0], [ 17,71340, 17, 17, 0, 0, 0, 17, 17,70568, 0,71796,71797], diff --git a/project/floors/KTVF2.js b/project/floors/KTVF2.js index 78260da..62626a0 100644 --- a/project/floors/KTVF2.js +++ b/project/floors/KTVF2.js @@ -15,7 +15,15 @@ main.floors.KTVF2= "eachArrive": [], "parallelDo": "", "events": {}, - "changeFloor": {}, + "changeFloor": { + "10,4": { + "floorId": "KTV", + "loc": [ + 10, + 1 + ] + } + }, "beforeBattle": {}, "afterBattle": {}, "afterGetItem": {}, diff --git a/project/floors/changguan1.js b/project/floors/changguan1.js new file mode 100644 index 0000000..833d90e --- /dev/null +++ b/project/floors/changguan1.js @@ -0,0 +1,140 @@ +main.floors.changguan1= +{ + "floorId": "changguan1", + "title": "主塔 10 层", + "name": "10", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "grass2", + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "通称——", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "changguan2", + "loc": [ + 0, + 0 + ] + } + ], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "6,0": { + "floorId": "guangchang", + "loc": [ + 6, + 12 + ] + }, + "5,12": { + "floorId": "changguan2", + "loc": [ + 5, + 0 + ] + }, + "6,12": { + "floorId": "changguan2", + "loc": [ + 6, + 0 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [210178,210178,210178,210178,210171, 0, 91, 0,210171,110272,110273,110274,110275], + [110241,110242,110243,110244,210187, 0, 0, 0,210187,110280,110281,110282,110283], + [110249,110250,110251,110252,210195, 0, 0, 0,210195,110288,110289,110290,110291], + [110257,110258,110259,200199, 0, 0, 0, 0, 0,110296,110297,110298,110299], + [110265,110266,110267,110268, 0, 0, 0, 0, 0,110304,110305,110306,110307], + [110273,110274,110275,110276, 0, 0, 0, 0, 0,110116,110313,110314,110315], + [110281,110282,110283,110284, 0, 0, 0, 0, 0,110132, 0, 0, 0], + [110289,110290,110291,110292, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [110297,110298,110299,110300, 0, 0, 0, 0, 0,110116, 0, 0, 0], + [110305,110306,110307,110308, 0, 0, 0, 0, 0,110261,110262,110262,110263], + [110313,110314,110315,110316,110122,110122, 0,110122,110122,110269,110270,110270,110271], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,110277,110278,110278,110279], + [140,140186,120002,120003, 0, 93, 93, 0, 0,110285,110286,110286,110286] +], + "bgmap": [ + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] +], + "fgmap": [ + [ 0, 0, 0,200175, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,200183, 0, 0, 0, 0,140086, 0, 0, 0, 0], + [ 0, 0, 0,200191, 0, 0, 0, 0,140094, 0, 0, 0, 0], + [ 0, 0, 0,110260, 0, 0, 0, 0,140102, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0,140110, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,110246,110246,110246,110246], + [140091,140092,140093, 0,110114,110114, 0,110114,110114, 0, 0, 0, 0], + [140099,140100,140101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140107,140108,140109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0,130046,130046,130046,130046,130046,210178, 0, 0,210178], + [210186,210186,210186,210186,130046,130046,130046,130046,130046, 0, 0, 0, 0], + [210194,210194,210194,210194,130054,130054,130054,130054,130054, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,110312, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/changguan2.js b/project/floors/changguan2.js new file mode 100644 index 0000000..c0e530d --- /dev/null +++ b/project/floors/changguan2.js @@ -0,0 +1,148 @@ +main.floors.changguan2= +{ + "floorId": "changguan2", + "title": "街道", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X20003", + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "《牢狱》", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "KTV", + "loc": [ + 10, + 8 + ] + } + ], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "5,0": { + "floorId": "changguan1", + "loc": [ + 5, + 12 + ] + }, + "6,0": { + "floorId": "changguan1", + "loc": [ + 6, + 12 + ] + }, + "12,8": { + "floorId": "street01", + "loc": [ + 0, + 8 + ] + }, + "2,1": { + "floorId": "KTV", + "loc": [ + 12, + 10 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [140193,130178,120010,120011, 0, 91, 91, 0,140184,140,140,140,140186], + [140193,130178, 90, 0, 0, 0, 0, 0,140192,140,140,140,140194], + [140193,130178,40163,120019, 0, 0, 0, 0,140200,140195,140,140,140194], + [140193,143,143,120027, 0, 0, 0, 0,70128,140192,140,140,140194], + [140193,210148,143,143, 0, 0, 0,71826,70136,140192,140,140,140194], + [140193,143,143,143,71226, 0, 0, 0,50151,140200,140201,140201,140202], + [70165,70165,70165,70166,71819, 0, 0, 0, 0,70128,70129,70129,70130], + [140193,210153,143,70174,71827, 0, 0, 0,71826,120056,70137,70137,70138], + [140193,210153,210156,143,71695, 0, 0, 0, 0, 0, 0, 0, 94], + [140193,143,143,143, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140193,140193,130178,70130, 0, 0, 0, 0, 0, 0, 0,140,140], + [140193,140193,130178,40165,200199, 0, 0,71791, 0, 0,140192,140,140], + [140193,140193,130186,110114,110114, 93, 93, 0,143, 0,140192,140,140] +], + "areas": "牢狱", + "bgmap": [ + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] +], + "fgmap": [ + [140,140194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140,140186, 0, 0, 0,71818, 0, 0, 0, 0, 0], + [140,140,140,140194,71218, 0, 0, 0,71818, 0, 0, 0, 0], + [140201,140201,140201,140202, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,71685, 0, 0, 0,71818, 0,90587, 0, 0], + [140,140,140,140186,71844, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140,140194,200175, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140196,140202,200183, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140194, 0,200191, 0, 0, 0, 0,71818,140184,140,140], + [140,140,140194, 0, 0, 0, 0, 0,71832,71833,140192,140,140], + [140,140,140194, 0,110117, 0, 0,140184,140,140,140,140,140] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0,110293,110294,110294,110294,110294], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0,71826, 0, 0, 0, 0], + [ 0, 0, 0, 0,71693, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,70136, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,120064, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,70138, 0, 0, 0, 0, 0,71826, 0, 0, 0], + [ 0, 0, 0,40173, 0, 0, 0,71799,71840,71841, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/chushi.js b/project/floors/chushi.js new file mode 100644 index 0000000..2ca6465 --- /dev/null +++ b/project/floors/chushi.js @@ -0,0 +1,129 @@ +main.floors.chushi= +{ + "floorId": "chushi", + "title": "开场剧情", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "T400", + "firstArrive": [ + { + "type": "insert", + "name": "chapter0" + }, + { + "type": "choices", + "text": "要进行教程内容吗", + "choices": [ + { + "text": "确定", + "action": [ + { + "type": "changeFloor", + "floorId": "jiaocheng01", + "loc": [ + 6, + 12 + ] + } + ] + }, + { + "text": "取消", + "action": [ + { + "type": "changeFloor", + "floorId": "guangchang", + "loc": [ + 6, + 10 + ] + } + ] + }, + { + "text": "一区测试", + "action": [ + { + "type": "changeFloor", + "floorId": "yiqu1", + "loc": [ + 0, + 7 + ] + }, + { + "type": "setValue", + "name": "status:atk", + "value": "16" + }, + { + "type": "setValue", + "name": "status:def", + "value": "16" + }, + { + "type": "setValue", + "name": "status:spell", + "value": "0" + }, + { + "type": "setValue", + "name": "status:speed", + "value": "20" + }, + { + "type": "setValue", + "name": "status:hp", + "value": "1000" + } + ] + } + ] + } + ], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "areas": "开场剧情", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/guangchang.js b/project/floors/guangchang.js index 2adfdaa..3427e91 100644 --- a/project/floors/guangchang.js +++ b/project/floors/guangchang.js @@ -10,27 +10,276 @@ main.floors.guangchang= "canUseQuickShop": true, "images": [], "ratio": 1, - "defaultGround": "grass2", - "firstArrive": [], + "defaultGround": "X90078", + "firstArrive": [ + { + "type": "setCurtain", + "time": 100 + }, + { + "type": "setText", + "position": "center" + }, + { + "type": "move", + "loc": [ + 6, + 7 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:1", + "left:1", + "up:2" + ] + }, + { + "type": "sleep", + "time": 400 + }, + { + "type": "move", + "loc": [ + 8, + 8 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:1", + "left:2" + ] + }, + { + "type": "sleep", + "time": 500 + }, + { + "type": "move", + "loc": [ + 4, + 9 + ], + "time": 500, + "keep": true, + "steps": [ + "right:1" + ] + }, + { + "type": "waitAsync" + }, + { + "type": "autoText", + "text": "浮游都市,《诺瓦斯·艾蒂尔》。", + "time": 2000 + }, + { + "type": "move", + "loc": [ + 6, + 5 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:2" + ] + }, + { + "type": "move", + "loc": [ + 6, + 7 + ], + "time": 500, + "keep": true, + "steps": [ + "up:1" + ] + }, + { + "type": "waitAsync" + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "move", + "loc": [ + 6, + 3 + ], + "time": 500, + "async": true, + "steps": [ + "down:9" + ] + }, + { + "type": "move", + "loc": [ + 5, + 4 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:1", + "right:1" + ] + }, + { + "type": "move", + "loc": [ + 6, + 6 + ], + "time": 300, + "keep": true, + "async": true, + "steps": [ + "right:2" + ] + }, + { + "type": "sleep", + "time": 1000 + }, + { + "type": "move", + "loc": [ + 8, + 6 + ], + "time": 500, + "keep": true, + "steps": [ + "left:1" + ] + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "waitAsync" + }, + { + "type": "jump", + "from": [ + 7, + 6 + ], + "to": [ + 7, + 6 + ], + "time": 500, + "keep": true, + "async": true + }, + { + "type": "move", + "loc": [ + 6, + 3 + ], + "time": 500, + "async": true, + "steps": [ + "up:2" + ] + }, + { + "type": "move", + "loc": [ + 7, + 9 + ], + "time": 500, + "async": true, + "steps": [ + "up:1", + "right:3" + ] + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "waitAsync" + }, + { + "type": "setBlock", + "number": "0", + "loc": [ + [ + 5, + 9 + ], + [ + 7, + 6 + ], + [ + 4, + 4 + ], + [ + 6, + 3 + ] + ] + }, + { + "type": "changeFloor", + "floorId": "guangchang2", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, "changeFloor": { - "12,6": { - "floorId": "street02", - "loc": [ - 0, - 6 - ], - "direction": "right" - }, "6,12": { - "floorId": "guangchang2", + "floorId": "changguan1", "loc": [ 6, 0 + ] + }, + "6,0": { + "floorId": "guangchang5", + "loc": [ + 6, + 12 + ] + }, + "12,8": { + "floorId": "guangchang2", + "loc": [ + 0, + 8 ], - "direction": "down" + "direction": "right" } }, "beforeBattle": {}, @@ -41,29 +290,65 @@ main.floors.guangchang= "cannotMove": {}, "cannotMoveIn": {}, "map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 0,140,141] + [120007,120007,120007,120007,120020, 0, 91, 0, 0,130187,130188,130189,130190], + [120015,120015,120015,120015,120028, 0, 0, 0, 0,120144,120145,120146,120147], + [130172,130173,130174,130175, 0, 0, 0, 0,71320,120152,120153,120154,120155], + [130180,130181,130182,130183,200199, 0, 0,122,71328,120160,120161,120162,120163], + [130188,130189,130190,130191,121, 0, 0, 0,71336,120168,120169,120170,120171], + [130196,130197,130198,130199,140087, 0,121, 0, 0,120176,140020,140020,140020], + [130204, 0,130206,130207,140095, 0, 0, 0, 0, 0,140028,140028,140028], + [ 0, 0,130214,130215,140103, 0,121, 0, 0, 0, 0, 0, 0], + [ 0, 0,130214,120172,140111, 0, 0, 0,123, 0, 0, 0, 94], + [ 0, 0, 0,120180,121, 0, 0,121, 0,200199, 0, 0, 0], + [140107,140108,140109,362,363, 0, 0, 0,361,362,362,362,362], + [210186,210186,210186,210186,210179, 0, 0, 0,210179,210185,210186,210186,210186], + [210178,210178,210178,210178,210171, 0, 93, 0,210171,210177,210178,210178,210178] ], "areas": "牢狱", "bgmap": [ - + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30055,30052,30052,30052,30052,30052,30055,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30055,30052], + [30052,30052,30052,30052,30055,30052,30052,30063,30062,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30055,30052,30062,30052,30052,30052,30052,30052,30052,30052,30055,30052,30052], + [30052,30052,30052,30052,30052,30052,30062,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30062,30052], + [30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [120177,120178,120179,30052,30052,30055,30052,30052,30055,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30062,30052,30052,30052,30052,30055,30052], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "fgmap": [ - + [ 0, 0, 0, 0,200175, 0, 0, 0, 0,130187,130188,130189,130190], + [ 0, 0, 0, 0,200183, 0, 0, 0,140086,130195,130196,130197,130198], + [ 0, 0, 0, 0,200191, 0, 0, 0,140094,130203,130204,130205,130206], + [ 0, 0, 0, 0, 0, 0, 0, 0,140102,130211,130212,130213,130214], + [ 0, 0, 0, 0, 0, 0, 0, 0,140110, 0,140091,140092,140093], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140099,140100,140101], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,200175,140107,140108,140109], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,200183, 0, 0, 0], + [140091,140092,140093, 0, 0, 0, 0, 0, 0,200191, 0, 0, 0], + [140099,140100,140101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [362,362,362, 0, 0, 0, 0, 0, 0, 0, 0,110242, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110249,110250,110251], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,110256,110257,110258,110259] ], "bg2map": [ - + [200195,200196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [90652,80106,90653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [120145,120146,120147, 0, 0, 0, 0, 0, 0, 0,120177,120178,120179], + [120153,120154,120155,120156, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [120161,120162,120163,120164,90642, 0, 0, 0, 0, 0, 0, 0, 0], + [120169,120170,120171, 0,90642, 0, 0, 0, 0, 0, 0, 0, 0], + [130007,130007,130007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [130015,130015,130015, 0, 0, 0, 0, 0,110239,110239,110239,110239,110239], + [ 0, 0, 0, 0,130046,130046,130046,130046,130046, 0, 0, 0, 0], + [ 0, 0, 0, 0,130046,130046,130046,130046,130046, 0, 0, 0, 0] ], "fg2map": [ diff --git a/project/floors/guangchang2.js b/project/floors/guangchang2.js index 8247ca4..2d9947a 100644 --- a/project/floors/guangchang2.js +++ b/project/floors/guangchang2.js @@ -10,25 +10,52 @@ main.floors.guangchang2= "canUseQuickShop": true, "images": [], "ratio": 1, - "defaultGround": "grass2", - "firstArrive": [], + "defaultGround": "X90078", + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "guangchang5", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, "changeFloor": { - "6,0": { + "0,8": { "floorId": "guangchang", "loc": [ - 6, - 12 - ], - "direction": "up" + 12, + 8 + ] }, - "12,10": { - "floorId": "xiaoxiang01", + "2,0": { + "floorId": "guangchang6", "loc": [ - 0, - 10 + 2, + 12 ] } }, @@ -40,29 +67,65 @@ main.floors.guangchang2= "cannotMove": {}, "cannotMoveIn": {}, "map": [ - [ 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,141], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140] + [ 0, 0, 91, 0,210184,210186,210186,210186,210186,210186,210186,210186,143], + [ 0, 0, 0, 0,210192,210194,210194,210175,210194,210194,210194,210194,143], + [120156, 0, 0, 0,90664,90648,90648, 0,90644,90648,90649, 0,143], + [120164, 0, 0, 0,90665,140110,122, 0,90645,140110,122, 0,120120], + [120172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120136], + [120180, 0, 0, 0,90656,90648,90649, 0,90636,90649,90648, 0,120137], + [ 0, 0, 0, 0,90657,140110,122, 0,90638,140110,122, 0,120145], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120160], + [ 92, 0, 0, 0,110384,110385,110376, 0,90652,90648,90649, 0,120168], + [ 0, 0, 0, 0,110384, 0,122, 0,90653, 0,122, 0,120176], + [362,362,363, 0, 0, 0, 0, 0, 0, 0, 0, 0,90266], + [210181,210181,210181, 0, 0, 0, 0, 0, 0, 0, 0, 0,110189], + [210186,210186,210186,361,362,362,362,362,362,362,362,362,110197] ], "areas": "牢狱", "bgmap": [ - + [30052,30052,30052,30052,30052,30062,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30062,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30062,30052,30052,30052,30052,30052,30052], + [30052,30055,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30062,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [210209,210209,210209,30052,30052,30052,30062,30052,30055,30052,30052,30052,30052], + [210209,210209,210209,30062,30052,30052,30052,30052,30052,30052,30052,30052,30052] ], "fgmap": [ - + [130191, 0, 0, 0, 0,140086,140087, 0, 0,140086,140087, 0, 0], + [130199,140087, 0, 0, 0,140094,140095, 0, 0,140094,140095, 0, 0], + [130207,140095, 0, 0, 0,140102,140103, 0, 0,140102,140103, 0, 0], + [130215,140103, 0, 0, 0,140086,140087, 0, 0,140086,140087, 0, 0], + [ 0,140111, 0, 0, 0,140094,140095, 0, 0,140094,140095, 0, 0], + [ 0, 0, 0, 0, 0,140102,140103, 0, 0,140102,140103, 0, 0], + [ 0, 0, 0, 0, 0,140086,140087, 0, 0,140086,140087, 0, 0], + [ 0, 0, 0, 0, 0,140094,140095, 0, 0,140094,140095, 0, 0], + [ 0, 0, 0, 0, 0,140102,140103, 0, 0,140102,140103, 0, 0], + [ 0, 0, 0, 0, 0,140110,140111, 0, 0,140110,140111, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "bg2map": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130192], + [ 0, 0, 0, 0, 0,140110,140111, 0, 0,140110,140111, 0,130200], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,140110,140111, 0, 0,140110,140111, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [110239,110239,110239,364, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,364, 0, 0, 0, 0, 0, 0, 0, 0,90266], + [ 0, 0, 0,110239,110239,110239,110239,110239,110239,110239,110239,110239, 0] ], "fg2map": [ diff --git a/project/floors/guangchang2_1.js b/project/floors/guangchang2_1.js new file mode 100644 index 0000000..c460473 --- /dev/null +++ b/project/floors/guangchang2_1.js @@ -0,0 +1,98 @@ +main.floors.guangchang2_1= +{ + "floorId": "guangchang2_1", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "6,12": { + "floorId": "guangchang", + "loc": [ + 6, + 0 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [210094,210095,210144,210145,210145,210145,210145,210145,210145,210145,210146,210092,210093], + [210102,210103,210152,210153,210153,210153,210153,210153,210153,210153,210154,210100,210101], + [210110,210111,210160,210161,210161,210161,210161,210161,210161,210161,210162,210108,210109], + [210118,210119,210168,210169,210169,210169,210169,210169,210169,210169,210170,210116,210117], + [210126,210127,210181,210181,210176,210183,210181,210181,210176,210183,210181,210124,210125], + [362,363, 0,210178,210184,210177,210178,210178,210184,210177, 0,361,362], + [210181,210181,210181,210178,210184,210177,210178,210178,210184,210177,210181,210181,210181], + [210178,210178,210178,210178,210184,210185,210186,210186,210192,210177,210178,210178,210178], + [210194,210194,210194,210194,210192,210193,210150,210194,210192,210193,210194,210194,210194], + [201037,201037,201037,201029, 0, 0, 0, 0, 0,201029,201037,201037,201037], + [210070,210071,210002,201029, 0, 0, 0, 0, 0,201029,210002,210068,210069], + [210078,210079,210002,201029, 0, 0, 93, 0, 0,201029,210002,210076,210077] +], + "areas": "牢狱", + "bgmap": [ + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [180025,180025, 0, 0, 0, 0, 0, 0, 0, 0, 0,180025,180025], + [180025,180025, 0, 0, 0, 0, 0, 0, 0, 0, 0,180025,180025], + [180025,180025, 0, 0, 0, 0, 0, 0, 0, 0, 0,180025,180025], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [190000,190000,190000,190000,210209,210209,210209,210209,210209,190000,190000,190000,190000], + [190000,190000,190000,190000,210209,210209,210209,210209,210209,190000,190000,190000,190000], + [190000,190000,190000,190000,210209,210209,210209,210209,210209,190000,190000,190000,190000], + [190000,190000,190000,190000,210209,210209,210209,210209,210209,190000,190000,190000,190000] +], + "fgmap": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,210134, 0, 0, 0,210134, 0, 0, 0, 0], + [ 0, 0, 0, 0,210142, 0, 0, 0,210142, 0, 0, 0, 0], + [ 0, 0,210142, 0,210150, 0,210130, 0,210150, 0,210142, 0, 0], + [ 0, 0,210150, 0, 0, 0,210138, 0, 0, 0,210150, 0, 0], + [ 0, 0, 0, 0, 0, 0,210142, 0, 0, 0, 0, 0, 0], + [201021,201021,201021,201021, 0, 0, 0, 0, 0,201021,201021,201021,201021], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,210206, 0,210194, 0,210207, 0, 0, 0, 0], + [ 0, 0, 0, 0,210208, 0, 0, 0,210210, 0, 0, 0, 0], + [210002,210002, 0, 0,210208, 0, 0, 0,210210, 0, 0,210002,210002], + [ 0, 0, 0, 0,210208, 0, 0, 0,210210, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/guangchang2_2.js b/project/floors/guangchang2_2.js new file mode 100644 index 0000000..a70e8c9 --- /dev/null +++ b/project/floors/guangchang2_2.js @@ -0,0 +1,105 @@ +main.floors.guangchang2_2= +{ + "floorId": "guangchang2_2", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "7,0": { + "floorId": "guangchang3", + "loc": [ + 7, + 12 + ] + }, + "6,12": { + "floorId": "guangchang2", + "loc": [ + 6, + 0 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0,120160], + [210094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120168], + [210102,210103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120176], + [210110,210111,110231,110231,110231, 0, 0, 0,110231,110231,110231,110231,110231], + [210118,365,362,362,363, 0, 0, 0,361,362,362,362,362], + [210126,365,210177,210178,210176, 0, 0, 0,210176,210177,210178,210178,210178], + [362,363,210070,210071,210184, 0, 0, 0,210184,210068,210069,210178,210178], + [210181,210184,210078,210079,210192, 0, 0, 0,210192,210076,210077,210194,210194], + [210178,210184,210086,210087, 0, 0, 0, 0, 0,210084,210085,110239,110239], + [210194,210192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [201037,201037,201029, 0, 0, 0, 0, 0, 0,130171,130172,130173,130174], + [210002,210002,201029, 0, 0, 0, 0, 0, 0,130179,130180,130181,130182], + [210002,210002,201029, 0, 0, 0, 93, 0, 0,130187,130188,130189,130190] +], + "areas": "牢狱", + "bgmap": [ + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [180025,180025,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [180025,180025,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [180025,180025,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [190000,190000,190000,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [190000,190000,190000,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [190000,190000,190000,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209], + [190000,190000,190000,210209,210209,210209,210209,210209,210209,210209,210209,210209,210209] +], + "fgmap": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110231,110231], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [201021,201021,201021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120160], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120168], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120176], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,210119,110239,110239,110239, 0, 0, 0,110239,110239,110239,110239,110239], + [ 0,210127, 0, 0, 0,130046,130046,130046, 0, 0, 0, 0, 0], + [ 0, 0,210177,210178, 0,130046,130046,130046, 0,210177,210178, 0, 0], + [ 0, 0,210193,210194, 0,130054,130054,130054, 0,210193,210194, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [210217,210217,210217,210206, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,210208, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,210208, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,210208, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/guangchang3.js b/project/floors/guangchang3.js new file mode 100644 index 0000000..06fa931 --- /dev/null +++ b/project/floors/guangchang3.js @@ -0,0 +1,132 @@ +main.floors.guangchang3= +{ + "floorId": "guangchang3", + "title": "主塔 10 层", + "name": "10", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "guangchang4", + "loc": [ + 0, + 0 + ] + } + ], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "0,9": { + "floorId": "guangchang4", + "loc": [ + 12, + 9 + ] + }, + "6,12": { + "floorId": "guangchang5", + "loc": [ + 6, + 0 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [210161,210161,210162,210185,210186,210186,210186,210186,210186,210186,210160,210161,210161], + [210169,210169,210170,210185,210186,210186,210186,210186,210186,210186,210168,210169,210169], + [210178,210178,210176,210193,210194,210194,210194,210194,210194,210194,210176,210177,210178], + [210178,210167,210184, 0, 0, 0, 0, 0, 0, 0,210184,210159,210178], + [210178,210178,210184, 0, 0, 0,132, 0, 0, 0,210184,210177,210178], + [210186,210186,210184,362,363, 0, 0, 0,361,362,210184,210185,210186], + [210194,210194,210192,210186,210186, 0, 0, 0,210186,210186,210184,210193,210194], + [71795,71814,210192,71655,210194, 0, 0, 0,210194,210194,210192,50165, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,71421,10168,71784,71785], + [ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0,10176, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 0, 0], + [210145,210145,210146, 0, 0, 0, 0, 0, 0, 0, 0,71799, 0], + [210153,210153,210154, 0, 0, 0, 93, 0, 0, 0,90648,90657,90850] +], + "bgmap": [ + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,210209,210209,210209,210209,210209,210209,210209,30052,30052,30052], + [30052,30052,30052,210209,210209,210209,210209,210209,210209,210209,30052,30052,30052], + [30052,30052,30052,210209,210209,210209,210209,210209,210209,210209,30052,30052,30052], + [30052,30052,30052,210209,210209,210209,210209,210209,210209,210209,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30062,30052,30052,30052,30052,30052,30052,30052,30052,30052,30055,30052], + [30052,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30062,30052,30052,30052,30062,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30055,30052,30052,30052], + [30052,30055,30052,30052,30052,30062,30052,30052,30052,30052,30052,30052,30052] +], + "fgmap": [ + [ 0, 0, 0, 0,210142, 0, 0, 0,210142, 0, 0, 0, 0], + [ 0, 0, 0, 0,210150, 0, 0, 0,210150, 0, 0, 0, 0], + [ 0,210142, 0, 0, 0, 0, 0, 0, 0, 0, 0,210142, 0], + [210131,210150, 0, 0, 0, 0, 0, 0, 0, 0, 0,210150,210131], + [210139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210139], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [71787,71806, 0, 0, 0, 0, 0, 0, 0, 0, 0,50157, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,71413, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140086], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,50151,71217,140094], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71791,140102], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140110], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140086] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,130046,130046,130046, 0, 0, 0, 0, 0], + [ 0, 0, 0,210194, 0,130054,130054,130054, 0,210194, 0, 0, 0], + [ 0, 0, 0,71663, 0, 0, 0, 0,90849, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71792,71793], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71225,71328], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71336], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/guangchang4.js b/project/floors/guangchang4.js new file mode 100644 index 0000000..cb6d123 --- /dev/null +++ b/project/floors/guangchang4.js @@ -0,0 +1,138 @@ +main.floors.guangchang4= +{ + "floorId": "guangchang4", + "title": "主塔 10 层", + "name": "10", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "是被险峻的峭壁环绕,与世隔绝的,都市的最底部", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "changguan1", + "loc": [ + 0, + 0 + ] + } + ], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "12,9": { + "floorId": "guangchang3", + "loc": [ + 0, + 9 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [210161,210161,210161,210162,364,271, 0,271,365,210160,210161,210161,210161], + [210169,210169,210169,210170,364, 0,272, 0,365,210168,210169,210169,210169], + [210181,210181,210182,210176,361,362,362,362,363,210176,210180,210181,210181], + [210178,210178,210159,210184,210185,210186,210186,210186,210186,210184,210177,210178,210178], + [210178,210178,210178,210184,210177,10104,10105,10106,210167,210184,210177,210178,210178], + [210186,210186,210186,210184,210193,10112,10113,10114,210194,210184,210185,210186,210186], + [71834,71835,210194,210192,30167, 0, 0, 0,30167,210192,210175,210194,210194], + [130173,71835,130175, 0, 0, 0, 0, 0, 0, 0,71799,71799, 0], + [130181,130182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [130189,130190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94], + [130189,130190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [130189,130190, 0, 0, 0, 0, 0, 0, 0, 0,210144,210145,210145], + [130197,130198, 0,90601,90601,90601,90601,90601,90601,90601,210152,210153,210153] +], + "bgmap": [ + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30062,30052,30052,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30062,30052,30052], + [30052,30052,30052,30062,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30055,30052,30052,30052,30052,30052,30052,30062,30052,30052,30052,30055,30052], + [30052,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30052,30052,30062] +], + "fgmap": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,210142, 0, 0, 0, 0, 0, 0, 0,210142, 0, 0], + [210131,210131,210150, 0,210142, 0, 0, 0,210142, 0,210150,210131,210131], + [210139,210139, 0, 0,210150, 0, 0, 0,210150, 0, 0,210139,210139], + [210142, 0, 0, 0,30159, 0, 0, 0,30159, 0, 0, 0,210142], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71791,71791,71786], + [ 0,130174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,71794], + [ 0, 0,130183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,130191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,130191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,130191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,130191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0,210212,210212,210212,210212,210212, 0, 0, 0, 0], + [ 0, 0, 0, 0,210212,210212,210212,210212,210212, 0, 0, 0, 0], + [ 0, 0, 0, 0,210212,210212,210212,210212,210212, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,210178,210178,210178, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,210194,210194,210194, 0, 0, 0, 0, 0], + [210150,210194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [71842,71843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [120146,120147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210150], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +] +} \ No newline at end of file diff --git a/project/floors/guangchang5.js b/project/floors/guangchang5.js new file mode 100644 index 0000000..86715ef --- /dev/null +++ b/project/floors/guangchang5.js @@ -0,0 +1,141 @@ +main.floors.guangchang5= +{ + "floorId": "guangchang5", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "《特别受灾地区》——", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "guangchang3", + "loc": [ + 0, + 0 + ] + } + ], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "6,12": { + "floorId": "guangchang", + "loc": [ + 6, + 0 + ] + }, + "6,0": { + "floorId": "guangchang3", + "loc": [ + 6, + 12 + ] + }, + "12,9": { + "floorId": "guangchang6", + "loc": [ + 0, + 9 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [210161,210157,210162, 0, 0, 0, 91, 0, 0, 0, 0, 0,140094], + [210164,210165,210170, 0, 0, 0, 0, 0, 0, 0, 0,20110,140094], + [210162,210178,210179, 0, 0, 0, 0, 0, 0, 0,122, 0,140102], + [210170,210178,210171, 0, 0, 0, 0, 0, 0, 0, 0,20110,140110], + [ 0,365,362,362,363, 0, 0, 0,361,362,362,362,362], + [ 0,365,210177,210178,210176, 0, 0, 0,210176,210167,210178,210178,210178], + [362,363,210070,210071,210184, 0, 0, 0,210184,210068,210069,210178,210166], + [210181,210184,210078,210079,210192, 0, 0, 0,210192,210076,210077,210194,210194], + [210178,210184,210086,210087, 0, 0, 0, 0, 0,210084,210085,110239,110239], + [210194,210192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94], + [200171,200172,120031,120031,120020, 0, 0, 0, 0, 0, 0, 0, 0], + [200179,200180,122, 0, 0, 0, 0, 0,200199, 0,130180,130181,130182], + [200187,200188, 0, 0, 0, 0, 93, 0, 0,130187,130188,130189,130190] +], + "areas": "牢狱", + "bgmap": [ + [30052,30052,30055,30052,30052,30052,30052,30052,30052,30062,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30055,30052], + [30055,30052,30052,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30062,30052,30052,30052,30052,30052,30052,30062,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30055,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [210209,210209,30052,30052,30052,30052,30062,30052,30052,30052,30052,30052,30052], + [210209,210209,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30052], + [30052,30052,30052,30052,30055,30052,30052,30052,30052,30052,30052,30052,30055], + [30052,30052,30052,30052,30052,30052,30052,30052,30052,30052,30062,30052,30052], + [30052,30052,30052,30052,30052,30052,30052,30052,30055,30052,30052,30052,30052], + [30052,30052,30052,30062,30052,30052,30052,30052,30052,30052,30052,30052,30052] +], + "fgmap": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,20102, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,20102, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,120080, 0, 0, 0, 0, 0, 0, 0, 0,120080, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [200115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110231,110231], + [200147,200124, 0, 0, 0, 0, 0, 0,200175, 0, 0, 0, 0], + [200147,200148,120026,120026,120004, 0, 0, 0,200183, 0, 0, 0, 0], + [200155,200156, 0, 0, 0, 0, 0, 0,200191, 0,130172,130173,130174], + [200163,200164, 0, 0, 0, 0, 0, 0, 0,130179, 0, 0, 0], + [ 0, 0, 0, 0,120004, 0, 0, 0, 0, 0, 0, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,210178,210179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,210178,210195, 0, 0, 0, 0, 0, 0, 0, 0, 0,140110], + [210179,210178,110239,110239,110239, 0, 0, 0,110239,110239,110239,110239,110239], + [210171, 0, 0, 0, 0,130046,130046,130046, 0, 0, 0, 0, 0], + [210195, 0,210177,210178, 0,130046,130046,130046, 0,210177,210178, 0, 0], + [ 0, 0,210175,210194, 0,130054,130054,130054, 0,210193,210194, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,200173, 0,120012, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,200181, 0,120028, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,200189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/guangchang6.js b/project/floors/guangchang6.js new file mode 100644 index 0000000..e2f79e3 --- /dev/null +++ b/project/floors/guangchang6.js @@ -0,0 +1,116 @@ +main.floors.guangchang6= +{ + "floorId": "guangchang6", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "2,12": { + "floorId": "guangchang2", + "loc": [ + 2, + 0 + ] + }, + "0,9": { + "floorId": "guangchang5", + "loc": [ + 12, + 9 + ] + }, + "12,7": { + "floorId": "yiqu1", + "loc": [ + 0, + 7 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": { + "4,12": [], + "4,11": [], + "4,10": [] + }, + "map": [ + [140095,120160,120161,120162,120163,120164,365, 0, 0, 0, 0,143,143], + [140095,120168,120169,120170,120171,120172,365, 0, 0, 0, 0,143,143], + [140103,120176,120177,20122,120179,120180,365,20122,122, 0, 0,143,143], + [140111,20110,140107,140108,140109,20110,365,20130, 0, 0,130075,130192,130193], + [362,362,362,362,362,362,362,20113, 0, 0,130082,130200,130201], + [210178,210178,210178,210167,210178,210178,210176, 0, 0, 0,137,140099,140100], + [210178,210178,210178,210178,210178,210178,210184,20113,121, 0, 0,140107,140108], + [210194,210175,210194,210194,210194,210194,210192,20114, 0, 0, 0, 0, 94], + [110239, 0, 0, 0, 0, 0,365, 0, 0, 0, 0,120109,120110], + [ 92, 0, 0, 0,362, 0,363,128, 0, 0,10165,120117,120118], + [ 0, 0, 0, 0, 17, 0, 17, 0, 0, 0,10173,120125,120126], + [130183, 0, 0, 0, 17, 0, 17, 0, 0, 0,10173,120133,120134], + [130191, 0, 93, 0, 17, 0, 0, 0, 0,138,10157,120141,120142] +], + "areas": "牢狱", + "bgmap": [ + [30055,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30055,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078, 0,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052, 0,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,30052,30052,30052,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,210187,210178,210187,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,210195,210178,210195,90078,90078,90078,90078,90078,90078], + [30052,30052,30052,30052,90078,90078,90078,90078,90078,90078,90078,90078,90078] +], + "fgmap": [ + [ 0, 0, 0, 0, 0, 0, 0,140087, 0, 0,140094, 0, 0], + [ 0, 0,140091,140092,140093, 0, 0,140095, 0, 0,140102, 0, 0], + [ 0,20102,140099,140100,140101,20102, 0,140103, 0, 0,140110, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0,140111, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0,140087, 0, 0, 0,140091,140092], + [ 0, 0, 0, 0, 0, 0, 0,140095, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0,140103, 0, 0, 0, 0, 0], + [110231, 0, 0, 0, 0, 0,365,140111, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140086, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140094, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140102, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0,160032, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,160032, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,120178, 0, 0,160032, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,20130, 0, 0,160032, 0, 0, 0,130088, 0, 0], + [120103,120103,120103,120103,120103,120103,120103, 0, 0, 0,130096, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130076,130076], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130084,130084], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,365, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,365,130045,130046,130047, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,365,130045,130046,130047, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,365,130053,130054,130055, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/guangchangquan.js b/project/floors/guangchangquan.js new file mode 100644 index 0000000..e5040e3 --- /dev/null +++ b/project/floors/guangchangquan.js @@ -0,0 +1,194 @@ +main.floors.guangchangquan= +{ + "floorId": "guangchangquan", + "title": "广场", + "name": "1", + "width": 26, + "height": 39, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [210178,210178,210178,210178,210171, 0, 0, 0,210171,210178,210178,210178,210178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [210178,210178,210178,210178,210171, 0, 0, 0,210171,210178,210178,210178,210178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "areas": "牢狱", + "bgmap": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,140061,140061,140061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,140061,140061,140061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fgmap": [ + +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 86, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 86, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 86, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 86, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 86, 86, 86, 86,140061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,140061,140061,140061,140061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,140061,140061,140061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0,140061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,20067,20067,20067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +] +} \ No newline at end of file diff --git a/project/floors/jiaocheng01.js b/project/floors/jiaocheng01.js new file mode 100644 index 0000000..98b85b0 --- /dev/null +++ b/project/floors/jiaocheng01.js @@ -0,0 +1,285 @@ +main.floors.jiaocheng01= +{ + "floorId": "jiaocheng01", + "title": "教程1", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [ + { + "type": "setHeroOpacity", + "opacity": 1 + }, + { + "type": "setCurtain", + "time": 100 + } + ], + "eachArrive": [], + "parallelDo": "", + "events": { + "0,11": [ + "宝石介绍:攻防法速\n加点量:2/2/5/2" + ], + "12,11": [ + "血瓶介绍:不同大小" + ], + "5,7": [ + { + "type": "choices", + "text": "\t[小妖精,fairy]是否要进行钥匙和宝物方面的教学呢?", + "choices": [ + { + "text": "我太需要了", + "action": [ + "\t[小妖精,fairy]一种颜色的钥匙开一种颜色的门。\n一把钥匙只能开一扇门。", + "\t[小妖精,fairy]除了钥匙以外,地图上常见的宝物还有宝石和血瓶。\n血瓶可以增加角色的生命值。\n血瓶的颜色、样式和所处的区域决定了血瓶增加的生命值数量。\n在第一个区域,四种颜色的基础血瓶分别可以回复角色100,\n250,500和900点生命值。", + "\t[小妖精,fairy]宝石可以增加角色的四维。\n红宝石增加攻击力。\n蓝宝石增加防御力。\n绿宝石增加法术强度。\n黄宝石增加速度。", + "\t[小妖精,fairy]不同样式、不同区域的宝石决定了宝石增加的能力幅度。\n在第一个区域,红、蓝、黄色的基础宝石可以增加角色对应能力2点。\n绿色的基础宝石可以增加角色法术强度5点。", + { + "type": "jump", + "to": [ + 2, + 2 + ], + "time": 500, + "keep": true + } + ] + }, + { + "text": "我已经了解了", + "action": [ + { + "type": "setValue", + "name": "flag:跳过1", + "value": "1" + }, + { + "type": "jump", + "to": [ + 6, + 1 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "loc": [ + [ + 2, + 2 + ] + ], + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 8, + 1 + ] + ], + "remove": true + } + ] + } + ] + } + ], + "2,2": [ + "\t[小妖精,fairy]在这个游戏中,不同颜色的钥匙珍贵程度也不相同。", + "\t[小妖精,fairy]黄色的钥匙最为常见。", + "\t[小妖精,fairy]蓝色的钥匙有点罕见,其价值在正式游戏中略高于2把黄钥匙,但低于3把黄钥匙。", + "\t[小妖精,fairy]红色的钥匙比较稀有,在正式游戏中一般一把红钥匙可以换取3把蓝钥匙,但反之则有价无市。\n红色的钥匙在正式游戏中一般仅用于boss战相关,开启非常重要的道具,或绕过非常非常强力的怪物。", + "\t[小妖精,fairy]绿色的钥匙为剧情道具,在游戏进程中绿钥匙和不可绕过的绿门一一对应,但存在通往相同区域的二选一绿门。\n绿色的钥匙一般被重兵把守,且不参与其他钥匙的相互兑换。", + { + "type": "jump", + "to": [ + 8, + 1 + ], + "time": 500, + "keep": true + } + ], + "8,1": [ + "\t[小妖精,fairy]在地图上,偶尔会出现这种看起来白送一把蓝钥匙的房间。", + "\t[小妖精,fairy]然而,拿到这把“免费的”蓝钥匙,需要一把红钥匙作为前置。\n在教程关卡中,你肯定拥有这把红钥匙——如果你没有立即拿取旁边绿钥匙的话。", + "\t[小妖精,fairy]在正式游戏中,你可能当时没有,甚至在一时半会儿都不会有这把红钥匙。\n那样的话,这把蓝钥匙只能寄存在房间里。\n在拿到红钥匙之后,你的第一优先级行动就是回来拿上这把蓝钥匙。", + "\t[小妖精,fairy]这把红钥匙,以及用1红钥匙换取1红1蓝钥匙的操作,称为钥匙的周转。", + "\t[小妖精,fairy]当然,如果门口有怪物把守的话就另当别论——等到损失比较合适的时候再回来吧。", + { + "type": "jump", + "to": [ + 6, + 1 + ], + "time": 500, + "keep": true + }, + { + "type": "setValue", + "name": "flag:教程1", + "value": "1" + } + ], + "6,1": [ + { + "type": "if", + "condition": "((Math.max(flag:教程1,flag:跳过1))===1)", + "true": [ + "\t[小妖精,fairy]接下来就要开始适应本游戏的战斗系统了——", + "\t[小妖精,fairy]在此之前,让我先确认一下吧。\n你拥有黄钥匙和蓝钥匙各一把,对吗?", + "\t[小妖精,fairy]相对于其他RPG游戏来说,本作的战斗系统并不需要玩家在战斗中爆手速进行操作。\n暂停或挂机也是没问题的——怪物并不会因为现实中的你不操作而主动攻击你。\n换句话说,战斗的结果在战斗开始的一瞬间就已经确定了。", + "\t[小妖精,fairy]除此之外,通过存档读档刷取随机数的操作在本作中也是不可行的。\n本作品将不涉及任何随机数的判定。\n这意味着如果你愿意,你可以百分百精确地复制一条攻略路线。", + "\t[小妖精,fairy]换句话说,本作的战斗过程只依赖于战斗双方的各项数据。\n这包括双方的面板数值,各种技能,和多样的装备。", + "\t[小妖精,fairy]本作还有另外一个特点——地图上的资源是有限的,并不会随时间自动刷新。\n这意味着不能在低级图反复刷取资源来碾压高级的怪物,必须仔细规划资源的获取及使用。", + "\t[小妖精,fairy]在手部乘区、脸部乘区、肝部乘区都被限制住的情况下——\n请开发自己的脑部乘区,迎接后面的挑战吧!", + { + "type": "choices", + "text": "\t[小妖精,fairy]是否需要进行简单的战斗系统讲解呢?", + "choices": [ + { + "text": "我太需要了", + "action": [] + }, + { + "text": "我已经很会了", + "action": [ + { + "type": "hide", + "loc": [ + [ + 9, + 10 + ] + ], + "floorId": "jiaocheng02", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 11, + 8 + ] + ], + "floorId": "jiaocheng02", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 11, + 4 + ] + ], + "floorId": "jiaocheng02", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 7, + 4 + ] + ], + "floorId": "jiaocheng02", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 5, + 2 + ] + ], + "floorId": "jiaocheng02", + "remove": true + }, + { + "type": "setBlock", + "number": "fairy", + "loc": [ + [ + 4, + 9 + ] + ], + "floorId": "jiaocheng02" + }, + { + "type": "setValue", + "name": "flag:跳过2", + "value": "1" + } + ] + } + ] + }, + { + "type": "hide", + "remove": true + } + ] + } + ] + }, + "changeFloor": { + "6,0": { + "floorId": "jiaocheng02", + "loc": [ + 6, + 12 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 1, 1, 1, 1, 1, 1, 91, 1, 1, 1, 1, 1, 1], + [ 1, 22, 0, 1, 22, 1, 0, 1, 0, 0, 23, 22, 1], + [ 1, 21, 0, 1, 81, 1, 84, 1, 83, 1, 1, 1, 1], + [ 1, 82, 1, 1, 0, 0, 0, 81, 0, 83, 0, 24, 1], + [ 1, 0, 0, 82, 0, 1, 81, 1, 82, 1, 1, 1, 1], + [ 1, 21, 1, 1, 0, 1, 22, 1, 0, 0, 21, 23, 1], + [ 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1, 1], + [401, 0,402, 1, 0,124, 82, 0, 22, 1, 31, 0, 32], + [ 0, 0, 0, 1, 21, 1, 1, 1, 0, 1, 0, 0, 0], + [403, 0,404, 1, 23, 1, 21, 1, 0, 1, 34, 0, 33], + [ 1, 1, 1, 1, 1, 1, 0, 1, 81, 1, 1, 1, 1], + [129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129], + [ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1] +], + "areas": "教程", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/jiaocheng02.js b/project/floors/jiaocheng02.js new file mode 100644 index 0000000..7990160 --- /dev/null +++ b/project/floors/jiaocheng02.js @@ -0,0 +1,363 @@ +main.floors.jiaocheng02= +{ + "floorId": "jiaocheng02", + "title": "教程2", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": { + "9,10": [ + "\t[小妖精,fairy]恭喜你!开始了接触本作战斗系统的第一步!\n希望你刚才有好好看过战斗动画哦——当然没有也没关系!我们一点点教!", + "\t[小妖精,fairy]刚才我们的剑砍到敌人身上的时候,敌人身上冒出了一个“-16”的数字。\n这意味着我们砍出去的剑对敌人造成了16点伤害。\n这个“-16”是怎么来的呢?", + "\t[小妖精,fairy]打开怪物手册!", + { + "type": "callBook" + }, + "\t[小妖精,fairy]我们拥有26点攻击力——在左边的状态栏可以看到。\n敌人拥有10点防御力——在怪物手册可以看到。\n我们的每次普通攻击将对怪物造成26-10=16点伤害。", + "\t[小妖精,fairy]同理,怪物的每次普通攻击将对我们造成46-16=30点伤害。\n在战斗动画中也有体现哦!", + "\t[小妖精,fairy]一方的生命值降低到0,意味着这一方被对方击杀。\n换句话说,如果我们的生命值被怪物的攻击压低到了0,这意味着勇士在战斗中牺牲了。\n(也就是game over啦)。", + "\t[小妖精,fairy]虽然在相同的状态下,持有更多的生命值总是更好,但生命值只是一个“够用就行”的属性。\n相较于把自己的生命值把握在自我设定的“500点”“1000点”等“安全线”上,\n用这些多余的生命值换取钥匙、能力,甚至是金币等资源,对后续的游戏过程来说会更轻松。", + "\t[小妖精,fairy]话说回来。\n怪物的生命值一共有222点。\n我们想要击杀怪物需要攻击怪物——222÷16(向上取整)=14次。\n为什么是向上取整?因为哪怕怪物还剩1点生命值,没死就是没死。", + "\t[小妖精,fairy]在我们攻击怪物14次的过程中,敌人也反击了我们13次。\n我们的生命因此损失了13*30=390点。\n如果没有关闭显伤开关的话,这个”390点“的数字将会显示在在怪物的左下角。\n剩余的生命仍然足够击败第二个相同的敌人呢——但好像还有什么事需要做?", + { + "type": "jump", + "to": [ + 11, + 8 + ], + "time": 500, + "keep": true + } + ], + "11,8": [ + "\t[小妖精,fairy]在本作中,有一个便捷操作,叫做“自动存档”。\n具体点说,就是在我们与怪物发生战斗前,或开门前,都会进行一个存档。\n后面我们发现之前哪一步做错了,都有机会撤销,“反悔”——最多支持反悔50步之前的错误。\n读取自动存档的快捷键是“A”键。", + "\t[小妖精,fairy]红宝石可以提高角色的攻击力。\n不同形状、不同区域的红宝石,提高攻击力的程度也不一样。\n刚才黄门里的红宝石,在当前区域每一颗可以提升角色2点攻击力。", + { + "type": "if", + "condition": "(status:hp!==280)", + "true": [ + "\t[小妖精,fairy]一般来说,在地图上有无需战斗就可以获得的资源时,优先获得这些资源再进行战斗。\n获得资源提升能力,会让我们在战斗中更具有优势。\n不用为了后面保存黄钥匙!钥匙是够的!", + "\t[小妖精,fairy]所以你为什么没有拿红宝石就急匆匆地来战斗了!", + "\t[小妖精,fairy]请读取自动存档,回去拿完宝石再与敌人作战!" + ], + "false": [ + "\t[小妖精,fairy]在提升攻击力后,角色的攻击将更有力度。\n在获得2颗红宝石之后,角色每次攻击对怪物造成的伤害将由16点提升到20点。\n原本需要222÷16=14次攻击击杀的怪物,现在只需要222÷20=12次即可击杀。", + "\t[小妖精,fairy]由于怪物受到更少次数的攻击就被击杀了,角色受到的攻击次数也减少了。\n从13次减少到了11次。", + "\t[小妖精,fairy]但要注意——不是所有时候提升攻击力都能降低角色受到的攻击次数。\n如果角色的攻击力仅提升了1点,攻击伤害从16提升到17——\n击败怪物需要的攻击次数是222÷17,还是14次。这意味着战斗伤害不会有任何变化。", + "\t[小妖精,fairy]因此,能带来战斗伤害减少的攻击力提升节点特别重要——我们称之为“临界”。\n从最初的26点攻击力,16点攻击伤害,需要14次攻击击杀,开始计算——\n222÷13=17.077,这意味着我们至少要达到17.077的攻击伤害,才能减少击杀敌人的攻击次数——但由于本作的攻击力是整数,你必须达到18的攻击伤害,也就是28点攻击力,才能降低战斗伤害。", + "\t[小妖精,fairy]同理,以现在的状态开始计算。现在我们需要12次攻击击杀怪物。\n222÷11=20.182,我们需要21的攻击伤害,也就是31点攻击力。", + { + "type": "callBook" + }, + "\t[小妖精,fairy]我们的攻击力距离下一个临界点还差1点;达到临界点可以让我们受到的伤害减少30点。\n在怪物手册中记作[1,30]或\"1:30\"。\n同样地,右上角相同的怪物身上,在战斗伤害330的数字上面,显示的是距离下一个攻击临界点的距离,\n1点。", + "\t[小妖精,fairy]点击怪物手册中的特定怪物,可以查看怪物的详细信息。\n其中不仅包括怪物特殊属性的具体效果,还包含了详细的临界表格。\n在攻击临界表格内,“:”前面的数值表示还差多少攻击抵达接下来的临界,后面的数值表示抵达该临界可以在战斗中少受到多少伤害。", + "\t[小妖精,fairy]但请注意,有的时候用更少的攻击次数击杀怪物,并不会让自己承受怪物的伤害变少哦!\n这就与我们接下来要讲解的属性,”速度“,有关啦。", + "\t[小妖精,fairy]哎呀——生命值好像不太够了!\n捡起后面黄门里的血瓶,补充生命值继续后面的内容吧!", + { + "type": "jump", + "to": [ + 11, + 4 + ], + "time": 500, + "keep": true + } + ] + } + ], + "11,4": [ + "\t[小妖精,fairy]与其他魔塔游戏不同的是,本作不仅引入了“速度”属性,还引入了实时战斗系统。\n这将带来比回合制战斗更丰富,更具有策略性的战斗体验。", + "\t[小妖精,fairy]在本作中,“速度”意味着角色进行一次攻击前摇的快慢程度。没有特殊说明的话,本作不涉及攻击后摇。\n现在角色的速度为16,这意味着在单位时间内,角色可以攻击16次。\n战斗开始时,参战的双方互相向对方表露敌意,并开始分别计算攻击前摇。\n另一方面,速度和攻击前摇挂钩,意味着角色下一次攻击的时刻以上一次攻击落下时的速度为准;在此之后受到任何额外的减速效果,都只会影响到再下一次攻击。", + "\t[小妖精,fairy]在刚才的战斗中,怪物的速度为18,角色的速度为16。\n因此在互相展现敌意后,怪物的攻击先命中角色,随后才是角色对怪物造成伤害。\n此后双方一直匀速造成伤害。", + "\t[小妖精,fairy]战斗结束于8次攻击/16速度=0.5时刻。\n此时角色攻击8次,完成对怪物的击杀;与此同时,怪物的第9次攻击前摇刚好准备完毕。\n在本作的战斗系统中,如果怪物死亡时刻正好作出一次攻击(时刻完全相同)的话,视为这次攻击有效!\n因此,角色在之前的战斗中受到怪物刚好9次伤害。", + "\t[小妖精,fairy]接下来,请获取黄门中的2颗黄宝石,将角色的速度从16提升到20。\n面对相同的敌人,提升速度又会展现什么效果呢?", + { + "type": "jump", + "to": [ + 7, + 4 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "remove": true + } + ], + "7,4": [ + { + "type": "if", + "condition": "(status:hp!==380)", + "true": [ + "\t[小妖精,fairy]都告诉你要获取黄宝石啦!地图上的生命资源并不是那么充足!再浪费的话后面肯定不够啦!", + "\t[小妖精,fairy]请读取自动存档,回去拿完宝石再与敌人作战!" + ], + "false": [ + "\t[小妖精,fairy]在提升速度后,角色可以在更短的时间内打出足以击杀怪物的攻击频率。\n相比获取宝石之前,角色的攻击前摇快了25%。", + "\t[小妖精,fairy]虽然攻击威力没有变化,仍然需要8次攻击才能击杀怪物,但战斗时间却实打实地从0.5降低到了0.4。\n在0.4时刻之前,怪物最多只能打出18*0.4=7次攻击。\n当然,提升攻击力降低战斗伤害的本质也是缩短战斗时间,从而让怪物的攻击频率缩短。", + "\t[小妖精,fairy]但要注意——不是所有时候提升速度都能降低角色受到的攻击次数。\n如果角色的速度从21提升到24,击杀怪物需要的时间将由8/21=0.381变为0.333。(实际计算中具体时刻将保留14位小数,确保精确)\n怪物的第6次攻击于0.333时刻落下,而第7次攻击将于0.389时刻落下。\n因此,将击杀怪物的时刻从0.381提前到0.333,不影响怪物的第6和第7次攻击,从而不会降低伤害。", + "\t[小妖精,fairy]因此,能带来战斗伤害减少的速度提升节点也特别重要——我们也称之为“临界”。\n从最初的需要8次攻击击杀,16点速度,0.5时刻击杀怪物开始计算(当然是计算怪物的时间轴)——\n怪物的第8次攻击落于0.444时刻,第9次攻击落于0.5时刻。\n速度达到17时,击杀时刻为8/17=0.471;速度达到19时,击杀时刻为8/19=0.421,刚好在怪物的第9次和第8次攻击之前。", + { + "type": "callBook" + }, + "\t[小妖精,fairy]同理,以现在的状态开始计算。现在我们需要0.4的攻击时间击杀怪物。\n怪物最后一次的攻击时刻为0.389;我们提升1点速度将会使我们的最后一次攻击时刻提前到0.381,从而少受到一次怪物的攻击——这1点速度就是一个速度临界值。继续提升速度,就需要考虑怪物在0.333时刻的攻击。", + "\t[小妖精,fairy]我们的速度距离下一个临界点还差1点;达到临界点可以让我们受到的伤害减少50点。\n在怪物手册中记作[1,50]或\"1:50\"。速度临界值和临界表暂时需要到怪物手册中才能查阅。", + "\t[小妖精,fairy]捡起后面的血瓶和黄钥匙,补充生命值继续后面的内容吧!", + { + "type": "jump", + "to": [ + 5, + 2 + ], + "time": 500, + "keep": true + } + ] + } + ], + "5,2": [ + "\t[小妖精,fairy]防御是另一个非常重要的属性。\n与攻击和速度相比,防御是通过降低被怪物攻击的单次伤害来减少战斗损失的。\n对物理攻击的怪物来说,每一点防御都能起到应有的作用。", + "\t[小妖精,fairy]而且角色的防御与敌人的攻击越接近,防御的减伤效果越好。\n一般来说,如果只考虑攻击和防御的话,攻防和高于怪物的时候,防御的减伤效果比攻击更好。", + "\t[小妖精,fairy]在刚才的战斗中,怪物的攻击为28,角色的防御为16。怪物每次攻击对角色造成12点伤害。\n在获取黄门中的2颗蓝宝石后,角色的防御将从16提升到20,怪物的攻击将仅造成8点伤害。", + { + "type": "callBook" + }, + "\t[小妖精,fairy]当然,1点防御的具体减伤价值,和战斗中角色受到的物理攻击次数有关,且怪物的特殊属性经常会造成影响。\n以刚才的战斗为例,角色总共被怪物攻击34次。\n1点防御将使怪物造成的普通攻击物理伤害减少1点,从而降低战斗伤害34点。\n同理,对于之前战斗过的两个怪物,1点防御对它们的价值分别是9点和7点减伤。", + "\t[小妖精,fairy]但对于初级法师来说——由于初级法师的攻击类型是魔法攻击,物理防御不能起到作用。\n因此尽管怪物出手次数为2,1点防御也无法减少任何伤害。", + { + "type": "jump", + "to": [ + 4, + 9 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "remove": true + } + ], + "4,9": [ + { + "type": "if", + "condition": "(flag:跳过2!==1)", + "true": [ + "\t[小妖精,fairy]接下来要介绍的是最后一个主要战斗属性——法强。\n任何生灵都有属于自己的魔法能量——只是他们大多数不知道如何去使用。\n在本作的初始阶段,角色不了解魔法的运作方式,自身所有的魔法能量都在无意识地保护自己。\n1点魔法强度可以给角色带来1点护盾效果——每次战斗(而不是每回合)抵挡1点战斗伤害。\n这个护盾效果可以抵挡所有种类的伤害,不拘泥于物理,魔法或真实伤害。", + "\t[小妖精,fairy]对于不懂如何使用魔法的怪物而言,其魔法能量被简单地合并到其生命值中进行计算。\n但对于会使用魔法攻击的怪物而言,其普通攻击或技能将造成魔法伤害。\n在怪物手册中,怪物普通攻击的魔法攻击力将显示在“法强”一栏。", + { + "type": "callBook" + }, + "\t[小妖精,fairy]怪物造成的魔法伤害无法通过简单地提高攻击/防御/速度抵挡。\n但有些装备可以提供百分比的法抗(魔法伤害抗性)。\n携带多件百分比法抗装备的话,抗性乘法叠加计算。", + "\t[小妖精,fairy]当然,在携带特定装备后,角色也有着使用魔法攻击的机会。\n不同类型的法杖将允许角色以不同比例将魔法能量向魔法攻击力转化。\n当然,因为角色将一部分魔力用于攻击,剩余支撑护盾的魔力就没那么多了。\n具体的魔法攻击力和护盾强度,将显示在状态栏对应比例的括号外面。\n括号里面的百分比是魔法能量以多大的比例转化为魔法攻击力和护盾。" + ] + }, + { + "type": "choices", + "text": "\t[小妖精,fairy]现在,你已经熟悉了简单的战斗系统。\n接下来的进阶部分,还需要我的引导嘛?", + "choices": [ + { + "text": "我太需要了", + "action": [ + { + "type": "jump", + "to": [ + 2, + 12 + ], + "time": 500, + "keep": true + } + ] + }, + { + "text": "这还是太简单了", + "action": [ + { + "type": "jump", + "to": [ + 5, + 0 + ], + "time": 500 + }, + { + "type": "hide", + "loc": [ + [ + 2, + 12 + ] + ], + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 6, + 11 + ] + ], + "floorId": "jiaocheng03", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 6, + 9 + ] + ], + "floorId": "jiaocheng03", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 6, + 7 + ] + ], + "floorId": "jiaocheng03", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 6, + 4 + ] + ], + "floorId": "jiaocheng03", + "remove": true + }, + { + "type": "hide", + "loc": [ + [ + 6, + 2 + ] + ], + "floorId": "jiaocheng03", + "remove": true + } + ] + } + ] + }, + { + "type": "hide", + "remove": true + } + ], + "2,12": [ + "\t[小妖精,fairy]这里是一个非常简单的生命价值判断。\n首先,我们的生命和路上的血瓶不足以让我们携带2把蓝钥匙击败把守着绿色血瓶的怪物。\n其次,路上没有任何机会获得宝石,提高能力,来减少战斗伤害。\n因此,我们至少要打开一扇蓝门来保存血量。\n当然,考虑到后面需要使用蓝钥匙来换取战斗属性以击败更强大的敌人,这里只允许打开一扇蓝门。", + "\t[小妖精,fairy]我们一共有2个选择:打开中间的蓝门绕开怪物前进,或者击败一个怪物并打开蓝门获取250生命值的血瓶。", + { + "type": "callBook" + }, + "\t[小妖精,fairy]首先,观察到所有怪物的金币、经验均为0点。这意味着不需要清理怪物获得资源。\n绕过挡路的怪物取得900血瓶的这扇蓝门,其生命价值为252-0=252点(为什么不是302点?)。\n而把守250生命值血瓶的蓝门,其生命价值为250点。\n显然,打开绕怪门的收益更大。打开我身后的这扇蓝门,继续后面的内容吧。\n如果在正式游戏过程中可以以0伤害清理怪物获得资源时,也适用这样的计算方法。", + { + "type": "jump", + "to": [ + 5, + 0 + ], + "time": 500 + }, + { + "type": "hide", + "remove": true + } + ], + "3,8": [ + { + "type": "animationDrawable", + "allFarme": 30, + "color": [ + 0, + 0, + 0 + ], + "imageList": [ + { + "image": "" + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + } + ] + }, + "changeFloor": { + "6,12": { + "floorId": "jiaocheng01", + "loc": [ + 6, + 0 + ] + }, + "6,0": { + "floorId": "jiaocheng03", + "loc": [ + 6, + 12 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 31, 0,217, 33, 0, 91, 1,402, 1,404, 1,203], + [216, 1, 0, 1, 1, 1, 1, 1,402, 1,404, 1, 1], + [216, 1, 31, 1, 0, 0, 0, 81, 0, 1, 0, 1,425], + [425, 1, 21, 1,216, 1,216, 1, 1, 1, 81, 1, 1], + [ 0, 1, 1, 1, 0, 1, 0, 0, 0,425, 0, 0, 0], + [ 31, 1, 32, 1, 0, 1, 1, 0, 1, 1, 1, 1,425], + [ 0, 82, 0, 1, 0, 1, 21, 33, 1, 33, 0, 81, 0], + [ 0, 1, 1, 1,217, 1, 1, 1, 1, 1, 1, 1, 22], + [203, 1, 33, 0, 0,403,403,403,403, 1, 0, 0, 0], + [ 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,203, 1, 82], + [ 33, 0,425, 1, 0, 1, 0,203, 0,124, 0, 1, 0], + [ 0, 82, 0, 1,217, 1, 0, 1, 1, 81, 1, 1, 21], + [216, 0, 0, 22, 0, 1, 93, 1,401, 0,401, 1, 21] +], + "areas": "教程", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/jiaocheng03.js b/project/floors/jiaocheng03.js new file mode 100644 index 0000000..756affb --- /dev/null +++ b/project/floors/jiaocheng03.js @@ -0,0 +1,175 @@ +main.floors.jiaocheng03= +{ + "floorId": "jiaocheng03", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": { + "0,0": [ + "匕首:速度+20" + ], + "12,0": [ + "法杖:魔攻比例10%,魔防比例0%" + ], + "6,0": [ + { + "type": "setHeroOpacity", + "opacity": 0 + }, + { + "type": "function", + "function": "function(){\ncore.unloadEquip(0, () => {\n\tcore.setItem(\"sword0\", 0);\n\tcore.setItem(\"I375\", 0)\n\tcore.setItem(\"yellowKey\", 0)\n\tcore.setItem(\"blueKey\", 0)\n\tcore.setItem(\"redKey\", 0)\n\tcore.setItem(\"greenKey\", 0)\n\tcore.status.hero.hp = 1000\n\tcore.status.hero.atk = 16\n\tcore.status.hero.def = 16\n\tcore.status.hero.spell = 0\n\tcore.status.hero.speed = 20\n\tcore.updateStatusBar()\n})\n}" + }, + { + "type": "tip", + "text": "教学层属性已清空" + }, + { + "type": "changeFloor", + "floorId": "guangchang", + "loc": [ + 6, + 10 + ] + } + ], + "6,11": [ + "\t[小妖精,fairy]接下来是能力价值判断。\n首先击败我右边的怪物,然后你需要在这三扇黄门中打开正确的一扇。\n打开错误的黄门将使你的生命值不足以抗住战斗伤害,并死亡。\n当然,你随时可以使用读取自动存档功能撤销错误的选择。", + { + "type": "jump", + "to": [ + 6, + 9 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "remove": true + } + ], + "6,9": [ + "\t[小妖精,fairy]刚才你应该是选择了红宝石,对吗?\n选择蓝宝石将见不到我,而选择红血瓶你将会因为能力不够而折戟在后面的怪物上。\n在除决战时刻以外的场合,获取能力都应该优于获取生命值,哪怕是看似不起眼的法强/护盾。", + "\t[小妖精,fairy]刚才为什么要增加2点攻击而不是2点防御呢?\n你应该看过了怪物手册才对。\n攻击临界表中有一项\"2:84\",意味着2点攻击可以降低84点战斗伤害。\n而1防减伤仅有36,意味着2点防御仅能降低72点战斗伤害。\n多出来的这部分战斗伤害,暂时是不可承受之重。", + "\t[小妖精,fairy]实际战斗中又应该怎么规划呢?\n观察到,角色的攻击防御之和为50,而怪物的攻击防御之和为56。\n在攻击/防御二选一的时候,一般攻防和高于怪物时加防御效果更好,低于怪物时则选择爆攻击。\n当然,怪物生命极低,角色接近一刀将其秒杀时,加攻击的效果也很好。", + "\t[小妖精,fairy]接下来是含速度的能力价值判断。\n你需要在这三扇红门中打开正确的一扇。\n打开错误的红门将使你的生命值不足以抗住战斗伤害,并死亡。\n当然,你随时可以使用读取自动存档功能撤销错误的选择。", + { + "type": "jump", + "to": [ + 6, + 7 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "remove": true + } + ], + "6,7": [ + "\t[小妖精,fairy]刚才你应该是选择了黄宝石,为什么呢?", + "\t[小妖精,fairy]首先排除2点防御力——敌人的单次攻击伤害高达93点,2点防御力的减伤杯水车薪。\n然后是在2点速度和2点攻击力中选择。\n在怪物手册中,速度临界值为1,可以减伤93点;攻击临界值为3,可以减伤93点。\n获取2点攻击力不足以达到怪物的攻击临界值。", + "\t[小妖精,fairy]实际战斗中又应该怎么决策呢?\n提高速度和攻击力都是为了减少被怪物攻击的次数,换句话说,缩短战斗的时间。\n因此,我们追求在更短的时间内打出更高的伤害,也就是更高的DPS。\n观察到,角色对怪物的DPS(速度*单次攻击伤害)为20*30=600。\n提高2点速度将使DPS提升为22*30=660,而提高2点攻击力将使DPS提升为20*32=640。\n简单地说,我们需要增加速度和(攻击-怪物防御)中较小的一项。就是个均值不等式。", + "\t[小妖精,fairy]下一个三选一见。\n怪物的“先攻”特殊属性,意味着怪物已经处于攻击姿态,在角色表现敌意的一霎那就会受到怪物的攻击。\n你需要在这三扇蓝门中打开正确的一扇。\n打开错误的蓝门将使你的生命值不足以抗住战斗伤害,并死亡。\n当然,你随时可以使用读取自动存档功能撤销错误的选择。", + { + "type": "jump", + "to": [ + 6, + 4 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "remove": true + } + ], + "6,4": [ + "\t[小妖精,fairy]刚才你应该是选择了1黄宝石1红宝石的组合,但——到底是什么原理?", + "\t[小妖精,fairy]接下来要讲的是本作一个非常隐蔽的现象——混合临界。\n混合临界仅会出现在角色的速度高于怪物速度的时候。\n出现混合临界的条件是,在怪物对角色进行最后一次攻击后,角色进行了两次以上的攻击才击杀了怪物。\n为了方便理解,可以画一个时间轴,从怪物最后一次攻击算起。", + "\t[小妖精,fairy]单纯提高攻击力来降低被攻击次数的话,需要让角色击杀怪物的攻击次数减少2,而不是1。\n在刚才的战斗中,角色的攻击力为32,击杀怪物需要162/(32-1)=6次攻击。\n要达到降低被攻击次数效果的话,将攻击力提升至162/5+1=34点并不足够。\n需要将攻击力提升至162/4+1=42点。", + "\t[小妖精,fairy]同样地,单纯提高速度来降低被攻击次数的话,需要让角色的最后一次攻击提前到怪物攻击之前,而不是倒数第二次攻击。\n在刚才的战斗中,怪物最后一次攻击的时刻为3/14=0.214。\n角色在5/22=0.227,6/22=0.273两个时刻分别攻击了怪物,其中0.273时刻对怪物的攻击造成了击杀。\n要达到降低被攻击次数效果的话,将速度提升至5+/0.214=24点并不足够,因为角色需要6次攻击才能击杀怪物。\n需要将速度提升至6+/0.214=29点。", + "\t[小妖精,fairy]但值得庆幸的是,我们还要第三种办法——同时增强速度和攻击。\n我们少量提升攻击力至34点,使击杀怪物仅需要5次攻击。\n然后再少量提升速度至24点,使我们的第5次攻击落在0.214时刻,即怪物的最后一次攻击前。\n这样,我们仅用了4点能力提升,就达到了单独提升某项能力10点或7点的效果。", + "\t[小妖精,fairy]接下来是法强(护盾)和防御的价值判断。\n希望你能在这三扇黄门中打开正确的一扇。", + { + "type": "jump", + "to": [ + 6, + 2 + ], + "time": 500, + "keep": true + }, + { + "type": "hide", + "remove": true + } + ], + "6,2": [ + "\t[小妖精,fairy]防御和护盾的比较就非常简单了。\n2点防御的价值是2*2=4点减伤,而5点法强的价值是5点减伤。\n如果仅以这一个怪物为准的话,获取5点法强是更优解。\n当然,我不会责备你刚才选择了红血瓶——因为没命的话,就啥也不是了。", + "\t[小妖精,fairy]但最终的守卫怪物是个坚固怪物——它每次攻击至多只会受到1点物理伤害。\n左边的红门里面,守着的是一把提高20速度的匕首。\n右边的红门里面,守着的是一把以10%效率将魔法强度转化为魔法攻击的法杖(当然护盾就没有了)。\n值得一提的是,本作魔法强度在转化成魔法攻击的时候,是向下取整的。", + "\t[小妖精,fairy]除此之外,你还拥有2把蓝钥匙来进一步提升自己的战斗力。\n为了击败面前的最终怪物,进行最后的二选一和七选二吧!\n不要忘了上一张地图内含250生命值的蓝门哦。\n综合利用攻防判断,DPS判断等手段,保留更多的生命值吧!", + { + "type": "hide", + "remove": true + } + ] + }, + "changeFloor": { + "6,12": { + "floorId": "jiaocheng02", + "loc": [ + 6, + 0 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [129, 1,401, 1,402, 1, 91, 1,403, 1,404, 1,129], + [ 70, 1, 82, 1, 82, 1,236, 1, 82, 1, 82, 1,375], + [ 0, 83, 0,403, 0, 33, 0, 31, 0, 23, 0, 83, 0], + [ 1, 1, 1, 1, 1, 1,219, 1, 1, 1, 1, 1, 1], + [ 0, 22, 0, 31, 0, 31, 0, 1,401, 1,404, 1,404], + [ 81, 1, 81, 1, 81, 1, 22, 1,401, 1,404, 1,401], + [403, 1, 31, 1, 31, 1,218, 1, 82, 1, 82, 1, 82], + [402, 1,402, 1,403, 1, 0, 81, 0, 33, 0, 21, 0], + [ 1, 1, 1, 1, 1, 1,240, 1, 1, 1, 1, 1, 1], + [ 0, 33, 0, 21, 0,403, 0, 1,401, 1,402, 1, 31], + [ 83, 1, 83, 1, 83, 1,204, 1, 81, 1, 81, 1, 81], + [402, 1,404, 1,401,129,124,204, 0, 33, 0, 23, 0], + [ 1, 1, 1, 1, 1, 1, 93, 1, 1, 1, 1, 1, 1] +], + "areas": "牢狱", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/jiuguan.js b/project/floors/jiuguan.js index 02fa764..07f4309 100644 --- a/project/floors/jiuguan.js +++ b/project/floors/jiuguan.js @@ -32,6 +32,7 @@ main.floors.jiuguan= "type": "over", "text": "这段话将在屏幕中心", "image": "bg_5043.png", + "memory": false, "time": 3000, "hidetime": 30, "sound": "", diff --git a/project/floors/street01.js b/project/floors/street01.js index dceac7f..62ca09a 100644 --- a/project/floors/street01.js +++ b/project/floors/street01.js @@ -10,7 +10,7 @@ main.floors.street01= "canUseQuickShop": true, "images": [], "ratio": 1, - "defaultGround": "X90001", + "defaultGround": "X90078", "firstArrive": [], "eachArrive": [], "parallelDo": "", @@ -25,68 +25,21 @@ main.floors.street01= ], "direction": "up" } - ], - "6,11": [ - { - "type": "insert", - "name": "chapter04" - } - ], - "4,11": [ - { - "type": "animationDrawable", - "allFarme": 300, - "color": [ - 0, - 0, - 0 - ], - "imageList": [ - { - "image": "bg_1511.webp", - "beforefarme": 50, - "globalAlpha": 0, - "afterfarme": 250, - "aglobalAlpha": 100 - }, - { - "image": "eve_010304.webp", - "beforefarme": 70, - "globalAlpha": 0, - "afterfarme": 170, - "aglobalAlpha": 100, - "ax": 0, - "ay": 0 - }, - { - "image": "eve_010304.webp", - "beforefarme": 171, - "globalAlpha": 100, - "afterfarme": 270, - "aglobalAlpha": 100, - "ax": 800, - "ay": 0 - } - ], - "soundList": [ - { - "sound": "", - "startfarme": 0, - "stopbefore": false - } - ] - }, - { - "type": "op" - } ] }, "changeFloor": { + "12,9": { + "floorId": "zhujuejia", + "loc": [ + 0, + 9 + ] + }, "0,8": { - "floorId": "street02", + "floorId": "changguan2", "loc": [ 12, - 6 + 8 ] } }, @@ -116,27 +69,27 @@ main.floors.street01= [110124, 0,200176,200177,200178,200179,71786,90064,90064,90064, 0,90064,110125], [110124, 0,200088,200089,200004,200005,200006,71795, 0, 0, 0, 0,110125], [110118,110118,200096,110116,110020, 0,200014, 0, 0, 0, 0, 0,110125], - [ 92, 0, 0,110124, 0,201, 0, 0,110125,110122,110122,110122,110122], - [ 0, 0, 0,110118,110118,202,110118,110118,110122, 0, 0, 0, 94], - [130170, 0, 0, 0, 71, 35, 0, 0, 0, 0, 0, 0, 0], - [130178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130168,130169], - [130225,130169,130169,130169,130169,130170,110122,110122,130168,130169,130169,130224,130177] + [ 92, 0, 0,110124, 0, 0, 0, 0,110125,110122,110122,110122,110122], + [ 0, 0, 0,110118,110118, 0,110118,110118,110122, 0, 0, 0, 94], + [140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,140], + [140,140,140,140,140,140186,110138,110138,140184,140,140,140,140] ], "areas": "牢狱", "bgmap": [ - [90001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90001], - [90001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90001], - [90001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90001], - [90001,71818,71819, 0, 0, 0, 0, 0, 0, 0,10036, 0,90001], - [90001,71826,71827, 0, 0, 0, 0, 0, 0, 0, 0, 0,90001], - [90001, 0, 0, 0, 0, 0,71786, 0,60135,60135,60135,60135, 0], - [90001, 0, 0, 0, 0, 0, 0, 0, 0,90001,90001,90001, 0], - [90001,90001,90001, 0, 0, 0, 0, 0,90001, 0, 0, 0, 0], - [70032,70032,70025, 0, 0,90244,90001,90001,90001, 0, 0, 0, 0], - [70025,70025,70025,90001,90001,90244,90001,90001,90001,70025,70025,70025,70025], - [ 0,70025,70025,70025,70025,70025,70025,70025,70025,70025,70025,70025,70025], - [ 0,70025,70025,70025,70025,70025,70025,70025,70025,70025,70025, 0, 0], - [ 0, 0, 0, 0, 0, 0,90001,90001, 0, 0, 0, 0, 0] + [90078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90078], + [90078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90078], + [90078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90078], + [90078,71818,71819, 0, 0, 0, 0, 0, 0, 0,10036, 0,90078], + [90078,71826,71827, 0, 0, 0, 0, 0, 0, 0, 0, 0,90078], + [90078, 0, 0, 0, 0, 0,71786, 0,60135,60135,60135,60135,90078], + [90078, 0, 0, 0, 0, 0, 0, 0,90078,90078,90078,90078, 0], + [90078,90078,90078, 0, 0, 0, 0, 0,90078, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,90244,90078,90078,90078, 0, 0, 0, 0], + [ 0, 0, 0,90078,90078,90244,90078,90078,90078, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,90078,90078, 0, 0, 0, 0, 0] ], "fgmap": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130076], @@ -149,8 +102,8 @@ main.floors.street01= [ 0, 0, 0, 0, 0, 0, 0, 0,110143,110114,110114,110114,110114], [ 0, 0, 0,110114,120095, 0,120095,120095,110114, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0,110114,110114, 0, 0, 0, 0, 0], + [ 0,140186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,140194, 0, 0, 0, 0, 0, 0, 0, 0,140184, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "bg2map": [ diff --git a/project/floors/street02.js b/project/floors/street02.js index 2c49a82..9bce79d 100644 --- a/project/floors/street02.js +++ b/project/floors/street02.js @@ -16,13 +16,6 @@ main.floors.street02= "parallelDo": "", "events": {}, "changeFloor": { - "12,6": { - "floorId": "street01", - "loc": [ - 0, - 8 - ] - }, "0,6": { "floorId": "guangchang", "loc": [ @@ -30,6 +23,13 @@ main.floors.street02= 6 ], "direction": "left" + }, + "12,8": { + "floorId": "street01", + "loc": [ + 0, + 8 + ] } }, "beforeBattle": {}, @@ -46,9 +46,9 @@ main.floors.street02= [141,141,141,141,141,141,141,141,141,141,141,141,141], [140,140,140,140,140,140,140,140,140,140,140,140,140], [ 0, 0,140, 27, 0,210, 0,209, 0, 0,217, 0, 0], - [ 92, 0,140,140,140,140, 0,140,140,140,140, 0, 94], + [ 92, 0,140,140,140,140, 0,140,140,140,140, 0,140], [ 0, 0,217, 0, 0,209, 0,210, 0, 28,140, 0, 0], - [140,140,140,140,140,140,140,140,140,140,140,140,140], + [140,140,140,140,140,140,140,140,140,140,140,140, 94], [141,141,141,141,141,141,141,141,141,141,141,141,141], [141,141,141,141,141,141,141,141,141,141,141,141,141], [141,141,141,141,141,141,141,141,141,141,141,141,141], diff --git a/project/floors/xiaoxiang01.js b/project/floors/xiaoxiang01.js index 3943dfe..6cc4e72 100644 --- a/project/floors/xiaoxiang01.js +++ b/project/floors/xiaoxiang01.js @@ -16,13 +16,6 @@ main.floors.xiaoxiang01= "parallelDo": "", "events": {}, "changeFloor": { - "0,10": { - "floorId": "guangchang2", - "loc": [ - 12, - 10 - ] - }, "12,7": { "floorId": "xiaoxiang02", "loc": [ @@ -36,6 +29,13 @@ main.floors.xiaoxiang01= 6, 0 ] + }, + "0,7": { + "floorId": "guangchang2", + "loc": [ + 12, + 10 + ] } }, "beforeBattle": {}, @@ -46,31 +46,79 @@ main.floors.xiaoxiang01= "cannotMove": {}, "cannotMoveIn": {}, "map": [ - [141,141,141,141,141,141,141,141,141,141,141,141,141], - [141,141,141,141,141,141,141,141,141,141,141,141,141], - [141,141,141,141,141,141,141,141,141,141,141,141,141], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140, 30,140, 0, 81, 0,221, 0,224, 0, 28, 27,140], - [140,224,140,225,140, 31,140, 0,140,140,140,224,140], - [140, 0, 32, 0,140, 0,140,225,140,224, 0, 0,140], - [140,225,140,140,140, 81,140, 0, 0, 0,140, 0, 94], - [140, 0,222, 0,221, 0,140, 81,140,225,140,140,140], - [140,140,140, 81,140,140,140, 0,140, 0, 81, 31,140], - [ 92, 0, 32, 22, 32,140, 31, 0,140, 0,140,140,140], - [140, 21, 21, 21, 21,140, 0, 0, 81, 0,222, 29,140], - [140,140,140,140,140,140, 93,140,140,140,140,140,140] + [143,143,143,143,130193,130193,130193,130193,130193,143,143,143,143], + [143,143,143,143,130060,130061,130062, 0,120074,143,143,143,143], + [143,130193,130193,130194,130068,130069,130070,130090,120023,130192,130193,130193,143], + [130194,130201,130201,130202,130015,120041,130099,130098,120031,130200,130201,130201,143], + [130202, 30,201029, 0, 81, 0,221, 0,224, 0, 28, 27,130192], + [120139,224,201037,225,201037, 31,201021, 0,110121,110122,110122,224,130200], + [120147, 0, 32, 0,200199, 0,201029,225,110132,224, 0, 0,90675], + [120164,225,200998,200999,201037, 81,201029, 0, 0, 0,110116, 0, 94], + [120172, 0,222, 0,221, 0,201029, 81,110116,225,110137,110138,90650], + [120180,201037,201037, 81,201037,201037,201037,246,110124, 0, 81, 31,90658], + [ 92, 32, 32, 22, 21,80089, 31, 0,110132, 0,110122,110122,110197], + [140,110191, 21, 21, 21,80089, 0,246, 81, 0,222, 29,110197], + [140,140,140,110191,80083,80097, 93,110138,110138,140189,140,140,140] ], "areas": "牢狱", "bgmap": [ - + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] ], "fgmap": [ - + [ 0, 0, 0, 0, 0,120080, 0, 0,120066, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,130007, 0,130091, 0, 0, 0, 0, 0, 0], + [120124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [120132, 0, 0, 0,201021, 0, 0, 0,110114,110114,110114, 0, 0], + [ 0, 0, 0, 0,200191, 0, 0, 0, 0, 0, 0, 0,90667], + [ 0, 0,200990,200991,201021, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,201021,201021, 0,201021,201021, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110114,110114,110189], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "bg2map": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0,130201,130201, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0,120082, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110134,110134, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "fg2map": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,201021, 0,200175, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,200183, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ] } \ No newline at end of file diff --git a/project/floors/xiaoxiang02.js b/project/floors/xiaoxiang02.js index 13e9a9d..cd94f20 100644 --- a/project/floors/xiaoxiang02.js +++ b/project/floors/xiaoxiang02.js @@ -32,29 +32,65 @@ main.floors.xiaoxiang02= "cannotMove": {}, "cannotMoveIn": {}, "map": [ - [141,141,141,141,141,141,141,141,141,141,141,141,141], - [141,141,141,141,141,141,141,141,141,141,141,141,141], - [141,141,141,141,141,141,141,141,141,141,141,141,141], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140, 0, 81, 0,140, 0, 0, 0, 0,140, 0, 0,140], - [140, 0,140, 0,140,140,140,140, 81,140,140, 81,140], - [140, 0,140, 0, 0, 0, 0, 0, 0, 0, 0, 0,140], - [ 92, 0,140,140,140,140, 81,140,140,140, 81,140,140], - [140, 0, 0, 0, 0, 0, 0, 0, 0,140, 0, 0,140], - [140,140,140,140,140, 0,140,140, 82,140,140, 0,140], - [140, 0, 0, 0,140, 0,140, 0, 0, 0, 81, 0,140], - [140, 0, 0, 0, 81, 0,140, 0, 0, 0,140, 0,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140] + [143,143,143,143,143,120166,120166,110205,110206,110206,110206,110206,110206], + [143,143,143,143,143,120174,120174,130192,130193,130193,130193,130193,130193], + [143,130193,130193,130193,130194,190142,90771,130192,130193,130193,130193,130193,130193], + [143,130201,130201,130201,130202,190150,190150,130200,130201, 0,130201,130201,130201], + [130194, 0, 81, 0,72106, 0, 0, 0, 0,72106, 0, 0,143], + [130202, 0,110116, 0,90064,90064,90064,90064, 81,90064,90064, 81,143], + [90675, 0,110124, 0, 0, 0, 0, 0, 0, 0, 0, 0,143], + [ 92, 0,110122,110122,110122,110122, 81,110122,110122,110122, 81,110122,143], + [90651, 0, 0, 0, 0, 0, 0, 0, 0,110129, 0, 0,143], + [90659,71844,110122,200199,110122, 0,110121,110122, 82,110122,110122, 0,143], + [110199, 0, 0, 0, 81, 0,110129, 0, 0, 0, 81, 0,130192], + [110199, 0, 0, 0,110117, 0,110129, 0, 0, 0,200637, 0,143], + [140,140,140,140,110191,72098,72098,72098,143,143,143,143,143] ], "areas": "牢狱", "bgmap": [ - + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] ], "fgmap": [ - + [ 0, 0, 0, 0, 0,200063,200063, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90799,110072], + [ 0, 0,90804, 0, 0,190023,190148, 0,90797, 0, 0, 0,110080], + [ 0, 0, 0, 0,72112, 0,190030, 0,90805,72112, 0, 0,110088], + [ 0, 0, 0, 0, 0,72098,72098,72098, 0, 0,72098, 0, 0], + [90667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,110114,110114,110114,110114, 0,110114,110114,110114, 0,110114, 0], + [ 0, 0, 0,200175, 0, 0, 0, 0, 0,110116, 0, 0, 0], + [ 0,110114,110114,200191,110114, 0,110114,110114, 0,110114,110114, 0, 0], + [110191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200638, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "bg2map": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,110122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,110133, 0,110132, 0, 0, 0, 0, 0, 0] ], "fg2map": [ diff --git a/project/floors/xiaoxiang3.js b/project/floors/xiaoxiang3.js index 9b9d310..06871b2 100644 --- a/project/floors/xiaoxiang3.js +++ b/project/floors/xiaoxiang3.js @@ -14,7 +14,68 @@ main.floors.xiaoxiang3= "firstArrive": [], "eachArrive": [], "parallelDo": "", - "events": {}, + "events": { + "4,8": { + "trigger": null, + "enable": false, + "noPass": null, + "displayDamage": true, + "opacity": 1, + "filter": { + "blur": 0, + "hue": 0, + "grayscale": 0, + "invert": false, + "shadow": 0 + }, + "data": [] + }, + "8,8": { + "trigger": null, + "enable": false, + "noPass": null, + "displayDamage": true, + "opacity": 1, + "filter": { + "blur": 0, + "hue": 0, + "grayscale": 0, + "invert": false, + "shadow": 0 + }, + "data": [] + }, + "7,10": { + "trigger": null, + "enable": false, + "noPass": null, + "displayDamage": true, + "opacity": 1, + "filter": { + "blur": 0, + "hue": 0, + "grayscale": 0, + "invert": false, + "shadow": 0 + }, + "data": [] + }, + "5,10": { + "trigger": null, + "enable": false, + "noPass": null, + "displayDamage": true, + "opacity": 1, + "filter": { + "blur": 0, + "hue": 0, + "grayscale": 0, + "invert": false, + "shadow": 0 + }, + "data": [] + } + }, "changeFloor": { "6,0": { "floorId": "xiaoxiang01", @@ -28,117 +89,112 @@ main.floors.xiaoxiang3= "afterBattle": { "6,8": [ { - "type": "setValue", - "name": "flag:door_xiaoxiang3_4_9", - "operator": "+=", - "value": "1" - }, - { - "type": "setValue", - "name": "flag:door_xiaoxiang3_8_9", - "operator": "+=", - "value": "1" - }, - { - "type": "setValue", - "name": "flag:door_xiaoxiang3_6_11", - "operator": "+=", - "value": "1" + "type": "show", + "loc": [ + [ + 4, + 8 + ], + [ + 5, + 10 + ], + [ + 7, + 10 + ], + [ + 8, + 8 + ], + [ + 6, + 12 + ] + ], + "time": 500 } ] }, "afterGetItem": {}, "afterOpenDoor": {}, - "autoEvent": { - "4,9": { - "0": { - "condition": "flag:door_xiaoxiang3_4_9==1", - "currentFloor": true, - "priority": 0, - "delayExecute": false, - "multiExecute": false, - "data": [ - { - "type": "openDoor" - }, - { - "type": "setValue", - "name": "flag:door_xiaoxiang3_4_9", - "operator": "=", - "value": "null" - } - ] - } - }, - "8,9": { - "0": { - "condition": "flag:door_xiaoxiang3_8_9==1", - "currentFloor": true, - "priority": 0, - "delayExecute": false, - "multiExecute": false, - "data": [ - { - "type": "openDoor" - }, - { - "type": "setValue", - "name": "flag:door_xiaoxiang3_8_9", - "operator": "=", - "value": "null" - } - ] - } - }, - "6,11": { - "0": { - "condition": "flag:door_xiaoxiang3_6_11==1", - "currentFloor": true, - "priority": 0, - "delayExecute": false, - "multiExecute": false, - "data": [ - { - "type": "openDoor" - }, - { - "type": "setValue", - "name": "flag:door_xiaoxiang3_6_11", - "operator": "=", - "value": "null" - } - ] - } - } - }, + "autoEvent": {}, "cannotMove": {}, "cannotMoveIn": {}, "map": [ - [140,140,140,140, 0, 0, 91, 0, 0,140,140,140,140], - [140,140,140,140, 0, 0, 0, 0, 0,140,140,140,140], - [140,140,140,140,140,140, 0,140,140,140,140,140,140], - [140,140,140,140,140,140, 0,140, 0,140,140,140,140], - [140,140,140,140, 0, 0, 0, 0, 0,140,140,140,140], - [140,140,140,140,140,140, 83,140,140,140,140,140,140], - [140,140,140,140, 0, 0, 0, 0, 0,140,140,140,140], - [140,140,140,140, 0, 0, 0, 0, 0,140,140,140,140], - [140,140,140,140, 0, 0,247, 0, 0,140,140,140,140], - [140,140,140,140, 85,140, 0,140, 85,140,140,140,140], - [140,140,140,140, 34,140, 0,140, 27,140,140,140,140], - [140,140,140,140, 21,140, 85,140, 28,140,140,140,140], - [140,140,140,140,140,140, 93,140,140,140,140,140,140] + [ 0, 0, 0,140199,80091,80092, 91,110146,110146,140197, 0, 0, 0], + [ 0, 0, 0,140,140,140, 0,140, 0, 0, 0, 0, 0], + [ 0, 0, 0,140204,140206,140206,140206,140206,140206,140203, 0, 0, 0], + [ 0, 0, 0,140199,170263,170252,170253,170254,170263,140197, 0, 0, 0], + [ 0, 0, 0,140199,170263,170260, 0,170262,170263,140197, 0, 0, 0], + [ 0, 0, 0,140199,170263,170268, 83,170270,170263,140205,140206,140206,140206], + [ 0, 0, 0,140199,71843,110122, 0,110122,90649,110208,110209,110209,110209], + [140206,140206,140206,140207, 0, 0, 0, 0, 0,110189,140,140,140], + [110209,110209,110209,110210, 21, 0,247, 0, 27,110197,140,140,140], + [140,140,140,110191, 0, 0, 0, 0, 0,110197,140,140,140], + [140,140,140,110199, 0, 34, 0, 28, 0,140,140,140,140], + [140,140,140,110199,110199, 0, 0, 0,110197,110204,110206,110206,110206], + [140,140,140,110199,110207, 0, 0, 0,110197,110199,110225,110225,110225] ], "areas": "牢狱", "bgmap": [ - + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] ], "fgmap": [ - + [140,140,140, 0, 0, 0, 0, 0, 0, 0,140,140,140], + [140,140,140,140,140,140,140,140,140,140,140,140,140], + [140,140,140, 0, 0, 0,140206,110327, 0, 0,140,140,140], + [140,140,140, 0, 0, 0,170253,110335, 0, 0,140,140,140], + [140,140,140, 0, 0,110153, 0,110152, 0, 0,140,140,140], + [140,140,140, 0,71835,110161, 0,110160,90648, 0, 0, 0, 0], + [140,140,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,110191, 0, 0, 0,110189, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,110138, 0,110138, 0, 0, 0, 0, 0] ], "bg2map": [ - + [140,140,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140,140,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,110216, 0, 0, 0], + [ 0, 0, 0,110218, 0, 0, 0, 0, 0,110216, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0,110218, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "fg2map": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0,110319, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,110114, 0,110114, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ] } \ No newline at end of file diff --git a/project/floors/yiqu1.js b/project/floors/yiqu1.js index 0fbd450..195b38f 100644 --- a/project/floors/yiqu1.js +++ b/project/floors/yiqu1.js @@ -11,41 +11,119 @@ main.floors.yiqu1= "images": [], "ratio": 1, "defaultGround": "grass2", - "firstArrive": [], + "firstArrive": [ + { + "type": "setHeroOpacity", + "opacity": 1 + }, + { + "type": "setCurtain", + "time": 100 + } + ], "eachArrive": [], "parallelDo": "", "events": {}, - "changeFloor": {}, + "changeFloor": { + "12,8": { + "floorId": "yiqu2", + "loc": [ + 0, + 8 + ] + }, + "0,7": { + "floorId": "guangchang6", + "loc": [ + 12, + 7 + ] + } + }, "beforeBattle": {}, "afterBattle": {}, "afterGetItem": {}, "afterOpenDoor": {}, "autoEvent": {}, - "cannotMove": {}, - "cannotMoveIn": {}, + "cannotMove": { + "8,1": [ + "right" + ] + }, + "cannotMoveIn": { + "8,1": [ + "right" + ] + }, "map": [ - [140,140,140,140,140,140, 91,140,140,140,140,140,140], - [140,140,140,140,140,140, 0,140,140, 0, 0, 0, 94], - [140,140,140,140,140,140, 0, 0,140,140, 81, 0, 0], - [140,140,140,140,140,140, 0, 0, 0,140, 0,140,140], - [140, 0, 0, 0,140, 0, 0, 0,140,140,140,140,140], - [140, 0,140,140,140, 0,140, 0,140, 0, 0, 0, 94], - [140, 0, 0,140, 0, 0,140, 0, 0, 0, 0, 0,140], - [ 92, 0, 0,140,140,140,140, 0,140,140, 81,140,140], - [140,140, 0,140, 0, 0, 0, 0,140, 0, 0, 0,140], - [140, 0, 0, 0, 0, 0,140, 0,140, 0, 0, 0,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140] + [143,143,143,143,130193,130193,130193,130193,130193,143,143,143,143], + [143,143,143,143,130060,130061,130062,130201,130201,143,143,143,143], + [143,130193,130193,130194,130068,130069,130070, 0,120023,130192,130193,130193,143], + [130194,130201,130201,130202,130007,130006,130099,130098,120031,130200,130201,130201,143], + [130202, 32, 0, 21,201021,401,110116, 0,201, 81, 0, 21,130192], + [140101, 0,205, 0,201037,421,110124, 31, 0,110116, 31, 0,130200], + [140109,201037, 0,201037,200199, 81,110140,110138, 81,110138,110138,202,90667], + [ 92,201, 0, 0, 31, 0,202, 0, 0, 82, 0, 0,90675], + [120111, 0, 0, 21, 0, 0,201021,205,110138,110138,201021, 0, 94], + [120119,110122, 81,110122,201037,201,201029,402, 0, 21,201029,205,90650], + [120127,202, 31,202,201037, 0,201029, 0, 21, 0,201029, 0,110189], + [120135, 22,205,403,201037,202,201037,110122,110122, 81,201037,201,110197], + [143,130193,140170,130194,130068,130069,130070, 0,120023,130192,130157,130193,143], + [130194,130201,140178,130202,130007,130006,130099,130098,120031,130200,130167,130201,143], + [130202, 32, 0, 21,201021,401,220008, 0,201, 81, 0, 21,130192], + [140101, 0,205, 0,201037,421,220008, 31, 0,220008, 31, 0,130200], + [140109,201037, 0,201037,200199, 81,220012,220013, 81,220012,220013,202,90667], + [ 92,201, 0, 21, 0, 0,202, 0, 21, 0, 82, 0,90675], + [120111, 0, 0, 0, 0, 0,201021,205,110138,110138,201021, 0, 94], + [120119,220013, 81,220013,201037,201,201029, 0, 31, 0,201029,205,90650], + [120127,202, 31,202,201037, 0,201029, 21, 0,402,201029, 0,110189], + [120135, 22,205,403,201037,202,201037,220013,220013, 81,201037,201,110197], + [120143,110138,110138,110138,201029, 0,201, 0, 31, 0, 21, 0,110197] ], "bgmap": [ - + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] ], "fgmap": [ - + [ 0, 0, 0, 0, 0,120080, 0, 0,120066, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0,120074, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,130091,130090, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,200175, 0, 0, 0, 0, 0, 0, 0, 0], + [140093, 0, 0, 0,200183, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,201021, 0,201021,200191, 0, 0,220009, 0, 0,220009, 0,90667], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0,220009, 0,220009,201021, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,201021, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,201021, 0, 0,220009,220009, 0, 0, 0, 0], + [ 0, 0, 0, 0,201021, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "bg2map": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,130193, 0, 0, 0, 0, 0,120082, 0,130193, 0, 0], + [ 0, 0,130201, 0, 0, 0, 0, 0, 0, 0,130201, 0, 0], + [ 0, 0, 0, 0,130015, 0, 0, 0, 0, 0, 0, 0, 0], + [130076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [130084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0,110146,110146, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90658], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "fg2map": [ diff --git a/project/floors/yiqu10.js b/project/floors/yiqu10.js index 98f1172..b276418 100644 --- a/project/floors/yiqu10.js +++ b/project/floors/yiqu10.js @@ -1,29 +1,29 @@ main.floors.yiqu10= { -"floorId": "yiqu10", -"title": "主塔 10 层", -"name": "10", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ + "floorId": "yiqu10", + "title": "主塔 10 层", + "name": "10", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -38,4 +38,16 @@ main.floors.yiqu10= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yiqu2.js b/project/floors/yiqu2.js index 7dca682..9ebbfdc 100644 --- a/project/floors/yiqu2.js +++ b/project/floors/yiqu2.js @@ -10,12 +10,27 @@ main.floors.yiqu2= "canUseQuickShop": true, "images": [], "ratio": 1, - "defaultGround": "grass2", + "defaultGround": "X90078", "firstArrive": [], "eachArrive": [], "parallelDo": "", "events": {}, - "changeFloor": {}, + "changeFloor": { + "12,7": { + "floorId": "yiqu3", + "loc": [ + 0, + 7 + ] + }, + "0,8": { + "floorId": "yiqu1", + "loc": [ + 12, + 8 + ] + } + }, "beforeBattle": {}, "afterBattle": {}, "afterGetItem": {}, @@ -24,28 +39,64 @@ main.floors.yiqu2= "cannotMove": {}, "cannotMoveIn": {}, "map": [ - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140, 32, 21, 28, 27,140], - [140,140,140,140,140,140,140,140,140, 82,140,140,140], - [140, 32, 0, 0,210, 0,140, 0, 0,214, 0, 0,140], - [140,140,140, 81,140, 0, 81, 0,140, 21,140, 0,140], - [140, 0,209, 0,140,140,140,210,140,140,140, 0,140], - [140,210,140,214,140, 27,140, 0,140, 22, 0, 0, 94], - [140, 0,209, 0, 81, 28,140, 0, 81, 21, 21, 21, 0], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140], - [140,140,140,140,140,140,140,140,140,140,140,140,140] + [143,120034,140120,140121,120034,120012, 1, 1, 1, 1, 1, 1, 1], + [143,170007,140128,140129,170007,120019, 1, 1, 1, 1, 1, 1, 1], + [143, 0, 0, 0, 0,120019, 1, 1, 1, 1, 1, 1, 1], + [143, 81, 0, 22, 0,120020, 1, 1, 1, 1, 1, 0, 22], + [130194, 81,120014,120010,120010,120028, 1, 1, 1, 0, 83, 0,403], + [130202, 31, 0,209, 0,402, 1, 0, 34, 0, 1,209, 0], + [401, 0,202, 1, 32, 0, 1,405, 0,408, 1, 81, 1], + [ 1, 1, 81, 1, 0,421, 1, 0,204, 0, 1, 0, 94], + [ 92, 0, 21, 1, 1, 81, 1, 1, 82, 1, 1,205, 1], + [ 1, 1, 0,202, 0, 0, 32,209, 0, 1, 21, 0, 1], + [ 0,201, 0, 1, 81, 1, 1, 1, 0,205, 0, 0,421], + [202, 1, 1, 1, 0, 1,402, 1,201, 1, 31, 1, 0], + [ 0, 21, 21, 1, 0,202, 0,201, 0, 1, 1, 1, 22] ], "bgmap": [ - + [90078,90078,180033,180033,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] ], "fgmap": [ - + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,120002,120002,120002, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "bg2map": [ - + [ 0,180025,120034,120034,180025,180026, 0, 0, 0, 0, 0, 0, 0], + [ 0,180025,180025,180025,180025,180026, 0, 0, 0, 0, 0, 0, 0], + [ 0,180025,180025,180025,180025,180026, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,180025,130061,130060,180026, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], "fg2map": [ diff --git a/project/floors/yiqu3.js b/project/floors/yiqu3.js index 394234a..6acf6a5 100644 --- a/project/floors/yiqu3.js +++ b/project/floors/yiqu3.js @@ -1,41 +1,68 @@ main.floors.yiqu3= { -"floorId": "yiqu3", -"title": "主塔 3 层", -"name": "3", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + "floorId": "yiqu3", + "title": "主塔 3 层", + "name": "3", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "0,7": { + "floorId": "yiqu2", + "loc": [ + 12, + 7 + ] + }, + "5,0": { + "floorId": "yiqu4", + "loc": [ + 5, + 12 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 1, 1, 1, 1, 1, 91, 1, 1, 1, 1, 1, 1, 1], + [ 1, 1, 1, 1, 1, 0, 1, 1, 1, 31, 21, 1, 1], + [ 1, 1, 1, 1, 1,203, 1, 1, 1, 1, 21, 1, 1], + [ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1], + [ 1, 1, 1, 1, 1,205, 1, 1, 1, 1, 82, 1, 1], + [ 1, 0,202, 0,421, 0,421, 0, 31, 0, 0, 1, 1], + [ 1,201, 1, 1, 81, 1, 1, 1, 1, 1, 81, 1, 1], + [ 92, 0, 1, 31, 0,209, 0, 1,403, 0,209, 1, 1], + [ 1, 81, 1, 0,244, 0, 31, 1, 0,403, 0, 1, 23], + [205, 0, 1, 1, 1, 1, 82, 1,205, 1, 1, 1, 0], + [ 0,209, 1,401,402, 0, 0, 1, 0, 1,244, 0, 31], + [205, 0, 1, 1, 1, 1,216, 1, 81, 1, 0, 81, 0], + [ 21, 0,203, 0, 31, 21, 0, 81, 0, 82,216, 0,203] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yiqu4.js b/project/floors/yiqu4.js index 498b6cb..7462679 100644 --- a/project/floors/yiqu4.js +++ b/project/floors/yiqu4.js @@ -1,41 +1,68 @@ main.floors.yiqu4= { -"floorId": "yiqu4", -"title": "主塔 4 层", -"name": "4", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + "floorId": "yiqu4", + "title": "主塔 4 层", + "name": "4", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "5,12": { + "floorId": "yiqu3", + "loc": [ + 5, + 0 + ] + }, + "12,11": { + "floorId": "yiqu5", + "loc": [ + 0, + 11 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [ 1, 1, 1,421, 0,205, 0,421, 1, 1, 1, 1, 1], + [ 1, 1, 1, 0, 1, 81, 1, 0, 81, 81, 0,205, 0], + [ 0,244, 0, 31, 1, 0, 1, 31, 1, 1,216, 1, 31], + [ 0, 1,425, 1, 1, 31, 1, 1, 22, 1, 0, 1, 1], + [ 31, 1, 0, 1,401, 1,402, 1, 0, 1, 32, 1,403], + [ 0, 81, 21, 1, 0, 1, 0, 1,244, 81, 0, 81, 0], + [403, 1, 0, 1, 82, 1, 82, 1, 1, 1,216, 1, 1], + [ 0, 1,421, 0, 21, 0, 32, 0,240, 21, 0,425, 94], + [ 0,216, 0, 1, 1, 93, 1, 1, 1, 1, 1, 1, 1] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yiqu5.js b/project/floors/yiqu5.js index 74f5bdd..2ebfddd 100644 --- a/project/floors/yiqu5.js +++ b/project/floors/yiqu5.js @@ -1,41 +1,61 @@ main.floors.yiqu5= { -"floorId": "yiqu5", -"title": "主塔 5 层", -"name": "5", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + "floorId": "yiqu5", + "title": "主塔 5 层", + "name": "5", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "0,11": { + "floorId": "yiqu4", + "loc": [ + 12, + 11 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1], + [ 1, 0, 32, 1, 1, 1,426, 1, 1, 1, 1, 1, 1], + [ 1, 82, 1, 1, 1, 1, 0, 1, 1, 31, 1, 1, 1], + [216, 0,216, 1, 1, 1, 83, 1, 1, 0, 1, 1, 1], + [ 0, 1, 0, 1, 1,209, 0,209, 1, 81, 1, 1, 1], + [ 32, 1, 32, 0, 81, 0, 82, 0, 32, 0,216, 0, 22], + [ 1, 1, 0, 1, 1,244, 1, 1, 81, 1, 1, 1, 1], + [ 31, 1,209, 1, 31, 0,403, 1,203, 0,244, 1, 31], + [ 0,216, 0, 1, 1, 1, 1, 1, 0,203, 0, 1, 0], + [ 1, 1, 32, 82, 0,402, 1, 1,209, 0, 34, 1, 81], + [ 92, 0, 0, 1, 1, 1, 1, 21, 1, 1, 21, 1, 22], + [ 1, 1, 31, 82, 0,401, 1, 32, 0,425, 0,213, 0] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yiqu6.js b/project/floors/yiqu6.js index 1399cff..633e6a3 100644 --- a/project/floors/yiqu6.js +++ b/project/floors/yiqu6.js @@ -1,29 +1,29 @@ main.floors.yiqu6= { -"floorId": "yiqu6", -"title": "主塔 6 层", -"name": "6", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ + "floorId": "yiqu6", + "title": "主塔 6 层", + "name": "6", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -38,4 +38,16 @@ main.floors.yiqu6= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yiqu7.js b/project/floors/yiqu7.js index d47401f..459aded 100644 --- a/project/floors/yiqu7.js +++ b/project/floors/yiqu7.js @@ -1,29 +1,29 @@ main.floors.yiqu7= { -"floorId": "yiqu7", -"title": "主塔 7 层", -"name": "7", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ + "floorId": "yiqu7", + "title": "主塔 7 层", + "name": "7", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -38,4 +38,16 @@ main.floors.yiqu7= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yiqu8.js b/project/floors/yiqu8.js index 18bb1e8..71c2a6f 100644 --- a/project/floors/yiqu8.js +++ b/project/floors/yiqu8.js @@ -10,7 +10,7 @@ main.floors.yiqu8= "canUseQuickShop": true, "images": [], "ratio": 1, - "defaultGround": "grass2", + "defaultGround": "X90078", "firstArrive": [], "eachArrive": [], "parallelDo": "", diff --git a/project/floors/yiqu9.js b/project/floors/yiqu9.js index 2b2d3e7..0bab892 100644 --- a/project/floors/yiqu9.js +++ b/project/floors/yiqu9.js @@ -1,29 +1,29 @@ main.floors.yiqu9= { -"floorId": "yiqu9", -"title": "主塔 9 层", -"name": "9", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ + "floorId": "yiqu9", + "title": "主塔 9 层", + "name": "9", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -38,4 +38,16 @@ main.floors.yiqu9= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/floors/yushou.js b/project/floors/yushou.js new file mode 100644 index 0000000..5abf05c --- /dev/null +++ b/project/floors/yushou.js @@ -0,0 +1,62 @@ +main.floors.yushou= +{ + "floorId": "yushou", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "grass2", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "9,0": { + "floorId": "guangchang2", + "loc": [ + 9, + 12 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "areas": "牢狱", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/zhujuejia.js b/project/floors/zhujuejia.js new file mode 100644 index 0000000..bbee16b --- /dev/null +++ b/project/floors/zhujuejia.js @@ -0,0 +1,106 @@ +main.floors.zhujuejia= +{ + "floorId": "zhujuejia", + "title": "新建楼层", + "name": "0", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "cannotViewMap": false, + "cannotMoveDirectly": false, + "images": [], + "ratio": 1, + "defaultGround": "ground", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": { + "0,9": { + "floorId": "street01", + "loc": [ + 12, + 9 + ] + }, + "5,2": { + "floorId": "Caimhome", + "loc": [ + 3, + 8 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [120125,120126,120127,120157,120164,120161,120160,120159,120149,120150,120151,120159,120002], + [120133,120134,120135,120165,120172,200550,120168,120167,120157,120158,120159,120167,120010], + [120141,120142,120143,120173,120065,200558,120176,120175,120165,120166,120167,140132,140133], + [120149,120150,120151,120017, 0,90244, 0, 0,120173,120174,120175,110011,140141], + [120157,120158,120159,120017, 0,90244, 0, 0, 0, 0,120021,120002,120002], + [120165,120166,120167,110030, 0, 0, 0,120015,120010,120010,120010,120010,120010], + [120173,120174,120175, 0, 0, 0, 0, 0, 0, 0, 0, 0,90266], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90266], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90266], + [ 92, 0, 0, 0, 0, 0,200199, 0, 0, 0, 0,140184,140], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140192,140], + [140,140,140186, 0, 0, 0, 0, 0, 0, 0, 0,140192,140], + [140,140,140,140,140,140,140,140,140,140,140,140,140] +], + "bgmap": [ + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,120175,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078], + [90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078,90078] +], + "fgmap": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0,90204, 0,140116,140117], + [ 0, 0, 0, 0, 0, 90,140093,140092, 0,90213, 0,140124,140125], + [ 0, 0, 0,120038, 0, 90,140099,140100, 0,90223, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,140107,140108, 0,90231,120039, 0, 0], + [ 0, 0, 0,110022, 0, 0, 0,120007,120007,120007,120007, 0, 0], + [140091,140092,140093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [140099,140100,140101, 0, 0, 0,200175, 0, 0, 0, 0, 0, 0], + [140107,140108,140109, 0, 0, 0,200183, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0,200191, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0,140186,71832,71833,71759,71758,71786,71787,71784,71785, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "bg2map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,120180, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0,120073, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110004,140149], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/fonts/Verdana.ttf b/project/fonts/Verdana.ttf new file mode 100644 index 0000000..ea3c090 Binary files /dev/null and b/project/fonts/Verdana.ttf differ diff --git a/project/functions.js b/project/functions.js index e90a843..fc50b74 100644 --- a/project/functions.js +++ b/project/functions.js @@ -2,55 +2,57 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = { "events": { "resetGame": function (hero, hard, floorId, maps, values) { - // 重置整个游戏;此函数将在游戏开始时,或者每次读档时最先被调用 - // hero:勇士信息;hard:难度;floorId:当前楼层ID;maps:地图信息;values:全局数值信息 + // 重置整个游戏;此函数将在游戏开始时,或者每次读档时最先被调用 + // hero:勇士信息;hard:难度;floorId:当前楼层ID;maps:地图信息;values:全局数值信息 - // 清除游戏数据 - // 这一步会清空状态栏和全部画布内容,并删除所有动态创建的画布 - core.clearStatus(); - // 初始化status - core.status = core.clone(core.initStatus, function (name) { - return name != 'hero' && name != 'maps'; - }); - core.control._bindRoutePush(); - core.status.played = true; - // 初始化人物,图标,统计信息 - core.status.hero = core.clone(hero); - window.hero = core.status.hero; - window.flags = core.status.hero.flags; - core.events.setHeroIcon(core.status.hero.image, true); - core.control._initStatistics(core.animateFrame.totalTime); - core.status.hero.statistics.totalTime = core.animateFrame.totalTime = - Math.max(core.status.hero.statistics.totalTime, core.animateFrame.totalTime); - core.status.hero.statistics.start = null; - // 初始难度 - core.status.hard = hard || ""; - // 初始化地图 - core.status.floorId = floorId; - core.status.maps = maps; - core.maps._resetFloorImages(); - // 初始化怪物和道具 - core.material.enemys = core.enemys.getEnemys(); - core.material.items = core.items.getItems(); - // 初始化全局数值和全局开关 - core.values = core.clone(core.data.values); - for (var key in values || {}) - core.values[key] = values[key]; - core.flags = core.clone(core.data.flags); - var globalFlags = core.getFlag("globalFlags", {}); - for (var key in globalFlags) - core.flags[key] = globalFlags[key]; - core._init_sys_flags(); - // 初始化界面,状态栏等 - core.resize(); - // 状态栏是否显示 - if (core.hasFlag('hideStatusBar')) - core.hideStatusBar(core.hasFlag('showToolbox')); - else - core.showStatusBar(); - // 隐藏右下角的音乐按钮 - core.dom.musicBtn.style.display = 'none'; - }, + // 清除游戏数据 + // 这一步会清空状态栏和全部画布内容,并删除所有动态创建的画布 + core.clearStatus(); + core.status.animateObjs = [] + core.plugin.playing.clear() + // 初始化status + core.status = core.clone(core.initStatus, function (name) { + return name != "hero" && name != "maps"; + }); + core.control._bindRoutePush(); + core.status.played = true; + // 初始化人物,图标,统计信息 + core.status.hero = core.clone(hero); + window.hero = core.status.hero; + window.flags = core.status.hero.flags; + core.events.setHeroIcon(core.status.hero.image, true); + core.control._initStatistics(core.animateFrame.totalTime); + core.status.hero.statistics.totalTime = core.animateFrame.totalTime = + Math.max( + core.status.hero.statistics.totalTime, + core.animateFrame.totalTime + ); + core.status.hero.statistics.start = null; + // 初始难度 + core.status.hard = hard || ""; + // 初始化地图 + core.status.floorId = floorId; + core.status.maps = maps; + core.maps._resetFloorImages(); + // 初始化怪物和道具 + core.material.enemys = core.enemys.getEnemys(); + core.material.items = core.items.getItems(); + // 初始化全局数值和全局开关 + core.values = core.clone(core.data.values); + for (var key in values || {}) core.values[key] = values[key]; + core.flags = core.clone(core.data.flags); + var globalFlags = core.getFlag("globalFlags", {}); + for (var key in globalFlags) core.flags[key] = globalFlags[key]; + core._init_sys_flags(); + // 初始化界面,状态栏等 + core.resize(); + // 状态栏是否显示 + if (core.hasFlag("hideStatusBar")) + core.hideStatusBar(core.hasFlag("showToolbox")); + else core.showStatusBar(); + // 隐藏右下角的音乐按钮 + core.dom.musicBtn.style.display = "none"; +}, "win": function (reason, norank, noexit) { // 游戏获胜事件 // 请注意,成绩统计时是按照hp进行上传并排名 @@ -62,117 +64,133 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.status.extraEvent = core.clone(core.status.event); } - // 游戏获胜事件 + // 游戏获胜事件 core.ui.closePanel(); var replaying = core.isReplaying(); if (replaying) core.stopReplay(); core.waitHeroToStop(function () { if (!noexit) { - core.clearMap('all'); // 清空全地图 + core.status.animateObjs = [] + core.plugin.playing.clear() + core.clearMap("all"); // 清空全地图 core.deleteAllCanvas(); // 删除所有创建的画布 core.dom.gif2.innerHTML = ""; } reason = core.replaceText(reason); - core.drawText([ - "\t[" + (reason || "恭喜通关") + "]你的分数是${status:hp}。" - ], function () { - core.events.gameOver(reason || '', replaying, norank); - }) + core.drawText( + ["\t[" + (reason || "恭喜通关") + "]你的分数是${status:hp}。"], + function () { + core.events.gameOver(reason || "", replaying, norank); + } + ); }); }, "lose": function (reason) { - // 游戏失败事件 - core.ui.closePanel(); - var replaying = core.isReplaying(); - core.stopReplay(); - core.waitHeroToStop(function () { - core.drawText([ - "\t[" + (reason || "结局1") + "]你死了。\n如题。" - ], function () { - core.events.gameOver(null, replaying); - }); - }) - }, + // 游戏失败事件 + core.ui.closePanel(); + var replaying = core.isReplaying(); + core.stopReplay(); + core.status.animateObjs = [] + core.plugin.playing.clear() + core.waitHeroToStop(function () { + core.drawText( + ["\t[" + (reason || "结局1") + "]你死了。\n如题。"], + function () { + core.events.gameOver(null, replaying); + } + ); + }); +}, "changingFloor": function (floorId, heroLoc) { - // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻 - // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置 + // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻 + // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置 - // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // - var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null - var fromLoad = core.hasFlag('__fromLoad__'); // 是否是读档造成的切换 - var isFlying = core.hasFlag('__isFlying__'); // 是否是楼传造成的切换 - if (!fromLoad && !(isFlying && currentId == floorId)) { - if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); - if (currentId != null) core.getFlag("__leaveLoc__")[currentId] = core.clone(core.status.hero.loc); + // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // + var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null + var fromLoad = core.hasFlag("__fromLoad__"); // 是否是读档造成的切换 + var isFlying = core.hasFlag("__isFlying__"); // 是否是楼传造成的切换 + if (!fromLoad && !(isFlying && currentId == floorId)) { + if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); + if (currentId != null) + core.getFlag("__leaveLoc__")[currentId] = core.clone( + core.status.hero.loc + ); + } + + // 可以对currentId进行判定,比如删除某些自定义图层等 + // if (currentId == 'MT0') { + // core.deleteAllCanvas(); + // } + + // 根据分区信息自动砍层与恢复 + if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); + + // 重置画布尺寸 + core.maps.resizeMap(floorId); + // 设置勇士的位置 + heroLoc.direction = core.turnDirection(heroLoc.direction); + core.status.hero.loc = heroLoc; + // 检查重生怪并重置 + if (!fromLoad) { + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { + block.disable = false; + core.setMapBlockDisabled(floorId, block.x, block.y, false); + core.maps._updateMapArray(floorId, block.x, block.y); } + }); + core.control.gatherFollowers(); + } - // 可以对currentId进行判定,比如删除某些自定义图层等 - // if (currentId == 'MT0') { - // core.deleteAllCanvas(); - // } + // ---------- 重绘新地图;这一步将会设置core.status.floorId ---------- // + core.drawMap(floorId); - // 根据分区信息自动砍层与恢复 - if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); + // 切换楼层BGM + if (core.status.maps[floorId].bgm) { + var bgm = core.status.maps[floorId].bgm; + if (bgm instanceof Array) + bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 + if (!core.hasFlag("__bgm__")) core.playBgm(bgm); + } else if (fromLoad && !core.hasFlag("__bgm__")) { + core.pauseBgm(); + } + // 更改画面色调 + var color = core.getFlag("__color__", null); + if (!color && core.status.maps[floorId].color) + color = core.status.maps[floorId].color; + core.clearMap("curtain"); + core.status.curtainColor = color; + if (color) + core.fillRect( + "curtain", + 0, + 0, + core._PX_ || core.__PIXELS__, + core._PY_ || core.__PIXELS__, + core.arrayToRGBA(color) + ); + // 更改天气 + var weather = core.getFlag("__weather__", null); + if (!weather && core.status.maps[floorId].weather) + weather = core.status.maps[floorId].weather; + if (weather) core.setWeather(weather[0], weather[1]); + else core.setWeather(); - // 重置画布尺寸 - core.maps.resizeMap(floorId); - // 设置勇士的位置 - heroLoc.direction = core.turnDirection(heroLoc.direction); - core.status.hero.loc = heroLoc; - // 检查重生怪并重置 - if (!fromLoad) { - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { - block.disable = false; - core.setMapBlockDisabled(floorId, block.x, block.y, false); - core.maps._updateMapArray(floorId, block.x, block.y); - } - }); - core.control.gatherFollowers(); - } - - // ---------- 重绘新地图;这一步将会设置core.status.floorId ---------- // - core.drawMap(floorId); - - // 切换楼层BGM - if (core.status.maps[floorId].bgm) { - var bgm = core.status.maps[floorId].bgm; - if (bgm instanceof Array) bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 - if (!core.hasFlag("__bgm__")) core.playBgm(bgm); - } else if (fromLoad && !core.hasFlag("__bgm__")) { - core.pauseBgm(); - } - // 更改画面色调 - var color = core.getFlag('__color__', null); - if (!color && core.status.maps[floorId].color) - color = core.status.maps[floorId].color; - core.clearMap('curtain'); - core.status.curtainColor = color; - if (color) core.fillRect('curtain', 0, 0, core._PX_ || core.__PIXELS__, core._PY_ || core.__PIXELS__, core.arrayToRGBA(color)); - // 更改天气 - var weather = core.getFlag('__weather__', null); - if (!weather && core.status.maps[floorId].weather) - weather = core.status.maps[floorId].weather; - if (weather) - core.setWeather(weather[0], weather[1]); - else core.setWeather(); - - // ...可以新增一些其他内容,比如创建个画布在右上角显示什么内容等等 - - }, + // ...可以新增一些其他内容,比如创建个画布在右上角显示什么内容等等 +}, "afterChangeFloor": function (floorId) { // 转换楼层结束的事件;此函数会在整个楼层切换完全结束后再执行 // floorId是切换到的楼层 // 如果是读档,则进行检查(是否需要恢复事件) - if (core.hasFlag('__fromLoad__')) { + if (core.hasFlag("__fromLoad__")) { core.events.recoverEvents(core.getFlag("__events__")); core.removeFlag("__events__"); } else { // 每次抵达楼层执行的事件 core.insertAction(core.floors[floorId].eachArrive); - core.ui.statusBar._update_map() + core.ui.statusBar._update_map(); // 首次抵达楼层时执行的事件(后插入,先执行) if (!core.hasVisitedFloor(floorId)) { core.insertAction(core.floors[floorId].firstArrive); @@ -180,6 +198,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.plugin.bfs(); } } + if (!core.isReplaying()) core.plugin.drawCommentSign() }, "flyTo": function (toId, callback) { // 楼层传送器的使用,从当前楼层飞往toId @@ -188,9 +207,13 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var fromId = core.status.floorId; // 检查能否飞行 - if (!core.status.maps[fromId].canFlyFrom || !core.status.maps[toId].canFlyTo || !core.hasVisitedFloor(toId)) { - core.playSound('操作失败'); - core.drawTip("无法飞往" + core.status.maps[toId].title + "!", 'fly'); + if ( + !core.status.maps[fromId].canFlyFrom || + !core.status.maps[toId].canFlyTo || + !core.hasVisitedFloor(toId) + ) { + core.playSound("操作失败"); + core.drawTip("无法飞往" + core.status.maps[toId].title + "!", "fly"); return false; } @@ -200,8 +223,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.flags.flyRecordPosition) { loc = core.getFlag("__leaveLoc__", {})[toId] || null; } - if (core.status.maps[toId].flyPoint != null && core.status.maps[toId].flyPoint.length == 2) { - stair = 'flyPoint'; + if ( + core.status.maps[toId].flyPoint != null && + core.status.maps[toId].flyPoint.length == 2 + ) { + stair = "flyPoint"; } if (stair == null && loc == null) { // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 @@ -209,14 +235,15 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = toIndex = core.floorIds.indexOf(toId); var stair = fromIndex <= toIndex ? "downFloor" : "upFloor"; // 地下层:同层传送至上楼梯 - if (fromIndex == toIndex && core.status.maps[fromId].underGround) stair = "upFloor"; + if (fromIndex == toIndex && core.status.maps[fromId].underGround) + stair = "upFloor"; } // 记录录像 core.status.route.push("fly:" + toId); // 传送 core.ui.closePanel(); - core.setFlag('__isFlying__', true); + core.setFlag("__isFlying__", true); core.changeFloor(toId, stair, loc, null, function () { core.removeFlag("__isFlying__"); if (callback) callback(); @@ -225,42 +252,47 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = return true; }, "beforeBattle": function (enemyId, x, y) { - // 战斗前触发的事件,可以加上一些战前特效(详见下面支援的例子) - // 此函数在“检测能否战斗和自动存档”【之后】执行。如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。 - // 返回true则将继续战斗,返回false将不再战斗。 + // 战斗前触发的事件,可以加上一些战前特效(详见下面支援的例子) + // 此函数在“检测能否战斗和自动存档”【之后】执行。如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。 + // 返回true则将继续战斗,返回false将不再战斗。 - // ------ 支援技能 ------ // - if (x != null && y != null) { - var index = x + "," + y, - cache = core.status.checkBlock.cache[index] || {}, - guards = cache.guards || []; - // 如果存在支援怪 - if (guards.length > 0) { - // 记录flag,当前要参与支援的怪物 - core.setFlag("__guards__" + x + "_" + y, guards); - var actions = [{ "type": "playSound", "name": "跳跃" }]; - // 增加支援的特效动画(图块跳跃) - guards.forEach(function (g) { - core.push(actions, { "type": "jump", "from": [g[0], g[1]], "to": [x, y], "time": 300, "keep": false, "async": true }); - }); - core.push(actions, [ - { "type": "waitAsync" }, // 等待所有异步事件执行完毕 - { "type": "setBlock", "number": enemyId, "loc": [[x, y]] }, // 重新设置怪物自身 - { "type": "battle", "loc": [x, y] } // 重要!重新触发本次战斗 - ]); - core.insertAction(actions); - return false; - } - } + // ------ 支援技能 ------ // + if (x != null && y != null) { + var index = x + "," + y, + cache = core.status.checkBlock.cache[index] || {}, + guards = cache.guards || []; + // 如果存在支援怪 + if (guards.length > 0) { + // 记录flag,当前要参与支援的怪物 + core.setFlag("__guards__" + x + "_" + y, guards); + var actions = [{ type: "playSound", name: "跳跃" }]; + // 增加支援的特效动画(图块跳跃) + guards.forEach(function (g) { + core.push(actions, { + type: "jump", + from: [g[0], g[1]], + to: [x, y], + time: 300, + keep: false, + async: true, + }); + }); + core.push(actions, [ + { type: "waitAsync" }, // 等待所有异步事件执行完毕 + { type: "setBlock", number: enemyId, loc: [[x, y]] }, // 重新设置怪物自身 + { type: "battle", loc: [x, y] }, // 重要!重新触发本次战斗 + ]); + core.insertAction(actions); + return false; + } + } - return true; - }, - "afterBattle": function (enemyId, x, y) { + return true; + }, + "afterBattle": async function (enemyId, x, y) { // 战斗结束后触发的事件 - - var enemy = core.material.enemys[enemyId]; - var special = enemy.special; - + var enemy = core.material.enemys[enemyId] + var special = core.getEnemyValue(enemy, "special", x, y); // 播放战斗音效和动画 // 默认播放的动画;你也可以使用 var animate = 'hand'; // 默认动画 @@ -270,19 +302,30 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = animate = core.material.items[equipId].equip.animate; // 你也可以在这里根据自己的需要,比如enemyId或special或flag来修改播放的动画效果 // if (enemyId == '...') animate = '...'; + if (core.getFlag('noAnimate')) { + // 检查该动画是否存在SE,如果不存在则使用默认音效 + if (!(core.material.animates[animate] || {}).se) + core.playSound('attack.mp3'); - // 检查该动画是否存在SE,如果不存在则使用默认音效 - if (!(core.material.animates[animate] || {}).se) - core.playSound('attack.mp3'); - - // 播放动画;如果不存在坐标(强制战斗)则播放到勇士自身 - if (x != null && y != null) - core.drawAnimate(animate, x, y); - else - core.drawHeroAnimate(animate); - + // 播放动画;如果不存在坐标(强制战斗)则播放到勇士自身 + if (x != null && y != null) + core.drawAnimate(animate, x, y); + else + core.drawHeroAnimate(animate); + } // 获得战斗伤害信息 var damageInfo = core.getDamageInfo(enemyId, null, x, y) || {}; + if ((!core.getFlag("noAnimate") || damageInfo.damage >= core.status.hero.hp) && (!main.replayChecking && !core.isReplaying())) await core.attackAnimate( + enemyId, + damageInfo.start[0], + damageInfo.start[1], + damageInfo.start[2], + damageInfo.start[3], + damageInfo.heroDiffList, + damageInfo.enemyDiffList, + damageInfo.heroanimateList, + damageInfo.enemyanimateList + ) // 战斗伤害 var damage = damageInfo.damage; // 当前战斗回合数,可用于战后所需的判定 @@ -354,8 +397,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 退化 if (core.enemys.hasSpecial(special, 21)) { - core.status.hero.atk -= (enemy.atkValue || 0); - core.status.hero.def -= (enemy.defValue || 0); + core.status.hero.atk -= core.getEnemyValue(enemy, "atkValue", x, y) || 0; + core.status.hero.def -= core.getEnemyValue(enemy, "defValue", x, y) || 0; if (core.status.hero.atk < 0) core.status.hero.atk = 0; if (core.status.hero.def < 0) core.status.hero.def = 0; } @@ -410,7 +453,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 因为removeBlock和hideBlock都会刷新状态栏,因此将删除部分移动到这里并保证刷新只执行一次,以提升效率 if (core.getBlock(x, y) != null) { // 检查是否是重生怪物;如果是则仅隐藏不删除 - if (core.hasSpecial(enemy.special, 23)) { + if (core.hasSpecial(special, 23)) { core.hideBlock(x, y); } else { core.removeBlock(x, y); @@ -427,61 +470,72 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }, "afterOpenDoor": function (doorId, x, y) { - // 开一个门后触发的事件 + // 开一个门后触发的事件 - var todo = []; - // 检查该点的开门后事件 - if (core.status.floorId) { - core.push(todo, core.floors[core.status.floorId].afterOpenDoor[x + "," + y]); - } - // 检查批量开门事件 - var door = core.getBlockById(doorId); - if (door && door.event.doorInfo) { - core.push(todo, door.event.doorInfo.afterOpenDoor); - } + var todo = []; + // 检查该点的开门后事件 + if (core.status.floorId) { + core.push( + todo, + core.floors[core.status.floorId].afterOpenDoor[x + "," + y] + ); + } + // 检查批量开门事件 + var door = core.getBlockById(doorId); + if (door && door.event.doorInfo) { + core.push(todo, door.event.doorInfo.afterOpenDoor); + } - if (todo.length > 0) core.insertAction(todo, x, y); + if (todo.length > 0) core.insertAction(todo, x, y); - if (core.status.event.id == null) - core.continueAutomaticRoute(); - else - core.clearContinueAutomaticRoute(); - }, + if (core.status.event.id == null) core.continueAutomaticRoute(); + else core.clearContinueAutomaticRoute(); + }, "afterGetItem": function (itemId, x, y, isGentleClick) { - // 获得一个道具后触发的事件 - // itemId:获得的道具ID;x和y是该道具所在的坐标 - // isGentleClick:是否是轻按触发的 - if (itemId.endsWith('Potion') && core.material.items[itemId].cls == 'items') - core.playSound('回血'); - else if (itemId.endsWith('Gem') && core.material.items[itemId].cls == 'items') - core.playSound('宝石') - else - core.playSound('获得道具'); + // 获得一个道具后触发的事件 + // itemId:获得的道具ID;x和y是该道具所在的坐标 + // isGentleClick:是否是轻按触发的 + if ( + itemId.endsWith("Potion") && + core.material.items[itemId].cls == "items" + ) + core.playSound("回血"); + else if ( + itemId.endsWith("Gem") && + core.material.items[itemId].cls == "items" + ) + core.playSound("宝石"); + else core.playSound("获得道具"); - var todo = []; - // 检查该点的获得道具后事件。 - if (core.status.floorId == null) return; - var event = core.floors[core.status.floorId].afterGetItem[x + "," + y]; - if (event && (event instanceof Array || !isGentleClick || !event.disableOnGentleClick)) { - if (event.data) event = event.data; - core.unshift(todo, event); - } + var todo = []; + // 检查该点的获得道具后事件。 + if (core.status.floorId == null) return; + var event = core.floors[core.status.floorId].afterGetItem[x + "," + y]; + if ( + event && + (event instanceof Array || + !isGentleClick || + !event.disableOnGentleClick) + ) { + if (event.data) event = event.data; + core.unshift(todo, event); + } - if (todo.length > 0) core.insertAction(todo, x, y); - }, + if (todo.length > 0) core.insertAction(todo, x, y); + }, "afterPushBox": function () { - // 推箱子后的事件 - if (core.searchBlock('box').length == 0) { - // 可以通过if语句来进行开门操作 - /* + // 推箱子后的事件 + if (core.searchBlock("box").length == 0) { + // 可以通过if语句来进行开门操作 + /* if (core.status.floorId=='xxx') { // 在某个楼层 core.insertAction([ // 插入一条事件 {"type": "openDoor", "loc": [x,y]} // 开门 ]) } */ - } - } + } + } }, "enemys": { "getSpecials": function () { @@ -491,36 +545,221 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 第五项为该特殊属性的标记;目前 1 代表是地图类技能(需要进行遍历全图) // 名字和描述可以直接写字符串,也可以写个function将怪物传进去 return [ - [1, "先攻", "怪物首先攻击", "#ffcc33"], - [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], - [6, function (enemy) { return (enemy.n || '') + "连击"; }, function (enemy) { return "怪物每回合攻击" + (enemy.n || 4) + "次"; }, "#ffee77"], - [7, "破甲", function (enemy) { return "战斗前,怪物附加角色防御的" + Math.floor(100 * (enemy.breakArmor || core.values.breakArmor || 0)) + "%作为伤害"; }, "#88c0ff"], - [8, "反击", function (enemy) { return "战斗时,怪物每回合附加角色攻击的" + Math.floor(100 * (enemy.counterAttack || core.values.counterAttack || 0)) + "%作为伤害,无视角色防御"; }, "#ffaa44"], - [9, "净化", function (enemy) { return "战斗前,怪物附加角色护盾的" + (enemy.purify || core.values.purify) + "倍作为伤害"; }, "#80eed6"], + [1, "先攻", "怪物首先攻击", "#ffcc33"], //√ + //[2, "魔攻", "怪物无视角色的防御", "#bbb0ff"], + [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], //√ + [ + 6, + function (enemy) { + return (enemy.n || "") + "连击"; + }, + function (enemy) { + return "怪物每回合攻击" + (enemy.n || 4) + "次"; + }, + "#ffee77", + ], //想改成“以XX%、XX%攻击力各攻击一次” + [ + 7, + "破甲", + function (enemy) { + return ( + "怪物无视角色防御的" + + Math.floor( + 100 * (enemy.breakArmor || core.values.breakArmor || 0) + ) + + "%" + ); + }, + "#88c0ff", + ], //√ + [ + 8, + "反击", + function (enemy) { + return ( + "战斗时,怪物每回合附加角色攻击的" + + Math.floor( + 100 * (enemy.counterAttack || core.values.counterAttack || 0) + ) + + "%作为伤害,无视角色防御" + ); + }, + "#ffaa44", + ], + [ + 9, + "净化", + function (enemy) { + return ( + "战斗前,怪物附加角色护盾的" + + (enemy.purify || core.values.purify) + + "倍作为伤害" + ); + }, + "#80eed6", + ], [10, "模仿", "怪物的攻防和角色攻防相等", "#b0c0dd"], - [11, "吸血", function (enemy) { return "战斗前,怪物首先吸取角色的" + Math.floor(100 * enemy.vampire || 0) + "%生命(约" + Math.floor((enemy.vampire || 0) * core.getStatus('hp')) + "点)作为伤害" + (enemy.add ? ",并把伤害数值加到自身生命上" : ""); }, "#dd4448"], - [12, "中毒", "战斗后,角色陷入中毒状态,每一步损失生命" + core.values.poisonDamage + "点", "#99ee88"], - [13, "衰弱", "战斗后,角色陷入衰弱状态,攻防暂时下降" + (core.values.weakValue >= 1 ? core.values.weakValue + "点" : parseInt(core.values.weakValue * 100) + "%"), "#f0bbcc"], - [14, "诅咒", "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", "#bbeef0"], - [15, "领域", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "范围内" + (enemy.range || 1) + "格时自动减生命" + (enemy.zone || 0) + "点"; }, "#c677dd"], + [ + 11, + "吸血", + function (enemy) { + return ( + "战斗前,怪物首先吸取角色的" + + Math.floor(100 * enemy.vampire || 0) + + "%生命(约" + + Math.floor((enemy.vampire || 0) * core.getStatus("hp")) + + "点)作为伤害" + + (enemy.add ? ",并把伤害数值加到自身生命上" : "") + ); + }, + "#dd4448", + ], + [ + 12, + "中毒", + "战斗后,角色陷入中毒状态,每一步损失生命" + + core.values.poisonDamage + + "点", + "#99ee88", + ], + [ + 13, + "衰弱", + "战斗后,角色陷入衰弱状态,攻防暂时下降" + + (core.values.weakValue >= 1 ? + core.values.weakValue + "点" : + parseInt(core.values.weakValue * 100) + "%"), + "#f0bbcc", + ], + [ + 14, + "诅咒", + "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", + "#bbeef0", + ], + [ + 15, + "领域", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "范围内" + + (enemy.range || 1) + + "格时自动减生命" + + (enemy.zone || 0) + + "点" + ); + }, + "#c677dd", + ], [16, "夹击", "经过两只相同的怪物中间,角色生命值变成一半", "#bb99ee"], - [17, "仇恨", "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + (core.values.hatred || 0) + "点仇恨值)", "#b0b666"], - [18, "阻击", function (enemy) { return "经过怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时自动减生命" + (enemy.repulse || 0) + "点,同时怪物后退一格"; }, "#8888e6"], + [ + 17, + "仇恨", + "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + + (core.values.hatred || 0) + + "点仇恨值)", + "#b0b666", + ], + [ + 18, + "阻击", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时自动减生命" + + (enemy.repulse || 0) + + "点,同时怪物后退一格" + ); + }, + "#8888e6", + ], [19, "自爆", "战斗后角色的生命值变成1", "#ff6666"], [20, "无敌", "角色无法打败怪物,除非拥有十字架", "#aaaaaa"], - [21, "退化", function (enemy) { return "战斗后角色永久下降" + (enemy.atkValue || 0) + "点攻击和" + (enemy.defValue || 0) + "点防御"; }], - [22, "固伤", function (enemy) { return "战斗前,怪物对角色造成" + (enemy.damage || 0) + "点固定伤害,未开启负伤时无视角色护盾。"; }, "#ff9977"], + [ + 21, + "退化", + function (enemy) { + return ( + "战斗后角色永久下降" + + (enemy.atkValue || 0) + + "点攻击和" + + (enemy.defValue || 0) + + "点防御" + ); + }, + ], + [ + 22, + "固伤", + function (enemy) { + return ( + "战斗前,怪物对角色造成" + + (enemy.damage || 0) + + "点固定伤害,未开启负伤时无视角色护盾。" + ); + }, + "#ff9977", + ], [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现", "#a0e0ff"], - [24, "激光", function (enemy) { return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; }, "#dda0dd"], - [25, "光环", function (enemy) { return (enemy.range != null ? ((enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + enemy.haloRange + "格范围内") : "同楼层所有") + "怪物生命提升" + (enemy.hpBuff || 0) + "%,攻击提升" + (enemy.atkBuff || 0) + "%,防御提升" + (enemy.defBuff || 0) + "%," + (enemy.haloAdd ? "可叠加" : "不可叠加"); }, "#e6e099", 1], - [26, "支援", "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", "#77c0b6", 1], - [27, "捕捉", function (enemy) { return "当走到怪物周围" + (enemy.zoneSquare ? "九宫格" : "十字") + "时会强制进行战斗。"; }, "#c0ddbb"] + [ + 24, + "激光", + function (enemy) { + return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; + }, + "#dda0dd", + ], + [ + 25, + "光环", + function (enemy) { + return ( + (enemy.range != null ? + (enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + + enemy.haloRange + + "格范围内" : + "同楼层所有") + + "怪物生命提升" + + (enemy.hpBuff || 0) + + "%,攻击提升" + + (enemy.atkBuff || 0) + + "%,防御提升" + + (enemy.defBuff || 0) + + "%," + + (enemy.haloAdd ? "可叠加" : "不可叠加") + ); + }, + "#e6e099", + 1, + ], + [ + 26, + "支援", + "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", + "#77c0b6", + 1, + ], + [ + 27, + "捕捉", + function (enemy) { + return ( + "当走到怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时会强制进行战斗。" + ); + }, + "#c0ddbb", + ], ]; }, "getEnemyInfo": function (enemy, hero, x, y, floorId) { // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 // 例如:坚固、模仿、仿攻等等 - // + // // 参数说明: // enemy:该怪物信息 // hero_hp,hero_atk,hero_def,hero_mdef:勇士的生命攻防护盾数据 @@ -528,18 +767,25 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // floorId:该怪物所在的楼层 // 后面三个参数主要是可以在光环等效果上可以适用(也可以按需制作部分范围光环效果) floorId = floorId || core.status.floorId; - var hero_hp = core.getRealStatusOrDefault(hero, 'hp'), - hero_atk = core.getRealStatusOrDefault(hero, 'atk'), - hero_def = core.getRealStatusOrDefault(hero, 'def'), - hero_mdef = core.getRealStatusOrDefault(hero, 'mdef'); - - var mon_hp = core.getEnemyValue(enemy, 'hp', x, y, floorId), - mon_atk = core.getEnemyValue(enemy, 'atk', x, y, floorId), - mon_def = core.getEnemyValue(enemy, 'def', x, y, floorId), - mon_special = core.getEnemyValue(enemy, 'special', x, y, floorId); - var mon_money = core.getEnemyValue(enemy, 'money', x, y, floorId), - mon_exp = core.getEnemyValue(enemy, 'exp', x, y, floorId), - mon_point = core.getEnemyValue(enemy, 'point', x, y, floorId); + var hero_hp = core.getRealStatusOrDefault(hero, "hp"), + hero_atk = core.getRealStatusOrDefault(hero, "atk"), + hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"); + var mon_id = core.getEnemyValue(enemy, "id", x, y, floorId), + mon_name = core.getEnemyValue(enemy, "name", x, y, floorId); + var mon_hp = core.getEnemyValue(enemy, "hp", x, y, floorId), + mon_atk = core.getEnemyValue(enemy, "atk", x, y, floorId), + mon_def = core.getEnemyValue(enemy, "def", x, y, floorId), + mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId) || 0, + mon_spell = core.getEnemyValue(enemy, "spell", x, y, floorId) || 0, + mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId) || 1, + mon_special = core.getEnemyValue(enemy, "special", x, y, floorId); + var mon_money = core.getEnemyValue(enemy, "money", x, y, floorId), + mon_exp = core.getEnemyValue(enemy, "exp", x, y, floorId), + mon_point = core.getEnemyValue(enemy, "point", x, y, floorId); + var mon_barrier = 0, + mon_absorb_damage = 0; // 模仿 if (core.hasSpecial(mon_special, 10)) { mon_atk = hero_atk; @@ -551,7 +797,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } var guards = []; - // 光环和支援检查 if (!core.status.checkBlock) core.status.checkBlock = {}; @@ -563,7 +808,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 已经计算过的光环怪ID列表,用于判定叠加 var usedEnemyIds = {}; // 检查光环和支援的缓存 - var index = x != null && y != null ? (x + "," + y) : floorId; + var index = x != null && y != null ? x + "," + y : floorId; if (!core.status.checkBlock.cache) core.status.checkBlock.cache = {}; var cache = core.status.checkBlock.cache[index]; if (!cache) { @@ -583,7 +828,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = dy = Math.abs(block.y - y); // 检查十字和九宫格光环 if (dx + dy <= enemy.haloRange) inRange = true; - if (enemy.haloSquare && dx <= enemy.haloRange && dy <= enemy.haloRange) inRange = true; + if ( + enemy.haloSquare && + dx <= enemy.haloRange && + dy <= enemy.haloRange + ) + inRange = true; } // 检查是否可叠加 if (inRange && (enemy.haloAdd || !usedEnemyIds[enemy.id])) { @@ -594,10 +844,17 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } // 检查【支援】技能,数字26 - if (enemy && core.hasSpecial(enemy.special, 26) && + if ( + enemy && + core.hasSpecial(enemy.special, 26) && // 检查支援条件,坐标存在,距离为1,且不能是自己 // 其他类型的支援怪,比如十字之类的话.... 看着做是一样的 - x != null && y != null && Math.abs(block.x - x) <= 1 && Math.abs(block.y - y) <= 1 && !(x == block.x && y == block.y)) { + x != null && + y != null && + Math.abs(block.x - x) <= 1 && + Math.abs(block.y - y) <= 1 && + !(x == block.x && y == block.y) + ) { // 记录怪物的x,y,ID guards.push([block.x, block.y, id]); } @@ -607,7 +864,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } }); - core.status.checkBlock.cache[index] = { "hp_buff": hp_buff, "atk_buff": atk_buff, "def_buff": def_buff, "guards": guards }; + core.status.checkBlock.cache[index] = { + hp_buff: hp_buff, + atk_buff: atk_buff, + def_buff: def_buff, + guards: guards, + }; } else { // 直接使用缓存数据 hp_buff = cache.hp_buff; @@ -617,9 +879,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 增加比例;如果要增加数值可以直接在这里修改 - mon_hp *= (1 + hp_buff / 100); - mon_atk *= (1 + atk_buff / 100); - mon_def *= (1 + def_buff / 100); + mon_hp *= 1 + hp_buff / 100; + mon_atk *= 1 + atk_buff / 100; + mon_def *= 1 + def_buff / 100; } // TODO:可以在这里新增其他的怪物数据变化 @@ -630,19 +892,27 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 也可以按需增加各种自定义内容 return { - "hp": Math.floor(mon_hp), - "atk": Math.floor(mon_atk), - "def": Math.floor(mon_def), - "money": Math.floor(mon_money), - "exp": Math.floor(mon_exp), - "point": Math.floor(mon_point), - "special": mon_special, - "guards": guards, // 返回支援情况 + id: mon_id, + name: mon_name, + hp: Math.floor(mon_hp), + atk: Math.floor(mon_atk), + def: Math.floor(mon_def), + mdef: Math.floor(mon_mdef), + spell: Math.floor(mon_spell), + speed: Math.floor(mon_speed), + barrier: Math.floor(mon_barrier), + absorb: Math.floor(mon_absorb_damage), + money: Math.floor(mon_money), + exp: Math.floor(mon_exp), + point: Math.floor(mon_point), + special: mon_special, + guards: guards // 返回支援情况 + }; }, "getDamageInfo": function (enemy, hero, x, y, floorId) { // 获得战斗伤害信息(实际伤害计算函数) - // + // // 参数说明: // enemy:该怪物信息 // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 @@ -651,43 +921,76 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 后面三个参数主要是可以在光环等效果上可以适用 floorId = floorId || core.status.floorId; - var hero_hp = core.getRealStatusOrDefault(hero, 'hp'), - hero_atk = core.getRealStatusOrDefault(hero, 'atk'), - hero_def = core.getRealStatusOrDefault(hero, 'def'), - hero_mdef = core.getRealStatusOrDefault(hero, 'mdef'), - origin_hero_hp = core.getStatusOrDefault(hero, 'hp'), - origin_hero_atk = core.getStatusOrDefault(hero, 'atk'), - origin_hero_def = core.getStatusOrDefault(hero, 'def'); - - // 勇士的负属性都按0计算 - hero_hp = Math.max(0, hero_hp); - hero_atk = Math.max(0, hero_atk); - hero_def = Math.max(0, hero_def); - hero_mdef = Math.max(0, hero_mdef); + var hero_hp = core.getRealStatusOrDefault(hero, "hp"), + hero_atk = core.getRealStatusOrDefault(hero, "atk"), + hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_spell = core.getRealStatusOrDefault(hero, "spell"), + origin_hero_hp = core.getStatusOrDefault(hero, "hp"), + origin_hero_atk = core.getStatusOrDefault(hero, "atk"), + origin_hero_def = core.getStatusOrDefault(hero, "def"); + //编辑器特判 + if (main.mode == "editor") { + hero_hp = hero?.hp ?? core.status.hero.hp, + hero_atk = hero?.atk ?? core.status.hero.atk, + hero_def = hero?.def ?? core.status.hero.def, + hero_matk = hero?.matk ?? core.status.hero.matk, + hero_mdef = hero?.mdef ?? core.status.hero.mdef, + hero_mhp = hero?.mhp ?? core.status.hero.mhp, + hero_speed = hero?.speed ?? core.status.hero.speed, + hero_spell = hero?.spell ?? core.status.hero.spell; + } // 怪物的各项数据 // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); var mon_hp = enemyInfo.hp, mon_atk = enemyInfo.atk, mon_def = enemyInfo.def, - mon_special = enemyInfo.special; - + mon_mdef = enemyInfo.mdef, + mon_spell = enemyInfo.spell, + mon_speed = enemyInfo.speed, + mon_special = enemyInfo.special, + mon_absorb_damage = enemyInfo.absorb, + mon_barrier = enemyInfo.barrier; + const { lcm, gcd } = core.plugin.utils + const equip0 = core.getEquip(0) + //---第一部分:静态属性修正--- + //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) // 技能的处理 - if (core.getFlag('skill', 0) == 1) { // 开启了技能1:二倍斩 - hero_atk *= 2; // 计算时攻击力翻倍 + if (core.getFlag("skill", 0) == 1) { + // 开启了技能1:二倍斩 + hero_atk *= 2; // 计算时攻击力翻倍 } + // 破甲 + if (core.hasSpecial(mon_special, 7)) + hero_def -= Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); + + //勇士属性取整 + hero_atk = Math.max(0, Math.floor(hero_atk)); + hero_def = Math.max(0, Math.floor(hero_def)); + hero_speed = Math.max(0, Math.floor(hero_speed)); + hero_spell = Math.max(0, Math.floor(hero_spell)); + hero_matk = Math.min(100, Math.max(0, Math.floor(hero_matk))); + hero_mdef = Math.min(100, Math.max(0, Math.floor(hero_mdef))); + hero_mhp = Math.min(100, Math.max(0, Math.floor(hero_mhp))); + // 如果是无敌属性,且勇士未持有十字架 if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) return null; // 不可战斗 // 战前造成的额外伤害(可被护盾抵消) - var init_damage = 0; + let init_damage = 0; // 吸血 if (core.hasSpecial(mon_special, 11)) { - var vampire_damage = hero_hp * enemy.vampire; + let vampire_damage = hero_hp * enemy.vampire; // 如果有神圣盾免疫吸血等可以在这里写 // 也可以用hasItem和hasEquip来判定装备 @@ -695,105 +998,334 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = vampire_damage = Math.floor(vampire_damage) || 0; // 加到自身 - if (enemy.add) // 如果加到自身 + if (enemy.add) + // 如果加到自身 mon_hp += vampire_damage; init_damage += vampire_damage; } - // 每回合怪物对勇士造成的战斗伤害 - var per_damage = mon_atk - hero_def; + //——第二部分:变量定义和初始赋值—— - // 战斗伤害不能为负值 - if (per_damage < 0) per_damage = 0; + let hero_per_damage = Math.max(hero_atk - mon_def, 0), - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= (enemy.n || 2); + hero_per_mdamage = Math.floor((hero_spell * hero_matk / 100) * (100 - mon_mdef) / 100); - // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 - var counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) - counterDamage += Math.floor((enemy.counterAttack || core.values.counterAttack) * hero_atk); + let damage = 0, + hero_turn = 0, + mon_turn = 0; + let equipInfo = [] //回合生效的装备列表 - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; + for (let i = 0; i < 5; i++) { + const a = core.plugin.equip[core.getEquip(i)] + if (a) equipInfo.push(a) + } - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor((enemy.breakArmor || core.values.breakArmor) * hero_def); - - // 净化 - if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor((enemy.purify || core.values.purify) * hero_mdef); - - // 勇士每回合对怪物造成的伤害 - var hero_per_damage = Math.max(hero_atk - mon_def, 0); - - // 如果没有破防,则不可战斗 - if (hero_per_damage <= 0) return null; - - // 勇士的攻击回合数;为怪物生命除以每回合伤害向上取整 - var turn = Math.ceil(mon_hp / hero_per_damage); - - // ------ 支援 ----- // - // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 - var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); - var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? - turn += core.getFlag("__extraTurn__", 0); - if (guards.length > 0) { - if (!guard_before_current_enemy) { // --- 先打当前怪物,记录当前回合数 - core.setFlag("__extraTurn__", turn); + //处理回合条长度 + let oneTurn = [hero_speed, mon_speed]; + if (equipInfo.length > 0) { + for (let i = 0; i < equipInfo.length; i++) { + equipInfo[i].now = 0; + equipInfo[i].isAttack = false; + oneTurn.push(equipInfo[i].speed); } - // 获得那些怪物组成小队战斗 - for (var i = 0; i < guards.length; i++) { - var gx = guards[i][0], - gy = guards[i][1], - gid = guards[i][2]; - // 递归计算支援怪伤害信息,这里不传x,y保证不会重复调用 - // 这里的mdef传0,因为护盾应该只会被计算一次 - var info = core.enemys.getDamageInfo(core.material.enemys[gid], { hp: origin_hero_hp, atk: origin_hero_atk, def: origin_hero_def, mdef: 0 }); - if (info == null) { // 小队中任何一个怪物不可战斗,直接返回null - core.removeFlag("__extraTurn__"); - return null; + } + //需要变更 + + const onegcd = gcd(...oneTurn) //最大公约数 + oneTurn = lcm(...oneTurn) //单次回合长度 + //在这里处理equip的初始位置now + equipInfo.forEach(v => { + switch (v.id) { + case "sword1": + default: + v.now = 0 + break + } + v.onAttack = false + if (v.now === oneTurn) v.onAttack = true //增加正在攻击的标志 + }) + const heroinfo = { hp: hero_hp, atk: hero_atk, def: hero_def, mdef: (!hero?.mdef || hero?.mdef === 100) ? hero_mdef : hero.mdef, spell: hero_spell, mhp: Math.floor(hero_spell * hero_mhp / 100), matk: Math.floor(hero_spell * hero_matk / 100), speed: hero_speed, now: 0, isAttack: false } //勇士属性 + const enemyinfo = { hp: mon_hp, atk: mon_atk, def: mon_def, mdef: mon_mdef, spell: mon_spell, speed: mon_speed, special: mon_special, now: 0, onAttack: false, isAttack: false } //怪物属性 + //先攻,先攻为怪物和勇士勇士行动前怪物出第一刀 + if (core.hasSpecial(mon_special, 1)) { + enemyinfo.now = oneTurn + enemyinfo.onAttack = true + } + const start = [core.clone(heroinfo), core.clone(enemyinfo), core.clone(equipInfo), oneTurn] //记录开始战斗时的属性并转发 + //---第三部分:递归开始--- + + const heroDiffList = [], + enemyDiffList = [], + heroanimateList = [], + enemyanimateList = []; + + let beforehp = enemyinfo.hp + while ( + enemyinfo.hp > 0 + ) { + let onattack = false + const hero_diff = {}, + enemy_diff = {}, + hero_animate = [], + enemy_animate = []; + if (enemyinfo.onAttack) { //怪物先攻的场合 + //这里计算怪物攻击时发生的各种变化,同时计入enemy_diff + let mon_damage = 0 + let hero_damage = 0 + //伤害计算 + let per_damage = Math.max(enemyinfo.atk - heroinfo.def, 0), + per_mdamage = Math.floor(enemyinfo.spell * (100 - heroinfo.mdef) / 100); + + //这里记录伤害触发后的属性变化和动画,同时计入diff、damage(不要在此直接修改heroinfo和enemyinfo) + if (core.hasSpecial(mon_special, 6)) { + hero_damage += per_damage * enemy.n + per_mdamage * enemy.n + } else { + hero_damage += per_damage + per_mdamage } - // 已经进行的回合数 - core.setFlag("__extraTurn__", info.turn); - init_damage += info.damage; + let animate = core.plugin.enemyanimate[enemy.id] ?? "jianji2" + //这里可通过if更改默认的怪物攻击特效 + hero_animate.push(animate) //勇士身上绘制jianji2动画 + if (heroinfo.mhp + (hero_diff.mhp ?? 0) - hero_damage >= 0) { + hero_diff.mhp = (hero_diff.mhp ?? 0) - hero_damage + hero_damage = 0 + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } else { + hero_damage -= heroinfo.mhp + (hero_diff.mhp ?? 0) + hero_diff.mhp = (hero_diff.mhp ?? 0) - heroinfo.mhp - (hero_diff.mhp ?? 0) + + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } + + damage += hero_damage + enemyinfo.onAttack = false + enemyinfo.now = 0 + onattack = true + } - if (guard_before_current_enemy) { // --- 先打支援怪物,增加当前回合数 - turn += core.getFlag("__extraTurn__", 0); + equipInfo.forEach(v => { + if (v.onAttack) { + let mon_damage = 0 + let hero_damage = 0 + //这里写生效装备的技能效果,同时对双方属性的修改计入diff(不要在此直接修改heroinfo和enemyinfo) + let animate = core.plugin.equipanimate[v.id] ?? "jianji2" + //这里可通过if更改默认的道具特效 + enemy_animate.push(animate) //勇士身上绘制动画 + + v.now = 0 + v.onAttack = false + onattack = true + } + }) + if (onattack) { //先手处理完毕后的数据处理 + heroDiffList.push(hero_diff) + enemyDiffList.push(enemy_diff) + heroanimateList.push(hero_animate) + enemyanimateList.push(enemy_animate) + //处理属性变化 + for (let v in hero_diff) { + heroinfo[v] += hero_diff[v] + } + for (let v in enemy_diff) { + enemyinfo[v] += enemy_diff[v] + } + continue //进入下一循环 } + heroinfo.now += heroinfo.speed + enemyinfo.now += enemyinfo.speed + equipInfo.forEach(v => { + v.now += v.speed + }) + + if ( + heroinfo.now >= oneTurn + ) { + //勇士攻击的回合 + let mon_damage = 0 + let hero_damage = 0 + //这里计算勇士攻击时发生的各种变化 + + //伤害计算 + let per_damage = Math.max(heroinfo.atk - enemyinfo.def, 0) + let per_mdamage = Math.max(Math.floor(heroinfo.matk * (100 - enemyinfo.mdef) / 100), 0) + mon_damage = per_damage + per_mdamage + //这里记录伤害触发后的属性变化和动画,同时计入diff(不要在此直接修改heroinfo和enemyinfo) + let animate = core.plugin.heroanimate[equip0] ?? "jianji2" + //这里可通过if更改默认的武器攻击特效 + enemy_animate.push(animate) + + + enemy_diff.hp = (enemy_diff.hp ?? 0) - mon_damage + heroinfo.now -= oneTurn + hero_turn++ + onattack = true + } + + + if (enemyinfo.now >= oneTurn) { + //怪物攻击的回合 + let mon_damage = 0 + let hero_damage = 0 + //伤害计算 + let per_damage = Math.max(enemyinfo.atk - heroinfo.def, 0), + per_mdamage = Math.floor(enemyinfo.spell * (100 - heroinfo.mdef) / 100); + + //这里记录伤害触发后的属性变化和动画,同时计入diff、damage(不要在此直接修改heroinfo和enemyinfo) + if (core.hasSpecial(mon_special, 6)) { + hero_damage += per_damage * enemy.n + per_mdamage * enemy.n + } else { + hero_damage += per_damage + per_mdamage + } + let animate = core.plugin.enemyanimate[enemy.id] ?? "jianji2" + //这里可通过if更改默认的怪物攻击特效 + hero_animate.push(animate) //勇士身上绘制sword动画 + if (heroinfo.mhp + (hero_diff.mhp ?? 0) - hero_damage >= 0) { + hero_diff.mhp = (hero_diff.mhp ?? 0) - hero_damage + hero_damage = 0 + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } else { + hero_damage -= heroinfo.mhp + (hero_diff.mhp ?? 0) + hero_diff.mhp = (hero_diff.mhp ?? 0) - heroinfo.mhp - (hero_diff.mhp ?? 0) + + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } + + damage += hero_damage + enemyinfo.now -= oneTurn + mon_turn++ + onattack = true + } + equipInfo.forEach(v => { + if (v.now >= oneTurn) { + let mon_damage = 0 + let hero_damage = 0 + //这里写生效装备的技能效果,同时对双方属性的修改计入diff(不要在此直接修改heroinfo和enemyinfo) + let animate = core.plugin.equipanimate[v.id] ?? "jianji2" + //这里可通过if更改默认的道具特效 + enemy_animate.push(animate) //怪物身上绘制动画 + + v.now -= oneTurn + onattack = true + } + + }) + if (onattack) { + //处理完毕后的数据处理 + heroDiffList.push(hero_diff) + enemyDiffList.push(enemy_diff) + heroanimateList.push(hero_animate) + enemyanimateList.push(enemy_animate) + //处理属性变化 + for (let v in hero_diff) { + heroinfo[v] += hero_diff[v] + } + for (let v in enemy_diff) { + enemyinfo[v] += enemy_diff[v] + } + + //出手50回合怪物生命未降低直接判负,避免死循环 + if (hero_turn === 50) { + + if (enemyinfo.hp >= beforehp) { + return null + } + } + } + } - core.removeFlag("__extraTurn__"); + + //下面这些还没修改,原有技能除先攻、连击外暂时全部移除,所有技能需要在上方的模拟循环中做修正 + /* + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); + + + + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = Math.floor(hero_spell * hero_mhp / 100); + + + // ------ 支援 ----- // + // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 + /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); + var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? + turn += core.getFlag("__extraTurn__", 0); + if (guards.length > 0) { + if (!guard_before_current_enemy) { // --- 先打当前怪物,记录当前回合数 + core.setFlag("__extraTurn__", turn); + } + // 获得那些怪物组成小队战斗 + for (var i = 0; i < guards.length; i++) { + var gx = guards[i][0], + gy = guards[i][1], + gid = guards[i][2]; + // 递归计算支援怪伤害信息,这里不传x,y保证不会重复调用 + // 这里的mdef传0,因为护盾应该只会被计算一次 + var info = core.enemys.getDamageInfo(core.material.enemys[gid], { hp: origin_hero_hp, atk: origin_hero_atk, def: origin_hero_def, mdef: 0 }); + if (info == null) { // 小队中任何一个怪物不可战斗,直接返回null + core.removeFlag("__extraTurn__"); + return null; + } + // 已经进行的回合数 + core.setFlag("__extraTurn__", info.turn); + init_damage += info.damage; + } + if (guard_before_current_enemy) { // --- 先打支援怪物,增加当前回合数 + turn += core.getFlag("__extraTurn__", 0); + } + } + core.removeFlag("__extraTurn__");*/ // ------ 支援END ------ // + /* + // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 + damage += init_damage + hero_turn * counterDamage; + // 再扣去护盾 + damage -= barrier; - // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 - var damage = init_damage + (turn - 1) * per_damage + turn * counterDamage; - // 再扣去护盾 - damage -= hero_mdef; - - // 检查是否允许负伤 - if (!core.flags.enableNegativeDamage) - damage = Math.max(0, damage); - - // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) - if (core.hasSpecial(mon_special, 17)) { // 仇恨 - damage += core.getFlag('hatred', 0); - } - if (core.hasSpecial(mon_special, 22)) { // 固伤 - damage += enemy.damage || 0; - } + // 检查是否允许负伤 + if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); + // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) + if (core.hasSpecial(mon_special, 17)) { + // 仇恨 + damage += core.getFlag("hatred", 0); + } + if (core.hasSpecial(mon_special, 22)) { + // 固伤 + damage += enemy.damage2 || 0; + } + */ return { - "mon_hp": Math.floor(mon_hp), - "mon_atk": Math.floor(mon_atk), - "mon_def": Math.floor(mon_def), - "init_damage": Math.floor(init_damage), - "per_damage": Math.floor(per_damage), - "hero_per_damage": Math.floor(hero_per_damage), - "turn": Math.floor(turn), - "damage": Math.floor(damage) + start: start, + mon_hp: Math.floor(mon_hp), + mon_atk: Math.floor(mon_atk), + mon_def: Math.floor(mon_def), + mon_mdef: Math.floor(mon_mdef), + mon_speed: Math.floor(mon_speed), + heroDiffList: heroDiffList, + enemyDiffList: enemyDiffList, + heroanimateList: heroanimateList, + enemyanimateList: enemyanimateList, + hero_turn: Math.floor(hero_turn), + mon_turn: Math.floor(mon_turn), + damage: Math.floor(damage) }; + /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) + 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) + 2. 一防减伤是物防还是魔防(由怪物是物攻还是魔攻来转换) + 3. 特殊战斗的怪物,在怪物手册里“伤害”写为“特殊战”*/ + /*TODO:怪物和勇士同时跑条到终点时,谁先出手的逻辑确定 + 怪物、勇士和装备同时跑条时的计算*/ } }, "actions": { @@ -807,7 +1339,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.isMoving()) return; // 商店长按时忽略 - if (core.status.onShopLongDown) return core.status.onShopLongDown = false; + if (core.status.onShopLongDown) + return (core.status.onShopLongDown = false); // Alt+0~9,快捷换上套装 if (altKey && keyCode >= 48 && keyCode <= 57) { @@ -824,7 +1357,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.openBook(true); break; case 71: // G:使用楼传器 - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + flags.canMoveFloor = core.canMoveFloor(); + core.useItem('fly', true) + core.status.route.push("key:71"); break; case 65: // A:读取自动存档(回退) core.doSL("autoSave", "load"); @@ -882,25 +1417,37 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.actions._clickGameInfo_openComments(); break; case 49: // 快捷键1: 破 - if (core.hasItem('pickaxe')) { + if (core.hasItem("pickaxe")) { core.status.route.push("key:49"); // 将按键记在录像中 - core.useItem('pickaxe', true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 + core.useItem("pickaxe", true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 } break; case 50: // 快捷键2: 炸 - if (core.hasItem('bomb')) { + if (core.hasItem("bomb")) { core.status.route.push("key:50"); // 将按键记在录像中 - core.useItem('bomb', true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 + core.useItem("bomb", true); // 第二个参数true代表该次使用道具是被按键触发的,使用过程不计入录像 } break; case 51: // 快捷键3: 飞 - if (core.hasItem('centerFly')) { + if (core.hasItem("centerFly")) { core.ui._drawCenterFly(); } break; case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... 其他道具依次判断 { - var list = ["icePickaxe", "freezeBadge", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; + var list = [ + "icePickaxe", + "freezeBadge", + "earthquake", + "upFly", + "downFly", + "jumpShoes", + "lifeWand", + "poisonWine", + "weakWine", + "curseWine", + "superWine", + ]; for (var i = 0; i < list.length; i++) { var itemId = list[i]; if (core.canUseItem(itemId)) { @@ -926,9 +1473,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = break; case 70: // F:开启技能“二倍斩” // 检测是否拥有“二倍斩”这个技能道具 - if (core.hasItem('skill1')) { + if (core.hasItem("skill1")) { core.status.route.push("key:70"); - core.useItem('skill1', true); + core.useItem("skill1", true); } break; // 在这里可以任意新增或编辑已有的快捷键内容 @@ -946,33 +1493,32 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = break; */ } - }, "onStatusBarClick": function (px, py, vertical) { - // 点击状态栏时触发的事件,仅在自绘状态栏开启时生效 - // px和py为点击的像素坐标 - // vertical为录像播放过程中的横竖屏信息 - // - // 横屏模式下状态栏的画布大小是 129*416 (开启拓展装备栏后是 129*457) - // 竖屏模式下状态栏的画布大小是 416*(32*rows+9) 其中rows为状态栏行数,即全塔属性中statusCanvasRowsOnMobile值 - // 可以使用 _isVertical() 来判定当前是否是竖屏模式 + // 点击状态栏时触发的事件,仅在自绘状态栏开启时生效 + // px和py为点击的像素坐标 + // vertical为录像播放过程中的横竖屏信息 + // + // 横屏模式下状态栏的画布大小是 129*416 (开启拓展装备栏后是 129*457) + // 竖屏模式下状态栏的画布大小是 416*(32*rows+9) 其中rows为状态栏行数,即全塔属性中statusCanvasRowsOnMobile值 + // 可以使用 _isVertical() 来判定当前是否是竖屏模式 - // 判定当前是否是竖屏模式。录像播放过程中可能会记录当时的横竖屏信息以覆盖。 - var _isVertical = function () { - if (core.isReplaying() && vertical != null) return vertical; - return core.domStyle.isVertical; - } + // 判定当前是否是竖屏模式。录像播放过程中可能会记录当时的横竖屏信息以覆盖。 + var _isVertical = function () { + if (core.isReplaying() && vertical != null) return vertical; + return core.domStyle.isVertical; + }; - // 如果正在执行事件,则忽略 - if (core.status.lockControl) return; - // 如果当前正在行走,则忽略;也可以使用 core.waitHeroToStop(callback) 来停止行走再回调执行脚本 - if (core.isMoving()) return; + // 如果正在执行事件,则忽略 + if (core.status.lockControl) return; + // 如果当前正在行走,则忽略;也可以使用 core.waitHeroToStop(callback) 来停止行走再回调执行脚本 + if (core.isMoving()) return; - // 判定px和py来执行自己的脚本内容.... 注意横竖屏 - // console.log("onStatusBarClick: ", px, py, _isVertical()); + // 判定px和py来执行自己的脚本内容.... 注意横竖屏 + // console.log("onStatusBarClick: ", px, py, _isVertical()); - // 样例一:点击某个区域后使用一个道具 - /* + // 样例一:点击某个区域后使用一个道具 + /* if (core.hasItem("pickaxe")) { if (_isVertical()) { // 竖屏模式下 @@ -988,8 +1534,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } */ - // 样例二:点击某个区域后执行一段公共事件或脚本 - /* + // 样例二:点击某个区域后执行一段公共事件或脚本 + /* if (core.hasFlag("xxx")) { if (_isVertical()) { // 竖屏模式下 @@ -1014,8 +1560,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } */ - - } + } }, "control": { "saveData": function () { @@ -1027,31 +1572,66 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (!core.same(core.values[key], core.data.values[key])) values[key] = core.clone(core.values[key]); } - + let cg = {} + if (core.getFlag("_cgText")) { + cg.index = core.ui.cgText.index + cg.head = core.ui.cgText.head + cg.name = core.ui.cgText.name + cg.text = core.ui.cgText.text + cg.bodyList = core.clone(core.ui.cgText.bodyList) + cg.nobg = core.ui.cgText.nobg + cg.image = core.ui.cgText.image + cg.time = core.ui.cgText.time + cg.WindowSkin = core.ui.cgText.WindowSkin + cg.sound = core.ui.cgText.sound + cg.beforeSound = core.ui.cgText.beforeSound + cg.wait = core.ui.cgText.wait + cg.memory = core.ui.cgText.memory + cg.textList = core.ui.cgText.textList + cg.page = core.ui.cgText.page + cg.overpage = core.ui.cgText.overpage + cg.log = core.ui.cgText.log + cg.index = core.ui.cgText.index + } // 要存档的内容 var data = { - 'floorId': core.status.floorId, - 'hero': core.clone(core.status.hero), - 'hard': core.status.hard, - 'maps': core.clone(core.maps.saveMap()), - 'route': core.encodeRoute(core.status.route), - 'values': values, - 'version': core.firstData.version, - 'guid': core.getGuid(), - "time": new Date().getTime() + floorId: core.status.floorId, + hero: core.clone(core.status.hero), + hard: core.status.hard, + maps: core.clone(core.maps.saveMap()), + route: core.encodeRoute(core.status.route), + values: values, + version: core.firstData.version, + guid: core.getGuid(), + time: new Date().getTime(), + cg: cg, + animateObjs: core.status.animateObjs.filter(v => v.loop), + playing: [...core.plugin.playing].filter(v => v.loop) }; return data; }, "loadData": function (data, callback) { // 读档操作;从存储中读取了内容后的行为 - const play = core.status.played + const play = core.status.played; // 重置游戏和路线 - core.resetGame(data.hero, data.hard, data.floorId, core.maps.loadMap(data.maps, null, data.hero.flags), data.values); + core.resetGame( + data.hero, + data.hard, + data.floorId, + core.maps.loadMap(data.maps, null, data.hero.flags), + data.values + ); core.status.route = core.decodeRoute(data.route); core.control._bindRoutePush(); // 文字属性,全局属性 - core.status.textAttribute = core.getFlag('textAttribute', core.status.textAttribute); - var toAttribute = core.getFlag('globalAttribute', core.status.globalAttribute); + core.status.textAttribute = core.getFlag( + "textAttribute", + core.status.textAttribute + ); + var toAttribute = core.getFlag( + "globalAttribute", + core.status.globalAttribute + ); if (!core.same(toAttribute, core.status.globalAttribute)) { core.status.globalAttribute = toAttribute; core.resize(); @@ -1063,36 +1643,46 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = icon = core.getMappedName(icon); if (core.material.images.images[icon]) { core.material.images.hero = core.material.images.images[icon]; - core.material.icons.hero.width = core.material.images.images[icon].width / 4; - core.material.icons.hero.height = core.material.images.images[icon].height / 4; + core.material.icons.hero.width = + core.material.images.images[icon].width / 4; + core.material.icons.hero.height = + core.material.images.images[icon].height / 4; } - core.setFlag('__fromLoad__', true); + core.setFlag("__fromLoad__", true); // TODO:增加自己的一些读档处理 - core.ui.statusBar.clearItemInfo() + core.ui.statusBar.clearItemInfo(); core.ui.statusBar.update(); - core.plugin.playing.clear() + core.status.animateObjs = data.animateObjs + core.plugin.playing = new Set(data.playing) + if (core.getFlag("_cgText")) { + core.setFlag("_cgText", false) + for (let v in data.cg) { + + core.ui.cgText[v] = data.cg[v] + } + core.drawbackground(core.ui.cgText.image, core.ui.cgText.memory) + } // 切换到对应的楼层 core.changeFloor(data.floorId, null, data.hero.loc, 0, function () { // TODO:可以在这里设置读档后播放BGM - if (core.hasFlag("__bgm__")) { // 持续播放 + if (core.hasFlag("__bgm__")) { + // 持续播放 core.playBgm(core.getFlag("__bgm__")); } - core.removeFlag('__fromLoad__'); - if (!play) core.insertCommonEvent('强制横屏') + core.removeFlag("__fromLoad__"); + if (!play) core.insertCommonEvent("强制横屏"); if (callback) callback(); }); - if (play) core.doAction() - - + if (play) core.doAction(); }, "getStatusLabel": function (name) { // 返回某个状态英文名的对应中文标签,如atk -> 攻击,def -> 防御等。 // 请注意此项仅影响 libs/ 下的内容(如绘制怪物手册、数据统计等) // 自行定义的(比如获得道具效果)中用到的“攻击+3”等需要自己去对应地方修改 - return { + return ({ name: "名称", lv: "等级", hpmax: "生命上限", @@ -1101,72 +1691,76 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = mana: "魔力", atk: "攻击", def: "防御", - mdef: "法强", + spell: "法强", + matk: "魔攻比例", + mhp: "护盾比例", + mdef: "法抗", speed: "速度", money: "金币", exp: "经验", point: "加点", steps: "步数", - } [name] || name; + } [name] || name); }, "triggerDebuff": function (action, type) { - // 毒衰咒效果的获得与解除 - // action:获得还是解除;'get'表示获得,'remove'表示解除 - // type:一个数组表示获得了哪些毒衰咒效果;poison, weak,curse - if (!(type instanceof Array)) type = [type]; + // 毒衰咒效果的获得与解除 + // action:获得还是解除;'get'表示获得,'remove'表示解除 + // type:一个数组表示获得了哪些毒衰咒效果;poison, weak,curse + if (!(type instanceof Array)) type = [type]; - if (action == 'get') { - if (core.inArray(type, 'poison') && !core.hasFlag("poison")) { - // 获得毒效果 - core.setFlag('poison', true); - } - if (core.inArray(type, 'weak') && !core.hasFlag('weak')) { - // 获得衰效果 - core.setFlag('weak', true); - if (core.values.weakValue >= 1) { - // >=1,直接扣数值 - core.addStatus('atk', -core.values.weakValue); - core.addStatus('def', -core.values.weakValue); - } else { - // <1,扣比例 - core.addBuff('atk', -core.values.weakValue); - core.addBuff('def', -core.values.weakValue); - } - } - if (core.inArray(type, 'curse') && !core.hasFlag('curse')) { - // 获得咒效果 - core.setFlag('curse', true); - } - } else if (action == 'remove') { - var success = false; - if (core.inArray(type, "poison") && core.hasFlag("poison")) { - success = true; - // 移除毒效果 - core.setFlag("poison", false); - } - if (core.inArray(type, "weak") && core.hasFlag("weak")) { - success = true; - // 移除衰效果 - core.setFlag("weak", false); - if (core.values.weakValue >= 1) { - // >=1,直接扣数值 - core.addStatus('atk', core.values.weakValue); - core.addStatus('def', core.values.weakValue); - } else { - // <1,扣比例 - core.addBuff('atk', core.values.weakValue); - core.addBuff('def', core.values.weakValue); - } - } - if (core.inArray(type, "curse") && core.hasFlag("curse")) { - success = true; - // 移除咒效果 - core.setFlag("curse", false); - } - if (success) core.playSound('回血'); - } - }, + if (action == "get") { + if (core.inArray(type, "poison") && !core.hasFlag("poison")) { + // 获得毒效果 + core.setFlag("poison", true); + } + if (core.inArray(type, "weak") && !core.hasFlag("weak")) { + // 获得衰效果 + core.setFlag("weak", true); + if (core.values.weakValue >= 1) { + // >=1,直接扣数值 + core.addStatus("atk", -core.values.weakValue); + core.addStatus("def", -core.values.weakValue); + } else { + // <1,扣比例 + core.addBuff("atk", -core.values.weakValue); + core.addBuff("def", -core.values.weakValue); + } + } + if (core.inArray(type, "curse") && !core.hasFlag("curse")) { + // 获得咒效果 + core.setFlag("curse", true); + } + } else if (action == "remove") { + var success = false; + if (core.inArray(type, "poison") && core.hasFlag("poison")) { + success = true; + // 移除毒效果 + core.setFlag("poison", false); + } + if (core.inArray(type, "weak") && core.hasFlag("weak")) { + success = true; + // 移除衰效果 + core.setFlag("weak", false); + if (core.values.weakValue >= 1) { + // >=1,直接扣数值 + core.addStatus("atk", core.values.weakValue); + core.addStatus("def", core.values.weakValue); + } else { + // <1,扣比例 + core.addBuff("atk", core.values.weakValue); + core.addBuff("def", core.values.weakValue); + } + } + if (core.inArray(type, "curse") && core.hasFlag("curse")) { + success = true; + // 移除咒效果 + core.setFlag("curse", false); + } + if (success) core.playSound("回血"); + } + }, "updateStatusBar": function () { + if (!core.control.noAutoEvents) core.checkAutoEvents() // 更新状态栏 core.ui.statusBar.update(); // 更新阻激夹域的伤害值 @@ -1175,216 +1769,257 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.updateDamage(); }, "updateCheckBlock": function (floorId) { - // 领域、夹击、阻击等的伤害值计算 - floorId = floorId || core.status.floorId; - if (!floorId || !core.status.maps) return; + // 领域、夹击、阻击等的伤害值计算 + floorId = floorId || core.status.floorId; + if (!floorId || !core.status.maps) return; - var width = core.floors[floorId].width, - height = core.floors[floorId].height; - var blocks = core.getMapBlocksObj(floorId); + var width = core.floors[floorId].width, + height = core.floors[floorId].height; + var blocks = core.getMapBlocksObj(floorId); - var damage = {}, // 每个点的伤害值 - type = {}, // 每个点的伤害类型 - repulse = {}, // 每个点的阻击怪信息 - ambush = {}; // 每个点的捕捉信息 - var betweenAttackLocs = {}; // 所有可能的夹击点 - var needCache = false; - var canGoDeadZone = core.flags.canGoDeadZone; - core.flags.canGoDeadZone = true; + var damage = {}, // 每个点的伤害值 + type = {}, // 每个点的伤害类型 + repulse = {}, // 每个点的阻击怪信息 + ambush = {}; // 每个点的捕捉信息 + var betweenAttackLocs = {}; // 所有可能的夹击点 + var needCache = false; + var canGoDeadZone = core.flags.canGoDeadZone; + core.flags.canGoDeadZone = true; - // 计算血网和领域、阻击、激光的伤害,计算捕捉信息 - for (var loc in blocks) { - var block = blocks[loc], - x = block.x, - y = block.y, - id = block.event.id, - enemy = core.material.enemys[id]; - if (block.disable) continue; + // 计算血网和领域、阻击、激光的伤害,计算捕捉信息 + for (var loc in blocks) { + var block = blocks[loc], + x = block.x, + y = block.y, + id = block.event.id, + enemy = core.material.enemys[id]; + if (block.disable) continue; - type[loc] = type[loc] || {}; + type[loc] = type[loc] || {}; - // 血网 - // 如需调用当前楼层的ratio可使用 core.status.maps[floorId].ratio - if (id == 'lavaNet' && !core.hasItem('amulet')) { - damage[loc] = (damage[loc] || 0) + core.values.lavaDamage; - type[loc][(block.event.name || "血网") + "伤害"] = true; - } + // 血网 + // 如需调用当前楼层的ratio可使用 core.status.maps[floorId].ratio + if (id == "lavaNet" && !core.hasItem("amulet")) { + damage[loc] = (damage[loc] || 0) + core.values.lavaDamage; + type[loc][(block.event.name || "血网") + "伤害"] = true; + } - // 领域 - // 如果要防止领域伤害,可以直接简单的将 flag:no_zone 设为true - if (enemy && core.hasSpecial(enemy.special, 15) && !core.hasFlag('no_zone')) { - // 领域范围,默认为1 - var range = enemy.range || 1; - // 是否是九宫格领域 - var zoneSquare = false; - if (enemy.zoneSquare != null) zoneSquare = enemy.zoneSquare; - // 在范围内进行搜索,增加领域伤害值 - for (var dx = -range; dx <= range; dx++) { - for (var dy = -range; dy <= range; dy++) { - if (dx == 0 && dy == 0) continue; - var nx = x + dx, - ny = y + dy, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; - // 如果是十字领域,则还需要满足 |dx|+|dy|<=range - if (!zoneSquare && Math.abs(dx) + Math.abs(dy) > range) continue; - damage[currloc] = (damage[currloc] || 0) + (enemy.zone || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["领域伤害"] = true; - } - } - } + // 领域 + // 如果要防止领域伤害,可以直接简单的将 flag:no_zone 设为true + if ( + enemy && + core.hasSpecial(enemy.special, 15) && + !core.hasFlag("no_zone") + ) { + // 领域范围,默认为1 + var range = enemy.range || 1; + // 是否是九宫格领域 + var zoneSquare = false; + if (enemy.zoneSquare != null) zoneSquare = enemy.zoneSquare; + // 在范围内进行搜索,增加领域伤害值 + for (var dx = -range; dx <= range; dx++) { + for (var dy = -range; dy <= range; dy++) { + if (dx == 0 && dy == 0) continue; + var nx = x + dx, + ny = y + dy, + currloc = nx + "," + ny; + if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; + // 如果是十字领域,则还需要满足 |dx|+|dy|<=range + if (!zoneSquare && Math.abs(dx) + Math.abs(dy) > range) continue; + damage[currloc] = (damage[currloc] || 0) + (enemy.zone || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["领域伤害"] = true; + } + } + } - // 阻击 - // 如果要防止阻击伤害,可以直接简单的将 flag:no_repulse 设为true - if (enemy && core.hasSpecial(enemy.special, 18) && !core.hasFlag('no_repulse')) { - var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; - for (var dir in scan) { - var nx = x + scan[dir].x, - ny = y + scan[dir].y, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; - damage[currloc] = (damage[currloc] || 0) + (enemy.repulse || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["阻击伤害"] = true; + // 阻击 + // 如果要防止阻击伤害,可以直接简单的将 flag:no_repulse 设为true + if ( + enemy && + core.hasSpecial(enemy.special, 18) && + !core.hasFlag("no_repulse") + ) { + var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; + for (var dir in scan) { + var nx = x + scan[dir].x, + ny = y + scan[dir].y, + currloc = nx + "," + ny; + if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; + damage[currloc] = (damage[currloc] || 0) + (enemy.repulse || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["阻击伤害"] = true; - var rdir = core.turnDirection(":back", dir); - // 检查下一个点是否存在事件(从而判定是否移动) - var rnx = x + scan[rdir].x, - rny = y + scan[rdir].y; - if (rnx < 0 || rnx >= width || rny < 0 || rny >= height) continue; - // 如需禁止阻击被推到已隐藏的事件处(如重生怪处),可将这一句的false改为true - if (core.getBlock(rnx, rny, floorId, false) != null) continue; - if (core.utils.scan[rdir] && !core.canMoveHero(x, y, rdir, floorId)) continue; - repulse[currloc] = (repulse[currloc] || []).concat([ - [x, y, id, rdir] - ]); - } - } + var rdir = core.turnDirection(":back", dir); + // 检查下一个点是否存在事件(从而判定是否移动) + var rnx = x + scan[rdir].x, + rny = y + scan[rdir].y; + if (rnx < 0 || rnx >= width || rny < 0 || rny >= height) continue; + // 如需禁止阻击被推到已隐藏的事件处(如重生怪处),可将这一句的false改为true + if (core.getBlock(rnx, rny, floorId, false) != null) continue; + if (core.utils.scan[rdir] && !core.canMoveHero(x, y, rdir, floorId)) + continue; + repulse[currloc] = (repulse[currloc] || []).concat([ + [x, y, id, rdir], + ]); + } + } - // 激光 - // 如果要防止激光伤害,可以直接简单的将 flag:no_laser 设为true - if (enemy && core.hasSpecial(enemy.special, 24) && !core.hasFlag("no_laser")) { - for (var nx = 0; nx < width; nx++) { - var currloc = nx + "," + y; - if (nx != x) { - damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["激光伤害"] = true; - } - } - for (var ny = 0; ny < height; ny++) { - var currloc = x + "," + ny; - if (ny != y) { - damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); - type[currloc] = type[currloc] || {}; - type[currloc]["激光伤害"] = true; - } - } - } + // 激光 + // 如果要防止激光伤害,可以直接简单的将 flag:no_laser 设为true + if ( + enemy && + core.hasSpecial(enemy.special, 24) && + !core.hasFlag("no_laser") + ) { + for (var nx = 0; nx < width; nx++) { + var currloc = nx + "," + y; + if (nx != x) { + damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["激光伤害"] = true; + } + } + for (var ny = 0; ny < height; ny++) { + var currloc = x + "," + ny; + if (ny != y) { + damage[currloc] = (damage[currloc] || 0) + (enemy.laser || 0); + type[currloc] = type[currloc] || {}; + type[currloc]["激光伤害"] = true; + } + } + } - // 捕捉 - // 如果要防止捕捉效果,可以直接简单的将 flag:no_ambush 设为true - if (enemy && core.enemys.hasSpecial(enemy.special, 27) && !core.hasFlag("no_ambush")) { - var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; - // 给周围格子加上【捕捉】记号 - for (var dir in scan) { - var nx = x + scan[dir].x, - ny = y + scan[dir].y, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height || (core.utils.scan[dir] && !core.canMoveHero(x, y, dir, floorId))) continue; - ambush[currloc] = (ambush[currloc] || []).concat([ - [x, y, id, dir] - ]); - } - } + // 捕捉 + // 如果要防止捕捉效果,可以直接简单的将 flag:no_ambush 设为true + if ( + enemy && + core.enemys.hasSpecial(enemy.special, 27) && + !core.hasFlag("no_ambush") + ) { + var scan = enemy.zoneSquare ? core.utils.scan2 : core.utils.scan; + // 给周围格子加上【捕捉】记号 + for (var dir in scan) { + var nx = x + scan[dir].x, + ny = y + scan[dir].y, + currloc = nx + "," + ny; + if ( + nx < 0 || + nx >= width || + ny < 0 || + ny >= height || + (core.utils.scan[dir] && !core.canMoveHero(x, y, dir, floorId)) + ) + continue; + ambush[currloc] = (ambush[currloc] || []).concat([[x, y, id, dir]]); + } + } - // 夹击;在这里提前计算所有可能的夹击点,具体计算逻辑在下面 - // 如果要防止夹击伤害,可以简单的将 flag:no_betweenAttack 设为true - if (enemy && core.enemys.hasSpecial(enemy.special, 16) && !core.hasFlag('no_betweenAttack')) { - for (var dir in core.utils.scan) { - var nx = x + core.utils.scan[dir].x, - ny = y + core.utils.scan[dir].y, - currloc = nx + "," + ny; - if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; - betweenAttackLocs[currloc] = true; - } - } + // 夹击;在这里提前计算所有可能的夹击点,具体计算逻辑在下面 + // 如果要防止夹击伤害,可以简单的将 flag:no_betweenAttack 设为true + if ( + enemy && + core.enemys.hasSpecial(enemy.special, 16) && + !core.hasFlag("no_betweenAttack") + ) { + for (var dir in core.utils.scan) { + var nx = x + core.utils.scan[dir].x, + ny = y + core.utils.scan[dir].y, + currloc = nx + "," + ny; + if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue; + betweenAttackLocs[currloc] = true; + } + } - // 检查地图范围类技能 - var specialFlag = core.getSpecialFlag(enemy); - if (specialFlag & 1) needCache = true; - if (core.status.event.id == 'viewMaps') needCache = true; - if ((core.status.event.id == 'book' || core.status.event.id == 'bool-detail') && core.status.event.ui) needCache = true; - } + // 检查地图范围类技能 + var specialFlag = core.getSpecialFlag(enemy); + if (specialFlag & 1) needCache = true; + if (core.status.event.id == "viewMaps") needCache = true; + if ( + (core.status.event.id == "book" || + core.status.event.id == "bool-detail") && + core.status.event.ui + ) + needCache = true; + } - // 对每个可能的夹击点计算夹击伤害 - for (var loc in betweenAttackLocs) { - var xy = loc.split(","), - x = parseInt(xy[0]), - y = parseInt(xy[1]); - // 夹击怪物的ID - var enemyId1 = null, - enemyId2 = null; - // 检查左右夹击 - var leftBlock = blocks[(x - 1) + "," + y], - rightBlock = blocks[(x + 1) + "," + y]; - var leftId = core.getFaceDownId(leftBlock), - rightId = core.getFaceDownId(rightBlock); - if (leftBlock && !leftBlock.disable && rightBlock && !rightBlock.disable && leftId == rightId) { - if (core.hasSpecial(leftId, 16)) - enemyId1 = leftId; - } - // 检查上下夹击 - var topBlock = blocks[x + "," + (y - 1)], - bottomBlock = blocks[x + "," + (y + 1)]; - var topId = core.getFaceDownId(topBlock), - bottomId = core.getFaceDownId(bottomBlock); - if (topBlock && !topBlock.disable && bottomBlock && !bottomBlock.disable && topId == bottomId) { - if (core.hasSpecial(topId, 16)) - enemyId2 = topId; - } + // 对每个可能的夹击点计算夹击伤害 + for (var loc in betweenAttackLocs) { + var xy = loc.split(","), + x = parseInt(xy[0]), + y = parseInt(xy[1]); + // 夹击怪物的ID + var enemyId1 = null, + enemyId2 = null; + // 检查左右夹击 + var leftBlock = blocks[x - 1 + "," + y], + rightBlock = blocks[x + 1 + "," + y]; + var leftId = core.getFaceDownId(leftBlock), + rightId = core.getFaceDownId(rightBlock); + if ( + leftBlock && + !leftBlock.disable && + rightBlock && + !rightBlock.disable && + leftId == rightId + ) { + if (core.hasSpecial(leftId, 16)) enemyId1 = leftId; + } + // 检查上下夹击 + var topBlock = blocks[x + "," + (y - 1)], + bottomBlock = blocks[x + "," + (y + 1)]; + var topId = core.getFaceDownId(topBlock), + bottomId = core.getFaceDownId(bottomBlock); + if ( + topBlock && + !topBlock.disable && + bottomBlock && + !bottomBlock.disable && + topId == bottomId + ) { + if (core.hasSpecial(topId, 16)) enemyId2 = topId; + } - if (enemyId1 != null || enemyId2 != null) { - var leftHp = core.status.hero.hp - (damage[loc] || 0); - if (leftHp > 1) { - // 夹击伤害值 - var value = Math.floor(leftHp / 2); - // 是否不超过怪物伤害值 - if (core.flags.betweenAttackMax) { - var enemyDamage1 = core.getDamage(enemyId1, x, y, floorId); - if (enemyDamage1 != null && enemyDamage1 < value) - value = enemyDamage1; - var enemyDamage2 = core.getDamage(enemyId2, x, y, floorId); - if (enemyDamage2 != null && enemyDamage2 < value) - value = enemyDamage2; - } - if (value > 0) { - damage[loc] = (damage[loc] || 0) + value; - type[loc] = type[loc] || {}; - type[loc]["夹击伤害"] = true; - } - } - } - } + if (enemyId1 != null || enemyId2 != null) { + var leftHp = core.status.hero.hp - (damage[loc] || 0); + if (leftHp > 1) { + // 夹击伤害值 + var value = Math.floor(leftHp / 2); + // 是否不超过怪物伤害值 + if (core.flags.betweenAttackMax) { + var enemyDamage1 = core.getDamage(enemyId1, x, y, floorId); + if (enemyDamage1 != null && enemyDamage1 < value) + value = enemyDamage1; + var enemyDamage2 = core.getDamage(enemyId2, x, y, floorId); + if (enemyDamage2 != null && enemyDamage2 < value) + value = enemyDamage2; + } + if (value > 0) { + damage[loc] = (damage[loc] || 0) + value; + type[loc] = type[loc] || {}; + type[loc]["夹击伤害"] = true; + } + } + } + } - // 取消注释下面这一段可以让护盾抵御阻激夹域伤害 - /* + // 取消注释下面这一段可以让护盾抵御阻激夹域伤害 + /* for (var loc in damage) { damage[loc] = Math.max(0, damage[loc] - core.getRealStatus('mdef')); } */ - core.flags.canGoDeadZone = canGoDeadZone; - core.status.checkBlock = { - damage: damage, - type: type, - repulse: repulse, - ambush: ambush, - needCache: needCache, - cache: {} // clear cache - }; - }, + core.flags.canGoDeadZone = canGoDeadZone; + core.status.checkBlock = { + damage: damage, + type: type, + repulse: repulse, + ambush: ambush, + needCache: needCache, + cache: {}, // clear cache + }; + }, "moveOneStep": function (callback) { // 勇士每走一步后执行的操作。callback为行走完毕后的回调 // 这个函数执行在“刚走完”的时候,即还没有检查该点的事件和领域伤害等。 @@ -1399,7 +2034,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.updateFollowers(); core.drawHero(); // 检查中毒状态的扣血和死亡 - if (core.hasFlag('poison')) { + if (core.hasFlag("poison")) { core.status.hero.statistics.poisonDamage += core.values.poisonDamage; core.status.hero.hp -= core.values.poisonDamage; if (core.status.hero.hp <= 0) { @@ -1421,12 +2056,16 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // ------ 检查目标点事件 ------ // // 无事件的道具(如血瓶)需要优先于阻激夹域判定 - var nowx = core.getHeroLoc('x'), - nowy = core.getHeroLoc('y'); + var nowx = core.getHeroLoc("x"), + nowy = core.getHeroLoc("y"); var block = core.getBlock(nowx, nowy); var hasTrigger = false; - if (block != null && block.event.trigger == 'getItem' && - !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy]) { + core.showComment(nowx, nowy) + if ( + block != null && + block.event.trigger == "getItem" && + !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy] + ) { hasTrigger = true; core.trigger(nowx, nowy, callback); } @@ -1434,13 +2073,12 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.checkBlock(); // 执行目标点的script和事件 - if (!hasTrigger) - core.trigger(nowx, nowy, callback); + if (!hasTrigger) core.trigger(nowx, nowy, callback); // 检查该点是否是滑冰 if (core.onSki()) { // 延迟到事件最后执行,因为这之前可能有阻激夹域动画 - core.insertAction({ "type": "moveAction" }, null, null, null, true); + core.insertAction({ type: "moveAction" }, null, null, null, true); } // ------ 检查目标点事件 END ------ // @@ -1456,19 +2094,23 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (ignoreSteps == null) ignoreSteps = core.canMoveDirectly(x, y); if (ignoreSteps >= 0) { // 中毒也允许瞬移 - if (core.hasFlag('poison')) { + if (core.hasFlag("poison")) { var damage = ignoreSteps * core.values.poisonDamage; if (damage >= core.status.hero.hp) return false; core.status.hero.statistics.poisonDamage += damage; core.status.hero.hp -= damage; } - - core.clearMap('hero'); - if ((core.bigmap.width * 32) === (core.bigmap.height * 32) && (core.bigmap.width * 32) === core.__PIXELS__) core.addPopMove(32 * core.status.hero.loc.x + 16, 32 * core.status.hero.loc.y + 16, 32 * x + 16, 32 * y + 16) + core.showComment(x, y) + core.clearMap("hero"); + if ( + core.bigmap.width * 32 === core.bigmap.height * 32 && + core.bigmap.width * 32 === core.__PIXELS__ + ) + if (core.getFlag('popmove')) core.addPopMove(32 * core.status.hero.loc.x + 16, 32 * core.status.hero.loc.y + 16, 32 * x + 16, 32 * y + 16); // 获得勇士最后的朝向 var lastDirection = core.status.route[core.status.route.length - 1]; - if (['left', 'right', 'up', 'down'].indexOf(lastDirection) >= 0) - core.setHeroLoc('direction', lastDirection); + if (["left", "right", "up", "down"].indexOf(lastDirection) >= 0) + core.setHeroLoc("direction", lastDirection); // 设置坐标,并绘制 core.control._moveDirectyFollowers(x, y); core.status.hero.loc.x = x; @@ -1479,7 +2121,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 统计信息 core.status.hero.statistics.moveDirectly++; core.status.hero.statistics.ignoreSteps += ignoreSteps; - if (core.hasFlag('poison')) { + if (core.hasFlag("poison")) { core.updateStatusBar(false, true); } @@ -1489,148 +2131,266 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = return false; }, "parallelDo": function (timestamp) { - // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 - // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 - // 参数timestamp为“从游戏资源加载完毕到当前函数执行时”的时间差,以毫秒为单位 + // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 + // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 + // 参数timestamp为“从游戏资源加载完毕到当前函数执行时”的时间差,以毫秒为单位 - // 检查当前是否处于游戏开始状态 - if (!core.isPlaying()) return; + // 检查当前是否处于游戏开始状态 + if (!core.isPlaying()) return; - // 执行当前楼层的并行事件处理 - if (core.status.floorId) { - try { - eval(core.floors[core.status.floorId].parallelDo); - } catch (e) { - console.error(e); - } - } - } + // 执行当前楼层的并行事件处理 + if (core.status.floorId) { + try { + eval(core.floors[core.status.floorId].parallelDo); + } catch (e) { + console.error(e); + } + } + } }, "ui": { "getToolboxItems": function (cls) { - // 获得道具栏中当前某类型道具的显示项和显示顺序 - // cls为道具类型,只可能是 tools, constants 和 equips - // 返回一个数组,代表当前某类型道具的显示内容和顺序 - // 默认按id升序排列,您可以取消下面的注释改为按名称排列 + // 获得道具栏中当前某类型道具的显示项和显示顺序 + // cls为道具类型,只可能是 tools, constants 和 equips + // 返回一个数组,代表当前某类型道具的显示内容和顺序 + // 默认按id升序排列,您可以取消下面的注释改为按名称排列 - return Object.keys(core.status.hero.items[cls] || {}) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }) - .sort( /*function (id1, id2) { return core.material.items[id1].name <= core.material.items[id2].name ? -1 : 1 }*/ ); -}, + return Object.keys(core.status.hero.items[cls] || {}) + .filter(function (id) { + return !core.material.items[id].hideInToolbox; + }) + .sort(/*function (id1, id2) { return core.material.items[id1].name <= core.material.items[id2].name ? -1 : 1 }*/); + }, "drawStatusBar": function () { // 这真的是人能写出来的东西? - var ctx, fill = function (text, x, y, style) { - core.ui.setFont(ctx, (/\w+/.test(text) ? 'italic ' : '') + 'bold 18px Verdana'); - core.ui.fillBoldText(ctx, text, x, y, style); - }; - if (core.flags.statusCanvas) { // 系统开关「自绘状态栏」开启 - core.ui.clearMap(ctx = core.dom.statusCanvasCtx); // 清空状态栏 + var ctx, + fill = function (text, x, y, style) { + core.ui.setFont( + ctx, + (/\w+/.test(text) ? "italic " : "") + "bold 18px Verdana" + ); + core.ui.fillBoldText(ctx, text, x, y, style); + }; + if (core.flags.statusCanvas) { + // 系统开关「自绘状态栏」开启 + core.ui.clearMap((ctx = core.dom.statusCanvasCtx)); // 清空状态栏 core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); - if (core.domStyle.isVertical) { // 竖屏 + if (core.domStyle.isVertical) { + // 竖屏 core.drawImage(ctx, core.statusBar.icons.floor, 6, 6, 25, 25); fill((core.status.thisMap || {}).name || "Loading", 42, 26); core.drawImage(ctx, core.statusBar.icons.hp, 137, 6, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('hp')), 173, 26); + fill(core.formatBigNumber(core.getRealStatus("hp")), 173, 26); core.drawImage(ctx, core.statusBar.icons.atk, 268, 6, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('atk')), 304, 26); + fill(core.formatBigNumber(core.getRealStatus("atk")), 304, 26); core.drawImage(ctx, core.statusBar.icons.def, 6, 38, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('def')), 42, 58); + fill(core.formatBigNumber(core.getRealStatus("def")), 42, 58); core.drawImage(ctx, core.statusBar.icons.mdef, 137, 38, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('mdef')), 173, 58); + fill(core.formatBigNumber(core.getRealStatus("mdef")), 173, 58); core.drawImage(ctx, core.statusBar.icons.money, 268, 38, 25, 25); fill(core.formatBigNumber(core.status.hero.money), 304, 58); core.drawImage(ctx, core.statusBar.icons.exp, 6, 70, 25, 25); fill(core.formatBigNumber(core.status.hero.exp), 42, 90); - } else if (!core.flags.hideLeftStatusBar) { // 横屏且未隐藏状态栏 + } else if (!core.flags.hideLeftStatusBar) { + // 横屏且未隐藏状态栏 core.drawImage(ctx, core.statusBar.icons.floor, 6, 9, 25, 25); fill((core.status.thisMap || {}).name || "Loading", 42, 29); core.drawImage(ctx, core.statusBar.icons.hp, 6, 43, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('hp')), 42, 63); + fill(core.formatBigNumber(core.getRealStatus("hp")), 42, 63); core.drawImage(ctx, core.statusBar.icons.atk, 6, 77, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('atk')), 42, 97); + fill(core.formatBigNumber(core.getRealStatus("atk")), 42, 97); core.drawImage(ctx, core.statusBar.icons.def, 6, 111, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('def')), 42, 131); + fill(core.formatBigNumber(core.getRealStatus("def")), 42, 131); core.drawImage(ctx, core.statusBar.icons.mdef, 6, 145, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('mdef')), 42, 165); + fill(core.formatBigNumber(core.getRealStatus("mdef")), 42, 165); core.drawImage(ctx, core.statusBar.icons.money, 6, 179, 25, 25); fill(core.formatBigNumber(core.status.hero.money), 42, 199); core.drawImage(ctx, core.statusBar.icons.exp, 6, 213, 25, 25); fill(core.formatBigNumber(core.status.hero.exp), 42, 233); - fill(core.setTwoDigits(core.itemCount('yellowKey')), 11, 267, '#FFCCAA'); - fill(core.setTwoDigits(core.itemCount('blueKey')), 46, 267, '#AAAADD'); - fill(core.setTwoDigits(core.itemCount('redKey')), 81, 267, '#FF8888'); + fill( + core.setTwoDigits(core.itemCount("yellowKey")), + 11, + 267, + "#FFCCAA" + ); + fill( + core.setTwoDigits(core.itemCount("blueKey")), + 46, + 267, + "#AAAADD" + ); + fill(core.setTwoDigits(core.itemCount("redKey")), 81, 267, "#FF8888"); } - } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { // 横屏且隐藏状态栏 - if (!core.dymCanvas['status']) - core.ui.createCanvas('status', 0, 0, core._PX_, core._PY_, 66); // 刚好盖过显伤层 - core.ui.clearMap(ctx = core.dymCanvas['status']); + } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { + // 横屏且隐藏状态栏 + if (!core.dymCanvas["status"]) + core.ui.createCanvas("status", 0, 0, core._PX_, core._PY_, 66); // 刚好盖过显伤层 + core.ui.clearMap((ctx = core.dymCanvas["status"])); core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); - var offset = core.status.hero.loc.x - core.bigmap.offsetX / 32 >= core._HEIGHT_ ? 0 : core._PY_; + var offset = + core.status.hero.loc.x - core.bigmap.offsetX / 32 >= core._HEIGHT_ ? + 0 : + core._PY_; core.ui.setAlpha(ctx, 0.75); - core.ui.drawWindowSkin('winskin.webp', ctx, offset, 0, core._PX_ - core._PY_, core._PY_); + core.ui.drawWindowSkin( + "winskin.webp", + ctx, + offset, + 0, + core._PX_ - core._PY_, + core._PY_ + ); core.ui.setAlpha(ctx, 1); core.drawImage(ctx, core.statusBar.icons.floor, 6 + offset, 9, 25, 25); fill((core.status.thisMap || {}).name || "Loading", 42 + offset, 29); core.drawImage(ctx, core.statusBar.icons.hp, 6 + offset, 43, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('hp')), 42 + offset, 63); + fill(core.formatBigNumber(core.getRealStatus("hp")), 42 + offset, 63); core.drawImage(ctx, core.statusBar.icons.atk, 6 + offset, 77, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('atk')), 42 + offset, 97); + fill(core.formatBigNumber(core.getRealStatus("atk")), 42 + offset, 97); core.drawImage(ctx, core.statusBar.icons.def, 6 + offset, 111, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('def')), 42 + offset, 131); + fill(core.formatBigNumber(core.getRealStatus("def")), 42 + offset, 131); core.drawImage(ctx, core.statusBar.icons.mdef, 6 + offset, 145, 25, 25); - fill(core.formatBigNumber(core.getRealStatus('mdef')), 42 + offset, 165); - core.drawImage(ctx, core.statusBar.icons.money, 6 + offset, 179, 25, 25); + fill( + core.formatBigNumber(core.getRealStatus("mdef")), + 42 + offset, + 165 + ); + core.drawImage( + ctx, + core.statusBar.icons.money, + 6 + offset, + 179, + 25, + 25 + ); fill(core.formatBigNumber(core.status.hero.money), 42 + offset, 199); core.drawImage(ctx, core.statusBar.icons.exp, 6 + offset, 213, 25, 25); fill(core.formatBigNumber(core.status.hero.exp), 42 + offset, 233); - fill(core.setTwoDigits(core.itemCount('yellowKey')), 11 + offset, 267, '#FFCCAA'); - fill(core.setTwoDigits(core.itemCount('blueKey')), 46 + offset, 267, '#AAAADD'); - fill(core.setTwoDigits(core.itemCount('redKey')), 81 + offset, 267, '#FF8888'); + fill( + core.setTwoDigits(core.itemCount("yellowKey")), + 11 + offset, + 267, + "#FFCCAA" + ); + fill( + core.setTwoDigits(core.itemCount("blueKey")), + 46 + offset, + 267, + "#AAAADD" + ); + fill( + core.setTwoDigits(core.itemCount("redKey")), + 81 + offset, + 267, + "#FF8888" + ); } }, "drawStatistics": function () { - // 浏览地图时参与的统计项目 + // 浏览地图时参与的统计项目 - return [ - 'yellowDoor', 'blueDoor', 'redDoor', 'greenDoor', 'steelDoor', - 'yellowKey', 'blueKey', 'redKey', 'greenKey', 'steelKey', - 'redGem', 'blueGem', 'greenGem', 'yellowGem', - 'redPotion', 'bluePotion', 'greenPotion', 'yellowPotion', 'superPotion', - 'pickaxe', 'bomb', 'centerFly', 'icePickaxe', 'freezeBadge', - 'earthquake', 'upFly', 'downFly', 'jumpShoes', 'lifeWand', - 'poisonWine', 'weakWine', 'curseWine', 'superWine', - 'sword1', 'sword2', 'sword3', 'sword4', 'sword5', - 'shield1', 'shield2', 'shield3', 'shield4', 'shield5', - // 在这里可以增加新的ID来进行统计个数,只能增加道具ID - ]; - }, + return [ + "yellowDoor", + "blueDoor", + "redDoor", + "greenDoor", + "steelDoor", + "yellowKey", + "blueKey", + "redKey", + "greenKey", + "steelKey", + "redGem", + "blueGem", + "greenGem", + "yellowGem", + "redPotion", + "bluePotion", + "greenPotion", + "yellowPotion", + "superPotion", + "pickaxe", + "bomb", + "centerFly", + "icePickaxe", + "freezeBadge", + "earthquake", + "upFly", + "downFly", + "jumpShoes", + "lifeWand", + "poisonWine", + "weakWine", + "curseWine", + "superWine", + "sword1", + "sword2", + "sword3", + "sword4", + "sword5", + "shield1", + "shield2", + "shield3", + "shield4", + "shield5", + // 在这里可以增加新的ID来进行统计个数,只能增加道具ID + ]; + }, "drawAbout": function () { - // 绘制“关于”界面 - core.ui.closePanel(); - core.lockControl(); - core.status.event.id = 'about'; + // 绘制“关于”界面 + core.ui.closePanel(); + core.lockControl(); + core.status.event.id = "about"; - var left = 48, - top = 36, - right = (core._PX_ || core.__PIXELS__) - 2 * left, - bottom = (core._PY_ || core.__PIXELS__) - 2 * top; + var left = 48, + top = 36, + right = (core._PX_ || core.__PIXELS__) - 2 * left, + bottom = (core._PY_ || core.__PIXELS__) - 2 * top; - core.setAlpha('ui', 0.85); - core.fillRect('ui', left, top, right, bottom, '#000000'); - core.setAlpha('ui', 1); - core.strokeRect('ui', left - 1, top - 1, right + 1, bottom + 1, '#FFFFFF', 2); + core.setAlpha("ui", 0.85); + core.fillRect("ui", left, top, right, bottom, "#000000"); + core.setAlpha("ui", 1); + core.strokeRect( + "ui", + left - 1, + top - 1, + right + 1, + bottom + 1, + "#FFFFFF", + 2 + ); - var text_start = left + 24; + var text_start = left + 24; - // 名称 - core.setTextAlign('ui', 'left'); - var globalAttribute = core.status.globalAttribute || core.initStatus.globalAttribute; - core.fillText('ui', "HTML5 魔塔样板", text_start, top + 35, globalAttribute.selectColor, "bold 22px " + globalAttribute.font); - core.fillText('ui', "版本: " + main.__VERSION__, text_start, top + 80, "#FFFFFF", "bold 17px " + globalAttribute.font); - core.fillText('ui', "作者: 艾之葵", text_start, top + 112); - core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top + 112 + 32); - // TODO: 写自己的“关于”页面,每次增加32像素即可 - core.playSound('打开界面'); - } + // 名称 + core.setTextAlign("ui", "left"); + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + core.fillText( + "ui", + "HTML5 魔塔样板", + text_start, + top + 35, + globalAttribute.selectColor, + "bold 22px " + globalAttribute.font + ); + core.fillText( + "ui", + "版本: " + main.__VERSION__, + text_start, + top + 80, + "#FFFFFF", + "bold 17px " + globalAttribute.font + ); + core.fillText("ui", "作者: 艾之葵", text_start, top + 112); + core.fillText( + "ui", + "HTML5魔塔交流群:539113091", + text_start, + top + 112 + 32 + ); + // TODO: 写自己的“关于”页面,每次增加32像素即可 + core.playSound("打开界面"); + } } } \ No newline at end of file diff --git a/project/icons.js b/project/icons.js index f44bfe9..14e3c91 100644 --- a/project/icons.js +++ b/project/icons.js @@ -113,7 +113,15 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = "T392": 81, "T393": 82, "T394": 83, - "T395": 84 + "T395": 84, + "T361": 85, + "T362": 86, + "T363": 87, + "T364": 88, + "T365": 89, + "T397": 90, + "T399": 91, + "T400": 92 }, "animates": { "star": 0, @@ -247,7 +255,11 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = "blueKing": 45, "keiskeiFairy": 71, "tulipFairy": 72, - "purpleBowman": 65 + "purpleBowman": 65, + "E421": 73, + "E422": 73, + "E425": 74, + "E426": 75 }, "enemy48": { "angel": 0, @@ -310,7 +322,41 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = "jumpShoes": 49, "skill1": 30, "wand": 10, - "pack": 46 + "pack": 46, + "I366": 5, + "I367": 7, + "I368": 26, + "I369": 31, + "I370": 32, + "I371": 34, + "I372": 35, + "I373": 36, + "I374": 37, + "I375": 38, + "I396": 39, + "postman": 62, + "I401": 63, + "I402": 64, + "I403": 65, + "I404": 66, + "I405": 67, + "I406": 68, + "I407": 69, + "I408": 70, + "I412": 71, + "I409": 72, + "I410": 73, + "I411": 74, + "I413": 75, + "I414": 76, + "I415": 77, + "I416": 78, + "I417": 79, + "I418": 80, + "I419": 81, + "I420": 82, + "I423": 83, + "I424": 84 }, "autotile": { "autotile": 0, diff --git a/project/images/005-Attack03.webp b/project/images/005-Attack03.webp new file mode 100644 index 0000000..09df0ff Binary files /dev/null and b/project/images/005-Attack03.webp differ diff --git a/project/images/012-Heal01.webp b/project/images/012-Heal01.webp new file mode 100644 index 0000000..23c2c6d Binary files /dev/null and b/project/images/012-Heal01.webp differ diff --git a/project/images/015-Fire01.webp b/project/images/015-Fire01.webp new file mode 100644 index 0000000..acd799f Binary files /dev/null and b/project/images/015-Fire01.webp differ diff --git a/project/images/jianji.webp b/project/images/jianji.webp new file mode 100644 index 0000000..40504a4 Binary files /dev/null and b/project/images/jianji.webp differ diff --git a/project/images/miwu.webp b/project/images/miwu.webp new file mode 100644 index 0000000..84e72cc Binary files /dev/null and b/project/images/miwu.webp differ diff --git a/project/images/sound.webp b/project/images/sound.webp new file mode 100644 index 0000000..1fed120 Binary files /dev/null and b/project/images/sound.webp differ diff --git a/project/images/statusBackground.webp b/project/images/statusBackground.webp new file mode 100644 index 0000000..498f5d8 Binary files /dev/null and b/project/images/statusBackground.webp differ diff --git a/project/images/tati_310101.webp b/project/images/tati_310101.webp new file mode 100644 index 0000000..e5a5dce Binary files /dev/null and b/project/images/tati_310101.webp differ diff --git a/project/images/winskin.webp b/project/images/winskin.webp index fb44533..00580fe 100644 Binary files a/project/images/winskin.webp and b/project/images/winskin.webp differ diff --git a/project/items.js b/project/items.js index fddc8ac..53adda0 100644 --- a/project/items.js +++ b/project/items.js @@ -37,61 +37,23 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": "true" }, "greenGem": { - "cls": "tools", + "cls": "items", "name": "绿宝石", - "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += core.values.greenGem * core.status.thisMap.ratio", - "itemEffectTip": ",护盾+${core.values.greenGem * core.status.thisMap.ratio}", - "useItemEffect": "core.status.hero.mdef += core.values.greenGem", + "text": ",法强+${core.values.greenGem}", + "itemEffect": "core.status.hero.spell += core.values.greenGem * core.status.thisMap.ratio", + "itemEffectTip": ",法强+${core.values.greenGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.spell += core.values.greenGem", "canUseItemEffect": "true" }, "yellowGem": { "cls": "items", "name": "黄宝石", - "text": "可以进行加点", - "itemEffect": "core.status.hero.hp+=1000;core.status.hero.atk+=6;core.status.hero.def+=6;core.status.hero.mdef+=10;", - "itemEffectTip": ",全属性提升", - "useItemEvent": [ - { - "type": "choices", - "choices": [ - { - "text": "攻击+1", - "action": [ - { - "type": "setValue", - "name": "status:atk", - "operator": "+=", - "value": "1" - } - ] - }, - { - "text": "防御+2", - "action": [ - { - "type": "setValue", - "name": "status:def", - "operator": "+=", - "value": "2" - } - ] - }, - { - "text": "生命+200", - "action": [ - { - "type": "setValue", - "name": "status:hp", - "operator": "+=", - "value": "200" - } - ] - } - ] - } - ], - "canUseItemEffect": "true" + "text": ",速度+${core.values.yellowGem}", + "itemEffect": "core.status.hero.speed += core.values.yellowGem * core.status.thisMap.ratio", + "itemEffectTip": ",速度+${core.values.yellowGem * core.status.thisMap.ratio}", + "useItemEvent": null, + "canUseItemEffect": "true", + "useItemEffect": "core.status.hero.spell += core.values.yellowGem" }, "redPotion": { "cls": "items", @@ -130,18 +92,20 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": "true" }, "sword0": { - "cls": "items", - "name": "破旧的剑", + "cls": "equips", + "name": "基础匕首", "text": "一把已经生锈的剑", "equip": { "type": 0, "animate": "sword", "value": { - "atk": 0 - } + "speed": 20 + }, + "percentage": {} }, "itemEffect": "core.status.hero.atk += 0", - "itemEffectTip": ",攻击+0" + "itemEffectTip": ",攻击+0", + "equipCls": "匕首" }, "sword1": { "cls": "equips", @@ -150,10 +114,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "equip": { "type": 0, "animate": "sword", - "value": { - "atk": 10 - }, - "percentage": {} + "value": {}, + "percentage": { + "mdef": 10 + } }, "itemEffect": "core.status.hero.atk += 10", "itemEffectTip": ",攻击+10", @@ -166,10 +130,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "equip": { "type": "武器", "animate": "sword", - "value": { - "atk": 20 - }, - "percentage": {} + "value": {}, + "percentage": { + "mdef": 20 + } }, "itemEffect": "core.status.hero.atk += 20", "itemEffectTip": ",攻击+20", @@ -247,10 +211,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "text": "一个很普通的铁盾", "equip": { "type": 1, - "value": { - "def": 10 - }, - "percentage": {} + "value": {}, + "percentage": { + "mdef": 10 + } }, "itemEffect": "core.status.hero.def += 10", "itemEffectTip": ",防御+10", @@ -310,13 +274,15 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "itemEffectTip": ",防御+100,护盾+100" }, "superPotion": { - "cls": "items", + "cls": "tools", "name": "圣水", "itemEffect": "core.status.hero.hp *= 2", "itemEffectTip": ",生命值翻倍", "useItemEffect": "core.status.hero.hp *= 2;core.playSound('回血');", "canUseItemEffect": "true", - "text": "生命值翻倍" + "text": "生命值翻倍", + "canBatchUse": "true", + "hideInReplay": true }, "book": { "cls": "constants", @@ -332,7 +298,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "text": "可以自由往来去过的楼层", "hideInReplay": true, "hideInToolbox": true, - "useItemEffect": "//core.ui.drawFly(core.floorIds.indexOf(core.status.floorId));\ncore.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));", + "useItemEffect": "//core.ui.drawFly(core.floorIds.indexOf(core.status.floorId));\nflags.canMoveFloor = core.canMoveFloor()\nif (!main.replayChecking && !core.isReplaying()) core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId));", "canUseItemEffect": "(function () {\n\tif (core.flags.flyNearStair && !core.nearStair() && !core.canMoveFloor())\n\t\treturn false;\n\treturn core.status.maps[core.status.floorId].canFlyFrom;\n})();" }, "coin": { @@ -546,5 +512,306 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "name": "钱袋", "itemEffect": "core.status.hero.money += 500", "itemEffectTip": ",金币+500" + }, + "I366": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I367": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I368": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I369": { + "cls": "constants", + "name": "动画开关", + "canUseItemEffect": "true", + "hideInToolbox": true, + "hideInReplay": true, + "useItemEvent": [ + { + "type": "confirm", + "text": "是否开启战斗动画", + "yes": [ + { + "type": "setValue", + "name": "flag:noAnimate", + "value": "false" + } + ], + "no": [ + { + "type": "setValue", + "name": "flag:noAnimate", + "value": "true" + } + ] + } + ], + "text": "调整战斗动画" + }, + "I370": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I371": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I372": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I373": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I374": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I375": { + "cls": "equips", + "name": "基础法杖", + "canUseItemEffect": "true", + "equipCls": "法杖", + "equip": { + "type": 0, + "value": { + "matk": 10, + "mhp": -100 + }, + "percentage": {} + } + }, + "I396": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "postman": { + "cls": "constants", + "name": "言灵", + "canUseItemEffect": "true", + "text": "可以发送和接收在线留言。", + "hideInToolbox": true, + "hideInReplay": true, + "useItemEvent": [ + { + "type": "while", + "condition": "true", + "data": [ + { + "type": "choices", + "text": "本功能需要您在h5mota.com在线游玩并处于登录状态时使用,可以发送和接受留言。\n发言后需要选择\"获取最新留言\"才能看到自己新发的留言。", + "choices": [ + { + "text": "地图上显示在线留言:${flag:comment?'开':'关'}", + "icon": "postman", + "action": [ + { + "type": "function", + "function": "function(){\nif (core.hasFlag('comment')) {\n\tcore.setFlag('comment', false);\n\tcore.plugin.clearCommentSign();\n} else {\n\tcore.setFlag('comment', true);\n\tcore.plugin.drawCommentSign();\n}\n}" + } + ] + }, + { + "text": "写留言", + "action": [ + { + "type": "input2", + "text": "请输入要发送的评论,文明友善发言,拒绝放假、剧透。" + }, + { + "type": "function", + "function": "function(){\nconst input = core.getFlag('input', '');\nconst tags = [core.status.floorId,\n\tcore.getHeroLoc().x.toString(), core.getHeroLoc().y.toString()\n]\nif (!core.isReplaying()) {\n\tcore.plugin.postComment(input, tags);\n}\n}" + }, + { + "type": "function", + "function": "function(){\nif (!core.isReplaying()) {\n\tcore.plugin.getComment();\n\tsetTimeout(core.plugin.drawCommentSign, 1000);\n}\n}" + } + ] + }, + { + "text": "获取最新留言", + "action": [ + { + "type": "function", + "function": "function(){\nif (!core.isReplaying()) {\n\tcore.plugin.getComment();\n\tsetTimeout(core.plugin.drawCommentSign, 1000);\n}\n}" + } + ] + }, + { + "text": "退出", + "action": [ + { + "type": "exit" + } + ] + } + ] + } + ] + } + ] + }, + "I401": { + "cls": "items", + "name": "初等红宝石", + "text": ",攻击+${core.values.redGem}", + "itemEffect": "core.status.hero.atk += core.values.redGem * core.status.thisMap.ratio", + "itemEffectTip": ",攻击+${core.values.redGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.atk += core.values.redGem", + "canUseItemEffect": "true" + }, + "I402": { + "cls": "items", + "name": "初等蓝宝石", + "text": ",防御+${core.values.blueGem}", + "itemEffect": "core.status.hero.def += core.values.blueGem * core.status.thisMap.ratio", + "itemEffectTip": ",防御+${core.values.blueGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.def += core.values.blueGem", + "canUseItemEffect": "true" + }, + "I403": { + "cls": "items", + "name": "初等绿宝石", + "text": ",法强+${core.values.greenGem}", + "itemEffect": "core.status.hero.spell += core.values.greenGem * core.status.thisMap.ratio", + "itemEffectTip": ",法强+${core.values.greenGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.spell += core.values.greenGem", + "canUseItemEffect": "true" + }, + "I404": { + "cls": "items", + "name": "初等黄宝石", + "text": ",速度+${core.values.yellowGem}", + "itemEffect": "core.status.hero.speed += core.values.yellowGem * core.status.thisMap.ratio", + "itemEffectTip": ",速度+${core.values.yellowGem * core.status.thisMap.ratio}", + "useItemEvent": null, + "canUseItemEffect": "true", + "useItemEffect": "core.status.hero.spell += core.values.yellowGem" + }, + "I405": { + "cls": "items", + "name": "中等红宝石", + "text": ",攻击+${core.values.redGem}", + "itemEffect": "core.status.hero.atk += 3 * core.values.redGem * core.status.thisMap.ratio", + "itemEffectTip": ",攻击+${core.values.redGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.atk += core.values.redGem", + "canUseItemEffect": "true" + }, + "I406": { + "cls": "items", + "name": "中等蓝宝石", + "text": ",防御+${core.values.blueGem}", + "itemEffect": "core.status.hero.def += 3 * core.values.blueGem * core.status.thisMap.ratio", + "itemEffectTip": ",防御+${core.values.blueGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.def += core.values.blueGem", + "canUseItemEffect": "true" + }, + "I407": { + "cls": "items", + "name": "中等绿宝石", + "text": ",法强+${core.values.greenGem}", + "itemEffect": "core.status.hero.spell += 3 * core.values.greenGem * core.status.thisMap.ratio", + "itemEffectTip": ",法强+${core.values.greenGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.spell += core.values.greenGem", + "canUseItemEffect": "true" + }, + "I408": { + "cls": "items", + "name": "中等黄宝石", + "text": ",速度+${core.values.yellowGem}", + "itemEffect": "core.status.hero.speed += 3 * core.values.yellowGem * core.status.thisMap.ratio", + "itemEffectTip": ",速度+${core.values.yellowGem * core.status.thisMap.ratio}", + "useItemEvent": null, + "canUseItemEffect": "true", + "useItemEffect": "core.status.hero.spell += core.values.yellowGem" + }, + "I412": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I409": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I410": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I411": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I413": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I414": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I415": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I416": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I417": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I418": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I419": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I420": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" + }, + "I423": { + "cls": "items", + "name": "银币", + "text": ",生命+${core.values.redPotion}", + "itemEffect": "core.status.hero.money += 10", + "itemEffectTip": ",金钱+10", + "useItemEffect": "core.status.hero.hp += core.values.redPotion", + "canUseItemEffect": "true" + }, + "I424": { + "cls": "items", + "name": "新物品", + "canUseItemEffect": "true" } } \ No newline at end of file diff --git a/project/maps.js b/project/maps.js index fc722c6..e9b9cf2 100644 --- a/project/maps.js +++ b/project/maps.js @@ -1,8 +1,8 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = { - "1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, - "2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, - "3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, + "1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, + "2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, + "3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, "4": {"cls":"animates","id":"star","name":"星空"}, "5": {"cls":"animates","id":"lava","name":"岩浆"}, "6": {"cls":"animates","id":"ice","doorInfo":{"time":160,"openSound":"破冰镐","closeSound":"door.opus","keys":{"icePickaxe":1}},"animate":1}, @@ -68,12 +68,12 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "71": {"cls":"items","id":"shield0"}, "72": {"cls":"items","id":"skill1"}, "73": {"cls":"items","id":"wand"}, - "81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"yellowKey":1}},"name":"黄门"}, - "82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"blueKey":1}},"name":"蓝门"}, - "83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"redKey":1}},"name":"红门"}, - "84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"greenKey":1}},"name":"绿门"}, - "85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"specialKey":1}},"name":"机关门"}, - "86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"steelKey":1}},"name":"铁门"}, + "81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"yellowKey":1}},"name":"黄门"}, + "82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"blueKey":1}},"name":"蓝门"}, + "83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"redKey":1}},"name":"红门"}, + "84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"greenKey":1}},"name":"绿门"}, + "85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"specialKey":1}},"name":"机关门"}, + "86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"steelKey":1}},"name":"铁门"}, "87": {"cls":"terrains","id":"upFloor","canPass":true}, "88": {"cls":"terrains","id":"downFloor","canPass":true}, "89": {"cls":"animates","id":"portal","canPass":true}, @@ -86,7 +86,7 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "102": {"cls":"animates","id":"crystalBottom"}, "103": {"cls":"animates","id":"fire"}, "104": {"cls":"animates","id":"switch"}, - "109": {"cls":"animates","id":"magentaWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{}}}, + "109": {"cls":"animates","id":"magentaWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{}}}, "121": {"cls":"npcs","id":"man"}, "122": {"cls":"npcs","id":"trader"}, "123": {"cls":"npcs","id":"thief"}, @@ -217,12 +217,12 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "316": {"cls":"terrains","id":"sWallTLR","name":"薄墙-上左右","cannotOut":["up","left","right"],"cannotIn":["up","left","right"]}, "317": {"cls":"terrains","id":"sWallTBR","name":"薄墙-上下右","cannotOut":["up","down","right"],"cannotIn":["up","down","right"]}, "318": {"cls":"terrains","id":"sWallTBL","name":"薄墙-上下左","cannotOut":["up","down","left"],"cannotIn":["up","down","left"]}, - "319": {"cls":"npc48","id":"tallYellowDoor","trigger":"openDoor","name":"高黄门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"yellowKey":1}}}, - "320": {"cls":"npc48","id":"tallBlueDoor","trigger":"openDoor","name":"高蓝门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"blueKey":1}}}, - "321": {"cls":"npc48","id":"tallRedDoor","trigger":"openDoor","name":"高红门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"redKey":1}}}, - "322": {"cls":"npc48","id":"tallGreenDoor","trigger":"openDoor","name":"高绿门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"greenKey":1}}}, - "323": {"cls":"npc48","id":"tallSpecialDoor","trigger":"openDoor","name":"高机关门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"specialKey":1}}}, - "324": {"cls":"npc48","id":"tallSteelDoor","trigger":"openDoor","name":"高铁门","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.opus","keys":{"steelKey":1}}}, + "319": {"cls":"npc48","id":"tallYellowDoor","trigger":"openDoor","name":"高黄门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"yellowKey":1}}}, + "320": {"cls":"npc48","id":"tallBlueDoor","trigger":"openDoor","name":"高蓝门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"blueKey":1}}}, + "321": {"cls":"npc48","id":"tallRedDoor","trigger":"openDoor","name":"高红门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"redKey":1}}}, + "322": {"cls":"npc48","id":"tallGreenDoor","trigger":"openDoor","name":"高绿门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"greenKey":1}}}, + "323": {"cls":"npc48","id":"tallSpecialDoor","trigger":"openDoor","name":"高机关门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"specialKey":1}}}, + "324": {"cls":"npc48","id":"tallSteelDoor","trigger":"openDoor","name":"高铁门","animate":1,"doorInfo":{"time":160,"openSound":"door.opus","closeSound":"door.opus","keys":{"steelKey":1}}}, "325": {"cls":"enemys","id":"keiskeiFairy"}, "326": {"cls":"enemys","id":"tulipFairy"}, "327": {"cls":"enemy48","id":"bearDown"}, @@ -259,6 +259,21 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "358": {"cls":"terrains","id":"T358"}, "359": {"cls":"terrains","id":"T359"}, "360": {"cls":"terrains","id":"T360"}, + "361": {"cls":"terrains","id":"T361"}, + "362": {"cls":"terrains","id":"T362"}, + "363": {"cls":"terrains","id":"T363"}, + "364": {"cls":"terrains","id":"T364"}, + "365": {"cls":"terrains","id":"T365"}, + "366": {"cls":"items","id":"I366"}, + "367": {"cls":"items","id":"I367"}, + "368": {"cls":"items","id":"I368"}, + "369": {"cls":"items","id":"I369"}, + "370": {"cls":"items","id":"I370"}, + "371": {"cls":"items","id":"I371"}, + "372": {"cls":"items","id":"I372"}, + "373": {"cls":"items","id":"I373"}, + "374": {"cls":"items","id":"I374"}, + "375": {"cls":"items","id":"I375"}, "376": {"cls":"terrains","id":"T376"}, "377": {"cls":"terrains","id":"T377"}, "378": {"cls":"terrains","id":"T378"}, @@ -279,6 +294,37 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = "393": {"cls":"terrains","id":"T393"}, "394": {"cls":"terrains","id":"T394"}, "395": {"cls":"terrains","id":"T395"}, + "396": {"cls":"items","id":"I396"}, + "397": {"cls":"items","id":"postman"}, + "398": {"cls":"terrains","id":"T397"}, + "399": {"cls":"terrains","id":"T399"}, + "400": {"cls":"terrains","id":"T400"}, + "401": {"cls":"items","id":"I401"}, + "402": {"cls":"items","id":"I402"}, + "403": {"cls":"items","id":"I403"}, + "404": {"cls":"items","id":"I404"}, + "405": {"cls":"items","id":"I405"}, + "406": {"cls":"items","id":"I406"}, + "407": {"cls":"items","id":"I407"}, + "408": {"cls":"items","id":"I408"}, + "409": {"cls":"items","id":"I409"}, + "410": {"cls":"items","id":"I410"}, + "411": {"cls":"items","id":"I411"}, + "412": {"cls":"items","id":"I412"}, + "413": {"cls":"items","id":"I413"}, + "414": {"cls":"items","id":"I414"}, + "415": {"cls":"items","id":"I415"}, + "416": {"cls":"items","id":"I416"}, + "417": {"cls":"items","id":"I417"}, + "418": {"cls":"items","id":"I418"}, + "419": {"cls":"items","id":"I419"}, + "420": {"cls":"items","id":"I420"}, + "421": {"cls":"enemys","id":"E421"}, + "422": {"cls":"enemys","id":"E422"}, + "423": {"cls":"items","id":"I423"}, + "424": {"cls":"items","id":"I424"}, + "425": {"cls":"enemys","id":"E425"}, + "426": {"cls":"enemys","id":"E426"}, "20034": {"cls":"tileset","id":"X20034","canPass":true}, "20154": {"cls":"tileset","id":"X20154","canPass":true}, "20216": {"cls":"tileset","id":"X20216","canPass":true}, diff --git a/project/materials/enemys.png b/project/materials/enemys.png index 2b3641c..44fb811 100644 Binary files a/project/materials/enemys.png and b/project/materials/enemys.png differ diff --git a/project/materials/items.png b/project/materials/items.png index 04dc29b..bf1a755 100644 Binary files a/project/materials/items.png and b/project/materials/items.png differ diff --git a/project/materials/terrains.png b/project/materials/terrains.png index 378c4bf..c68f818 100644 Binary files a/project/materials/terrains.png and b/project/materials/terrains.png differ diff --git a/project/plugins.js b/project/plugins.js index 009ae14..cc38544 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -1,226 +1,326 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = { "init": function () { - this._afterLoadResources = function () { - // 本函数将在所有资源加载完毕后,游戏开启前被执行 - core.ui.statusBar.init(); - core.registerEvent("changeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.changeMouse( - data.icon, - data.div, - data.translate[0], - data.translate[1], - data.scale[0], - data.scale[1], - data.angel, - data.px, - data.py - ); - core.doAction(); - }); - core.registerEvent("removeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.removeMouse(data.div); - core.doAction(); - }); - core.registerEvent("addPop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.value = core.replaceText(data.value); - core.addPop( - data.value, - data.px, - data.py, - data.color, - data.boldColor, - data.left, - data.jump, - data.time, - data.show, - data.font, - data.speed - ); - } - core.doAction(); - }); - core.registerEvent("drawWarning", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.text = core.replaceText(data.text); - data.text2 = core.replaceText(data.text2); - core.drawWarning( - data.x, - data.y, - data.size, - data?.text, - data?.text2, - data?.warning - ); - setTimeout(() => core.doAction(), 3100); - } else { - core.doAction(); - } - }); - core.registerEvent("playStereo", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.playStereo(data.name, data.left, data.right, data.split); - core.doAction(); - }); - core.registerEvent("moveStereo", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - const id = core.playStereo( - data.name, - data.left, - data.right, - data.split - ); - core.moveStereo(id, data.leftTo, data.rightTo, data.time); - } - core.doAction(); - }); - core.registerEvent("over", function (data) { - let image = data.image ?? ""; - let time = data.time ?? 3000; - let sound = data.sound ?? ""; - let textColor = data.textColor ?? "#FFFFFF"; - let boldColor = data.boldColor ?? "#000000"; - let font = data.font ?? "bold 48px Verdana"; - let text = data.text ?? ""; - let hidetime = data.hidetime ?? 100; - if (!main.replayChecking && !core.isReplaying()) { - core.over( - image, - data.memory, - time, - hidetime, - sound, - textColor, - boldColor, - font, - text - ); - } else { - core.doAction(); - } - }); - core.registerEvent("changebg", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.changebg( - data.img1, - data.memory1, - data.img2, - data.memory2, - data.time, - data.style - ); - } else { - core.doAction(); - } - }); - core.registerEvent("overlist", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.overlist( - data.image, - data.memory, - data.hidetime || 30, - data.list || [ - { - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, - ] - ); - } else { - core.doAction(); - } - }); - core.registerEvent("op", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.openvideo(); - } else { - core.doAction(); - } - }); - core.registerEvent("animationDrawable", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.animationDrawable( - data.allFarme, - data.color, - data.globalAlpha, - data.imageList, - data.soundList - ); - } else { - core.doAction(); - } - }); - core.registerEvent("setanimate", function (data) { - data.px = data.px ?? 0; - data.py = data.py ?? 0; - core.setanimate( - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - data.imageList, - data.soundList - ); - core.doAction(); - }); - core.registerEvent("clearanimate", function (data) { - core.plugin.playing.clear(); + this._afterLoadResources = function () { + // 本函数将在所有资源加载完毕后,游戏开启前被执行 + core.ui.statusBar.init(); + core.dom.playGame.style.fontFamily = "pala"; + core.dom.loadGame.style.fontFamily = "pala"; + core.dom.CGMode.style.fontFamily = "pala"; + core.dom.musicMode.style.fontFamily = "pala"; + core.dom.replayGame.style.fontFamily = "pala"; + core.registerEvent("changeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.changeMouse( + data.icon, + data.div, + data.translate[0], + data.translate[1], + data.scale[0], + data.scale[1], + data.angel, + data.px, + data.py + ); + core.doAction(); + }); + core.registerEvent("removeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.removeMouse(data.div); + core.doAction(); + }); + core.registerEvent("animationDrawable", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.animationDrawable( + data.allFarme, + data.color, + data.globalAlpha, + data.imageList, + data.soundList + ); + } else { + core.doAction(); + } + }); + core.registerEvent("drawbackground", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.drawbackground(data.image, data.memory); + core.ui.cgText.image = data.image; + core.ui.cgText.memory = data.memory; - core.doAction(); - }); - core.registerEvent("deleteanimate", function (data) { - core.deleteanimate(data.name); - core.doAction(); - }); - core.registerEvent("playanimate", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.x = data.x ?? 0; - data.y = data.y ?? 0; - data.scalex = data.scalex ?? 1; - data.scaley = data.scaley ?? 1; - core.playanimate( - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley - ); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("cgtext", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.ui.cgText.image = data.bg; - core.ui.cgText.memory = data.memory; - core.ui.cgText.head = core.clone(data.head); - core.ui.cgText.name = data.name; - core.ui.cgText.text = data.text; - core.ui.cgText.time = data.time; - core.ui.cgText.wait = data.wait; - core.ui.cgText.WindowSkin = data.WindowSkin; - core.ui.cgText.sound = data.sound || ""; - core.ui.cgText.bodyList = core.clone(data.bodyList); - main.dom.cgText.style.display = "block"; - core.ui.cgText.update(); - } else { - core.doAction(); - } - }); - }; - }, + } + core.doAction(); + }); + core.registerEvent("animateResize", function (data, x, y, prefix) { + core.events._action_animateResize(data, x, y, prefix) + + }); + core.registerEvent("pauseAnimate", function (data, x, y, prefix) { + core.maps.pauseAnimate(data.id) + core.doAction(); + + }); + core.registerEvent("remuseAnimate", function (data, x, y, prefix) { + core.maps.remuseAnimate(data.id) + core.doAction(); + }); + core.registerEvent("clearbackground", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.clearbackground(); + core.ui.cgText.image = ""; + } else { + + core.doAction(); + } + }); + core.registerEvent("setanimate", function (data) { + data.px = data.px ?? 0; + data.py = data.py ?? 0; + core.setanimate( + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + data.imageList, + data.soundList + ); + core.doAction(); + }); + core.registerEvent("animatemove", function (data) { + core.animatemove(data.id, data.px, data.py, data.relative, data.time, data.style); + + core.doAction(); + }); + core.registerEvent("moveAnimate", function (data) { + core.maps.moveAnimate(data.id, data.px, data.py, data.relative, data.time, data.style); + + core.doAction(); + }); + core.registerEvent("animateloop", function (data) { + core.animateloop(data.id, data.loop); + + core.doAction(); + }); + core.registerEvent("animatereverse", function (data) { + core.animatereverse(data.id, data.reverse); + + core.doAction(); + }); + core.registerEvent("animatepause", function (data) { + core.animatepause(data.id, data.pause); + + core.doAction(); + }); + core.registerEvent("clearanimate", function (data) { + core.animateclear(data.id); + + core.doAction(); + }); + core.registerEvent("deleteanimate", function (data) { + core.deleteanimate(data.name); + core.doAction(); + }); + core.registerEvent("playanimate", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.x = data.x ?? 0; + data.y = data.y ?? 0; + data.scalex = data.scalex ?? 1; + data.scaley = data.scaley ?? 1; + core.playanimate( + data.name, + data.id, + data.x, + data.y, + data.hero, + data.scalex, + data.scaley, + data.loop, + data.reverse + ); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("addPop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.value = core.replaceText(data.value); + core.addPop( + data.value, + data.px, + data.py, + data.color, + data.boldColor, + data.left, + data.jump, + data.time, + data.show, + data.font, + data.speed + ); + } + core.doAction(); + }); + core.registerEvent("drawWarning", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.text = core.replaceText(data.text); + data.text2 = core.replaceText(data.text2); + core.drawWarning( + data.x, + data.y, + data?.text, + data?.text2, + data?.warning, + data.large, + data.size + ); + + setTimeout(() => core.doAction(), 3100); + } else { + core.doAction(); + } + }); + + core.registerEvent("over", function (data) { + let image = data.image ?? ""; + let time = data.time ?? 3000; + let sound = data.sound ?? ""; + let textColor = data.textColor ?? "#FFFFFF"; + let boldColor = data.boldColor ?? "#000000"; + let font = data.font ?? "bold 48px Verdana"; + let text = data.text ?? ""; + let hidetime = data.hidetime ?? 100; + if (!main.replayChecking && !core.isReplaying()) { + core.over( + image, + data.memory, + time, + hidetime, + sound, + textColor, + boldColor, + font, + text + ); + } else { + core.doAction(); + } + }); + core.registerEvent("changebg", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.changebg( + data.img1, + data.memory1, + data.img2, + data.memory2, + data.time, + data.style + ); + if (data.style === "引出") { core.ui.cgText.image = ""; } else {} core.ui.cgText.image = data.img2; + core.ui.cgText.memory = data.memory2; + } else { + core.doAction(); + } + }); + core.registerEvent("overlist", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.overlist( + data.image, + data.memory, + data.hidetime || 30, + data.list || [{ + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, ] + ); + } else { + core.doAction(); + } + }); + core.registerEvent("op", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.openvideo(); + } else { + core.doAction(); + } + }); + + core.registerEvent("cgtextList", function (data) { + core.ui.cgText.textList = data.textList; + core.doAction(); + }); + core.registerEvent("cgtext", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + + core.ui.cgText.head = core.clone(data.head); + core.ui.cgText.index = data.index; + core.ui.cgText.name = core.plugin[core.ui.cgText.textList][data.index][0]; + core.ui.cgText.text = data.text ? + data.text : + core.plugin[core.ui.cgText.textList][data.index][1]; + core.ui.cgText.time = data.time; + core.ui.cgText.wait = data.wait; + core.ui.cgText.WindowSkin = data.WindowSkin; + core.ui.cgText.sound = + data.sound === "" ? + data.sound : + core.plugin[core.ui.cgText.textList][data.index][2] || ""; + core.ui.cgText.bodyList = core.clone(data.bodyList); + main.dom.cgText.style.display = "block"; + core.ui.cgText.update(); + } else { + core.doAction(); + } + }); + core.registerEvent("introAndLoop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.plugin.introAndLoop(data.intro, data.time, data.loop); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("setq", function (data) { + core.setFlag("任务地点", data.id); + + core.doAction(); + }); + + core.registerEvent("setmusics", function (data) { + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + let a = core.getLocalStorage("musics"); + if (!data.bgm) { + core.setLocalStorage("musics", ["theme.mp3"]); + } else { + if (!a.includes(data.bgm)) a.push(data.bgm); + core.setLocalStorage("musics", a); + } + core.doAction(); + }); + core.registerEvent("setcgs", function (data) { + if (!data.img) { + core.setLocalStorage("cgs", []); + } else { + let a = core.getLocalStorage("cgs") ?? []; + if (!a.includes(data.img)) a.push(data.img); + core.setLocalStorage("cgs", a); + } + core.doAction(); + }); + }; +}, "drawLight": function () { // 绘制灯光/漆黑层效果。调用方式 core.plugin.drawLight(...) // 【参数说明】 @@ -264,8 +364,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); lightDec = core.clamp(lightDec, 0, 1); - - // 绘制每个灯光效果 ctx.globalCompositeOperation = "destination-out"; lights.forEach(function (light) { // 坐标,半径,中心不透明度 @@ -2484,1560 +2582,2013 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = })(); }, "statusBar": function () { - main.dom.floorMsgGroup.style.display = "none"; - main.dom.statusBar.style.display = "none"; - main.dom.toolBar.style.display = "none"; - //所有数据*3是为了实现高清画布 - const GAMEVIEW_WIDTH = 676 * 3; //横屏画面宽度 - const GAMEVIEW_HEIGHT = 416 * 3; //横屏画面高度 + main.dom.floorMsgGroup.style.display = "none"; + main.dom.statusBar.style.display = "none"; + main.dom.toolBar.style.display = "none"; + //所有数据*3是为了实现高清画布 + const GAMEVIEW_WIDTH = 676 * 3; //横屏画面宽度 + const GAMEVIEW_HEIGHT = 416 * 3; //横屏画面高度 - const GAMEVIEW_WIDTH_VERTICAL = 416 * 3; //竖屏画面宽度 - const GAMEVIEW_HEIGHT_VERTICAL = 676 * 3; //竖屏画面高度 + const GAMEVIEW_WIDTH_VERTICAL = 416 * 3; //竖屏画面宽度 + const GAMEVIEW_HEIGHT_VERTICAL = 676 * 3; //竖屏画面高度 - const BAR_WIDTH = 130 * 3; //横屏左侧额外距离(即边栏宽度) - const BAR_HEIGHT_VERTICAL = 130 * 3; //竖屏上侧额外距离(即边栏高度) - const BORDER_WIDTH = 0; //游戏画面左侧偏移距离 - const BORDER_HEIGHT = 0; //游戏画面上侧偏移距离 + const BAR_WIDTH = 130 * 3; //横屏左侧额外距离(即边栏宽度) + const BAR_HEIGHT_VERTICAL = 130 * 3; //竖屏上侧额外距离(即边栏高度) + const BORDER_WIDTH = 0; //游戏画面左侧偏移距离 + const BORDER_HEIGHT = 0; //游戏画面上侧偏移距离 - const ITEM_BOX_LEFT = 549 * 3; //横屏道具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const ITEM_BOX_TOP = 155 * 3; //横屏道具栏上侧距离 - const ITEM_BOX_LEFT_VERTICAL = 160 * 3; //竖屏道具栏左侧距离 - const ITEM_BOX_TOP_VERTICAL = 549 * 3; //竖屏道具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const ITEM_BOX_LEFT = 549 * 3; //横屏道具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const ITEM_BOX_TOP = 175 * 3; //横屏道具栏上侧距离 + const ITEM_BOX_LEFT_VERTICAL = 160 * 3; //竖屏道具栏左侧距离 + const ITEM_BOX_TOP_VERTICAL = 549 * 3; //竖屏道具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const EQUIP_BLOCK_LEFT = 549 * 3; //横屏装备栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const EQUIP_BLOCK_TOP = 10 * 3; //横屏装备栏上侧距离 - const EQUIP_BLOCK_LEFT_VERTICAL = 10 * 3; //竖屏装备栏左侧距离 - const EQUIP_BLOCK_TOP_VERTICAL = 549 * 3; //竖屏装备栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const EQUIP_BLOCK_LEFT = 549 * 3; //横屏装备栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const EQUIP_BLOCK_TOP = 10 * 3; //横屏装备栏上侧距离 + const EQUIP_BLOCK_LEFT_VERTICAL = 10 * 3; //竖屏装备栏左侧距离 + const EQUIP_BLOCK_TOP_VERTICAL = 549 * 3; //竖屏装备栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const MAP_BLOCK_LEFT = 551 * 3; //横屏小地图左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const MAP_BLOCK_TOP = 0; //横屏小地图上侧距离 - const MAP_BLOCK_LEFT_VERTICAL = 0; //竖屏小地图左侧距离 - const MAP_BLOCK_TOP_VERTICAL = 551 * 3; //竖屏小地图上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const MAP_BLOCK_LEFT = 551 * 3; //横屏小地图左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const MAP_BLOCK_TOP = 0; //横屏小地图上侧距离 + const MAP_BLOCK_LEFT_VERTICAL = 0; //竖屏小地图左侧距离 + const MAP_BLOCK_TOP_VERTICAL = 551 * 3; //竖屏小地图上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const KEY_BLOCK_LEFT = EQUIP_BLOCK_LEFT; //横屏钥匙栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const KEY_BLOCK_TOP = 110 * 3; //横屏钥匙栏上侧距离 - const KEY_BLOCK_LEFT_VERTICAL = 110 * 3; //竖屏钥匙栏左侧距离 - const KEY_BLOCK_TOP_VERTICAL = EQUIP_BLOCK_TOP_VERTICAL; //竖屏钥匙栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const KEY_BLOCK_LEFT = EQUIP_BLOCK_LEFT; //横屏钥匙栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const KEY_BLOCK_TOP = 130 * 3; //横屏钥匙栏上侧距离 + const KEY_BLOCK_LEFT_VERTICAL = 110 * 3; //竖屏钥匙栏左侧距离 + const KEY_BLOCK_TOP_VERTICAL = EQUIP_BLOCK_TOP_VERTICAL; //竖屏钥匙栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const INFO_BLOCK_LEFT = 10 * 3; //横屏道具说明左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const INFO_BLOCK_TOP = 180 * 3; //横屏道具说明上侧距离 - const INFO_BLOCK_LEFT_VERTICAL = 113 * 3; //竖屏道具说明左侧距离 - const INFO_BLOCK_TOP_VERTICAL = 8 * 3; //竖屏道具说明上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const INFO_BLOCK_LEFT = 10 * 3; //横屏道具说明左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const INFO_BLOCK_TOP = 290 * 3; //横屏道具说明上侧距离 + const INFO_BLOCK_LEFT_VERTICAL = 113 * 3; //竖屏道具说明左侧距离 + const INFO_BLOCK_TOP_VERTICAL = 8 * 3; //竖屏道具说明上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const TOOL_BOX_LEFT = EQUIP_BLOCK_LEFT; //横屏工具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const TOOL_BOX_TOP = 348 * 3; //横屏工具栏上侧距离 - const TOOL_BOX_LEFT_VERTICAL = 348 * 3; //竖屏工具栏左侧距离 - const TOOL_BOX_TOP_VERTICAL = 549 * 3; //竖屏工具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const TOOL_BOX_LEFT = EQUIP_BLOCK_LEFT; //横屏工具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const TOOL_BOX_TOP = 348 * 3; //横屏工具栏上侧距离 + const TOOL_BOX_LEFT_VERTICAL = 348 * 3; //竖屏工具栏左侧距离 + const TOOL_BOX_TOP_VERTICAL = 549 * 3; //竖屏工具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const TOOL_ICON_OUTER_SIZE = 34 * 3; + const TOOL_ICON_OUTER_SIZE = 34 * 3; - const TEXT_COLOR = "#FFFFFF"; //默认文字颜色 - const globalAlpha = 0.7; //默认底框透明度 - const FORCE_COUNTABLE_ITEMS = ["centerFly"]; //常态显示数量的非永久道具,如果道具不在此数组中,则只有道具多余1时显示数量 + const TEXT_COLOR = "#FFFFFF"; //默认文字颜色 + const globalAlpha = 0.7; //默认底框透明度 + const FORCE_COUNTABLE_ITEMS = ["centerFly"]; //常态显示数量的非永久道具,如果道具不在此数组中,则只有道具多余1时显示数量 - const outerBackground = document.createElement("canvas"); //背景画布设置 - let globalAlphafloor = 0, - globalAlphafloorStatus = 4; - outerBackground.style.position = "absolute"; - outerBackground.style.zIndex = 5; - outerBackground.id = "outerBackground"; - main.dom.outerBackground = outerBackground; - main.dom.startPanel.insertAdjacentElement("afterend", outerBackground); + const outerBackground = document.createElement("canvas"); //背景画布设置 + let globalAlphafloor = 0, + globalAlphafloorStatus = 4; + outerBackground.style.position = "absolute"; + outerBackground.style.zIndex = 5; + outerBackground.id = "outerBackground"; + main.dom.outerBackground = outerBackground; + main.dom.startPanel.insertAdjacentElement("afterend", outerBackground); - const outerUI = document.createElement("canvas"); //额外ui画布设置(状态栏所有绘制、点击都在额外ui上) - outerUI.style.position = "absolute"; - outerUI.style.zIndex = 165; - outerUI.id = "outerUI"; + const outerUI = document.createElement("canvas"); //额外ui画布设置(状态栏所有绘制、点击都在额外ui上) + outerUI.style.position = "absolute"; + outerUI.style.zIndex = 165; + outerUI.id = "outerUI"; - main.dom.outerUI = outerUI; - outerBackground.insertAdjacentElement("afterend", outerUI); - setTimeout(function () { - // Should be executed immediately after init() - main.canvas.outerUI = outerUI.getContext("2d"); - }); - outerUI.onclick = function (e) { - try { - e.preventDefault(); - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.statusBar.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + main.dom.outerUI = outerUI; + outerBackground.insertAdjacentElement("afterend", outerUI); + setTimeout(function () { + // Should be executed immediately after init() + main.canvas.outerUI = outerUI.getContext("2d"); + }); + outerUI.onclick = function (e) { + try { + e.preventDefault(); + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.statusBar.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - const _resize_gameGroup = function (obj) { - //游戏画面自适应调节 - const gameGroup = core.dom.gameGroup; - gameGroup.style.width = obj.totalWidth + "px"; - gameGroup.style.height = obj.totalHeight + "px"; - gameGroup.style.left = (obj.clientWidth - obj.totalWidth) / 2 + "px"; - gameGroup.style.top = (obj.clientHeight - obj.totalHeight) / 2 + "px"; - //floorMsgGroup为切换楼层中生效,显示时间可通过‘全塔属性’——‘切换楼层时间’或游戏内设置调整 - //显示内容为游戏名/版本号/楼层名 - // floorMsgGroup - var floorMsgGroup = core.dom.floorMsgGroup; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - floorMsgGroup.style = globalAttribute.floorChangingStyle; - floorMsgGroup.style.height = floorMsgGroup.style.width = - (GAMEVIEW_HEIGHT / 3) * core.domStyle.scale + "px"; - floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; + const _resize_gameGroup = function (obj) { + //游戏画面自适应调节 + const gameGroup = core.dom.gameGroup; + gameGroup.style.width = obj.totalWidth + "px"; + gameGroup.style.height = obj.totalHeight + "px"; + gameGroup.style.left = (obj.clientWidth - obj.totalWidth) / 2 + "px"; + gameGroup.style.top = (obj.clientHeight - obj.totalHeight) / 2 + "px"; + //floorMsgGroup为切换楼层中生效,显示时间可通过‘全塔属性’——‘切换楼层时间’或游戏内设置调整 + //显示内容为游戏名/版本号/楼层名 + // floorMsgGroup + var floorMsgGroup = core.dom.floorMsgGroup; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + floorMsgGroup.style = globalAttribute.floorChangingStyle; + floorMsgGroup.style.height = floorMsgGroup.style.width = + (GAMEVIEW_HEIGHT / 3) * core.domStyle.scale + "px"; + floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; - if (core.domStyle.isVertical) { - floorMsgGroup.style.left = "0px"; - floorMsgGroup.style.top = - ((GAMEVIEW_HEIGHT_VERTICAL / 3 - GAMEVIEW_WIDTH_VERTICAL / 3) * - core.domStyle.scale) / - 2 + - "px"; - } else { - floorMsgGroup.style.left = - ((GAMEVIEW_WIDTH / 3 - GAMEVIEW_HEIGHT / 3) * core.domStyle.scale) / - 2 + - "px"; - floorMsgGroup.style.top = "0px"; - } - core.dom.musicBtn.style.right = - (obj.clientWidth - obj.totalWidth) / 2 + "px"; - core.dom.musicBtn.style.bottom = - (obj.clientHeight - obj.totalHeight) / 2 - 27 + "px"; - let startBackground = core.domStyle.isVertical - ? main.styles.startVerticalBackground || main.styles.startBackground - : main.styles.startBackground; - if (main.dom.startBackground.getAttribute("__src__") != startBackground) { - main.dom.startBackground.setAttribute("__src__", startBackground); - main.dom.startBackground.src = startBackground; - } - const span = document - .getElementById("startButtons") - .getElementsByTagName("span"); - let font = (GAMEVIEW_WIDTH / 100) * core.domStyle.scale; - if (core.domStyle.isVertical) - font = ((GAMEVIEW_WIDTH_VERTICAL * 2) / 100) * core.domStyle.scale; + if (core.domStyle.isVertical) { + floorMsgGroup.style.left = "0px"; + floorMsgGroup.style.top = + ((GAMEVIEW_HEIGHT_VERTICAL / 3 - GAMEVIEW_WIDTH_VERTICAL / 3) * + core.domStyle.scale) / + 2 + + "px"; + } else { + floorMsgGroup.style.left = + ((GAMEVIEW_WIDTH / 3 - GAMEVIEW_HEIGHT / 3) * core.domStyle.scale) / + 2 + + "px"; + floorMsgGroup.style.top = "0px"; + } + core.dom.musicBtn.style.right = + (obj.clientWidth - obj.totalWidth) / 2 + "px"; + core.dom.musicBtn.style.bottom = + (obj.clientHeight - obj.totalHeight) / 2 - 27 + "px"; + let startBackground = core.domStyle.isVertical ? + main.styles.startVerticalBackground || main.styles.startBackground : + main.styles.startBackground; + if (main.dom.startBackground.getAttribute("__src__") != startBackground) { + main.dom.startBackground.setAttribute("__src__", startBackground); + main.dom.startBackground.src = startBackground; + } + const span = document + .getElementById("startButtons") + .getElementsByTagName("span"); + let font = (GAMEVIEW_WIDTH / 100) * core.domStyle.scale; + if (core.domStyle.isVertical) + font = ((GAMEVIEW_WIDTH_VERTICAL * 2) / 100) * core.domStyle.scale; - core.dom.playGame.style.fontSize = font + "px"; - core.dom.loadGame.style.fontSize = font + "px"; - core.dom.CGMode.style.fontSize = font + "px"; - core.dom.musicMode.style.fontSize = font + "px"; - core.dom.replayGame.style.fontSize = font + "px"; - core.dom.startButtonGroup.style.padding = font * 0.3 + "px 25px"; - }; - const _resize_canvas = function (obj) { - //自适应画布 - main.dom.outerBackground.style.width = obj.totalWidth + "px"; - main.dom.outerBackground.style.height = obj.totalHeight + "px"; - main.dom.outerUI.style.width = obj.totalWidth + "px"; - main.dom.outerUI.style.height = obj.totalHeight + "px"; - if (main.dom.CGUI) { - main.dom.CGUI.style.width = obj.totalWidth + 3 + "px"; - main.dom.CGUI.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.music) { - main.dom.music.style.width = obj.totalWidth + 3 + "px"; - main.dom.music.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.cgText) { - main.dom.cgText.style.width = obj.totalWidth + 3 + "px"; - main.dom.cgText.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.over) { - main.dom.over.style.width = obj.totalWidth + 3 + "px"; - main.dom.over.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.video) { - main.dom.video.style.width = obj.totalWidth + 3 + "px"; - main.dom.video.style.height = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) - main.dom.video.style.width = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) - main.dom.video.style.height = obj.totalWidth + 3 + "px"; - main.dom.video.style.top = "50%"; - main.dom.video.style.left = "50%"; + core.dom.playGame.style.fontSize = font + "px"; + core.dom.loadGame.style.fontSize = font + "px"; + core.dom.CGMode.style.fontSize = font + "px"; + core.dom.musicMode.style.fontSize = font + "px"; + core.dom.replayGame.style.fontSize = font + "px"; + core.dom.startButtonGroup.style.padding = font * 0.3 + "px 25px"; + }; + const _resize_canvas = function (obj) { + //自适应画布 + main.dom.outerBackground.style.width = obj.totalWidth + "px"; + main.dom.outerBackground.style.height = obj.totalHeight + "px"; + main.dom.outerUI.style.width = obj.totalWidth + "px"; + main.dom.outerUI.style.height = obj.totalHeight + "px"; + if (main.dom.CGUI) { + main.dom.CGUI.style.width = obj.totalWidth + 3 + "px"; + main.dom.CGUI.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.music) { + main.dom.music.style.width = obj.totalWidth + 3 + "px"; + main.dom.music.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.cgText) { + main.dom.cgText.style.width = obj.totalWidth + 3 + "px"; + main.dom.cgText.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.logcanvas) { + main.dom.logcanvas.style.width = obj.totalWidth + 3 + "px"; + main.dom.logcanvas.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.over) { + main.dom.over.style.width = obj.totalWidth + 3 + "px"; + main.dom.over.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.book) { + main.dom.book.style.width = obj.totalWidth + 3 + "px"; + main.dom.book.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.video) { + main.dom.video.style.width = obj.totalWidth + 3 + "px"; + main.dom.video.style.height = obj.totalHeight + 3 + "px"; + if (core.domStyle.isVertical) + main.dom.video.style.width = obj.totalHeight + 3 + "px"; + if (core.domStyle.isVertical) + main.dom.video.style.height = obj.totalWidth + 3 + "px"; + main.dom.video.style.top = "50%"; + main.dom.video.style.left = "50%"; - main.dom.video.style.transform = "translate(-50%,-50%)"; + main.dom.video.style.transform = "translate(-50%,-50%)"; - if (core.domStyle.isVertical) - main.dom.video.style.transform = "translate(-50%,-50%) rotate(90deg)"; - } - if (main.dom.video1) { - main.dom.video1.style.width = obj.totalWidth + 3 + "px"; - main.dom.video1.style.height = obj.totalHeight + 3 + "px"; - } + if (core.domStyle.isVertical) + main.dom.video.style.transform = "translate(-50%,-50%) rotate(90deg)"; + } + if (main.dom.video1) { + main.dom.video1.style.width = obj.totalWidth + 3 + "px"; + main.dom.video1.style.height = obj.totalHeight + 3 + "px"; + } - const innerSize = obj.canvasWidth * core.domStyle.scale + "px"; - for (let i = 0; i < core.dom.gameCanvas.length; ++i) - core.dom.gameCanvas[i].style.width = core.dom.gameCanvas[ - i - ].style.height = innerSize; - core.dom.gif.style.width = core.dom.gif.style.height = innerSize; - core.dom.gif2.style.width = core.dom.gif2.style.height = innerSize; + main.dom.boss1.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss1.style.height = obj.totalHeight + 3 + "px"; - core.dom.gameDraw.style.width = core.dom.gameDraw.style.height = - innerSize; - core.dom.gameDraw.style.top = - obj.gameDrawBox.top * core.domStyle.scale + "px"; - core.dom.gameDraw.style.left = - obj.gameDrawBox.left * core.domStyle.scale + "px"; - // resize bigmap - core.bigmap.canvas.forEach(function (cn) { - const ratio = core.canvas[cn].canvas.hasAttribute("isHD") - ? core.domStyle.ratio - : 1; - core.canvas[cn].canvas.style.width = - (innerSize / ratio) * core.domStyle.scale + "px"; - core.canvas[cn].canvas.style.height = - (innerSize / ratio) * core.domStyle.scale + "px"; - }); - // resize dynamic canvas - for (const name in core.dymCanvas) { - const ctx = core.dymCanvas[name], - canvas = ctx.canvas; - const ratio = canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; - canvas.style.width = (innerSize / ratio) * core.domStyle.scale + "px"; - canvas.style.height = (innerSize / ratio) * core.domStyle.scale + "px"; - canvas.style.left = - parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; - canvas.style.top = - parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; - } - // resize next - main.dom.next.style.width = main.dom.next.style.height = - 5 * core.domStyle.scale + "px"; - main.dom.next.style.borderBottomWidth = - main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; - }; - const bgctx = main.dom.outerBackground.getContext("2d"); - const uictx = main.dom.outerUI.getContext("2d"); - let now = 0; - core.registerAnimationFrame("lightFloor", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - globalAlphafloor += globalAlphafloorStatus; - if (globalAlphafloor === 100) globalAlphafloorStatus = -2; - if (globalAlphafloor === 0) globalAlphafloorStatus = 2; + main.dom.boss2.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss2.style.height = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } + main.dom.boss3.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss3.style.height = obj.totalHeight + 3 + "px"; - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 135, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 180 - ); - uictx.globalAlpha = 1; - } - } - }); + main.dom.boss4.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss4.style.height = obj.totalHeight + 3 + "px"; - core.control.resize = function () { - //自适应,可实现横竖屏切换 - if (main.mode == "editor") return; + main.dom.boss5.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss5.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss6.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss6.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss7.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss7.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss8.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss8.style.height = obj.totalHeight + 3 + "px"; + main.dom.saveLoad.style.width = obj.totalWidth + 3 + "px"; + main.dom.saveLoad.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss.style.height = obj.totalHeight + 3 + "px"; - const clientWidth = main.dom.body.clientWidth, - clientHeight = main.dom.body.clientHeight; - const canvasWidth = core.__PIXELS__; + const innerSize = obj.canvasWidth * core.domStyle.scale + "px"; + for (let i = 0; i < core.dom.gameCanvas.length; ++i) + core.dom.gameCanvas[i].style.width = core.dom.gameCanvas[ + i + ].style.height = innerSize; + core.dom.gif.style.width = core.dom.gif.style.height = innerSize; + core.dom.gif2.style.width = core.dom.gif2.style.height = innerSize; - const isVertical = clientHeight > clientWidth; - core.domStyle.isVertical = isVertical; + core.dom.gameDraw.style.width = core.dom.gameDraw.style.height = + innerSize; + core.dom.gameDraw.style.top = + obj.gameDrawBox.top * core.domStyle.scale + "px"; + core.dom.gameDraw.style.left = + obj.gameDrawBox.left * core.domStyle.scale + "px"; + // resize bigmap + core.bigmap.canvas.forEach(function (cn) { + const ratio = core.canvas[cn].canvas.hasAttribute("isHD") ? + core.domStyle.ratio : + 1; + core.canvas[cn].canvas.style.width = + (innerSize / ratio) * core.domStyle.scale + "px"; + core.canvas[cn].canvas.style.height = + (innerSize / ratio) * core.domStyle.scale + "px"; + }); + // resize dynamic canvas + for (const name in core.dymCanvas) { + const ctx = core.dymCanvas[name], + canvas = ctx.canvas; + const ratio = canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; + canvas.style.width = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.height = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.left = + parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; + canvas.style.top = + parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; + } + // resize next + main.dom.next.style.width = main.dom.next.style.height = + 5 * core.domStyle.scale + "px"; + main.dom.next.style.borderBottomWidth = + main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; + }; + const bgctx = main.dom.outerBackground.getContext("2d"); + const uictx = main.dom.outerUI.getContext("2d"); + let now = 0; + core.registerAnimationFrame("lightFloor", true, function (timestamp) { + if (!core.status.floorId) return + if (timestamp - now > 1000 / 60) { + now = timestamp; + globalAlphafloor += globalAlphafloorStatus; + if (globalAlphafloor === 100) globalAlphafloorStatus = -2; + if (globalAlphafloor === 0) globalAlphafloorStatus = 2; - const totalWidth = isVertical - ? GAMEVIEW_WIDTH_VERTICAL / 3 - : GAMEVIEW_WIDTH / 3, - totalHeight = isVertical - ? GAMEVIEW_HEIGHT_VERTICAL / 3 - : GAMEVIEW_HEIGHT / 3; + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } - const maxRatio = Math.min( - clientWidth / totalWidth, - clientHeight / totalHeight - ); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 135, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 180 + ); + uictx.globalAlpha = 1; + } + } + }); - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { - if (maxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); + core.control.resize = function () { + //自适应,可实现横竖屏切换 + if (main.mode == "editor") return; - if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { - core.domStyle.scale = Math.min(1, maxRatio); - } else if ( - core.getLocalStorage("scale") == null && - core.domStyle.availableScale.length >= 2 - ) { - core.domStyle.scale = - core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; - core.setLocalStorage("scale", core.domStyle.scale); - } + const clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + const canvasWidth = core.__PIXELS__; - const totalWidthScaled = totalWidth * core.domStyle.scale, - totalHeightScaled = totalHeight * core.domStyle.scale; + const isVertical = clientHeight > clientWidth; + core.domStyle.isVertical = isVertical; - const gameDrawBox = isVertical - ? { - left: BORDER_WIDTH / 3, - top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, - } - : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; + const totalWidth = isVertical ? + GAMEVIEW_WIDTH_VERTICAL / 3 : + GAMEVIEW_WIDTH / 3, + totalHeight = isVertical ? + GAMEVIEW_HEIGHT_VERTICAL / 3 : + GAMEVIEW_HEIGHT / 3; - const obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - canvasWidth: canvasWidth, - totalWidth: totalWidthScaled, - totalHeight: totalHeightScaled, - gameDrawBox: gameDrawBox, - globalAttribute: - core.status.globalAttribute || core.initStatus.globalAttribute, - }; + const maxRatio = Math.min( + clientWidth / totalWidth, + clientHeight / totalHeight + ); - _resize_gameGroup(obj); - _resize_canvas(obj); + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { + if (maxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); - if (core.status.automaticRoute == null) core.status.automaticRoute = {}; - core.updateStatusBar(); - if (main.dom.CGUI && main.dom.CGUI.style.display === "block") - core.ui.CG.update(); - if (main.dom.music && main.dom.music.style.display === "block") - core.ui.music.update(); - if (main.dom.cgText && main.dom.cgText.style.display === "block") - core.ui.cgText.update(); - }; + if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { + core.domStyle.scale = Math.min(1, maxRatio); + } else if ( + core.getLocalStorage("scale") == null && + core.domStyle.availableScale.length >= 2 + ) { + core.domStyle.scale = + core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; + core.setLocalStorage("scale", core.domStyle.scale); + } - class StatusBar { - constructor() { - //道具栏列表 - this.itemMx = [ - //空位用‘none’填充,当前ui至多4列6行 - ["book", "wand", "none", "fly"], - ["cross", "superPotion", "pickaxe"], - ["bomb", "centerFly", "upFly"], - ["none", "none", "none"], - ["downFly", "knife", "snow"], - ["bigKey", "earthquake", "coin"], - ]; - } - //初始化内容(工具栏/录像操作执行函数) - init() { - this.toolbarAction = [ - [ - main.core.openKeyBoard, - main.core.openQuickShop, - core.openToolbox, - core.doSL, - ], - [main.core.openSettings, main.core.save, main.core.load, core.doSL], - ]; - this.replayAction = [ - [core.triggerReplay, core.stopReplay, core.rewindReplay], - [core.speedDownReplay, core.speedUpReplay, core.saveReplay], - ]; - } - //更新 - update() { - this._update_background(); //更新背景 - this._update_props(); //更新属性 - //this._update_items(); //更新道具 - //this._update_equips(); //更新装备 - //this._update_keys(); //更新钥匙 - //this._update_infoWindow(); //更新道具说明 - this._update_toolBox(); //更新工具栏 - this._redrawMap(); - } - _redrawMap() { - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 125, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 170 - ); - uictx.globalAlpha = 1; - } - } - //更新背景 - _update_background() { - if (core.domStyle.isVertical) { - bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + const totalWidthScaled = totalWidth * core.domStyle.scale, + totalHeightScaled = totalHeight * core.domStyle.scale; - const bg = core.material.images.images["status.webp"]; //竖屏背景(上) - bgctx.drawImage( - bg, - 0, - 0, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) - bgctx.drawImage( - bg2, - 0, - BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } else { - bgctx.canvas.width = GAMEVIEW_WIDTH; - bgctx.canvas.height = GAMEVIEW_HEIGHT; - uictx.canvas.width = GAMEVIEW_WIDTH; - uictx.canvas.height = GAMEVIEW_HEIGHT; + const gameDrawBox = isVertical ? { + left: BORDER_WIDTH / 3, + top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, + } : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; - const bg = core.material.images.images["status.webp"]; //横屏背景(左) - bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); - const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) - bgctx.drawImage( - bg2, - BAR_WIDTH + GAMEVIEW_HEIGHT, - 0, - BAR_WIDTH, - GAMEVIEW_HEIGHT - ); - bgctx.globalAlpha = globalAlpha; + const obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + canvasWidth: canvasWidth, + totalWidth: totalWidthScaled, + totalHeight: totalHeightScaled, + gameDrawBox: gameDrawBox, + globalAttribute: core.status.globalAttribute || core.initStatus.globalAttribute, + }; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } - } - // 更新属性 - _update_props(updatedFloorTitle) { - if (!updatedFloorTitle && core.status.floorId) { - updatedFloorTitle = core.status.maps[core.status.floorId].title; - } - const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) - const drawStatusList = (baseX, baseY) => { - let curh = baseY; - core.setTextAlign("outerUI", "right"); - statusList.forEach((item) => { - // 绘制图标 - core.drawIcon( - "outerUI", - item, - baseX - 95 * 3, - curh - 18 * 3, - 22 * 3, - 22 * 3 - ); + _resize_gameGroup(obj); + _resize_canvas(obj); - // 四舍五入 - core.status.hero[item] = Math.round(core.status.hero[item]); - // 大数据格式化 - core.fillBoldText1( - "outerUI", - core.getRealStatus(item), - baseX, - curh, - TEXT_COLOR, - "#000000", - 6 - ); - curh += 24 * 3; - if (curh > 130 * 3 && core.domStyle.isVertical) { - curh = 24 * 3; - baseX += 105 * 3; - } - }); - core.setTextAlign("outerUI", "center"); - }; - if (core.domStyle.isVertical) { - core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); - core.setFont("outerUI", "bold 42px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 60 * 3, - 22 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(96 * 3, 46 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 0) - core.drawImage("outerUI", "cao.webp", 0, 0); - } else { - core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); - core.setFont("outerUI", "bold 48px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 62 * 3, - 41 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(110 * 3, 93 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 30) - core.drawImage( - "outerUI", - "cao.webp", - 0, - 0, - 400, - 350, - 0, - 30, - 360, - 315 - ); - } - } - _update_items() { - //更新道具栏 - const drawItemMx = (drawFn) => { - for (let i = 0; i < this.itemMx.length; i++) { - for (let j = 0; j < this.itemMx[i].length; j++) { - var item = this.itemMx[i][j]; - drawFn(i, j, item); - } - } - }; - const drawItem = (item, posx, posy) => { - const icon = core.material.icons.items[item], - image = core.material.images.items; - core.drawImage( - "outerUI", - image, - 0, - 32 * icon, - 32, - 32, - posx, - posy, - 30 * 3, - 30 * 3 - ); - const cnt = core.itemCount(item); - if ( - (core.items.items[item].cls === "tools" && cnt > 1) || - FORCE_COUNTABLE_ITEMS.includes(item) - ) { - core.fillText( - "outerUI", - cnt, - posx + 25 * 3, - posy + 28 * 3, - "#FFFFFF", - "bold 36px Verdana" - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT_VERTICAL, - ITEM_BOX_TOP_VERTICAL, - 185 * 3, - 125 * 3 - ); + if (core.status.automaticRoute == null) core.status.automaticRoute = {}; + core.updateStatusBar(); + if (main.dom.CGUI && main.dom.CGUI.style.display === "block") + core.ui.CG.update(); + if (main.dom.music && main.dom.music.style.display === "block") + core.ui.music.update(); + if (main.dom.cgText && main.dom.cgText.style.display === "block") + core.ui.cgText.update(); + if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") + core.ui.cgText.update(); + if (main.dom.boss1 && main.dom.boss1.style.display === "block") + core.ui.boss.update(); + if (main.dom.over && main.dom.over.style.display === "block") + core.overupdate() + if (main.dom.saveLoad && main.dom.saveLoad.style.display === "block") + core.saveLoad.update(); + }; - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, - posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; - drawItem(item, posx, posy); - } - }); - } else { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT, - ITEM_BOX_TOP, - 125 * 3, - 185 * 3 - ); + class StatusBar { + constructor() { + //道具栏列表 + this.itemMx = [ + //空位用‘none’填充,当前ui至多4列6行 + ["book", "postman", "I369", "fly"], + ["cross", "superPotion", "pickaxe"], + ["bomb", "centerFly", "upFly"], + ["none", "none", "none"], + ["downFly", "knife", "snow"], + ["bigKey", "earthquake", "coin"], + ]; + } + //初始化内容(工具栏/录像操作执行函数) + init() { + this.toolbarAction = [ + [ + main.core.openKeyBoard, + main.core.openQuickShop, + core.openToolbox, + core.doSL, + ], + [main.core.save, main.core.load, main.core.openSettings, core.doSL], + ]; + this.replayAction = [ + [core.triggerReplay, core.stopReplay, core.rewindReplay], + [ + core.speedDownReplay, + core.speedUpReplay, + function () { + core.control._replay_SL(); + }, + ], + ]; + } + //更新 + update() { + this._update_background(); //更新背景 + this._update_props(); //更新属性 + this._update_items(); //更新道具 + //this._update_equips(); //更新装备 + this._update_keys(); //更新钥匙 + //this._update_infoWindow(); //更新道具说明 + this._update_toolBox(); //更新工具栏 + this._redrawMap(); + } + _redrawMap() { + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 125, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 170 + ); + uictx.globalAlpha = 1; + } + } + //更新背景 + _update_background() { + if (core.domStyle.isVertical) { + bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT + j * 30 * 3, - posy = ITEM_BOX_TOP + i * 31 * 3; - drawItem(item, posx, posy); - } - }); - } - } + const bg = core.material.images.images["status.webp"]; //竖屏背景(上) + bgctx.drawImage( + bg, + 0, + 0, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) + bgctx.drawImage( + bg2, + 0, + BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + bgctx.globalAlpha = globalAlpha; + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } else { + bgctx.canvas.width = GAMEVIEW_WIDTH; + bgctx.canvas.height = GAMEVIEW_HEIGHT; + uictx.canvas.width = GAMEVIEW_WIDTH; + uictx.canvas.height = GAMEVIEW_HEIGHT; - _update_map(floorId = core.status.floorId) { - const x = core.domStyle.isVertical - ? MAP_BLOCK_LEFT_VERTICAL - : MAP_BLOCK_LEFT; - const y = core.domStyle.isVertical - ? MAP_BLOCK_TOP_VERTICAL - : MAP_BLOCK_TOP; + const bg = core.material.images.images["status.webp"]; //横屏背景(左) + bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); + const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) + bgctx.drawImage( + bg2, + BAR_WIDTH + GAMEVIEW_HEIGHT, + 0, + BAR_WIDTH, + GAMEVIEW_HEIGHT + ); + bgctx.globalAlpha = globalAlpha; - if (!floorId) return; - const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); - core.setTextAlign("outerUI", "center"); + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } + } + // 更新属性 + _update_props(updatedFloorTitle) { + if (!updatedFloorTitle && core.status.floorId) { + updatedFloorTitle = core.status.maps[core.status.floorId].title; + } + const statusList = [ + "hp", + "atk", + "def", + "spell", + "mdef", + "matk", + "mhp", + "speed", + "money", + "exp" + ]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) + const drawStatusList = (baseX, baseY) => { + let curh = baseY; + core.setTextAlign("outerUI", "right"); + statusList.forEach((item) => { + // 绘制图标 + /*core.drawIcon( + "outerUI", + item, + baseX - 95 * 3, + curh - 18 * 3, + 22 * 3, + 22 * 3 + );*/ + core.strokeRect("outerUI", baseX - 96 * 3, + curh - 16 * 3, 100 * 3, 22 * 3, "#FFFFFF", 3) + core.setFont("outerUI", "bold 24px Verdana"); + core.fillBoldText1( + "outerUI", + core.getStatusLabel(item), + baseX - 65 * 3, + curh - 4 * 3, + TEXT_COLOR, + "#000000", + 3 + ); + core.setFont("outerUI", "bold 36px Verdana"); + // 四舍五入 + core.status.hero[item] = Math.round(core.status.hero[item]); + let text = core.getRealStatus(item); + // 大数据格式化 + switch (item) { + case "mdef": + text += "%"; + break; + case "matk": + case "mhp": + text = `${Math.floor(core.getRealStatus("spell")* core.getRealStatus(item)/100)}(${text}%)`; + break; + } + core.fillBoldText1( + "outerUI", + text, + baseX, + curh, + TEXT_COLOR, + "#000000", + 3 + ) - core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); - } + curh += 24 * 3; + if (curh > 130 * 3 && core.domStyle.isVertical) { + curh = 24 * 3; + baseX += 105 * 3; + } + }); + core.setTextAlign("outerUI", "center"); + }; + if (core.domStyle.isVertical) { + core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); + core.setFont("outerUI", "bold 42px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 60 * 3, + 22 * 3, + TEXT_COLOR, + "#000000", + 3 + ); + } + drawStatusList(96 * 3, 46 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 0) + //core.drawImage("outerUI", "cao.webp", 0, 0); + } else { + core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); + core.setFont("outerUI", "bold 48px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 62 * 3, + 41 * 3, + TEXT_COLOR, + "#000000", + 3 + ); + } + drawStatusList(110 * 3, 93 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 30); + core.drawImage( + "outerUI", + "cao.webp", + 0, + 0, + 400, + 350, + 0, + 30, + 360, + 315 + ); + } + } + _update_items() { + //更新道具栏 + const drawItemMx = (drawFn) => { + for (let i = 0; i < this.itemMx.length; i++) { + for (let j = 0; j < this.itemMx[i].length; j++) { + var item = this.itemMx[i][j]; + drawFn(i, j, item); + } + } + }; + const drawItem = (item, posx, posy) => { + const icon = core.material.icons.items[item], + image = core.material.images.items; + core.drawImage( + "outerUI", + image, + 0, + 32 * icon, + 32, + 32, + posx, + posy, + 30 * 3, + 30 * 3 + ); + const cnt = core.itemCount(item); + if ( + (core.items.items[item].cls === "tools" && cnt > 1) || + FORCE_COUNTABLE_ITEMS.includes(item) + ) { + core.fillText( + "outerUI", + cnt, + posx + 25 * 3, + posy + 28 * 3, + "#FFFFFF", + "bold 36px Verdana" + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT_VERTICAL, + ITEM_BOX_TOP_VERTICAL, + 185 * 3, + 125 * 3 + ); - _update_equips() { - return; - core.setFont("outerUI", "bold 48px Verdana"); - const drawEquip = (baseX, baseY, id, color, back) => { - if (!id) - core.fillText( - "outerUI", - back, - baseX + 20 * 3, - baseY + 22 * 3, - color - ); - else { - var icon = core.material.icons.items[id]; - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - baseX + 5 * 3, - baseY, - 32 * 3, - 32 * 3 - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - 90 * 3, - 130 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } else { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - 130 * 3, - 95 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } - } - _update_keys() { - const drawKeyList = (baseX, baseY) => { - const todraw = [], - keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; - let total = 0; - keyList.forEach(function (key, i) { - todraw[i] = core.itemCount(key); - total += todraw[i]; - }); + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, + posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; + drawItem(item, posx, posy); + } + }); + } else { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT, + ITEM_BOX_TOP, + 125 * 3, + 185 * 3 + ); - let dn = 3; - for (let i = 0; i <= dn; i++) { - let delta = i * 32 * 3; + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT + j * 30 * 3, + posy = ITEM_BOX_TOP + i * 31 * 3; + drawItem(item, posx, posy); + } + }); + } + } - if (core.domStyle.isVertical) { - this.drawKey(keyList[i], baseX, baseY + delta); - } else { - this.drawKey(keyList[i], baseX + delta, baseY); - } + _update_map(floorId = core.status.floorId) { + const x = core.domStyle.isVertical ? + MAP_BLOCK_LEFT_VERTICAL : + MAP_BLOCK_LEFT; + const y = core.domStyle.isVertical ? + MAP_BLOCK_TOP_VERTICAL : + MAP_BLOCK_TOP; - core.setFont("outerUI", "bold 48px Verdana"); - core.setTextAlign("outerUI", "left"); - if (core.domStyle.isVertical) { - core.fillText( - "outerUI", - todraw[i], - baseX + 20 * 3, - baseY + 14 * 3 + delta, - TEXT_COLOR - ); - } else { - core.fillText( - "outerUI", - todraw[i], - baseX + delta, - baseY + 32 * 3, - TEXT_COLOR - ); - } - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT_VERTICAL, - KEY_BLOCK_TOP_VERTICAL, - 45 * 3, - 130 * 3 - ); - drawKeyList( - KEY_BLOCK_LEFT_VERTICAL + 3 * 3, - KEY_BLOCK_TOP_VERTICAL + 5 * 3 - ); - } else { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT, - KEY_BLOCK_TOP, - 130 * 3, - 45 * 3 - ); - drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); - } - } - drawKey(key, x, y) { - let sx = 0, - sy = 0; + if (!floorId) return; + const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); + core.setTextAlign("outerUI", "center"); - if (key == "yellowKey") sx += 13; - else if (key == "blueKey") sx += 26; - else if (key == "greenKey") sx += 39; + core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); + } - core.drawImage( - "outerUI", - "maba.webp", - sx, - sy, - 13, - 26, - x, - y, - 13 * 3, - 26 * 3 - ); - } - _update_infoWindow() { - const itemId = this.selectedItem; - let text = ""; - if (this.selectedItem) { - text = core.replaceText(core.material.items[itemId]?.text); - if (text[0] == "," || text[0] == ",") text = text.substring(1); - } - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT_VERTICAL, - INFO_BLOCK_TOP_VERTICAL, - 300 * 3, - 120 * 3 - ); + _update_equips() { + return; + core.setFont("outerUI", "bold 48px Verdana"); + const drawEquip = (baseX, baseY, id, color, back) => { + if (!id) + core.fillText( + "outerUI", + back, + baseX + 20 * 3, + baseY + 22 * 3, + color + ); + else { + var icon = core.material.icons.items[id]; + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + baseX + 5 * 3, + baseY, + 32 * 3, + 32 * 3 + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + 90 * 3, + 130 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } else { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + 130 * 3, + 95 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } + } + _update_keys() { + const drawKeyList = (baseX, baseY) => { + const todraw = [], + keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; + let total = 0; + keyList.forEach(function (key, i) { + todraw[i] = core.itemCount(key); + total += todraw[i]; + }); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "left"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT_VERTICAL + 50 * 3, - INFO_BLOCK_TOP_VERTICAL + 27 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - INFO_BLOCK_TOP_VERTICAL + 8 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, - maxWidth: 275 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } else { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT, - INFO_BLOCK_TOP, - 115 * 3, - 230 * 3 - ); + let dn = 3; + for (let i = 0; i <= dn; i++) { + let delta = i * 32 * 3; - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "center"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT + 60 * 3, - INFO_BLOCK_TOP + 25 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT + 45 * 3, - INFO_BLOCK_TOP + 30 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT + 10 * 3, - top: INFO_BLOCK_TOP + 60 * 3, - maxWidth: 105 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } - } - showItemInfo(itemId) { - //展示道具说明 - this.selectedItem = itemId; - this._update_infoWindow(); - } - clearItemInfo() { - //清除道具说明 - this.selectedItem = null; - this._update_infoWindow(); - } - _update_toolBox() { - const tools = core.isReplaying() - ? [ - [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], - ["speedDown", "speedUp", "save"], - ] - : [ - ["keyboard", "shop", "pack", "T332"], - ["settings", "save", "load", "T331"], - ]; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT_VERTICAL, - TOOL_BOX_TOP_VERTICAL, - 115, - 130 - ); + if (core.domStyle.isVertical) { + this.drawKey(keyList[i], baseX, baseY + delta); + } else { + this.drawKey(keyList[i], baseX + delta, baseY); + } - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, - TOOL_BOX_TOP_VERTICAL + j * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } else { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT, - TOOL_BOX_TOP, - 130 * 3, - 80 * 3 - ); + core.setFont("outerUI", "bold 48px Verdana"); + core.setTextAlign("outerUI", "left"); + if (core.domStyle.isVertical) { + core.fillText( + "outerUI", + todraw[i], + baseX + 20 * 3, + baseY + 14 * 3 + delta, + TEXT_COLOR + ); + } else { + core.fillText( + "outerUI", + todraw[i], + baseX + delta, + baseY + 32 * 3, + TEXT_COLOR + ); + } + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT_VERTICAL, + KEY_BLOCK_TOP_VERTICAL, + 45 * 3, + 130 * 3 + ); + drawKeyList( + KEY_BLOCK_LEFT_VERTICAL + 3 * 3, + KEY_BLOCK_TOP_VERTICAL + 5 * 3 + ); + } else { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT, + KEY_BLOCK_TOP, + 130 * 3, + 45 * 3 + ); + drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); + } + } + drawKey(key, x, y) { + let sx = 0, + sy = 0; - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT + j * 31 * 3, - TOOL_BOX_TOP + i * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } - } - onclick(x, y) { - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const gridify = ([x, y], [gw, gh]) => { - return [Math.floor(x / gw), Math.floor(y / gh)]; - }; - const useItem = (itemId) => { - if (!core.hasItem(itemId)) return; + if (key == "yellowKey") sx += 13; + else if (key == "blueKey") sx += 26; + else if (key == "greenKey") sx += 39; - if (itemId != this.selectedItem) { - this.showItemInfo(itemId); - } else { - switch (itemId) { - case "centerFly": - core.ui._drawCenterFly(); - break; - case "book": - core.openBook(true); - break; - case "wand": - core.insertAction({ - type: "useItem", - id: itemId, - }); - break; - case "fly": - core.useItem(itemId, true); - break; - default: - core.useItem(itemId); - } - } - }; - const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const relativeTo = ([x, y], [ax, ay]) => { - return [x - ax, y - ay]; - }; - const pos = [x, y]; - if (core.domStyle.isVertical) { - const itemBox = makeBox( - [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], - [30 * 6 * 3, 31 * 4 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 30 * 3, - 31 * 3, - ]); - const itemId = this.itemMx[gx][gy]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], - [31 * 2 * 3, 31 * 4 * 3] - ); - if (inRect(pos, toolBox)) { - const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - const mapBox = makeBox( - [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], - [350, 350] - ); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - return; - } - /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) + core.drawImage( + "outerUI", + "maba.webp", + sx, + sy, + 13, + 26, + x, + y, + 13 * 3, + 26 * 3 + ); + } + _update_infoWindow() { + const itemId = this.selectedItem; + let text = ""; + if (this.selectedItem) { + text = core.replaceText(core.material.items[itemId]?.text); + if (text[0] == "," || text[0] == ",") text = text.substring(1); + } + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT_VERTICAL, + INFO_BLOCK_TOP_VERTICAL, + 300 * 3, + 120 * 3 + ); + + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "left"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT_VERTICAL + 50 * 3, + INFO_BLOCK_TOP_VERTICAL + 27 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + INFO_BLOCK_TOP_VERTICAL + 8 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, + maxWidth: 275 * 3, + color: "#D1CEFF", + fontSize: 24, + }); + } + } else { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT, + INFO_BLOCK_TOP, + 115 * 3, + 230 * 3 + ); + core.setFont("outerUI", "bold 36px Verdana") + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "center"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT + 60 * 3, + INFO_BLOCK_TOP + 25 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT + 45 * 3, + INFO_BLOCK_TOP + 30 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT + 10 * 3, + top: INFO_BLOCK_TOP + 60 * 3, + maxWidth: 105 * 3, + color: "#D1CEFF", + fontSize: 24, + }); + } + } + } + showItemInfo(itemId) { + //展示道具说明 + this.selectedItem = itemId; + this._update_infoWindow(); + } + clearItemInfo() { + //清除道具说明 + this.selectedItem = null; + this._update_infoWindow(); + } + _update_toolBox() { + const tools = core.isReplaying() ? [ + [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], + ["speedDown", "speedUp", "save"], + ] : [ + ["keyboard", "shop", "pack", "T332"], + ["save", "load", "settings", "T331"], + ]; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT_VERTICAL, + TOOL_BOX_TOP_VERTICAL, + 115, + 130 + ); + + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, + TOOL_BOX_TOP_VERTICAL + j * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } else { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT, + TOOL_BOX_TOP, + 130 * 3, + 80 * 3 + ); + + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT + j * 31 * 3, + TOOL_BOX_TOP + i * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } + } + onclick(x, y) { + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const gridify = ([x, y], [gw, gh]) => { + return [Math.floor(x / gw), Math.floor(y / gh)]; + }; + const useItem = (itemId) => { + if (!core.hasItem(itemId)) return; + + if (itemId != this.selectedItem) { + this.showItemInfo(itemId); + } else { + switch (itemId) { + case "centerFly": + core.ui._drawCenterFly(); + break; + case "book": + core.openBook(true); + break; + default: + core.useItem(itemId); + } + } + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const relativeTo = ([x, y], [ax, ay]) => { + return [x - ax, y - ay]; + }; + const pos = [x, y]; + if (core.domStyle.isVertical) { + const itemBox = makeBox( + [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], + [30 * 6 * 3, 31 * 4 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 30 * 3, + 31 * 3, + ]); + const itemId = this.itemMx[gx][gy]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], + [31 * 2 * 3, 31 * 4 * 3] + ); + if (inRect(pos, toolBox)) { + const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + const mapBox = makeBox( + [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], + [350, 350] + ); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - } else { - const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - return; - } - /* + } else { + const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /* const equipBox = makeBox([EQUIP_BLOCK_LEFT, EQUIP_BLOCK_TOP], [130, 95]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - const itemBox = makeBox( - [ITEM_BOX_LEFT, ITEM_BOX_TOP], - [31 * 4 * 3, 30 * 6 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 31 * 3, - 30 * 3, - ]); - const itemId = this.itemMx[gy][gx]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT, TOOL_BOX_TOP], - [31 * 4 * 3, 31 * 2 * 3] - ); - if (inRect(pos, toolBox)) { - const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - } - } - } + const itemBox = makeBox( + [ITEM_BOX_LEFT, ITEM_BOX_TOP], + [31 * 4 * 3, 30 * 6 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 31 * 3, + 30 * 3, + ]); + const itemId = this.itemMx[gy][gx]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT, TOOL_BOX_TOP], + [31 * 4 * 3, 31 * 2 * 3] + ); + if (inRect(pos, toolBox)) { + const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + } + } + } - core.ui.statusBar = new StatusBar(); + core.ui.statusBar = new StatusBar(); - core.control.clearStatusBar = function () { - core.clearMap("outerUI"); - }; - // init() called in `afterLoadResources`. - }, + core.control.clearStatusBar = function () { + core.clearMap("outerUI"); + }; + // init() called in `afterLoadResources`. +}, "override": function () { - core.statusBar.icons = { - floor: 0, - name: null, - lv: 1, - hpmax: 2, - hp: 3, - atk: 4, - def: 5, - mdef: 6, - money: 7, - exp: 8, - up: 9, - book: 10, - fly: 11, - toolbox: 12, - keyboard: 13, - shop: 14, - save: 15, - load: 16, - settings: 17, - play: 18, - pause: 19, - stop: 20, - speedDown: 21, - speedUp: 22, - rewind: 23, - equipbox: 24, - mana: 25, - skill: 26, - exit: 27, - btn1: 28, - btn2: 29, - btn3: 30, - btn4: 31, - btn5: 32, - btn6: 33, - btn7: 34, - alt: 35, - keys: 36, - help: 37, - battle: 38, - }; - core.actions._getClickLoc = function (x, y) { - var size = 32 * core.domStyle.scale; - var left = main.dom.gameDraw.offsetLeft + main.dom.gameGroup.offsetLeft; - var top = main.dom.gameDraw.offsetTop + main.dom.gameGroup.offsetTop; - var loc = { - x: Math.max(x - left, 0), - y: Math.max(y - top, 0), - size: size, - }; - return loc; - }; - core.ui._drawWindowSelector = function (background, x, y, w, h) { - w = Math.round(w) + 48; - h = Math.round(h); - var ctx = core.ui.createCanvas("_selector", x - 24, y, w, h, 165); - ctx.canvas.id = ""; - this._drawSelector(ctx, background, w, h); - }; + core.statusBar.icons = { + floor: 0, + name: null, + lv: 1, + hpmax: 2, + hp: 3, + atk: 4, + def: 5, + mdef: 6, + money: 7, + exp: 8, + up: 9, + book: 10, + fly: 11, + toolbox: 12, + keyboard: 13, + shop: 14, + save: 15, + load: 16, + settings: 17, + play: 18, + pause: 19, + stop: 20, + speedDown: 21, + speedUp: 22, + rewind: 23, + equipbox: 24, + mana: 25, + skill: 26, + exit: 27, + btn1: 28, + btn2: 29, + btn3: 30, + btn4: 31, + btn5: 32, + btn6: 33, + btn7: 34, + alt: 35, + keys: 36, + help: 37, + battle: 38, + }; + core.actions._getClickLoc = function (x, y) { + var size = 32 * core.domStyle.scale; + var left = main.dom.gameDraw.offsetLeft + main.dom.gameGroup.offsetLeft; + var top = main.dom.gameDraw.offsetTop + main.dom.gameGroup.offsetTop; + var loc = { + x: Math.max(x - left, 0), + y: Math.max(y - top, 0), + size: size, + }; + return loc; + }; + /* core.ui._drawWindowSelector = function (background, x, y, w, h) { + w = Math.round(w) + 48; + h = Math.round(h); + var ctx = core.ui.createCanvas("_selector", x - 24, y, w, h, 165); + ctx.canvas.id = ""; + this._drawSelector(ctx, background, w, h); + }; - core.ui._drawSelector = function (ctx, background, w, h, left, top) { - left = left || 0; - top = top || 0; - ctx = this.getContextByName(ctx); - if (!ctx) return; - if (typeof background == "string") - background = core.material.images.images[background]; - if (!(background instanceof Image)) return; - // badge - ctx.drawImage(background, 132, 68, 24, 24, left + 4, top + 4, 24, 24); - ctx.drawImage( - background, - 132, - 68, - 24, - 24, - w - left - 28, - top + 4, - 24, - 24 - ); - }; + core.ui._drawSelector = function (ctx, background, w, h, left, top) { + left = left || 0; + top = top || 0; + ctx = this.getContextByName(ctx); + if (!ctx) return; + if (typeof background == "string") + background = core.material.images.images[background]; + if (!(background instanceof Image)) return; + // badge + ctx.drawImage(background, 132, 68, 24, 24, left + 4, top + 4, 24, 24); + ctx.drawImage( + background, + 132, + 68, + 24, + 24, + w - left - 28, + top + 4, + 24, + 24 + ); + };*/ - enemys.prototype._nextCriticals_useBinarySearch = function ( - enemy, - info, - number, - x, - y, - floorId - ) { - var mon_hp = info.mon_hp, - hero_atk = core.status.hero.atk, - mon_def = info.mon_def, - pre = info.damage; - var list = []; - var start_atk = hero_atk; - if (info.__over__) { - start_atk += info.__overAtk__; - list.push([info.__overAtk__, -info.damage]); - } - var calNext = function (currAtk, maxAtk) { - var start = Math.floor(currAtk), - end = Math.floor(maxAtk); - if (start > end) return null; + enemys.prototype._nextCriticals_useBinarySearch = function ( + enemy, + info, + number, + x, + y, + floorId + ) { + var mon_hp = info.mon_hp, + hero_atk = core.status.hero.atk, + mon_def = info.mon_def, + pre = info.damage; + var list = []; + var start_atk = hero_atk; + if (info.__over__) { + start_atk += info.__overAtk__; + list.push([info.__overAtk__, -info.damage]); + } + var calNext = function (currAtk, maxAtk) { + var start = Math.floor(currAtk), + end = Math.floor(maxAtk); + if (start > end) return null; - while (start < end) { - var mid = Math.floor((start + end) / 2); - if (mid - start > end - mid) mid--; - var nextInfo = core.enemys.getDamageInfo( - enemy, - { atk: mid }, - x, - y, - floorId - ); - if (nextInfo == null || typeof nextInfo == "number") return null; - if (pre > nextInfo.damage) end = mid; - else start = mid + 1; - } - var nextInfo = core.enemys.getDamageInfo( - enemy, - { atk: start }, - x, - y, - floorId - ); - return nextInfo == null || - typeof nextInfo == "number" || - nextInfo.damage >= pre - ? null - : [start, nextInfo.damage]; - }; - var currAtk = start_atk; - while (true) { - var next = calNext(currAtk + 1, Number.MAX_SAFE_INTEGER, pre); - if (next == null) break; - currAtk = next[0]; - pre = next[1]; - list.push([currAtk - hero_atk, info.damage - pre]); - if (pre <= 0 && !core.flags.enableNegativeDamage) break; - if (list.length >= number) break; - } - if (list.length == 0) list.push([0, 0]); - return list; - }; - core.ui.clearMap = function (name, x, y, width, height) { - if (name == "all") { - for (var m in core.canvas) { - core.canvas[m].clearRect( - -32, - -32, - core.canvas[m].canvas.width + 32, - core.canvas[m].canvas.height + 32 - ); - } - core.clearMap("outerUI"); - core.dom.gif.innerHTML = ""; - core.removeGlobalAnimate(); - core.deleteCanvas(function (one) { - return one.startsWith("_bigImage_"); - }); - core.setWeather(null); - } else { - var ctx = this.getContextByName(name); - if (ctx) - ctx.clearRect( - x || 0, - y || 0, - width || ctx.canvas.width, - height || ctx.canvas.height - ); - } - }; - events.prototype.openBook = function (fromUserAction) { - if (core.isReplaying()) return; - // 如果能恢复事件(从callBook事件触发) - if ( - core.status.event.id == "book" && - core.events.recoverEvents(core.status.event.interval) - ) - return; - // 当前是book,且从“浏览地图”打开 - if (core.status.event.id == "book" && core.status.event.ui) { - core.status.boxAnimateObjs = []; - core.ui._drawViewMaps(core.status.event.ui); - return; - } - // 从“浏览地图”页面打开 - if (core.status.event.id == "viewMaps" || core.status.event.id == "fly") { - fromUserAction = false; - core.status.event.ui = core.status.event.data; - } - if (!this._checkStatus("book", fromUserAction, true)) return; - core.playSound("打开界面"); - core.useItem("book", true); - }; - ////// 怪物手册界面时,放开某个键的操作 ////// - core.actions._keyUpBook = function (keycode) { - if (keycode == 27 || keycode == 88) { - core.playSound("取消"); - if (core.events.recoverEvents(core.status.event.interval)) { - return; - } else if (core.status.event.ui != null) { - core.status.boxAnimateObjs = []; - if (typeof core.status.event.ui === "number") { - core.status.event.id = "fly"; - core.ui.drawFly(core.status.event.ui); - } else { - core.ui._drawViewMaps(core.status.event.ui); - } - } else core.ui.closePanel(); - return; - } - if (keycode == 13 || keycode == 32 || keycode == 67) { - var data = core.status.event.data; - if (data != null) { - core.ui._drawBookDetail(data); - } - return; - } - }; - ////// 怪物手册界面的点击操作 ////// - actions.prototype._clickBook = function (x, y) { - var pageinfo = core.ui._drawBook_pageinfo(); - // 上一页 - if ( - (x == this._HX_ - 2 || x == this._HX_ - 3) && - y === core._HEIGHT_ - 1 - ) { - core.playSound("光标移动"); - core.ui.drawBook(core.status.event.data - pageinfo.per_page); - return; - } - // 下一页 - if ( - (x == this._HX_ + 2 || x == this._HX_ + 3) && - y === core._HEIGHT_ - 1 - ) { - core.playSound("光标移动"); - core.ui.drawBook(core.status.event.data + pageinfo.per_page); - return; - } - // 返回 - if (x >= this.LAST - 2 && y === core._HEIGHT_ - 1) { - core.playSound("取消"); - if (core.events.recoverEvents(core.status.event.interval)) { - return; - } else if (core.status.event.ui != null) { - core.status.boxAnimateObjs = []; - if (typeof core.status.event.ui === "number") { - core.status.event.id = "fly"; - core.ui.drawFly(core.status.event.ui); - } else { - core.ui._drawViewMaps(core.status.event.ui); - } - } else core.ui.closePanel(); - return; - } - // 怪物信息 - var data = core.status.event.data; - if (data != null && y < core._HEIGHT_ - 1) { - var per_page = pageinfo.per_page, - page = parseInt(data / per_page); - var u = (core._HEIGHT_ - 1) / per_page; - for (var i = 0; i < per_page; ++i) { - if (y >= u * i && y < u * (i + 1)) { - var index = per_page * page + i; - core.ui.drawBook(index); - core.ui._drawBookDetail(index); - break; - } - } - return; - } - return; - }; + while (start < end) { + var mid = Math.floor((start + end) / 2); + if (mid - start > end - mid) mid--; + var nextInfo = core.enemys.getDamageInfo( + enemy, { atk: mid }, + x, + y, + floorId + ); + if (nextInfo == null || typeof nextInfo == "number") return null; + if (pre > nextInfo.damage) end = mid; + else start = mid + 1; + } + var nextInfo = core.enemys.getDamageInfo( + enemy, { atk: start }, + x, + y, + floorId + ); + return nextInfo == null || + typeof nextInfo == "number" || + nextInfo.damage >= pre ? + null : [start, nextInfo.damage]; + }; + var currAtk = start_atk; + while (true) { + var next = calNext(currAtk + 1, Number.MAX_SAFE_INTEGER, pre); + if (next == null) break; + currAtk = next[0]; + pre = next[1]; + list.push([currAtk - hero_atk, info.damage - pre]); + if (pre <= 0 && !core.flags.enableNegativeDamage) break; + if (list.length >= number) break; + } + if (list.length == 0) list.push([0, 0]); + return list; + }; + core.ui.clearMap = function (name, x, y, width, height) { + if (name == "all") { + for (var m in core.canvas) { + core.canvas[m].clearRect( + -32, + -32, + core.canvas[m].canvas.width + 32, + core.canvas[m].canvas.height + 32 + ); + } + core.clearMap("outerUI"); + core.dom.gif.innerHTML = ""; + core.removeGlobalAnimate(); + core.deleteCanvas(function (one) { + return one.startsWith("_bigImage_"); + }); + core.setWeather(null); + } else { + var ctx = this.getContextByName(name); + if (ctx) + ctx.clearRect( + x || 0, + y || 0, + width || ctx.canvas.width, + height || ctx.canvas.height + ); + } + }; + events.prototype.openBook = function (fromUserAction) { + if (core.isReplaying()) return; + // 如果能恢复事件(从callBook事件触发) + if ( + core.status.event.id == "book" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + // 当前是book,且从“浏览地图”打开 + if (core.status.event.id == "book" && core.status.event.ui) { + core.status.boxAnimateObjs = []; + core.ui._drawViewMaps(core.status.event.ui); + return; + } + // 从“浏览地图”页面打开 + if (core.status.event.id == "viewMaps" || core.status.event.id == "fly") { + fromUserAction = false; + core.status.event.ui = core.status.event.data; + } + if (!this._checkStatus("book", fromUserAction, true)) return; + core.playSound("打开界面"); + core.useItem("book", true); + }; + ////// 怪物手册界面时,放开某个键的操作 ////// + core.actions._keyUpBook = function (keycode) { + if (keycode == 27 || keycode == 88) { + core.playSound("取消"); + if (core.events.recoverEvents(core.status.event.interval)) { + return; + } else if (core.status.event.ui != null) { + core.status.boxAnimateObjs = []; + if (typeof core.status.event.ui === "number") { + core.status.event.id = "fly"; + core.ui.drawFly(core.status.event.ui); + } else { + core.ui._drawViewMaps(core.status.event.ui); + } + } else core.ui.closePanel(); + return; + } + if (keycode == 13 || keycode == 32 || keycode == 67) { + var data = core.status.event.data; + if (data != null) { + core.ui._drawBookDetail(data); + } + return; + } + }; + ////// 怪物手册界面的点击操作 ////// + actions.prototype._clickBook = function (x, y) { + var pageinfo = core.ui._drawBook_pageinfo(); + // 上一页 + if ( + (x == this._HX_ - 2 || x == this._HX_ - 3) && + y === core._HEIGHT_ - 1 + ) { + core.playSound("光标移动"); + core.ui.drawBook(core.status.event.data - pageinfo.per_page); + return; + } + // 下一页 + if ( + (x == this._HX_ + 2 || x == this._HX_ + 3) && + y === core._HEIGHT_ - 1 + ) { + core.playSound("光标移动"); + core.ui.drawBook(core.status.event.data + pageinfo.per_page); + return; + } + // 返回 + if (x >= this.LAST - 2 && y === core._HEIGHT_ - 1) { + core.playSound("取消"); + if (core.events.recoverEvents(core.status.event.interval)) { + return; + } else if (core.status.event.ui != null) { + core.status.boxAnimateObjs = []; + if (typeof core.status.event.ui === "number") { + core.status.event.id = "fly"; + core.ui.drawFly(core.status.event.ui); + } else { + core.ui._drawViewMaps(core.status.event.ui); + } + } else core.ui.closePanel(); + return; + } + // 怪物信息 + var data = core.status.event.data; + if (data != null && y < core._HEIGHT_ - 1) { + var per_page = pageinfo.per_page, + page = parseInt(data / per_page); + var u = (core._HEIGHT_ - 1) / per_page; + for (var i = 0; i < per_page; ++i) { + if (y >= u * i && y < u * (i + 1)) { + var index = per_page * page + i; + core.ui.drawBook(index); + core.ui._drawBookDetail(index); + break; + } + } + return; + } + return; + }; - ////// 执行当前自定义事件列表中的下一个事件 ////// - events.prototype.doAction = function () { - // 清空boxAnimate和UI层 - clearInterval(core.status.event.interval); - clearTimeout(core.status.event.interval); - clearInterval(core.status.event.animateUI); - core.status.event.interval = null; - delete core.status.event.aniamteUI; - if (core.status.gameOver || core.status.replay.failed) return; - // 判定是否执行完毕 - if (this._doAction_finishEvents()) return; - core.clearUI(); - var floorId = core.status.event.data.floorId || core.status.floorId; - // 当前点坐标和前缀 - var x = core.status.event.data.x, - y = core.status.event.data.y; - var prefix = [ - floorId || ":f", - x != null ? x : "x", - y != null ? y : "y", - ].join("@"); - var current = core.status.event.data.list[0]; - if (this._popEvents(current, prefix)) return; - // 当前要执行的事件 - var data = current.todo.shift(); - core.status.event.data.current = data; - if (typeof data == "string") data = { type: "text", text: data }; - // 该事件块已经被禁用 - if (data._disabled) return core.doAction(); - if (data.type !== "cgtext") { - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - } - data.floorId = data.floorId || floorId; - core.status.event.data.type = data.type; - this.doEvent(data, x, y, prefix); - return; - }; + ////// 执行当前自定义事件列表中的下一个事件 ////// + events.prototype.doAction = function () { + // 清空boxAnimate和UI层 + clearInterval(core.status.event.interval); + clearTimeout(core.status.event.interval); + clearInterval(core.status.event.animateUI); + core.status.event.interval = null; + delete core.status.event.aniamteUI; + if (core.status.gameOver || core.status.replay.failed) return; + // 判定是否执行完毕 + if (this._doAction_finishEvents()) return; + core.clearUI(); + var floorId = core.status.event.data.floorId || core.status.floorId; + // 当前点坐标和前缀 + var x = core.status.event.data.x, + y = core.status.event.data.y; + var prefix = [ + floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + var current = core.status.event.data.list[0]; + if (this._popEvents(current, prefix)) return; + // 当前要执行的事件 + var data = current.todo.shift(); + core.status.event.data.current = data; + if (typeof data == "string") data = { type: "text", text: data }; + // 该事件块已经被禁用 + if (data._disabled) return core.doAction(); + if (data.type !== "cgtext") { + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + } + data.floorId = data.floorId || floorId; + core.status.event.data.type = data.type; + this.doEvent(data, x, y, prefix); + return; + }; - ////// 在某个canvas上绘制粗体 ////// - core.fillBoldText1 = function ( - name, - text, - x, - y, - style, - strokeStyle, - lineWidth, - font, - maxWidth - ) { - var ctx = this.getContextByName(name); - if (!ctx) return; - if (font) ctx.font = font; - if (!style) style = ctx.fillStyle; - style = core.arrayToRGBA(style); - if (!strokeStyle) strokeStyle = "#000000"; - strokeStyle = core.arrayToRGBA(strokeStyle); - if (maxWidth != null) { - this.setFontForMaxWidth(ctx, text, maxWidth); - } - ctx.strokeStyle = strokeStyle; + ////// 在某个canvas上绘制粗体 ////// + core.fillBoldText1 = function ( + name, + text, + x, + y, + style, + strokeStyle, + lineWidth, + font, + maxWidth + ) { + var ctx = this.getContextByName(name); + if (!ctx) return; + if (font) ctx.font = font; + if (!style) style = ctx.fillStyle; + style = core.arrayToRGBA(style); + if (!strokeStyle) strokeStyle = "#000000"; + strokeStyle = core.arrayToRGBA(strokeStyle); + if (maxWidth != null) { + this.setFontForMaxWidth(ctx, text, maxWidth); + } + ctx.strokeStyle = strokeStyle; - if (!lineWidth) lineWidth = 2; - ctx.lineWidth = lineWidth; - ctx.strokeText(text, x, y); - ctx.fillStyle = style; - ctx.fillText(text, x, y); - }; - }, + if (!lineWidth) lineWidth = 2; + ctx.lineWidth = lineWidth; + ctx.strokeText(text, x, y); + ctx.fillStyle = style; + ctx.fillText(text, x, y); + }; + ////// 绘制 WindowSkin + ui.prototype.drawWindowSkin = function ( + background, + ctx, + x, + y, + w, + h, + direction, + px, + py, + size = 1 + ) { + background = background || core.status.textAttribute.background; + + // 仿RM窗口皮肤 ↓ + // 绘制背景 + core.drawImage( + ctx, + background, + 0, + 0, + 128, + 128, + x + 2 * size, + y + 2 * size, + w - 4 * size, + h - 4 * size + ); + // 绘制边框 + // 上方 + core.drawImage( + ctx, + background, + 128, + 0, + 16, + 16, + x, + y, + 16 * size, + 16 * size + ); + for (var dx = 0; dx < w - 64 * size; dx += 32 * size) { + core.drawImage( + ctx, + background, + 144, + 0, + 32, + 16, + x + dx + 16 * size, + y, + 32 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 144, + 48, + 32, + 16, + x + dx + 16 * size, + y + h - 16 * size, + 32 * size, + 16 * size + ); + } + core.drawImage( + ctx, + background, + 144, + 0, + (w - dx - 32 * size) / size, + 16, + x + dx + 16 * size, + y, + w - dx - 32 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 144, + 48, + (w - dx - 32 * size) / size, + 16, + x + dx + 16 * size, + y + h - 16 * size, + w - dx - 32 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 176, + 0, + 16, + 16, + x + w - 16 * size, + y, + 16 * size, + 16 * size + ); + // 左右 + for (var dy = 0; dy < h - 64 * size; dy += 32 * size) { + core.drawImage( + ctx, + background, + 128, + 16, + 16, + 32, + x, + y + dy + 16 * size, + 16 * size, + 32 * size + ); + core.drawImage( + ctx, + background, + 176, + 16, + 16, + 32, + x + w - 16 * size, + y + dy + 16 * size, + 16 * size, + 32 * size + ); + } + core.drawImage( + ctx, + background, + 128, + 16, + 16, + (h - dy - 32 * size) / size, + x, + y + dy + 16 * size, + 16 * size, + h - dy - 32 * size + ); + core.drawImage( + ctx, + background, + 176, + 16, + 16, + (h - dy - 32 * size) / size, + x + w - 16 * size, + y + dy + 16 * size, + 16 * size, + h - dy - 32 * size + ); + //下方 + core.drawImage( + ctx, + background, + 128, + 48, + 16, + 16, + x, + y + h - 16 * size, + 16 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 176, + 48, + 16, + 16, + x + w - 16 * size, + y + h - 16 * size, + 16 * size, + 16 * size + ); + + // arrow + if (px != null && py != null) { + if (direction == "up") { + core.drawImage( + ctx, + background, + 128, + 96, + 32, + 32, + px, + y + h - 3 * size, + 32 * size, + 32 * size + ); + } else if (direction == "down") { + core.drawImage( + ctx, + background, + 160, + 96, + 32, + 32, + px, + y - 29 * size, + 32 * size, + 32 * size + ); + } + } + // 仿RM窗口皮肤 ↑ + }; + events.prototype.battle = function (id, x, y, force, callback) { + core.saveAndStopAutomaticRoute(); + id = id || core.getBlockId(x, y); + const cls = core.getClsFromId(id); + if (!id || !cls || !(cls === "enemys" || cls === "enemy48")) + return core.clearContinueAutomaticRoute(callback); + // 非强制战斗 + if (core.enemys.getDamage(id, x, y) === null && !force && !core.status.event.id) { + core.stopSound(); + core.playSound("操作失败"); + core.drawTip("你打不过此怪物!", id); + return core.clearContinueAutomaticRoute(callback); + } + // 自动存档 + if (!core.status.event.id) core.autosave(true); + // 战前事件 + if (!this.beforeBattle(id, x, y)) + return core.clearContinueAutomaticRoute(callback); + // 战后事件 + this.afterBattle(id, x, y); + if (callback) callback(); + }; + actions.prototype._sys_ondown_lockControl = function (x, y, px, py) { + if (core.status.played && !core.status.lockControl) return false; + + switch (core.status.event.id) { + case "battle": + core.plugin.battle_onclick(x, y, px, py); + break; + case "centerFly": + this._clickCenterFly(x, y, px, py); + break; + case "book": + this._clickBook(x, y, px, py); + break; + case "book-detail": + this._clickBookDetail(x, y, px, py); + break; + case "fly": + this._clickFly(x, y, px, py); + break; + case "viewMaps": + this._clickViewMaps(x, y, px, py); + break; + case "switchs": + this._clickSwitchs(x, y, px, py); + break; + case "switchs-sounds": + this._clickSwitchs_sounds(x, y, px, py); + break; + case "switchs-display": + this._clickSwitchs_display(x, y, px, py); + break; + case "switchs-action": + this._clickSwitchs_action(x, y, px, py); + break; + case "settings": + this._clickSettings(x, y, px, py); + break; + case "selectShop": + this._clickQuickShop(x, y, px, py); + break; + case "equipbox": + this._clickEquipbox(x, y, px, py); + break; + case "toolbox": + this._clickToolbox(x, y, px, py); + break; + case "save": + case "load": + case "replayLoad": + case "replayRemain": + case "replaySince": + this._clickSL(x, y, px, py); + break; + case "confirmBox": + this._clickConfirmBox(x, y, px, py); + break; + case "keyBoard": + this._clickKeyBoard(x, y, px, py); + break; + case "action": + this._clickAction(x, y, px, py); + break; + case "text": + core.drawText(); + break; + case "notes": + this._clickNotes(x, y, px, py); + break; + case "syncSave": + this._clickSyncSave(x, y, px, py); + break; + case "syncSelect": + this._clickSyncSelect(x, y, px, py); + break; + case "localSaveSelect": + this._clickLocalSaveSelect(x, y, px, py); + break; + case "storageRemove": + this._clickStorageRemove(x, y, px, py); + break; + case "cursor": + this._clickCursor(x, y, px, py); + break; + case "replay": + this._clickReplay(x, y, px, py); + break; + case "gameInfo": + this._clickGameInfo(x, y, px, py); + break; + case "about": + case "help": + core.ui.closePanel(); + break; + } + + // --- 长按判定 + if (core.timeout.onDownTimeout == null) { + core.timeout.onDownTimeout = setTimeout(function () { + if (core.interval.onDownInterval == null) { + core.interval.onDownInterval = setInterval(function () { + if (!core.actions.longClick(x, y, px, py)) { + clearInterval(core.interval.onDownInterval); + core.interval.onDownInterval = null; + } + }, 40); + } + }, 500); + } + return true; + }; + core.registerAction( + "ondown", + "_sys_ondown_lockControl", + core.actions._sys_ondown_lockControl, + 30 + ); + ////// 结束一切事件和绘制,关闭UI窗口,返回游戏进程 ////// + ui.prototype.closePanel = function () { + core.dom.saveLoad.style.display = "none" + if (core.status.hero && core.status.hero.flags) { + // 清除全部临时变量 + Object.keys(core.status.hero.flags).forEach(function (name) { + if (name.startsWith("@temp@") || /^arg\d+$/.test(name)) { + delete core.status.hero.flags[name]; + } + }); + } + this.clearUI(); + core.maps.generateGroundPattern(); + core.updateStatusBar(true); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + core.status.event.selection = null; + core.status.event.ui = null; + core.status.event.interval = null; + // 清除onDownInterval + clearInterval(core.interval.onDownInterval); + core.interval.onDownInterval = 'tmp'; + } + ////// 绘制提示同时播放错误音效 ////// + this.drawFailTip = function (text, id, frame) { + core.drawTip(text, id, frame); + core.playSound('error.opus'); + } + const floor = Math.floor + Math.floor = (a) => floor(a + 1e-8) +}, "额外信息": function () { /* 宝石血瓶左下角显示数值 * 注意!!!不要在道具属性中直接操作flags,使用core.status.hero.flags或core.setFlag系列函数代替! @@ -4195,2143 +4746,2626 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = } } }, + "跳伤": function () { + // 在此增加新插件 + /** + 函数使用说明 + Dove.MorePerform.ShowDamagePop.PopDamage( + 'ui', // 画布名称或画布2d上下文对象 + 100, 200, // 位置 (x, y) + -50, // 伤害值 + 24, // 字体大小 + "宋体",//字体 + '#FF0000', // 字体颜色 + '#000000', // 描边颜色 + 0.5, // 水平速度 (speedX) + -10, // 垂直速度 (speedY) + 0.5, // 重力 (gravity) + 120 // 显示时长(帧数) + */ + if (!core.registerAnimationFrame) { + throw new Error("require 2.6.1 or higher version"); + } + + window.Dove = window.Dove || {}; + Dove.MorePerform = Dove.MorePerform || {}; + + Dove.MorePerform.ShowDamagePop = {}; + Dove.MorePerform.ShowDamagePop.version = 1.0; + + Dove.MorePerform.ShowDamagePop.AllPopingCanvas = []; + + // 每帧的处理 + Dove.MorePerform.ShowDamagePop.Update = function () { + this.AllPopingCanvas = this.AllPopingCanvas.filter(function (spr) { + spr.update(); + return spr.isAlive(); + }); + if (!this.AllPopingCanvas.length) PopSprite._count = 0; + }; + + // 弹出伤害气泡 + Dove.MorePerform.ShowDamagePop.PopDamage = function ( + canvasName, + x, + y, + damageValue, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ) { + if (damageValue) { + var poper = new PopSprite( + canvasName, + x, + y, + damageValue, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ); + Dove.MorePerform.ShowDamagePop.AllPopingCanvas.push(poper); + } + }; + + // 战斗发生前后记录生命值并处理 + Dove.MorePerform.ShowDamagePop.OnBattle = core.events.battle; + core.events.battle = function () { + var hpBeforeBattle = core.status.hero.hp; + Dove.MorePerform.ShowDamagePop.OnBattle.apply(core.events, arguments); + if (core.getFlag("noAnimate")) + Dove.MorePerform.ShowDamagePop.PopDamage( + "ui", // 默认画布名称 + core.getHeroLoc("x") * 32, // 英雄位置 x + core.getHeroLoc("y") * 32, // 英雄位置 y + Math.floor(core.status.hero.hp - hpBeforeBattle), // 伤害值 + 16, // 默认字体大小 + "Arial", //默认字体 + null, // 默认颜色 + null, // 默认描边颜色 + null, // 默认水平速度 + null, // 默认垂直速度 + null, // 默认重力 + 90 // 默认显示时长(帧数) + ); + }; + // 注册每帧事件 + core.registerAnimationFrame("ShowDamagePop", true, (temptime) => { + + Dove.MorePerform.ShowDamagePop.Update.bind( + Dove.MorePerform.ShowDamagePop + )(); + + }); + + // 弹出精灵类 + function PopSprite( + canvasName, + x, + y, + damage, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ) { + this.initialize.apply(this, arguments); + } + + PopSprite.prototype = Object.create(Object.prototype); + PopSprite.prototype.constructor = PopSprite; + + // 常量 + PopSprite._count = 0; + PopSprite._baseZOrder = 50; + PopSprite._floorDis = 20; + + // 初始化 + PopSprite.prototype.initialize = function ( + canvasName, + x, + y, + damage, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ) { + this._canvasName = canvasName ?? "ui"; // 默认画布名称 + this._x = x; + this._y = y; + this._damage = damage; + this._fontSize = fontSize ?? 16; // 默认字体大小 + this._font = font ?? "Arial"; + this._fontColor = fontColor ?? (damage > 0 ? "#22FF44" : "lightcoral"); // 默认颜色 + this._outlineColor = outlineColor ?? "#FFFFFF"; // 默认描边颜色 + this._speedX = speedX ?? -1 + Math.random() * 2; // 水平速度,默认随机 + this._speedY = speedY ?? -3 - Math.random() * 4; // 垂直速度,默认随机 + this._gravity = gravity ?? 0.3; // 重力加速度,默认 0.3 + this._duration = duration ?? 180; // 显示时长(帧数),默认 180 帧 + this.initAllMembers(); + this.requestCanvas(); + }; + + // 自更新 + PopSprite.prototype.update = function () { + if (this._timer < this._duration) { + // 使用传入的显示时长 + this._x += this._vx; + this._y += this._vy; + this._vy += this._gravity; + if (this._y >= this._floorY) { + this._y = this._floorY; + this._vy *= -0.75; // 反弹衰减 + } + core.relocateCanvas(this._symbol, this._x, this._y); + core.setOpacity(this._symbol, 1 - this._timer / this._duration); // 根据显示时长设置透明度 + } else { + this.dispose(); + } + this._timer++; + }; + + // 申请并描绘canvas + PopSprite.prototype.requestCanvas = function () { + core.createCanvas( + this._symbol, + this._x, + this._y, + this._width + 4, + this._height + 4, + this._z + ); + + var canvas = core.getContextByName(this._symbol); + canvas.font = this._fontSize + "px " + this._font; // 动态设置字体大小 + canvas.fillStyle = this._fontColor; // 动态设置字体颜色 + canvas.strokeStyle = this._outlineColor; // 动态设置描边颜色 + canvas.strokeText(this._text, 2, this._height); + canvas.fillText(this._text, 2, this._height); + }; + + // 初始化所有成员变量 + PopSprite.prototype.initAllMembers = function () { + this._text = String(this._damage); + var uiContext = core.ui.getContextByName(this._canvasName); // 使用指定画布 + uiContext.font = this._fontSize + "px " + this._font; // 动态设置字体大小 + var textRect = uiContext.measureText(this._text); + this._width = textRect.width + 4; + this._height = this._fontSize + 4; // 动态设置高度 + this._z = uiContext.canvas.style.zIndex ? + Number(uiContext.canvas.style.zIndex) + PopSprite._count : + PopSprite._baseZOrder + PopSprite._count; + this._symbol = "popSprite" + PopSprite._count++; + this._alive = true; + this._vx = this._speedX; // 使用传入的水平速度 + this._vy = this._speedY; // 使用传入的垂直速度 + this._floorY = this._y + PopSprite._floorDis; + this._timer = 0; + }; + + // 判断是否存活 + PopSprite.prototype.isAlive = function () { + return this._alive; + }; + + // 释放 + PopSprite.prototype.dispose = function () { + this._alive = false; + core.deleteCanvas(this._symbol); + }; +}, "编辑器显伤": function () { - // 在此增加新插件 - /////// 用户设置 /////// - // 将__enable置为false将关闭插件 - var __enable = true; - // 魔防攻速之类的属性可以在这里加 ['atk', 'def', 'mdef'] - var heroStatus = ["atk", "def", "mdef", "hp"]; - // saveHero为true 将会把每次造塔测试时的角色数据存下来 否则会读取初始属性 - // 用不着可以关了 节约缓存空间 (虽然根本没多少 还没一个存档大 - // 也可以手动清理 控制台输入core.removeLocalStorage('editorHero')即可 - var saveHero = true; + // 在此增加新插件 + /////// 用户设置 /////// + // 将__enable置为false将关闭插件 + var __enable = true; + // 魔防攻速之类的属性可以在这里加 ['atk', 'def', 'mdef'] + var heroStatus = [ + "atk", + "def", + "spell", + "mdef", + "matk", + "mhp", + "speed", + "hp", + ]; + // saveHero为true 将会把每次造塔测试时的角色数据存下来 否则会读取初始属性 + // 用不着可以关了 节约缓存空间 (虽然根本没多少 还没一个存档大 + // 也可以手动清理 控制台输入core.removeLocalStorage('editorHero')即可 + var saveHero = true; - // 下为具体实现 懒得写注释了 大概就是写HTML然后注册交互 - if (!__enable || main.mode != "editor") return; - core.plugin.initEditorDamage = false; - if (heroStatus.length >= 4 && !editor.isMobile) - editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + "px"; - editor.statusRatio = core.getLocalStorage("statusRatio", 1); - editor.saveHero = saveHero; - editor._heroStatus = heroStatus; - editor.dom.mapEdit.appendChild(core.canvas.damage.canvas); - var HTML = - "<input type='button' value='←'/><input type='button' value='↑'/><input type='button' value='↓'/><input type='button' value='→'/><input type='button' id='bigmapBtn' value='大地图'' style='margin-left: '5px'/>"; + // 下为具体实现 懒得写注释了 大概就是写HTML然后注册交互 + if (!__enable || main.mode != "editor") return; + core.plugin.initEditorDamage = false; + if (heroStatus.length >= 4 && !editor.isMobile) { + editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + "px"; + editor.dom.mid.style.height = 730 + "px"; + document.querySelector("#mid .tools").style.height = 280 + "px"; + } + editor.statusRatio = core.getLocalStorage("statusRatio", 1); + editor.saveHero = saveHero; + editor._heroStatus = heroStatus; + editor.dom.mapEdit.appendChild(core.canvas.damage.canvas); + const viewportButtons = document.getElementById("viewportButtons"); - //if (heroStatus.length >= 4 && !editor.isMobile) editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + 'px'; - heroStatus.forEach(function (status) { - var id = status + "set", - id2 = status + "add", - id3 = status + "rec", - id4 = status + "help"; - HTML += - "<br/><input type='text' size='15' id='" + - id + - "'><input type='button' id='" + - id2 + - "' value = '+'><input type='button' id='" + - id3 + - "' value = '-'><input type='button' value='?' id = '" + - id4 + - "'>"; - }); - document.getElementById("viewportButtons").innerHTML = HTML; - ["set", "add", "rec", "help"].forEach(function (e) { - heroStatus.forEach(function (status) { - editor.dom[status + e] = document.getElementById(status + e); - }); - }); - var _hasItem = core.items.hasItem; - core.items.hasItem = function (itemId) { - if (itemId == "book" && main.mode == "editor") return true; - return _hasItem.call(core.items, itemId); - }; - if (main.mode == "editor") { - var applyList = [ - "getDamageString", - "nextCriticals", - "getEnemyInfo", - "getEnemyValue", - ]; - applyList.forEach(function (name) { - var func = core.enemys[name]; - core.enemys[name] = function () { - var args = - arguments.length === 1 - ? [arguments[0]] - : Array.apply(null, arguments); - if (typeof args[0] == "string") args[0] = core.enemys.enemys[args[0]]; - return func.apply(core.enemys, args); - }; - }); - } + var HTML = + "<input type='button' value='←'/><input type='button' value='↑'/><input type='button' value='↓'/><input type='button' value='→'/><input type='button' id='bigmapBtn' value='大地图'' style='margin-left: '5px'/>"; - ////// 获得勇士属性 ////// - core.control.getStatus = function (name) { - if (!core.status.hero) return null; - if (name == "x" || name == "y" || name == "direction") - return this.getHeroLoc(name); - /*if ( main.mode == 'editor' && !core.hasFlag('__statistics__')) { + //if (heroStatus.length >= 4 && !editor.isMobile) editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + 'px'; + heroStatus.forEach(function (status) { + var id = status + "set", + id2 = status + "add", + id3 = status + "rec", + id4 = status + "help"; + HTML += + "<br/>" + + core.getStatusLabel(status) + + "<text ><input type='text' size='" + + (15 - core.getStatusLabel(status).length * 2.5) + + "' id='" + + id + + "'><input type='button' id='" + + id2 + + "' value = '+'><input type='button' id='" + + id3 + + "' value = '-'><input type='button' value='?' id = '" + + id4 + + "'>"; + }); + document.getElementById("viewportButtons").innerHTML = HTML; + ["set", "add", "rec", "help"].forEach(function (e) { + heroStatus.forEach(function (status) { + editor.dom[status + e] = document.getElementById(status + e); + }); + }); + var _hasItem = core.items.hasItem; + core.items.hasItem = function (itemId) { + if (itemId == "book" && main.mode == "editor") return true; + return _hasItem.call(core.items, itemId); + }; + if (main.mode == "editor") { + var applyList = [ + "getDamageString", + "nextCriticals", + "getEnemyInfo", + "getEnemyValue", + ]; + applyList.forEach(function (name) { + var func = core.enemys[name]; + core.enemys[name] = function () { + var args = + arguments.length === 1 ? + [arguments[0]] : + Array.apply(null, arguments); + if (typeof args[0] == "string") args[0] = core.enemys.enemys[args[0]]; + return func.apply(core.enemys, args); + }; + }); + } + + ////// 获得勇士属性 ////// + core.control.getStatus = function (name) { + if (!core.status.hero) return null; + if (name == "x" || name == "y" || name == "direction") + return this.getHeroLoc(name); + /*if ( main.mode == 'editor' && !core.hasFlag('__statistics__')) { return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero[name]; }*/ - return core.status.hero[name]; - }; + return core.status.hero[name]; + }; - core.control.updateDamage = function (floorId, ctx) { - floorId = floorId || core.status.floorId; - if (!floorId || core.status.gameOver) return; - var onMap = ctx == null; - if (main.mode == "editor") { - ctx = core.canvas.damage; - core.updateCheckBlock(); - core.clearMap(ctx); - if (editor.uivalues.bigmap) return; - } + core.control.updateDamage = function (floorId, ctx) { + floorId = floorId || core.status.floorId; + if (!floorId || core.status.gameOver) return; + var onMap = ctx == null; + if (main.mode == "editor") { + ctx = core.canvas.damage; + core.updateCheckBlock(); + core.clearMap(ctx); + if (editor.uivalues.bigmap) return; + } - // 没有怪物手册 - if (!core.hasItem("book")) return; - core.status.damage.posX = core.bigmap.posX; - core.status.damage.posY = core.bigmap.posY; - if (!onMap) { - var width = core.floors[floorId].width, - height = core.floors[floorId].height; - // 地图过大的缩略图不绘制显伤 - if (width * height > core.bigmap.threshold) return; - } - this._updateDamage_damage(floorId, onMap); - this._updateDamage_extraDamage(floorId, onMap); - this.drawDamage(ctx); - }; + // 没有怪物手册 + if (!core.hasItem("book")) return; + core.status.damage.posX = core.bigmap.posX; + core.status.damage.posY = core.bigmap.posY; + if (!onMap) { + var width = core.floors[floorId].width, + height = core.floors[floorId].height; + // 地图过大的缩略图不绘制显伤 + if (width * height > core.bigmap.threshold) return; + } + this._updateDamage_damage(floorId, onMap); + this._updateDamage_extraDamage(floorId, onMap); + this.drawDamage(ctx); + }; - core.control.drawDamage = function (ctx) { - if ( - core.status.gameOver || - !core.status.damage /* || main.mode != 'play'*/ - ) - return; - var onMap = false; - if (ctx == null) { - ctx = core.canvas.damage; - core.clearMap("damage"); - onMap = true; - } + core.control.drawDamage = function (ctx) { + if ( + core.status.gameOver || + !core.status.damage /* || main.mode != 'play'*/ + ) + return; + var onMap = false; + if (ctx == null) { + ctx = core.canvas.damage; + core.clearMap("damage"); + onMap = true; + } - if (onMap && core.bigmap.v2) { - // 检查是否需要重算... - if ( - Math.abs(core.bigmap.posX - core.status.damage.posX) >= - core.bigmap.extend - 1 || - Math.abs(core.bigmap.posY - core.status.damage.posY) >= - core.bigmap.extend - 1 - ) { - return this.updateDamage(); - } - } - return this._drawDamage_draw(ctx, onMap); - }; + if (onMap && core.bigmap.v2) { + // 检查是否需要重算... + if ( + Math.abs(core.bigmap.posX - core.status.damage.posX) >= + core.bigmap.extend - 1 || + Math.abs(core.bigmap.posY - core.status.damage.posY) >= + core.bigmap.extend - 1 + ) { + return this.updateDamage(); + } + } + return this._drawDamage_draw(ctx, onMap); + }; - ////// 以x,y的形式返回每个点的事件 ////// - core.maps.getMapBlocksObj = function (floorId, noCache) { - floorId = floorId || core.status.floorId; - if ( - core.status.mapBlockObjs[floorId] && - !noCache && - main.mode != "editor" - ) - return core.status.mapBlockObjs[floorId]; + ////// 以x,y的形式返回每个点的事件 ////// + core.maps.getMapBlocksObj = function (floorId, noCache) { + floorId = floorId || core.status.floorId; + if ( + core.status.mapBlockObjs[floorId] && + !noCache && + main.mode != "editor" + ) + return core.status.mapBlockObjs[floorId]; - var obj = {}; - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - obj[block.x + "," + block.y] = block; - }); - core.status.mapBlockObjs[floorId] = obj; - return obj; - }; + var obj = {}; + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + obj[block.x + "," + block.y] = block; + }); + core.status.mapBlockObjs[floorId] = obj; + return obj; + }; - this.bignum = function (num, defaultValue) { - if (num == null || num == "") return defaultValue; - num = num + ""; - var list = { - w: 1e4, - e: 1e8, - z: 1e12, - j: 1e16, - g: 1e20, - }; - // 浮点数问题 - function checkFloat(num) { - if (!core.isset(num)) return 0; - num = num + ""; - var index = num.indexOf("."); - if (index < 0) return 0; - else return num.slice(index + 1).length; - } - var index = num.search(/w|e|z|j|g/); - if (index <= 0) { - num = parseInt(num); - if (core.isset(num)) return num; - else { - alert("不正确的输入"); - return defaultValue; - } - } - for (; index > 0; index = num.search(/w|e|z|j|g/)) { - var p = num[index], - q = list[p], - n = num.slice(0, index), - m = Math.pow(10, checkFloat(n)); - num = (n * m * q) / m + num.slice(index + 1); - } - return parseInt(num); - }; + this.bignum = function (num, defaultValue) { + if (num == null || num == "") return defaultValue; + num = num + ""; + var list = { + w: 1e4, + e: 1e8, + z: 1e12, + j: 1e16, + g: 1e20, + }; + // 浮点数问题 + function checkFloat(num) { + if (!core.isset(num)) return 0; + num = num + ""; + var index = num.indexOf("."); + if (index < 0) return 0; + else return num.slice(index + 1).length; + } + var index = num.search(/w|e|z|j|g/); + if (index <= 0) { + num = parseInt(num); + if (core.isset(num)) return num; + else { + alert("不正确的输入"); + return defaultValue; + } + } + for (; index > 0; index = num.search(/w|e|z|j|g/)) { + var p = num[index], + q = list[p], + n = num.slice(0, index), + m = Math.pow(10, checkFloat(n)); + num = (n * m * q) / m + num.slice(index + 1); + } + return parseInt(num); + }; - this.updateEditorDamage = function (noSave) { - core.updateDamage(); - heroStatus.forEach(function (status) { - editor.dom[status + "set"].value = core.status.hero[status]; - }); - if (!noSave && editor.saveHero) - core.setLocalStorage("editorHero", core.status.hero); - }; + this.updateEditorDamage = function (noSave) { + core.updateDamage(); + heroStatus.forEach(function (status) { + editor.dom[status + "set"].value = core.status.hero[status]; + }); + if (!noSave && editor.saveHero) + core.setLocalStorage("editorHero", core.status.hero); + }; - var _resizeMap = core.maps.resizeMap; - core.maps.resizeMap = function (floorId) { - _resizeMap.call(core.maps, floorId); - if (!core.plugin.initEditorDamage && main.mode == "editor") { - core.plugin.initEditorDamage = true; - var editorHero = core.getLocalStorage("editorHero"); - if (editorHero && saveHero) core.status.hero = editorHero; - else core.removeLocalStorage("editorHero"); - editor._heroStatus.forEach(function (e) { - editor.dom[e + "set"].onchange = function () { - var status = this.id.slice(0, -3); - core.status.hero[status] = core.bignum( - this.value, - core.status.hero[status] - ); - core.updateEditorDamage(); - }; - editor.dom[e + "add"].onclick = function () { - var status = this.id.slice(0, -3); - core.status.hero[status] += editor.statusRatio; - core.updateEditorDamage(); - }; - editor.dom[e + "rec"].onclick = function () { - var status = this.id.slice(0, -3); - core.status.hero[status] -= editor.statusRatio; - core.updateEditorDamage(); - }; - editor.dom[e + "help"].onclick = function () { - var status = this.id.slice(0, -4), - name = core.getStatusLabel(status); - var ratio = parseInt( - prompt( - "当前属性:" + - name + - "\n现在的点击按钮变化值:" + - editor.statusRatio + - ",请输入按下一次+/-按钮的属性变化量,可以写4w 10.2e这种字母缩写" - ) - ); - if (!core.isset(ratio)) { - printe("不合法的输入"); - return; - } - editor.statusRatio = ratio; - core.setLocalStorage("statusRatio", ratio); - }; - }); - var _updateMap = editor.updateMap; - editor.updateMap = function () { - _updateMap.call(editor); - core.updateEditorDamage(true); - }; - editor.mode.onmode = function (mode, callback) { - if (editor_mode.mode != mode) { - if (mode === "save") { - editor_mode.doActionList( - editor_mode.mode, - editor_mode.actionList, - function () { - if (callback) callback(); - core.updateEditorDamage(); - } - ); - } - if (editor_mode.mode === "nextChange" && mode) - editor_mode.showMode(mode); - if (mode !== "save") editor_mode.mode = mode; - editor_mode.actionList = []; - } - }; - } - }; - }, + var _resizeMap = core.maps.resizeMap; + core.maps.resizeMap = function (floorId) { + _resizeMap.call(core.maps, floorId); + if (!core.plugin.initEditorDamage && main.mode == "editor") { + core.plugin.initEditorDamage = true; + var editorHero = core.getLocalStorage("editorHero"); + if (editorHero && saveHero) core.status.hero = editorHero; + else core.removeLocalStorage("editorHero"); + editor._heroStatus.forEach(function (e) { + editor.dom[e + "set"].onchange = function () { + var status = this.id.slice(0, -3); + core.status.hero[status] = core.bignum( + this.value, + core.status.hero[status] + ); + if (status === "mdef" && core.status.hero[status] > 100) + core.status.hero[status] = 100; + core.updateEditorDamage(); + }; + editor.dom[e + "add"].onclick = function () { + var status = this.id.slice(0, -3); + core.status.hero[status] += editor.statusRatio; + if (status === "mdef" && core.status.hero[status] > 100) + core.status.hero[status] = 100; + core.updateEditorDamage(); + }; + editor.dom[e + "rec"].onclick = function () { + var status = this.id.slice(0, -3); + core.status.hero[status] -= editor.statusRatio; + core.updateEditorDamage(); + }; + editor.dom[e + "help"].onclick = function () { + var status = this.id.slice(0, -4), + name = core.getStatusLabel(status); + var ratio = parseInt( + prompt( + "当前属性:" + + name + + "\n现在的点击按钮变化值:" + + editor.statusRatio + + ",请输入按下一次+/-按钮的属性变化量,可以写4w 10.2e这种字母缩写" + ) + ); + if (!core.isset(ratio)) { + printe("不合法的输入"); + return; + } + editor.statusRatio = ratio; + core.setLocalStorage("statusRatio", ratio); + }; + }); + var _updateMap = editor.updateMap; + editor.updateMap = function () { + _updateMap.call(editor); + core.updateEditorDamage(true); + }; + editor.mode.onmode = function (mode, callback) { + if (editor_mode.mode != mode) { + if (mode === "save") { + editor_mode.doActionList( + editor_mode.mode, + editor_mode.actionList, + function () { + if (callback) callback(); + core.updateEditorDamage(); + } + ); + } + if (editor_mode.mode === "nextChange" && mode) + editor_mode.showMode(mode); + if (mode !== "save") editor_mode.mode = mode; + editor_mode.actionList = []; + } + }; + } + }; +}, "手册区分特殊属性": function () { - // 在此增加新插件 - this.arrsame = function (Arraya, Arrayb) { - let a = Arraya || []; - let b = Arrayb || []; - if (typeof a === "number") a = [a]; - if (typeof b === "number") b = [b]; - let c = [...a, ...b]; - for (const i of c) - if (!a.includes(i) || !b.includes(i)) { - return false; - } - return true; - }; - enemys.prototype.getCurrentEnemys = function (floorId) { - floorId = floorId || core.status.floorId; - var enemys = [], - used = {}; - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (!block.disable && block.event.cls.indexOf("enemy") == 0) { - this._getCurrentEnemys_addEnemy( - block.event.id, - enemys, - used, - block.x, - block.y, - floorId - ); - } - }, this); - return this._getCurrentEnemys_sort(enemys); - }; + // 在此增加新插件 + this.arrsame = function (Arraya, Arrayb) { + let a = Arraya || []; + let b = Arrayb || []; + if (typeof a === "number") a = [a]; + if (typeof b === "number") b = [b]; + let c = [...a, ...b]; + for (const i of c) + if (!a.includes(i) || !b.includes(i)) { + return false; + } + return true; + }; + enemys.prototype.getCurrentEnemys = function (floorId) { + floorId = floorId || core.status.floorId; + var enemys = [], + used = {}; + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (!block.disable && block.event.cls.indexOf("enemy") == 0) { + this._getCurrentEnemys_addEnemy( + block.event.id, + enemys, + used, + block.x, + block.y, + floorId + ); + } + }, this); + return this._getCurrentEnemys_sort(enemys); + }; - enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { - var enemy = core.material.enemys[enemyId]; - if (!enemy) return null; + enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { + var enemy = core.material.enemys[enemyId]; + if (!enemy) return null; - // 检查朝向;displayIdInBook - return ( - core.material.enemys[enemy.displayIdInBook] || - core.material.enemys[(enemy.faceIds || {}).down] || - enemy - ); - }; + // 检查朝向;displayIdInBook + return ( + core.material.enemys[enemy.displayIdInBook] || + core.material.enemys[(enemy.faceIds || {}).down] || + enemy + ); + }; - enemys.prototype._getCurrentEnemys_addEnemy = function ( - enemyId, - enemys, - used, - x, - y, - floorId - ) { - var enemy = this._getCurrentEnemys_getEnemy(enemyId); - if (enemy == null) return; + enemys.prototype._getCurrentEnemys_addEnemy = function ( + enemyId, + enemys, + used, + x, + y, + floorId + ) { + var enemy = this._getCurrentEnemys_getEnemy(enemyId); + if (enemy == null) return; - var id = enemy.id; + var id = enemy.id; - var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); - var locEnemyInfo = this.getEnemyInfo(enemy, null, x, y, floorId); - if ( - !core.flags.enableEnemyPoint || - (locEnemyInfo.atk == enemyInfo.atk && - locEnemyInfo.def == enemyInfo.def && - locEnemyInfo.hp == enemyInfo.hp && - core.plugin.arrsame(locEnemyInfo.special, enemyInfo.special)) - ) { - x = null; - y = null; - } else { - // 检查enemys里面是否使用了存在的内容 - for (var i = 0; i < enemys.length; ++i) { - var one = enemys[i]; - if ( - id == one.id && - one.locs != null && - locEnemyInfo.atk == one.atk && - locEnemyInfo.def == one.def && - locEnemyInfo.hp == one.hp && - core.plugin.arrsame(locEnemyInfo.special, one.special) - ) { - one.locs.push([x, y]); - return; - } - } - enemyInfo = locEnemyInfo; - } + var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); + var locEnemyInfo = this.getEnemyInfo(enemy, null, x, y, floorId); + if ( + !core.flags.enableEnemyPoint || + (locEnemyInfo.atk == enemyInfo.atk && + locEnemyInfo.def == enemyInfo.def && + locEnemyInfo.hp == enemyInfo.hp && + core.plugin.arrsame(locEnemyInfo.special, enemyInfo.special)) + ) { + x = null; + y = null; + } else { + // 检查enemys里面是否使用了存在的内容 + for (var i = 0; i < enemys.length; ++i) { + var one = enemys[i]; + if ( + id == one.id && + one.locs != null && + locEnemyInfo.atk == one.atk && + locEnemyInfo.def == one.def && + locEnemyInfo.hp == one.hp && + core.plugin.arrsame(locEnemyInfo.special, one.special) + ) { + one.locs.push([x, y]); + return; + } + } + enemyInfo = locEnemyInfo; + } - var id = enemy.id + ":" + x + ":" + y; - if (used[id]) return; - used[id] = true; + var id = enemy.id + ":" + x + ":" + y; + if (used[id]) return; + used[id] = true; - var specialText = core.enemys.getSpecialText(enemy, x, y, floorId); - var specialColor = core.enemys.getSpecialColor(enemy, x, y, floorId); + var specialText = core.enemys.getSpecialText(enemy, x, y, floorId); + var specialColor = core.enemys.getSpecialColor(enemy, x, y, floorId); - var critical = this.nextCriticals(enemy, 1, x, y, floorId); - if (critical.length > 0) critical = critical[0]; + var critical = this.nextCriticals(enemy, 1, x, y, floorId); + if (critical.length > 0) critical = critical[0]; + var criticalSpeed = core.nextCriticals_speed(enemy, 1, x, y, floorId); + if (criticalSpeed.length > 0) criticalSpeed = criticalSpeed[0]; + var criticalSpell = core.nextCriticals_spell(enemy, 1, x, y, floorId); + if (criticalSpell.length > 0) criticalSpell = criticalSpell[0]; + var e = core.clone(enemy); + for (var v in enemyInfo) { + e[v] = enemyInfo[v]; + } + if (x != null && y != null) { + e.locs = [ + [x, y] + ]; + } + e.name = core.getEnemyValue(enemy, "name", x, y, floorId); + e.specialText = specialText; + e.specialColor = specialColor; + e.damage = this.getDamage(enemy, x, y, floorId); + e.critical = critical[0]; + e.criticalDamage = critical[1]; + e.criticalAtk = [critical[0], critical[1]]; + e.criticalSpeed = criticalSpeed; + e.criticalSpell = criticalSpell; + e.defDamage = this._getCurrentEnemys_addEnemy_defDamage( + enemy, + x, + y, + floorId + ); + enemys.push(e); + }; - var e = core.clone(enemy); - for (var v in enemyInfo) { - e[v] = enemyInfo[v]; - } - if (x != null && y != null) { - e.locs = [[x, y]]; - } - e.name = core.getEnemyValue(enemy, "name", x, y, floorId); - e.specialText = specialText; - e.specialColor = specialColor; - e.damage = this.getDamage(enemy, x, y, floorId); - e.critical = critical[0]; - e.criticalDamage = critical[1]; - e.defDamage = this._getCurrentEnemys_addEnemy_defDamage( - enemy, - x, - y, - floorId - ); - enemys.push(e); - }; + enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( + enemy, + x, + y, + floorId + ) { + var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; + return this.getDefDamage(enemy, ratio, x, y, floorId); + }; - enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( - enemy, - x, - y, - floorId - ) { - var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; - return this.getDefDamage(enemy, ratio, x, y, floorId); - }; + enemys.prototype._getCurrentEnemys_sort = function (enemys) { + return enemys.sort(function (a, b) { + if (a.damage == b.damage) { + return a.money - b.money; + } + if (a.damage == null) { + return 1; + } + if (b.damage == null) { + return -1; + } + return a.damage - b.damage; + }); + }; - enemys.prototype._getCurrentEnemys_sort = function (enemys) { - return enemys.sort(function (a, b) { - if (a.damage == b.damage) { - return a.money - b.money; - } - if (a.damage == null) { - return 1; - } - if (b.damage == null) { - return -1; - } - return a.damage - b.damage; - }); - }; + ////// 获得所有特殊属性的名称 ////// + enemys.prototype.getSpecialText = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = this.getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var text = []; - ////// 获得所有特殊属性的名称 ////// - enemys.prototype.getSpecialText = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = this.getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var text = []; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + text.push(this._calSpecialContent(enemy, specials[i][1])); + } + } + return text; + }; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - text.push(this._calSpecialContent(enemy, specials[i][1])); - } - } - return text; - }; + ////// 获得所有特殊属性的颜色 ////// + enemys.prototype.getSpecialColor = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = this.getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var colors = []; - ////// 获得所有特殊属性的颜色 ////// - enemys.prototype.getSpecialColor = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = this.getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var colors = []; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + colors.push(specials[i][3] || null); + } + } + return colors; + }; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - colors.push(specials[i][3] || null); - } - } - return colors; - }; + ////// 获得所有特殊属性的额外标记 ////// + enemys.prototype.getSpecialFlag = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var flag = 0; - ////// 获得所有特殊属性的额外标记 ////// - enemys.prototype.getSpecialFlag = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var flag = 0; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + flag |= specials[i][4] || 0; + } + } + return flag; + }; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - flag |= specials[i][4] || 0; - } - } - return flag; - }; + ////// 获得每个特殊属性的说明 ////// + enemys.prototype.getSpecialHint = function (enemy, special) { + var specials = this.getSpecials(); + if (special == null) { + if (specials == null) return []; + var hints = []; + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(enemy, specials[i][0])) + hints.push( + "\r[" + + core.arrayToRGBA(specials[i][3] || "#FF6A6A") + + "]\\d" + + this._calSpecialContent(enemy, specials[i][1]) + + ":\\d\r[]" + + this._calSpecialContent(enemy, specials[i][2]) + ); + } + return hints; + } - ////// 获得每个特殊属性的说明 ////// - enemys.prototype.getSpecialHint = function (enemy, special) { - var specials = this.getSpecials(); - if (special == null) { - if (specials == null) return []; - var hints = []; - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(enemy, specials[i][0])) - hints.push( - "\r[" + - core.arrayToRGBA(specials[i][3] || "#FF6A6A") + - "]\\d" + - this._calSpecialContent(enemy, specials[i][1]) + - ":\\d\r[]" + - this._calSpecialContent(enemy, specials[i][2]) - ); - } - return hints; - } - - if (specials == null) return ""; - for (var i = 0; i < specials.length; i++) { - if (special == specials[i][0]) - return ( - "\r[#FF6A6A]\\d" + - this._calSpecialContent(enemy, specials[i][1]) + - ":\\d\r[]" + - this._calSpecialContent(enemy, specials[i][2]) - ); - } - return ""; - }; - ui.prototype._drawBook_drawName = function ( - index, - enemy, - top, - left, - width - ) { - // 绘制第零列(名称和特殊属性) - // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 - core.setTextAlign("ui", "center"); - if (core.enemys.getSpecialText(enemy).length == 0) { - core.fillText( - "ui", - enemy.name, - left + width / 2, - top + 35, - "#DDDDDD", - this._buildFont(17, true), - width - ); - } else { - core.fillText( - "ui", - enemy.name, - left + width / 2, - top + 28, - "#DDDDDD", - this._buildFont(17, true), - width - ); - switch (core.enemys.getSpecialText(enemy).length) { - case 1: - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[0], - left + width / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" - ), - this._buildFont(15, true), - width - ); - break; - case 2: - // Step 1: 计算字体 - var text = - core.enemys.getSpecialText(enemy)[0] + - " " + - core.enemys.getSpecialText(enemy)[1]; - core.setFontForMaxWidth( - "ui", - text, - width, - this._buildFont(15, true) - ); - // Step 2: 计算总宽度 - var totalWidth = core.calWidth("ui", text); - var leftWidth = core.calWidth( - "ui", - core.enemys.getSpecialText(enemy)[0] - ); - var rightWidth = core.calWidth( - "ui", - core.enemys.getSpecialText(enemy)[1] - ); - // Step 3: 绘制 - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[0], - left + (width + leftWidth - totalWidth) / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" - ) - ); - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[1], - left + (width + totalWidth - rightWidth) / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[1] || "#FF6A6A" - ) - ); - break; - default: - core.fillText( - "ui", - "多属性...", - left + width / 2, - top + 50, - "#FF6A6A", - this._buildFont(15, true), - width - ); - } - } - }; - ui.prototype._drawBookDetail_getInfo = function (index) { - var floorId = - core.floorIds[(core.status.event.ui || {}).index] || - core.status.floorId; - // 清除浏览地图时的光环缓存 - if (floorId != core.status.floorId && core.status.checkBlock) { - core.status.checkBlock.cache = {}; - } - var enemys = core.enemys.getCurrentEnemys(floorId); - console.log(123); - if (enemys.length == 0) return []; - index = core.clamp(index, 0, enemys.length - 1); - var enemy = enemys[index]; - var texts = core.enemys.getSpecialHint(enemy); - if (texts.length == 0) texts.push("该怪物无特殊属性。"); - if (enemy.description) texts.push(enemy.description + "\r"); - this._drawBookDetail_getTexts(enemy, floorId, texts); - texts.push(""); - return [enemy, texts]; - }; - }, + if (specials == null) return ""; + for (var i = 0; i < specials.length; i++) { + if (special == specials[i][0]) + return ( + "\r[#FF6A6A]\\d" + + this._calSpecialContent(enemy, specials[i][1]) + + ":\\d\r[]" + + this._calSpecialContent(enemy, specials[i][2]) + ); + } + return ""; + }; + ui.prototype._drawBook_drawName = function ( + index, + enemy, + top, + left, + width + ) { + // 绘制第零列(名称和特殊属性) + // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 + core.setTextAlign("ui", "center"); + if (core.enemys.getSpecialText(enemy).length == 0) { + core.fillText( + "ui", + enemy.name, + left + width / 2, + top + 35, + "#DDDDDD", + this._buildFont(17, true), + width + ); + } else { + core.fillText( + "ui", + enemy.name, + left + width / 2, + top + 28, + "#DDDDDD", + this._buildFont(17, true), + width + ); + switch (core.enemys.getSpecialText(enemy).length) { + case 1: + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[0], + left + width / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" + ), + this._buildFont(15, true), + width + ); + break; + case 2: + // Step 1: 计算字体 + var text = + core.enemys.getSpecialText(enemy)[0] + + " " + + core.enemys.getSpecialText(enemy)[1]; + core.setFontForMaxWidth( + "ui", + text, + width, + this._buildFont(15, true) + ); + // Step 2: 计算总宽度 + var totalWidth = core.calWidth("ui", text); + var leftWidth = core.calWidth( + "ui", + core.enemys.getSpecialText(enemy)[0] + ); + var rightWidth = core.calWidth( + "ui", + core.enemys.getSpecialText(enemy)[1] + ); + // Step 3: 绘制 + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[0], + left + (width + leftWidth - totalWidth) / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" + ) + ); + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[1], + left + (width + totalWidth - rightWidth) / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[1] || "#FF6A6A" + ) + ); + break; + default: + core.fillText( + "ui", + "多属性...", + left + width / 2, + top + 50, + "#FF6A6A", + this._buildFont(15, true), + width + ); + } + } + }; + ui.prototype._drawBookDetail_getInfo = function (index) { + var floorId = + core.floorIds[(core.status.event.ui || {}).index] || + core.status.floorId; + // 清除浏览地图时的光环缓存 + if (floorId != core.status.floorId && core.status.checkBlock) { + core.status.checkBlock.cache = {}; + } + var enemys = core.enemys.getCurrentEnemys(floorId); + console.log(123); + if (enemys.length == 0) return []; + index = core.clamp(index, 0, enemys.length - 1); + var enemy = enemys[index], + enemyId = enemy.id; + var texts = core.enemys.getSpecialHint(enemyId); + if (texts.length == 0) texts.push("该怪物无特殊属性。"); + if (enemy.description) texts.push(enemy.description + "\r"); + this._drawBookDetail_getTexts(enemy, floorId, texts); + texts.push(""); + return [enemy, texts]; + }; +}, "一防减伤": function () { - // 在此增加新插件 - ui.prototype._drawBook_drawRow3 = function ( - index, - enemy, - top, - left, - width, - position - ) { - // 绘制第三行 - core.setTextAlign("ui", "left"); - var b13 = this._buildFont(13, true), - f13 = this._buildFont(13, false); - var col1 = left, - col2 = left + (width * 9) / 25, - col3 = left + (width * 17) / 25; - core.fillText("ui", "临界", col1, position, "#DDDDDD", f13); - core.fillText( - "ui", - core.formatBigNumber(enemy.critical || 0), - col1 + 30, - position, - null, - b13 - ); - core.fillText("ui", "减伤", col2, position, null, f13); - core.fillText( - "ui", - core.formatBigNumber(enemy.criticalDamage || 0), - col2 + 30, - position, - null, - b13 - ); - //core.fillText('ui', '加防', col3, position, null, f13); - core.fillText("ui", "1防", col3, position, null, f13); - core.fillText( - "ui", - core.formatBigNumber(enemy.defDamage || 0), - col3 + 30, - position, - null, - b13 - ); - }; - ////// 1防减伤计算 ////// - enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId) { - if (typeof enemy == "string") enemy = core.material.enemys[enemy]; - k = k || 1; - var nowDamage = this._getDamage(enemy, null, x, y, floorId); - var nextDamage = this._getDamage( - enemy, - { def: core.status.hero.def + k }, - x, - y, - floorId - ); - if (nowDamage == null || nextDamage == null) return "???"; - return nowDamage - nextDamage; - }; - //防御倍数 - enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( - enemy, - x, - y, - floorId - ) { - var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; - //第一行为按照ratio值计算减防,第二行为1防减伤 - //return this.getDefDamage(enemy, ratio, x, y, floorId); - return this.getDefDamage(enemy, null, x, y, floorId); - }; - }, + // 在此增加新插件 + // + + ui.prototype._drawBook_drawRow3 = function ( + index, + enemy, + top, + left, + width, + position + ) { + // 绘制第三行 + core.setTextAlign("ui", "left"); + var b13 = this._buildFont(13, true), + f13 = this._buildFont(13, false); + var col1 = left, + col2 = left + (width * 9) / 25, + col3 = left + (width * 17) / 25; + core.fillText('ui', '攻击临界', col1 - 50, position, '#DDDDDD', f13); + core.fillText('ui', `[${core.formatBigNumber(enemy.criticalAtk?.[0] || 0)},${core.formatBigNumber(enemy.criticalAtk?.[1] || 0)}]`, col1 + 10, position, null, b13); + core.fillText('ui', '法强临界', col2 - 33, position, null, f13); + core.fillText('ui', `[${core.formatBigNumber(enemy.criticalSpell[0] || 0)},${core.formatBigNumber(enemy.criticalSpell?.[1] || 0)}]`, col2 + 27, position, null, b13); + //core.fillText('ui', '加防', col3, position, null, f13); + core.fillText("ui", "1防", col3, position, null, f13); + core.fillText( + "ui", + core.formatBigNumber(enemy.defDamage || 0), + col3 + 30, + position, + null, + b13 + ); + }; + ////// 1防减伤计算 ////// + enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId) { + if (typeof enemy == "string") enemy = core.material.enemys[enemy]; + k = k || 1; + var nowDamage = this._getDamage(enemy, null, x, y, floorId); + var nextDamage = this._getDamage( + enemy, { def: core.status.hero.def + k }, + x, + y, + floorId + ); + if (nowDamage == null || nextDamage == null) return "???"; + return nowDamage - nextDamage; + }; + //防御倍数 + enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( + enemy, + x, + y, + floorId + ) { + var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; + //第一行为按照ratio值计算减防,第二行为1防减伤 + //return this.getDefDamage(enemy, ratio, x, y, floorId); + return this.getDefDamage(enemy, null, x, y, floorId); + }; +}, "新道具栏/装备栏": function () { - // 在此增加新插件 - // 注:///// *** 裹起来的区域: 该区域内参数可以随意更改调整ui绘制 不会影响总体布局 - // 请尽量修改该区域而不是其他区域 修改的时候最好可以对照现有ui修改 + // 这个插件有点离谱 个人觉得参数过多只会降低可读性,还不如硬编码 - ///// *** 道具类型 - // cls对应name - var itemClsName = { - constants: "永久道具", - tools: "消耗道具", - }; - // 一页最大放的道具数量 将把整个道具左栏分成num份 每份是一个道具项 - var itemNum = 12; - ///// *** + // 注:///// *** 裹起来的区域: 该区域内参数可以随意更改调整ui绘制 不会影响总体布局 + // 请尽量修改该区域而不是其他区域 修改的时候最好可以对照现有ui修改 - // 背景设置 - this.drawBoxBackground = function (ctx) { - core.setTextAlign(ctx, "left"); - core.clearMap(ctx); - core.deleteCanvas("_selector"); - var info = core.status.thisUIEventInfo || {}; + ///// *** 道具类型 + // cls对应name + var itemClsName = { + constants: "永久道具", + tools: "消耗道具", + }; + // 一页最大放的道具数量 将把整个道具左栏分成num份 每份是一个道具项 + var itemNum = 12; + ///// *** - ///// *** 背景设置 - var max = core.__PIXELS__; - var x = 2, - y = x, - w = max - x * 2, - h = w; - var borderWidth = 2, - borderRadius = 5, // radius:圆角矩形的圆角半径 - borderStyle = "#fff"; - var backgroundColor = "gray"; - // 设置背景不透明度(0.85) - var backgroundAlpha = 0.85; - ///// *** + // 背景设置 + function drawBoxBackground(ctx) { + core.setTextAlign(ctx, "left"); + core.clearMap(ctx); + core.deleteCanvas("_selector"); + var info = core.status.thisUIEventInfo || {}; - var start_x = x + borderWidth / 2, - start_y = y + borderWidth / 2, - width = max - start_x * 2, - height = max - start_y * 2; + ///// *** 背景设置 + var max = core.__PIXELS__; + var x = 2, + y = x, + w = max - x * 2, + h = w; + var borderWidth = 2, + borderRadius = 5, // radius:圆角矩形的圆角半径 + borderStyle = "#fff"; + var backgroundColor = "gray"; + // 设置背景不透明度(0.85) + var backgroundAlpha = 0.85; + ///// *** - // 渐变色背景的一个例子(黑色渐变白色): - // 有关渐变色的具体知识请网上搜索canvas createGradient了解 - /* + var start_x = x + borderWidth / 2, + start_y = y + borderWidth / 2, + width = max - start_x * 2, + height = max - start_y * 2; + + // 渐变色背景的一个例子(黑色渐变白色): + // 有关渐变色的具体知识请网上搜索canvas createGradient了解 + /* var grd = ctx.createLinearGradient(x, y, x + w, y); grd.addColorStop(0, "black"); grd.addColorStop(1, "white"); backgroundColor = grd; */ - // 使用图片背景要注释掉下面的strokeRect和fillRoundRect - // 图片背景的一个例子: - /* + // 使用图片背景要注释掉下面的strokeRect和fillRoundRect + // 图片背景的一个例子: + /* core.drawImage(ctx, "xxx.png", x, y, w, h); core.strokeRect(ctx, x, y, w, h, borderStyle, borderWidth); */ - core.setAlpha(ctx, backgroundAlpha); - core.strokeRoundRect( - ctx, - x, - y, - w, - h, - borderRadius, - borderStyle, - borderWidth - ); - core.fillRoundRect( - ctx, - start_x, - start_y, - width, - height, - borderRadius, - backgroundColor - ); - core.setAlpha(ctx, 1); - - ///// *** 左栏配置 - var leftbar_height = height; - // 左边栏宽度(width*0.6) 本身仅为坐标使用 需要与底下的rightbar_width(width*0.4)同时更改 - var leftbar_width = width * 0.6; - ///// *** - - // xxx_right参数 代表最右侧坐标 - var leftbar_right = start_x + leftbar_width - borderWidth / 2; - var leftbar_bottom = start_y + leftbar_height; - var leftbar_x = start_x; - var leftbar_y = start_y; - - ///// *** 道具栏配置 - var boxName_color = "#fff"; - var boxName_fontSize = 15; - var boxName_font = core.ui._buildFont(boxName_fontSize, true); - var arrow_x = 10 + start_x; - var arrow_y = 10 + start_y; - var arrow_width = 20; - var arrow_style = "white"; - // 暂时只能是1 否则不太行 等待新样板(2.7.3)之后对drawArrow做优化 - var arrow_lineWidth = 1; - // 右箭头 - var rightArrow_right = leftbar_right - 10; - // 道具内栏顶部坐标 本质是通过该项 控制(道具栏顶部文字和箭头)与道具内栏顶部的间隔 - var itembar_top = arrow_y + 15; - ///// *** - - var itembar_right = rightArrow_right; - var boxName = - core.status.event.id == "toolbox" - ? "\r[yellow]道具栏\r | 装备栏" - : "道具栏 | \r[yellow]装备栏\r"; - core.drawArrow( - ctx, - arrow_x + arrow_width, - arrow_y, - arrow_x, - arrow_y, - arrow_style, - arrow_lineWidth - ); - core.drawArrow( - ctx, - rightArrow_right - arrow_width, - arrow_y, - rightArrow_right, - arrow_y, - arrow_style, - arrow_lineWidth - ); - core.setTextAlign(ctx, "center"); - core.setTextBaseline(ctx, "middle"); - var changeBox = function () { - var id = core.status.event.id; - core.closePanel(); - if (id == "toolbox") core.openEquipbox(); - else core.openToolbox(); - }; - core.fillText( - ctx, - boxName, - (leftbar_right + leftbar_x) / 2, - arrow_y + 2, - boxName_color, - boxName_font - ); - - ///// *** 底栏按钮 - var pageBtn_radius = 8; - // xxx_left 最左侧坐标 - var pageBtn_left = leftbar_x + 3; - var pageBtn_right = leftbar_right - 3; - // xxx_bottom 最底部坐标 - var pageBtn_bottom = leftbar_bottom - 2; - var pageBtn_borderStyle = "#fff"; - var pageBtn_borderWidth = 2; - var pageText_color = "#fff"; - // 底部按钮与上面的道具内栏的间隔大小 - var bottomSpace = 8; - ///// *** - - core.drawItemListbox_setPageBtn( - ctx, - pageBtn_left, - pageBtn_right, - pageBtn_bottom, - pageBtn_radius, - pageBtn_borderStyle, - pageBtn_borderWidth - ); - var page = info.page || 1; - var pageFontSize = pageBtn_radius * 2 - 4; - var pageFont = core.ui._buildFont(pageFontSize); - core.setPageItems(page); - var num = itemNum; - if (core.status.event.id == "equipbox") num -= 5; - var maxPage = info.maxPage; - var pageText = page + " / " + maxPage; - core.setTextAlign(ctx, "center"); - core.setTextBaseline(ctx, "bottom"); - core.fillText( - ctx, - pageText, - (leftbar_x + leftbar_right) / 2, - pageBtn_bottom, - pageText_color, - pageFont - ); - core.addUIEventListener( - start_x, - start_y, - leftbar_right - start_x, - arrow_y - start_y + 13, - changeBox - ); - var itembar_height = Math.ceil( - pageBtn_bottom - - pageBtn_radius * 2 - - pageBtn_borderWidth / 2 - - bottomSpace - - itembar_top - ); - var oneItemHeight = (itembar_height - 4) / itemNum; - return { - x: start_x, - y: start_y, - width: width, - height: height, - leftbar_right: leftbar_right, - obj: { - x: arrow_x, - y: itembar_top, - width: itembar_right - arrow_x, - height: itembar_height, - oneItemHeight: oneItemHeight, - }, - }; - }; - - this.drawItemListbox = function (ctx, obj) { - ctx = ctx || core.canvas.ui; - var itembar_x = obj.x, - itembar_y = obj.y, - itembar_width = obj.width, - itembar_height = obj.height, - itemNum = obj.itemNum, - oneItemHeight = obj.oneItemHeight; - var itembar_right = itembar_x + itembar_width; - var info = core.status.thisUIEventInfo || {}; - var obj = {}; - var page = info.page || 1, - index = info.index, - select = info.select || {}; - - ///// *** 道具栏内栏配置 - var itembar_style = "black"; - var itembar_alpha = 0.7; - // 一个竖屏下减少道具显示的例子: - // if (core.domStyle.isVertical) itemNum = 10; - // 每个道具项的上下空隙占总高度的比例 - var itembar_marginHeightRatio = 0.2; - // 左右间隔空隙 - var item_marginLeft = 2; - var item_x = itembar_x + 2, - item_y = itembar_y + 2, - item_right = itembar_right - 2, - itemName_color = "#fff"; - // 修改此项以更换闪烁光标 - var item_selector = "winskin.webp"; - ///// *** - - core.setAlpha(ctx, itembar_alpha); - core.fillRect( - ctx, - itembar_x, - itembar_y, - itembar_width, - itembar_height, - itembar_style - ); - core.setAlpha(ctx, 1); - var pageItems = core.setPageItems(page); - var marginHeight = itembar_marginHeightRatio * oneItemHeight; - core.setTextBaseline(ctx, "middle"); - var originColor = itemName_color; - for (var i = 0; i < pageItems.length; i++) { - itemName_color = originColor; - var item = pageItems[i]; - // 设置某个的字体颜色的一个例子 - // if (item.id == "xxx") itemName_color = "green"; - core.drawItemListbox_drawItem( - ctx, - item_x, - item_right, - item_y, - oneItemHeight, - item_marginLeft, - marginHeight, - itemName_color, - pageItems[i] - ); - if (index == i + 1) - core.ui._drawWindowSelector( - item_selector, - item_x + 1, - item_y - 1, - item_right - item_x - 2, - oneItemHeight - 2 - ); - item_y += oneItemHeight; - } - }; - - this.drawToolboxRightbar = function (ctx, obj) { - ctx = ctx || core.canvas.ui; - var info = core.status.thisUIEventInfo || {}; - var page = info.page || 1, - index = info.index || 1, - select = info.select || {}; - var start_x = obj.x, - start_y = obj.y, - width = obj.width, - height = obj.height; - var toolboxRight = start_x + width, - toolboxBottom = start_y + height; - - ///// *** 侧边栏(rightbar)背景设置(物品介绍) - var rightbar_width = width * 0.4; - var rightbar_height = height; - var rightbar_lineWidth = 2; - var rightbar_lineStyle = "#fff"; - ///// *** - - var rightbar_x = toolboxRight - rightbar_width - rightbar_lineWidth / 2; - var rightbar_y = start_y; - core.drawLine( - ctx, - rightbar_x, - rightbar_y, - rightbar_x, - rightbar_y + rightbar_height, - rightbar_lineStyle, - rightbar_lineWidth - ); - - // 获取道具id(有可能为null) - var itemId = select.id; - var item = core.material.items[itemId]; - - ///// *** 侧边栏物品Icon信息 - var iconRect_y = rightbar_y + 10; - // space:间距 - // 这里布局设定iconRect与侧边栏左边框 itemName与工具栏右边框 itemRect与itemName的间距均为space - var space = 15; - var iconRect_x = rightbar_x + space; - var iconRect_radius = 2, - iconRect_width = 32, - iconRect_height = 32, - iconRect_style = "#fff", - iconRect_lineWidth = 2; - ///// *** - - var iconRect_bottom = iconRect_y + iconRect_height, - iconRect_right = iconRect_x + iconRect_width; - - ///// *** 侧边栏各项信息 - var itemTextFontSize = 15, - itemText_x = iconRect_x - 4, - itemText_y = Math.floor(start_y + rightbar_height * 0.25), // 坐标取整防止模糊 - itemClsFontSize = 15, - itemClsFont = core.ui._buildFont(itemClsFontSize), - itemClsColor = "#fff", - itemCls_x = itemText_x - itemClsFontSize / 2, - itemCls_middle = (iconRect_bottom + itemText_y) / 2, //_middle代表文字的中心y坐标 - itemNameFontSize = 18, - itemNameColor = "#fff", - itemNameFont = core.ui._buildFont(itemNameFontSize, true); - var itemName_x = iconRect_right + space; - var itemName_middle = - iconRect_y + iconRect_height / 2 + iconRect_lineWidth; - // 修改这里可以编辑未选中道具时的默认值 - var defaultItem = { - cls: "constants", - name: "未知道具", - text: "没有道具最永久", - }; - var defaultEquip = { - cls: "equips", - name: "未知装备", - text: "一无所有,又何尝不是一种装备", - equipCls: "无", - equip: { - type: "装备", - }, - }; - ///// *** - - var originItem = item; - if (core.status.event.id == "equipbox") item = item || defaultEquip; - item = item || defaultItem; - var itemCls = item.cls, - itemName = item.name, - itemText = item.text; - itemText = core.replaceText(itemText); - if (itemText[0] == "," || itemText[0] == ",") - itemText = itemText.substring(1); - - /* 一个根据道具id修改道具名字(右栏)的例子 - * if (item.id == "xxx") itemNameColor = "red"; - */ - var itemClsName = core.getItemClsName(item); - var itemNameMaxWidth = - rightbar_width - iconRect_width - iconRect_lineWidth * 2 - space * 2; - core.strokeRoundRect( - ctx, - iconRect_x, - iconRect_y, - iconRect_width, - iconRect_height, - iconRect_radius, - iconRect_style, - iconRect_lineWidth - ); - if (item.id) - core.drawIcon( - ctx, - item.id, - iconRect_x + iconRect_lineWidth / 2, - iconRect_y + iconRect_lineWidth / 2, - iconRect_width - iconRect_lineWidth, - iconRect_height - iconRect_lineWidth - ); - core.setTextAlign(ctx, "left"); - core.setTextBaseline(ctx, "middle"); - if (itemCls === "equips" && item.id) { - itemName = "【" + item.equipCls + "】" + itemName; - } - core.fillText( - ctx, - itemName, - itemName_x, - itemName_middle, - itemNameColor, - itemNameFont, - itemNameMaxWidth - ); - if (!item.equip) - core.fillText( - ctx, - "【" + itemClsName + "】", - itemCls_x, - itemCls_middle, - itemClsColor, - itemClsFont - ); - - var statusText = ""; - if (core.status.event.id == "equipbox") { - var type = item.equip.type; - if (typeof type == "string") type = core.getEquipTypeByName(type); - var compare = core.compareEquipment(item.id, core.getEquip(type)); - var compare2; - if (item.equipCls === "双手剑") - compare2 = core.compareEquipment(null, core.getEquip(1)); - if (info.select.action == "unload") - compare = core.compareEquipment(null, item.id); - // --- 变化值... - for (var name in core.status.hero) { - if (typeof core.status.hero[name] != "number") continue; - var nowValue = core.getRealStatus(name); - // 查询新值 - var newValue = Math.floor( - ((core.getStatus(name) + - (compare.value[name] || 0) + - (compare2?.value[name] || 0)) * - (core.getBuff(name) * 100 + - (compare.percentage[name] || 0) + - (compare2?.percentage[name] || 0))) / - 100 - ); - if (nowValue == newValue) continue; - var color = newValue > nowValue ? "#00FF00" : "#FF0000"; - nowValue = core.formatBigNumber(nowValue); - newValue = core.formatBigNumber(newValue); - statusText += - core.getStatusLabel(name) + - " " + - nowValue + - "->\r[" + - color + - "]" + - newValue + - "\r\n"; - } - } - itemText = statusText + itemText; - if (item.equip) { - core.drawTextContent(ctx, itemText, { - left: itemText_x, - top: itemCls_middle, - bold: false, - color: "white", - align: "left", - fontSize: itemTextFontSize, - maxWidth: - rightbar_width - - (itemText_x - rightbar_x) * 2 + - itemTextFontSize / 2, - }); - } else { - core.drawTextContent(ctx, itemText, { - left: itemText_x, - top: itemText_y, - bold: false, - color: "white", - align: "left", - fontSize: itemTextFontSize, - maxWidth: - rightbar_width - - (itemText_x - rightbar_x) * 2 + - itemTextFontSize / 2, - }); - } - - ///// *** 退出按钮设置 - var btnRadius = 10; - var btnBorderWidth = 2; - var btnRight = toolboxRight - 2; - var btnBottom = toolboxBottom - 2; - var btnBorderStyle = "#fff"; - ///// *** - - // 获取圆心位置 - var btn_x = btnRight - btnRadius - btnBorderWidth / 2, - btn_y = btnBottom - btnRadius - btnBorderWidth / 2; - core.drawToolbox_setExitBtn( - ctx, - btn_x, - btn_y, - btnRadius, - btnBorderStyle, - btnBorderWidth - ); - - ///// *** 使用按钮设置 - var useBtnHeight = btnRadius * 2; - // 这里不设置useBtnWidth而是根据各项数据自动得出width - var useBtnRadius = useBtnHeight / 2; - var useBtn_x = rightbar_x + 4, - useBtn_y = btnBottom - useBtnHeight; - var useBtnBorderStyle = "#fff"; - var useBtnBorderWidth = btnBorderWidth; - ///// *** - - core.drawToolbox_setUseBtn( - ctx, - useBtn_x, - useBtn_y, - useBtnRadius, - useBtnHeight, - useBtnBorderStyle, - useBtnBorderWidth - ); - }; - - this.drawEquipbox_drawOthers = function (ctx, obj) { - var info = core.status.thisUIEventInfo; - - ///// *** 装备格设置 - var equipList_lineWidth = 2; - var equipList_boxSize = 32; - var equipList_borderWidth = 2; - var equipList_borderStyle = "#fff"; - var equipList_nameColor = "#fff"; - ///// *** - - var equipList_x = obj.x + 4, - equipList_bottom = obj.obj.y - equipList_lineWidth, - equipList_y = equipList_bottom - obj.obj.oneItemHeight * reduceItem - 2, - equipList_height = equipList_bottom - equipList_y; - var equipList_right = obj.leftbar_right, - equipList_width = equipList_right - equipList_x; - core.drawLine( - ctx, - obj.x, - equipList_bottom + equipList_lineWidth / 2, - equipList_right, - equipList_bottom + equipList_lineWidth / 2, - equipList_borderStyle, - equipList_lineWidth - ); - var toDrawList = core.status.globalAttribute.equipName, - len = toDrawList.length; - - ///// *** 装备格设置 - var maxItem = 2; - var box_width = 32, - box_height = 32, - box_borderStyle = "#fff", - box_selectBorderStyle = "gold", // 选中的装备格的颜色 - box_borderWidth = 2; - var boxName_fontSize = 14, - boxName_space = 2, - boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离 - var maxLine = Math.ceil(len / maxItem); - ///// *** - var l = Math.sqrt(len); - if (Math.pow(l) == len && len != 4) { - if (l <= maxItem) maxItem = l; - } - maxItem = Math.min(toDrawList.length, maxItem); - info.equips = maxItem; - - var boxName_font = core.ui._buildFont(boxName_fontSize); - // 总宽高减去所有装备格宽高得到空隙大小 - var oneBoxWidth = box_width + box_borderWidth * 2; - var oneBoxHeight = - box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth; - var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine), - space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem); - var box_x = equipList_x + space_x, - box_y = equipList_y + space_y + 12; - for (var i = 0; i < 2; i++) { - var id = core.getEquip(i), - name = toDrawList[i]; - if (i === 0) name = "主手"; - if (i === 1) name = "副手"; - var selectBorder = false; - if (core.status.thisUIEventInfo.select.type == i) selectBorder = true; - var borderStyle = selectBorder - ? box_selectBorderStyle - : box_borderStyle; - core.drawEquipbox_drawOne( - ctx, - name, - id, - box_x, - box_y, - box_width, - box_height, - boxName_space, - boxName_font, - boxName_color, - borderStyle, - box_borderWidth - ); - var todo = new Function( - "core.clickOneEquipbox('" + id + "'," + i + ")" - ); - core.addUIEventListener( - box_x - box_borderWidth / 2, - box_y - box_borderWidth / 2, - oneBoxWidth, - oneBoxHeight, - todo - ); - box_x += space_x + oneBoxWidth; - if ((i + 1) % maxItem == 0) { - box_x = equipList_x + space_x; - box_y += space_y + oneBoxHeight; - } - } - if (core.material.items[core.getEquip(0)]?.equipCls === "双手剑") { - core.drawLine( - ctx, - equipList_x + space_x + space_x + oneBoxWidth, - equipList_y + space_y + 12, - equipList_x + - space_x + - space_x + - oneBoxWidth + - box_width + - box_borderWidth, - equipList_y + space_y + box_height + 12 - ); - core.drawLine( - ctx, - equipList_x + space_x + space_x + oneBoxWidth, - equipList_y + space_y + box_height + 12, - equipList_x + - space_x + - space_x + - oneBoxWidth + - box_width + - box_borderWidth, - equipList_y + space_y + 12 - ); - } - ///// *** 装备格设置 - var maxItem = 3; - var box_width = 32, - box_height = 32, - box_borderStyle = "#fff", - box_selectBorderStyle = "gold", // 选中的装备格的颜色 - box_borderWidth = 2; - var boxName_fontSize = 14, - boxName_space = 2, - boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离 - var maxLine = Math.ceil(len / maxItem); - ///// *** - var l = Math.sqrt(len); - if (Math.pow(l) == len && len != 4) { - if (l <= maxItem) maxItem = l; - } - maxItem = Math.min(toDrawList.length, maxItem); - info.equips = maxItem; - - var boxName_font = core.ui._buildFont(boxName_fontSize); - // 总宽高减去所有装备格宽高得到空隙大小 - var oneBoxWidth = box_width + box_borderWidth * 2; - var oneBoxHeight = - box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth; - var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine), - space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem); - var box_x = equipList_x + space_x, - box_y = equipList_y + space_y + space_y + oneBoxHeight; - for (var i = 2; i < len; i++) { - var id = core.getEquip(i), - name = toDrawList[i]; - var selectBorder = false; - if (core.status.thisUIEventInfo.select.type == i) selectBorder = true; - var borderStyle = selectBorder - ? box_selectBorderStyle - : box_borderStyle; - core.drawEquipbox_drawOne( - ctx, - name, - id, - box_x, - box_y, - box_width, - box_height, - boxName_space, - boxName_font, - boxName_color, - borderStyle, - box_borderWidth - ); - var todo = new Function( - "core.clickOneEquipbox('" + id + "'," + i + ")" - ); - core.addUIEventListener( - box_x - box_borderWidth / 2, - box_y - box_borderWidth / 2, - oneBoxWidth, - oneBoxHeight, - todo - ); - box_x += space_x + oneBoxWidth; - } - }; - - this.drawToolbox = function (ctx) { - ctx = ctx || core.canvas.ui; - core.status.thisEventClickArea = []; - - var info = core.drawBoxBackground(ctx); - info.itemNum = itemNum; - core.drawItemListbox(ctx, info.obj); - core.drawToolboxRightbar(ctx, info); - core.setTextBaseline(ctx, "alphabetic"); - core.setTextAlign("left"); - }; - - var reduceItem = 4; - this.drawEquipbox = function (ctx) { - ctx = ctx || core.canvas.ui; - core.status.thisEventClickArea = []; - var info = core.drawBoxBackground(ctx); - info.itemNum = itemNum - reduceItem; - info.obj.y += info.obj.oneItemHeight * reduceItem; - info.obj.height -= info.obj.oneItemHeight * reduceItem; - core.drawItemListbox(ctx, info.obj); - core.drawEquipbox_drawOthers(ctx, info); - core.drawToolboxRightbar(ctx, info); - core.setTextBaseline(ctx, "alphabetic"); - core.setTextAlign("left"); - }; - - this.drawEquipbox_drawOne = function ( - ctx, - name, - id, - x, - y, - width, - height, - space, - font, - color, - style, - lineWidth - ) { - if (id) - core.drawIcon( - ctx, - id, - x + lineWidth / 2, - y + lineWidth / 2, - width, - height - ); - core.strokeRect( - ctx, - x, - y, - width + lineWidth, - height + lineWidth, - style, - lineWidth - ); - core.setTextAlign(ctx, "center"); - core.setTextBaseline(ctx, "top"); - var tx = (x + x + lineWidth / 2 + width) / 2, - ty = y + height + (lineWidth / 2) * 3 + space; - core.fillText(ctx, name, tx, ty, color, font); - core.setTextBaseline(ctx, "alphabetic"); - core.setTextAlign("left"); - }; - - this.drawItemListbox_drawItem = function ( - ctx, - left, - right, - top, - height, - marginLeft, - marginHeight, - style, - id - ) { - var info = core.status.thisUIEventInfo; - var nowClick = info.index; - var item = core.material.items[id] || {}; - var name = item.name || "???"; - var num = core.itemCount(id) || 0; - var fontSize = Math.floor(height - marginHeight * 2); - core.setTextAlign(ctx, "right"); - var numText = "x" + num; - core.fillText( - ctx, - numText, - right - marginLeft, - top + height / 2, - style, - core.ui._buildFont(fontSize) - ); - if (name != "???") - core.drawIcon( - ctx, - id, - left + marginLeft, - top + marginHeight, - fontSize, - fontSize - ); - var text_x = left + marginLeft + fontSize + 2; - var maxWidth = right - core.calWidth(ctx, numText) - text_x; - core.setTextAlign(ctx, "left"); - core.fillText( - ctx, - name, - text_x, - top + height / 2, - style, - core.ui._buildFont(fontSize), - maxWidth - ); - var todo = new Function("core.clickItemFunc('" + id + "');"); - core.addUIEventListener(left, top, right - left, height, todo); - }; - - this.setPageItems = function (page) { - var num = itemNum; - if (core.status.event.id == "equipbox") num -= reduceItem; - var info = core.status.thisUIEventInfo; - if (!info) return; - page = page || info.page; - var items = core.getToolboxItems( - core.status.event.id == "toolbox" ? "all" : "equips" - ); - info.allItems = items; - var maxPage = Math.ceil(items.length / num); - info.maxPage = maxPage; - var pageItems = items.slice((page - 1) * num, page * num); - info.pageItems = pageItems; - info.maxItem = pageItems.length; - if (items.length == 0 && pageItems.length == 0) info.index = null; - if (pageItems.length == 0 && info.page > 1) { - info.page = Math.max(1, info.page - 1); - return core.setPageItems(info.page); - } - return pageItems; - }; - - this.drawToolbox_setExitBtn = function (ctx, x, y, r, style, lineWidth) { - core.strokeCircle(ctx, x, y, r, style, lineWidth); - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - var textSize = Math.sqrt(2) * r; - core.fillText( - ctx, - "x", - x, - y, - style, - core.ui._buildFont(textSize), - textSize - ); - core.setTextAlign(ctx, "start"); - core.setTextBaseline(ctx, "top"); - - var todo = function () { - core.closePanel(); - }; - core.addUIEventListener(x - r, y - r, r * 2, r * 2, todo); - }; - - this.drawToolbox_setUseBtn = function (ctx, x, y, r, h, style, lineWidth) { - core.setTextAlign(ctx, "left"); - core.setTextBaseline(ctx, "top"); - var fontSize = h - 4; - var font = core.ui._buildFont(fontSize); - var text = core.status.event.id == "toolbox" ? "使用" : "装备"; - if (core.status.thisUIEventInfo.select.action == "unload") text = "卸下"; - var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2; - - core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth); - core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font); - - var todo = function () { - core.useSelectItemInBox(); - }; - core.addUIEventListener(x, y, w, h, todo); - }; - - this.drawItemListbox_setPageBtn = function ( - ctx, - left, - right, - bottom, - r, - style, - lineWidth - ) { - var offset = lineWidth / 2 + r; - - var x = left + offset; - var y = bottom - offset; - var pos = (Math.sqrt(2) / 2) * (r - lineWidth / 2); - core.fillPolygon( - ctx, - [ - [x - pos, y], - [x + pos - 2, y - pos], - [x + pos - 2, y + pos], - ], - style - ); - core.strokeCircle(ctx, x, y, r, style, lineWidth); - var todo = function () { - core.addItemListboxPage(-1); - }; - core.addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); - - x = right - offset; - core.fillPolygon( - ctx, - [ - [x + pos, y], - [x - pos + 2, y - pos], - [x - pos + 2, y + pos], - ], - style - ); - core.strokeCircle(ctx, x, y, r, style, lineWidth); - var todo = function () { - core.addItemListboxPage(1); - }; - core.addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); - }; - - this.clickItemFunc = function (id) { - var info = core.status.thisUIEventInfo; - if (!info) return; - if (info.select.id == id) return core.useSelectItemInBox(); - info.select = {}; - info.select.id = id; - core.setIndexAndSelect("index"); - core.refreshBox(); - }; - - this.clickOneEquipbox = function (id, type) { - var info = core.status.thisUIEventInfo; - if (!info) return; - if (info.select.id == id && info.select.type == type) - core.useSelectItemInBox(); - else - core.status.thisUIEventInfo.select = { - id: id, - type: type, - action: "unload", - }; - return core.refreshBox(); - }; - - core.ui.getToolboxItems = function (cls) { - var list = Object.keys(core.status.hero.items[cls] || {}); - if (cls == "all") { - for (var name in core.status.hero.items) { - if (name == "equips") continue; - list = list.concat(Object.keys(core.status.hero.items[name])); - } - return list - .filter(function (id) { - return !core.material.items[id].hideInToolbox; - }) - .sort(); - } - - if (this.uidata.getToolboxItems) { - return this.uidata.getToolboxItems(cls); - } - return list - .filter(function (id) { - return !core.material.items[id].hideInToolbox; - }) - .sort(); - }; - - this.useSelectItemInBox = function () { - var info = core.status.thisUIEventInfo; - if (!info) return; - if (!info.select.id) return; - var id = info.select.id; - if (core.status.event.id == "toolbox") { - core.events.tryUseItem(id); - // core.closePanel(); - } else if (core.status.event.id == "equipbox") { - var action = info.select.action || "load"; - info.index = 1; - if (action == "load") { - var type = core.getEquipTypeById(id); - let equipClsid = core.material.items[id]?.equipCls; - let equipCls0 = core.material.items[core.getEquip(0)]?.equipCls; - let equipCls1 = core.material.items[core.getEquip(1)]?.equipCls; - if (equipClsid === "双手剑") { - core.unloadEquip(0, function () { - core.status.route.push("unEquip:" + 0); - }); - core.unloadEquip(1, function () { - core.status.route.push("unEquip:" + 1); - }); - } - core.loadEquip(id, function () { - core.status.route.push("equip:" + id); - info.select.type = type; - core.setIndexAndSelect("select"); - core.drawEquipbox(); - }); - } else { - var type = info.select.type; - core.unloadEquip(type, function () { - core.status.route.push("unEquip:" + type); - info.select.type = type; - //info.select.action = 'load' - core.setIndexAndSelect("select"); - core.drawEquipbox(); - }); - } - } - core.updateStatusBar(); - }; - this.setIndexAndSelect = function (toChange) { - var info = core.status.thisUIEventInfo; - if (!info) return; - core.setPageItems(info.page); - var index = info.index || 1; - var items = info.pageItems; - if (info.select.type != null) { - var type = info.select.type; - id = core.getEquip(type); - info.index = null; - info.select = { - id: id, - action: "unload", - type: type, - }; - return; - } else { - info.select.action = null; - info.select.type = null; - if (toChange == "index") info.index = items.indexOf(info.select.id) + 1; - info.select.id = items[info.index - 1]; - } - }; - - this.addItemListboxPage = function (num) { - var info = core.status.thisUIEventInfo; - if (!info) return; - var maxPage = info.maxPage || 1; - info.page = info.page || 1; - info.page += num; - if (info.page <= 0) info.page = maxPage; - if (info.page > maxPage) info.page = 1; - info.index = 1; - core.setPageItems(info.page); - core.setIndexAndSelect("select"); - core.refreshBox(); - }; - - this.addItemListboxIndex = function (num) { - var info = core.status.thisUIEventInfo; - if (!info) return; - var maxItem = info.maxItem || 0; - info.index = info.index || 0; - info.index += num; - if (info.index <= 0) info.index = 1; - if (info.index > maxItem) info.index = maxItem; - core.setIndexAndSelect("select"); - core.refreshBox(); - }; - - this.addEquipboxType = function (num) { - var info = core.status.thisUIEventInfo; - var type = info.select.type; - if (type == null && num > 0) info.select.type = 0; - else info.select.type = type + num; - var max = core.status.globalAttribute.equipName.length; - if (info.select.type >= max) { - info.select = {}; - core.setIndexAndSelect("select"); - return core.addItemListboxPage(0); - } else { - var m = Math.abs(info.select.type); - if (info.select.type < 0) info.select.type = max - m; - core.setIndexAndSelect("select"); - core.refreshBox(); - return; - } - }; - - core.actions._keyDownToolbox = function (keycode) { - if (!core.status.thisEventClickArea) return; - if (keycode == 37) { - // left - core.addItemListboxPage(-1); - return; - } - if (keycode == 38) { - // up - core.addItemListboxIndex(-1); - return; - } - if (keycode == 39) { - // right - core.addItemListboxPage(1); - return; - } - if (keycode == 40) { - // down - core.addItemListboxIndex(1); - return; - } - }; - - ////// 工具栏界面时,放开某个键的操作 ////// - core.actions._keyUpToolbox = function (keycode) { - if (keycode == 81) { - core.ui.closePanel(); - if (core.isReplaying()) core.control._replay_equipbox(); - else core.openEquipbox(); - return; - } - if (keycode == 84 || keycode == 27 || keycode == 88) { - core.closePanel(); - return; - } - if (keycode == 13 || keycode == 32 || keycode == 67) { - var info = core.status.thisUIEventInfo; - if (info.select) { - core.useSelectItemInBox(); - } - return; - } - }; - - core.actions._keyDownEquipbox = function (keycode) { - if (!core.status.thisEventClickArea) return; - if (keycode == 37) { - // left - var info = core.status.thisUIEventInfo; - if (info.index != null) return core.addItemListboxPage(-1); - return core.addEquipboxType(-1); - } - if (keycode == 38) { - // up - var info = core.status.thisUIEventInfo; - if (info.index == 1) { - info.select.type = core.status.globalAttribute.equipName.length - 1; - core.setIndexAndSelect(); - return core.refreshBox(); - } - if (info.index) return core.addItemListboxIndex(-1); - return core.addEquipboxType(-1 * info.equips); - } - if (keycode == 39) { - // right - var info = core.status.thisUIEventInfo; - if (info.index != null) return core.addItemListboxPage(1); - return core.addEquipboxType(1); - } - if (keycode == 40) { - // down - var info = core.status.thisUIEventInfo; - if (info.index) return core.addItemListboxIndex(1); - return core.addEquipboxType(info.equips); - } - }; - - core.actions._keyUpEquipbox = function (keycode, altKey) { - if (altKey && keycode >= 48 && keycode <= 57) { - core.items.quickSaveEquip(keycode - 48); - return; - } - if (keycode == 84) { - core.ui.closePanel(); - if (core.isReplaying()) core.control._replay_toolbox(); - else core.openToolbox(); - return; - } - if (keycode == 81 || keycode == 27 || keycode == 88) { - core.closePanel(); - return; - } - if (keycode == 13 || keycode == 32 || keycode == 67) { - var info = core.status.thisUIEventInfo; - if (info.select) core.useSelectItemInBox(); - return; - } - }; - - core.registerAction( - "ondown", - "inEventClickAction", - function (x, y, px, py) { - if (!core.status.thisEventClickArea) return false; - // console.log(px + "," + py); - var info = core.status.thisEventClickArea; - for (var i = 0; i < info.length; i++) { - var obj = info[i]; - if ( - px >= obj.x && - px <= obj.x + obj.width && - py > obj.y && - py < obj.y + obj.height - ) { - if (obj.todo) obj.todo(); - break; - } - } - return true; - }, - 51 - ); - core.registerAction( - "onclick", - "stopClick", - function () { - if (core.status.thisEventClickArea) return true; - }, - 51 - ); - - this.addUIEventListener = function (x, y, width, height, todo) { - if (!core.status.thisEventClickArea) return; - var obj = { - x: x, - y: y, - width: width, - height: height, - todo: todo, - }; - core.status.thisEventClickArea.push(obj); - }; - - this.initThisEventInfo = function () { - core.status.thisUIEventInfo = { - page: 1, - select: {}, - }; - core.status.thisEventClickArea = []; - }; - - this.refreshBox = function () { - if (!core.status.event.id) return; - if (core.status.event.id == "toolbox") core.drawToolbox(); - else core.drawEquipbox(); - }; - - core.ui.closePanel = function () { - if (core.status.hero && core.status.hero.flags) { - // 清除全部临时变量 - Object.keys(core.status.hero.flags).forEach(function (name) { - if (name.startsWith("@temp@") || /^arg\d+$/.test(name)) { - delete core.status.hero.flags[name]; - } - }); - } - this.clearUI(); - core.maps.generateGroundPattern(); - core.updateStatusBar(true); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - core.status.event.selection = null; - core.status.event.ui = null; - core.status.event.interval = null; - core.status.thisUIEventInfo = null; - core.status.thisEventClickArea = null; - }; - - this.getItemClsName = function (item) { - if (item == null) return itemClsName; - if (item.cls == "equips") { - if (typeof item.equip.type == "string") return item.equip.type; - var type = core.getEquipTypeById(item.id); - return core.status.globalAttribute.equipName[type]; - } else return itemClsName[item.cls] || item.cls; - }; - - core.events.openToolbox = function (fromUserAction) { - if (core.isReplaying()) return; - if (!this._checkStatus("toolbox", fromUserAction)) return; - core.initThisEventInfo(); - let info = core.status.thisUIEventInfo; - info.index = 1; - core.setIndexAndSelect("select"); - core.drawToolbox(); - }; - - core.events.openEquipbox = function (fromUserAction) { - if (core.isReplaying()) return; - if (!this._checkStatus("equipbox", fromUserAction)) return; - core.initThisEventInfo(); - let info = core.status.thisUIEventInfo; - info.select.type = 0; - core.setIndexAndSelect("select"); - core.drawEquipbox(); - }; - - core.control._replay_toolbox = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) - return core.drawTip("请等待当前事件的处理结束"); - - core.lockControl(); - core.status.event.id = "toolbox"; - core.drawToolbox(); - }; - - core.control._replay_equipbox = function () { - if (!core.isPlaying() || !core.isReplaying()) return; - if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); - if (core.isMoving() || core.status.replay.animate || core.status.event.id) - return core.drawTip("请等待当前事件的处理结束"); - - core.lockControl(); - core.status.event.id = "equipbox"; - core.drawEquipbox(); - }; - - core.control._replayAction_item = function (action) { - if (action.indexOf("item:") != 0) return false; - var itemId = action.substring(5); - if (!core.canUseItem(itemId)) return false; - if ( - core.material.items[itemId].hideInReplay || - core.status.replay.speed == 24 - ) { - core.useItem(itemId, false, core.replay); - return true; - } - core.status.event.id = "toolbox"; - core.initThisEventInfo(); - var info = core.status.thisUIEventInfo; - var items = core.getToolboxItems("all"); - core.setPageItems(1); - var index = items.indexOf(itemId) + 1; - info.page = Math.ceil(index / info.maxItem); - info.index = index % info.maxItem || info.maxItem; - core.setIndexAndSelect("select"); - core.setPageItems(info.page); - core.drawToolbox(); - setTimeout(function () { - core.ui.closePanel(); - core.useItem(itemId, false, core.replay); - }, core.control.__replay_getTimeout()); - return true; - }; - - core.control._replayAction_equip = function (action) { - if (action.indexOf("equip:") != 0) return false; - var itemId = action.substring(6); - var items = core.getToolboxItems("equips"); - var index = items.indexOf(itemId) + 1; - if (index < 1) return false; - core.status.route.push(action); - if ( - core.material.items[itemId].hideInReplay || - core.status.replay.speed == 24 - ) { - core.loadEquip(itemId, core.replay); - return true; - } - core.status.event.id = "equipbox"; - core.initThisEventInfo(); - var info = core.status.thisUIEventInfo; - core.setPageItems(1); - info.page = Math.ceil(index / info.maxItem); - info.index = index % info.maxItem || info.maxItem; - core.setIndexAndSelect("select"); - core.setPageItems(info.page); - core.drawEquipbox(); - setTimeout(function () { - core.ui.closePanel(); - core.loadEquip(itemId, core.replay); - }, core.control.__replay_getTimeout()); - return true; - }; - - core.control._replayAction_unEquip = function (action) { - if (action.indexOf("unEquip:") != 0) return false; - var equipType = parseInt(action.substring(8)); - if (!core.isset(equipType)) return false; - core.status.route.push(action); - if (core.status.replay.speed == 24) { - core.unloadEquip(equipType, core.replay); - return true; - } - core.status.event.id = "equipbox"; - core.initThisEventInfo(); - var info = core.status.thisUIEventInfo; - core.setPageItems(1); - info.select.type = equipType; - core.setIndexAndSelect(); - core.drawEquipbox(); - setTimeout(function () { - core.ui.closePanel(); - core.unloadEquip(equipType, core.replay); - }, core.control.__replay_getTimeout()); - return true; - }; - - core.registerReplayAction("item", core.control._replayAction_item); - core.registerReplayAction("equip", core.control._replayAction_equip); - core.registerReplayAction("unEquip", core.control._replayAction_unEquip); - }, + core.setAlpha(ctx, backgroundAlpha); + core.strokeRoundRect( + ctx, + x, + y, + w, + h, + borderRadius, + borderStyle, + borderWidth + ); + core.fillRoundRect( + ctx, + start_x, + start_y, + width, + height, + borderRadius, + backgroundColor + ); + core.setAlpha(ctx, 1); + + ///// *** 左栏配置 + var leftbar_height = height; + // 左边栏宽度(width*0.6) 本身仅为坐标使用 需要与底下的rightbar_width(width*0.4)同时更改 + var leftbar_width = width * 0.6; + ///// *** + + // xxx_right参数 代表最右侧坐标 + var leftbar_right = start_x + leftbar_width - borderWidth / 2; + var leftbar_bottom = start_y + leftbar_height; + var leftbar_x = start_x; + var leftbar_y = start_y; + + ///// *** 道具栏配置 + var boxName_color = "#fff"; + var boxName_fontSize = 15; + var boxName_font = core.ui._buildFont(boxName_fontSize, true); + var arrow_x = 10 + start_x; + var arrow_y = 10 + start_y; + var arrow_width = 20; + var arrow_style = "white"; + // 暂时只能是1 否则不太行 等待新样板(2.7.3)之后对drawArrow做优化 + var arrow_lineWidth = 2; + // 右箭头 + var rightArrow_right = leftbar_right - 10; + // 道具内栏顶部坐标 本质是通过该项 控制(道具栏顶部文字和箭头)与道具内栏顶部的间隔 + var itembar_top = arrow_y + 15; + ///// *** + + var itembar_right = rightArrow_right; + var boxName = + core.status.event.id == "toolbox" ? + "\r[yellow]道具栏\r | 装备栏" : + "道具栏 | \r[yellow]装备栏\r"; + core.drawArrow( + ctx, + arrow_x + arrow_width, + arrow_y, + arrow_x, + arrow_y, + arrow_style, + arrow_lineWidth + ); + core.drawArrow( + ctx, + rightArrow_right - arrow_width, + arrow_y, + rightArrow_right, + arrow_y, + arrow_style, + arrow_lineWidth + ); + core.setTextAlign(ctx, "center"); + core.setTextBaseline(ctx, "middle"); + var changeBox = function () { + var id = core.status.event.id; + core.closePanel(); + if (id == "toolbox") core.openEquipbox(); + else core.openToolbox(); + }; + core.fillText( + ctx, + boxName, + (leftbar_right + leftbar_x) / 2, + arrow_y + 2, + boxName_color, + boxName_font + ); + + ///// *** 底栏按钮 + var pageBtn_radius = 8; + // xxx_left 最左侧坐标 + var pageBtn_left = leftbar_x + 3; + var pageBtn_right = leftbar_right - 3; + // xxx_bottom 最底部坐标 + var pageBtn_bottom = leftbar_bottom - 2; + var pageBtn_borderStyle = "#fff"; + var pageBtn_borderWidth = 2; + var pageText_color = "#fff"; + // 底部按钮与上面的道具内栏的间隔大小 + var bottomSpace = 8; + ///// *** + + drawItemListbox_setPageBtn( + ctx, + pageBtn_left, + pageBtn_right, + pageBtn_bottom, + pageBtn_radius, + pageBtn_borderStyle, + pageBtn_borderWidth + ); + var page = info.page || 1; + var pageFontSize = pageBtn_radius * 2 - 4; + var pageFont = core.ui._buildFont(pageFontSize); + setPageItems(page); + var num = itemNum; + if (core.status.event.id == "equipbox") num -= 5; + var maxPage = info.maxPage; + var pageText = page + " / " + maxPage; + core.setTextAlign(ctx, "center"); + core.setTextBaseline(ctx, "bottom"); + core.fillText( + ctx, + pageText, + (leftbar_x + leftbar_right) / 2, + pageBtn_bottom, + pageText_color, + pageFont + ); + addUIEventListener( + start_x, + start_y, + leftbar_right - start_x, + arrow_y - start_y + 13, + changeBox + ); + var itembar_height = Math.ceil( + pageBtn_bottom - + pageBtn_radius * 2 - + pageBtn_borderWidth / 2 - + bottomSpace - + itembar_top + ); + var oneItemHeight = (itembar_height - 4) / itemNum; + return { + x: start_x, + y: start_y, + width: width, + height: height, + leftbar_right: leftbar_right, + obj: { + x: arrow_x, + y: itembar_top, + width: itembar_right - arrow_x, + height: itembar_height, + oneItemHeight: oneItemHeight, + }, + }; + } + + function drawItemListbox(ctx, obj) { + ctx = ctx || core.canvas.ui; + var itembar_x = obj.x, + itembar_y = obj.y, + itembar_width = obj.width, + itembar_height = obj.height, + itemNum = obj.itemNum, + oneItemHeight = obj.oneItemHeight; + var itembar_right = itembar_x + itembar_width; + var info = core.status.thisUIEventInfo || {}; + var obj = {}; + var page = info.page || 1, + index = info.index, + select = info.select || {}; + + ///// *** 道具栏内栏配置 + var itembar_style = "black"; + var itembar_alpha = 0.7; + // 一个竖屏下减少道具显示的例子: + // if (core.domStyle.isVertical) itemNum = 10; + // 每个道具项的上下空隙占总高度的比例 + var itembar_marginHeightRatio = 0.2; + // 左右间隔空隙 + var item_marginLeft = 2; + var item_x = itembar_x + 2, + item_y = itembar_y + 2, + item_right = itembar_right - 2, + itemName_color = "#fff"; + // 修改此项以更换闪烁光标 + var item_selector = "winskin.webp"; + ///// *** + + core.setAlpha(ctx, itembar_alpha); + core.fillRect( + ctx, + itembar_x, + itembar_y, + itembar_width, + itembar_height, + itembar_style + ); + core.setAlpha(ctx, 1); + var pageItems = setPageItems(page); + var marginHeight = itembar_marginHeightRatio * oneItemHeight; + core.setTextBaseline(ctx, "middle"); + var originColor = itemName_color; + for (var i = 0; i < pageItems.length; i++) { + itemName_color = originColor; + var item = pageItems[i]; + // 设置某个的字体颜色的一个例子 + // if (item.id == "xxx") itemName_color = "green"; + drawItemListbox_drawItem( + ctx, + item_x, + item_right, + item_y, + oneItemHeight, + item_marginLeft, + marginHeight, + itemName_color, + pageItems[i] + ); + if (index == i + 1) + core.ui._drawWindowSelector( + item_selector, + item_x + 1, + item_y - 1, + item_right - item_x - 2, + oneItemHeight - 2 + ); + item_y += oneItemHeight; + } + } + + function drawToolboxRightbar(ctx, obj) { + ctx = ctx || core.canvas.ui; + var info = core.status.thisUIEventInfo || {}; + var page = info.page || 1, + index = info.index || 1, + select = info.select || {}; + var start_x = obj.x, + start_y = obj.y, + width = obj.width, + height = obj.height; + var toolboxRight = start_x + width, + toolboxBottom = start_y + height; + + ///// *** 侧边栏(rightbar)背景设置(物品介绍) + var rightbar_width = width * 0.4; + var rightbar_height = height; + var rightbar_lineWidth = 2; + var rightbar_lineStyle = "#fff"; + ///// *** + + var rightbar_x = toolboxRight - rightbar_width - rightbar_lineWidth / 2; + var rightbar_y = start_y; + core.drawLine( + ctx, + rightbar_x, + rightbar_y, + rightbar_x, + rightbar_y + rightbar_height, + rightbar_lineStyle, + rightbar_lineWidth + ); + + // 获取道具id(有可能为null) + var itemId = select.id; + var item = core.material.items[itemId]; + + ///// *** 侧边栏物品Icon信息 + var iconRect_y = rightbar_y + 10; + // space:间距 + // 这里布局设定iconRect与侧边栏左边框 itemName与工具栏右边框 itemRect与itemName的间距均为space + var space = 15; + var iconRect_x = rightbar_x + space; + var iconRect_radius = 2, + iconRect_width = 32, + iconRect_height = 32, + iconRect_style = "#fff", + iconRect_lineWidth = 2; + ///// *** + + var iconRect_bottom = iconRect_y + iconRect_height, + iconRect_right = iconRect_x + iconRect_width; + + ///// *** 侧边栏各项信息 + var itemTextFontSize = 15, + itemText_x = iconRect_x - 4, + itemText_y = Math.floor(start_y + rightbar_height * 0.25), // 坐标取整防止模糊 + itemClsFontSize = 15, + itemClsFont = core.ui._buildFont(itemClsFontSize), + itemClsColor = "#fff", + itemCls_x = itemText_x - itemClsFontSize / 2, + itemCls_middle = (iconRect_bottom + itemText_y) / 2, //_middle代表文字的中心y坐标 + itemNameFontSize = 18, + itemNameColor = "#fff", + itemNameFont = core.ui._buildFont(itemNameFontSize, true); + var itemName_x = iconRect_right + space; + var itemName_middle = + iconRect_y + iconRect_height / 2 + iconRect_lineWidth; + // 修改这里可以编辑未选中道具时的默认值 + var defaultItem = { + cls: "constants", + name: "未知道具", + text: "没有道具最永久", + }; + var defaultEquip = { + cls: "equips", + name: "未知装备", + text: "一无所有,又何尝不是一种装备", + equip: { + type: "装备", + }, + }; + ///// *** + + var originItem = item; + if (core.status.event.id == "equipbox") item = item || defaultEquip; + item = item || defaultItem; + var itemCls = item.cls, + itemName = item.name, + itemText = item.text; + itemText = core.replaceText(itemText); + if (!itemText) itemText = "该道具无描述。"; + /* 一个根据道具id修改道具名字(右栏)的例子 + * if (item.id == "xxx") itemNameColor = "red"; + */ + var itemClsName = core.getItemClsName(item); + var itemNameMaxWidth = + rightbar_width - iconRect_width - iconRect_lineWidth * 2 - space * 2; + core.strokeRoundRect( + ctx, + iconRect_x, + iconRect_y, + iconRect_width, + iconRect_height, + iconRect_radius, + iconRect_style, + iconRect_lineWidth + ); + if (item.id) + core.drawIcon( + ctx, + item.id, + iconRect_x + iconRect_lineWidth / 2, + iconRect_y + iconRect_lineWidth / 2, + iconRect_width - iconRect_lineWidth, + iconRect_height - iconRect_lineWidth + ); + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "middle"); + if (itemCls === "equips" && item.id) { + itemName = "【" + item.equipCls + "】" + itemName; + } + core.fillText( + ctx, + itemName, + itemName_x, + itemName_middle, + itemNameColor, + itemNameFont, + itemNameMaxWidth + ); + if (!item.equip) + core.fillText( + ctx, + "【" + itemClsName + "】", + itemCls_x, + itemCls_middle, + itemClsColor, + itemClsFont + ); + + var statusText = ""; + if (core.status.event.id == "equipbox") { + var type = item.equip.type; + if (typeof type == "string") type = core.getEquipTypeByName(type); + var compare = core.compareEquipment(item.id, core.getEquip(type)); + var compare2; + if (item.equipCls === "双手剑") + compare2 = core.compareEquipment(null, core.getEquip(1)); + if ( + item.equipCls === "盾牌" && + core.material.items[core.getEquip(0)]?.equipCls === "双手剑" + ) + compare2 = core.compareEquipment(null, core.getEquip(0)); + if (info.select.action == "unload") + compare = core.compareEquipment(null, item.id); + // --- 变化值... + for (var name in core.status.hero) { + if (typeof core.status.hero[name] != "number") continue; + var nowValue = core.getRealStatus(name); + // 查询新值 + var newValue = Math.floor( + ((core.getStatus(name) + + (compare.value[name] || 0) + + (compare2?.value[name] || 0)) * + (core.getBuff(name) * 100 + + (compare.percentage[name] || 0) + + (compare2?.percentage[name] || 0))) / + 100 + ); + if (name === "mdef") { + var nowValue = core.getRealStatus(name); + var newValue = Math.round( + (core.getStatus(name) - + (compare.value[name] || 0) - + (compare2?.value[name] || 0)) * + (1 - + (1 - core.getBuff(name)) * + (compare.percentage[name] || 1) * + (compare2?.percentage[name] || 1)) + ); + } + if (nowValue == newValue) continue; + var color = newValue > nowValue ? "#00FF00" : "#FF0000"; + nowValue = core.formatBigNumber(nowValue); + newValue = core.formatBigNumber(newValue); + + if (name === "mdef") { + nowValue += "%"; + newValue += "%"; + } + statusText += + core.getStatusLabel(name) + + " " + + nowValue + + "->\r[" + + color + + "]" + + newValue + + "\r\n"; + } + } + itemText = statusText + itemText; + if (item.equip) { + core.drawTextContent(ctx, itemText, { + left: itemText_x, + top: itemCls_middle, + bold: false, + color: "white", + align: "left", + fontSize: itemTextFontSize, + maxWidth: rightbar_width - + (itemText_x - rightbar_x) * 2 + + itemTextFontSize / 2, + }); + } else { + core.drawTextContent(ctx, itemText, { + left: itemText_x, + top: itemText_y, + bold: false, + color: "white", + align: "left", + fontSize: itemTextFontSize, + maxWidth: rightbar_width - + (itemText_x - rightbar_x) * 2 + + itemTextFontSize / 2, + }); + } + + ///// *** 退出按钮设置 + var btnRadius = 10; + var btnBorderWidth = 2; + var btnRight = toolboxRight - 2; + var btnBottom = toolboxBottom - 2; + var btnBorderStyle = "#fff"; + ///// *** + + // 获取圆心位置 + var btn_x = btnRight - btnRadius - btnBorderWidth / 2; + btn_y = btnBottom - btnRadius - btnBorderWidth / 2; + drawToolbox_setExitBtn( + ctx, + btn_x, + btn_y, + btnRadius, + btnBorderStyle, + btnBorderWidth + ); + + ///// *** 使用按钮设置 + var useBtnHeight = btnRadius * 2; + // 这里不设置useBtnWidth而是根据各项数据自动得出width + var useBtnRadius = useBtnHeight / 4; + var useBtn_x = rightbar_x + 4, + useBtn_y = btnBottom - useBtnHeight; + var useBtnBorderStyle = "#fff"; + var useBtnBorderWidth = btnBorderWidth; + const batchUseBtn_x = useBtn_x + 50; // 个人觉得,搞这么多参数还不如硬编码 + const hideBtn_y = useBtn_y - useBtnHeight - 8; + ///// *** + + drawToolbox_setUseBtn( + ctx, + useBtn_x, + useBtn_y, + useBtnRadius, + useBtnHeight, + useBtnBorderStyle, + useBtnBorderWidth + ); + if (core.status.event.id === "toolbox") { + drawToolbox_setBatchUseBtn( + ctx, + batchUseBtn_x, + useBtn_y, + useBtnRadius, + useBtnHeight, + useBtnBorderStyle, + useBtnBorderWidth + ); + } + drawToolbox_setHideBtn( + ctx, + useBtn_x, + hideBtn_y, + useBtnRadius, + useBtnHeight, + useBtnBorderStyle, + useBtnBorderWidth + ); + drawToolbox_setShowHideBtn( + ctx, + rightbar_x, + useBtn_y, + useBtnHeight, + useBtnBorderStyle + ); + } + + function drawEquipbox_drawOthers(ctx, obj) { + var info = core.status.thisUIEventInfo; + + ///// *** 装备格设置 + var equipList_lineWidth = 2; + var equipList_boxSize = 32; + var equipList_borderWidth = 2; + var equipList_borderStyle = "#fff"; + var equipList_nameColor = "#fff"; + ///// *** + + var equipList_x = obj.x + 4, + equipList_bottom = obj.obj.y - equipList_lineWidth, + equipList_y = equipList_bottom - obj.obj.oneItemHeight * reduceItem - 2, + equipList_height = equipList_bottom - equipList_y; + var equipList_right = obj.leftbar_right, + equipList_width = equipList_right - equipList_x; + core.drawLine( + ctx, + obj.x, + equipList_bottom + equipList_lineWidth / 2, + equipList_right, + equipList_bottom + equipList_lineWidth / 2, + equipList_borderStyle, + equipList_lineWidth + ); + var toDrawList = core.status.globalAttribute.equipName, + len = toDrawList.length; + + ///// *** 装备格设置 + var maxItem = 2; + var box_width = 32, + box_height = 32, + box_borderStyle = "#fff", + box_selectBorderStyle = "gold", // 选中的装备格的颜色 + box_borderWidth = 2; + var boxName_fontSize = 14, + boxName_space = 2, + boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离 + var maxLine = Math.ceil(len / maxItem); + ///// *** + var l = Math.sqrt(len); + if (Math.pow(l) == len && len != 4) { + if (l <= maxItem) maxItem = l; + } + maxItem = Math.min(toDrawList.length, maxItem); + info.equips = maxItem; + + var boxName_font = core.ui._buildFont(boxName_fontSize); + // 总宽高减去所有装备格宽高得到空隙大小 + var oneBoxWidth = box_width + box_borderWidth * 2; + var oneBoxHeight = + box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth; + var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine), + space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem); + var box_x = equipList_x + space_x, + box_y = equipList_y + space_y + 12; + for (var i = 0; i < 2; i++) { + var id = core.getEquip(i), + name = toDrawList[i]; + if (i === 0) name = "主手"; + if (i === 1) name = "副手"; + var selectBorder = false; + if (core.status.thisUIEventInfo.select.type == i) selectBorder = true; + var borderStyle = selectBorder ? + box_selectBorderStyle : + box_borderStyle; + drawEquipbox_drawOne( + ctx, + name, + id, + box_x, + box_y, + box_width, + box_height, + boxName_space, + boxName_font, + boxName_color, + borderStyle, + box_borderWidth + ); + var todo = new Function( + "core.clickOneEquipbox('" + id + "'," + i + ")" + ); + addUIEventListener( + box_x - box_borderWidth / 2, + box_y - box_borderWidth / 2, + oneBoxWidth, + oneBoxHeight, + todo + ); + box_x += space_x + oneBoxWidth; + if ((i + 1) % maxItem == 0) { + box_x = equipList_x + space_x; + box_y += space_y + oneBoxHeight; + } + } + if (core.material.items[core.getEquip(0)]?.equipCls === "双手剑") { + core.drawLine( + ctx, + equipList_x + space_x + space_x + oneBoxWidth, + equipList_y + space_y + 12, + equipList_x + + space_x + + space_x + + oneBoxWidth + + box_width + + box_borderWidth, + equipList_y + space_y + box_height + 12 + ); + core.drawLine( + ctx, + equipList_x + space_x + space_x + oneBoxWidth, + equipList_y + space_y + box_height + 12, + equipList_x + + space_x + + space_x + + oneBoxWidth + + box_width + + box_borderWidth, + equipList_y + space_y + 12 + ); + } + ///// *** 装备格设置 + var maxItem = 3; + var box_width = 32, + box_height = 32, + box_borderStyle = "#fff", + box_selectBorderStyle = "gold", // 选中的装备格的颜色 + box_borderWidth = 2; + var boxName_fontSize = 14, + boxName_space = 2, + boxName_color = "#fff"; // 装备格名称与上面的装备格框的距离 + var maxLine = Math.ceil(len / maxItem); + ///// *** + var l = Math.sqrt(len); + if (Math.pow(l) == len && len != 4) { + if (l <= maxItem) maxItem = l; + } + maxItem = Math.min(toDrawList.length, maxItem); + info.equips = maxItem; + + var boxName_font = core.ui._buildFont(boxName_fontSize); + // 总宽高减去所有装备格宽高得到空隙大小 + var oneBoxWidth = box_width + box_borderWidth * 2; + var oneBoxHeight = + box_height + boxName_fontSize + boxName_space + 2 * box_borderWidth; + var space_y = (equipList_height - maxLine * oneBoxHeight) / (1 + maxLine), + space_x = (equipList_width - maxItem * oneBoxWidth) / (1 + maxItem); + var box_x = equipList_x + space_x, + box_y = equipList_y + space_y + space_y + oneBoxHeight; + for (var i = 2; i < len; i++) { + var id = core.getEquip(i), + name = toDrawList[i]; + var selectBorder = false; + if (core.status.thisUIEventInfo.select.type == i) selectBorder = true; + var borderStyle = selectBorder ? + box_selectBorderStyle : + box_borderStyle; + drawEquipbox_drawOne( + ctx, + name, + id, + box_x, + box_y, + box_width, + box_height, + boxName_space, + boxName_font, + boxName_color, + borderStyle, + box_borderWidth + ); + var todo = new Function( + "core.clickOneEquipbox('" + id + "'," + i + ")" + ); + addUIEventListener( + box_x - box_borderWidth / 2, + box_y - box_borderWidth / 2, + oneBoxWidth, + oneBoxHeight, + todo + ); + box_x += space_x + oneBoxWidth; + } + } + + this.drawToolbox = function (ctx) { + ctx = ctx || core.canvas.ui; + core.status.thisEventClickArea = []; + + var info = drawBoxBackground(ctx); + info.itemNum = itemNum; + drawItemListbox(ctx, info.obj); + drawToolboxRightbar(ctx, info); + core.setTextBaseline(ctx, "alphabetic"); + core.setTextAlign("left"); + }; + + var reduceItem = 4; + this.drawEquipbox = function (ctx) { + ctx = ctx || core.canvas.ui; + core.status.thisEventClickArea = []; + var info = drawBoxBackground(ctx); + info.itemNum = itemNum - reduceItem; + info.obj.y += info.obj.oneItemHeight * reduceItem; + info.obj.height -= info.obj.oneItemHeight * reduceItem; + drawItemListbox(ctx, info.obj); + drawEquipbox_drawOthers(ctx, info); + drawToolboxRightbar(ctx, info); + core.setTextBaseline(ctx, "alphabetic"); + core.setTextAlign("left"); + }; + + function drawEquipbox_drawOne( + ctx, + name, + id, + x, + y, + width, + height, + space, + font, + color, + style, + lineWidth + ) { + if (id) + core.drawIcon( + ctx, + id, + x + lineWidth / 2, + y + lineWidth / 2, + width, + height + ); + core.strokeRect( + ctx, + x, + y, + width + lineWidth, + height + lineWidth, + style, + lineWidth + ); + core.setTextAlign(ctx, "center"); + core.setTextBaseline(ctx, "top"); + var tx = (x + x + lineWidth / 2 + width) / 2, + ty = y + height + (lineWidth / 2) * 3 + space; + core.fillText(ctx, name, tx, ty, color, font); + + core.setAlpha(ctx, 1); + + core.setTextBaseline(ctx, "alphabetic"); + core.setTextAlign("left"); + } + + function drawItemListbox_drawItem( + ctx, + left, + right, + top, + height, + marginLeft, + marginHeight, + style, + id + ) { + var info = core.status.thisUIEventInfo; + var nowClick = info.index; + var item = core.material.items[id] || {}; + var name = item.name || "???"; + var num = core.itemCount(id) || 0; + var fontSize = Math.floor(height - marginHeight * 2); + core.setTextAlign(ctx, "right"); + var numText = "x" + num; + core.fillText( + ctx, + numText, + right - marginLeft, + top + height / 2, + style, + core.ui._buildFont(fontSize) + ); + + const hideInfo = core.getFlag("hideInfo", {}); + if ( + item && + (hideInfo.hasOwnProperty(id) ? hideInfo[id] : item.hideInToolbox) + ) + core.setAlpha(ctx, 0.5); + + if (name != "???") + core.drawIcon( + ctx, + id, + left + marginLeft, + top + marginHeight, + fontSize, + fontSize + ); + var text_x = left + marginLeft + fontSize + 2; + var maxWidth = right - core.calWidth(ctx, numText) - text_x; + core.setTextAlign(ctx, "left"); + core.fillText( + ctx, + name, + text_x, + top + height / 2, + style, + core.ui._buildFont(fontSize), + maxWidth + ); + core.setAlpha(ctx, 1); + + var todo = new Function("core.clickItemFunc('" + id + "');"); + addUIEventListener(left, top, right - left, height, todo); + } + + function setPageItems(page) { + var num = itemNum; + if (core.status.event.id == "equipbox") num -= reduceItem; + var info = core.status.thisUIEventInfo; + if (!info) return; + page = page || info.page; + var items = core.getToolboxItems( + core.status.event.id == "toolbox" ? "all" : "equips", + core.getFlag("showHideItem", false) + ); + info.allItems = items; + var maxPage = Math.ceil(items.length / num); + info.maxPage = maxPage; + var pageItems = items.slice((page - 1) * num, page * num); + info.pageItems = pageItems; + info.maxItem = pageItems.length; + if (items.length == 0 && pageItems.length == 0) info.index = null; + if (pageItems.length == 0 && info.page > 1) { + info.page = Math.max(1, info.page - 1); + return setPageItems(info.page); + } + return pageItems; + } + + function drawToolbox_setExitBtn(ctx, x, y, r, style, lineWidth) { + core.strokeCircle(ctx, x, y, r, style, lineWidth); + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + var textSize = Math.sqrt(2) * r; + core.fillText( + ctx, + "x", + x, + y, + style, + core.ui._buildFont(textSize), + textSize + ); + core.setTextAlign(ctx, "start"); + core.setTextBaseline(ctx, "top"); + + var todo = function () { + core.closePanel(); + }; + addUIEventListener(x - r, y - r, r * 2, r * 2, todo); + } + + function drawToolbox_setUseBtn(ctx, x, y, r, h, style, lineWidth) { + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 4; + var font = core.ui._buildFont(fontSize); + var text = core.status.event.id == "toolbox" ? "使用" : "装备"; + if (core.status.thisUIEventInfo.select.action == "unload") text = "卸下"; + var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2; + + core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth); + core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font); + + var todo = function () { + core.useSelectItemInBox(); + }; + addUIEventListener(x, y, w, h, todo); + } + + function getSelectedItem() { + var info = core.status.thisUIEventInfo; + if ( + !( + info && ["toolbox", "equipbox"].includes(core.status.event.id) + ) + ) { + core.drawFailTip("发生了未知错误!"); + return; + } + return info.select.id; + } + + function batchUse(item, count) { + try { + const itemCount = core.itemCount(item); + if (count > itemCount) count = itemCount; + core.closePanel(); + for (let i = 0; i < count; i++) { + if (core.canUseItem(item)) core.useItem(item); + else return; + } + } catch (e) { + console.error(e); + core.drawFailTip("批量使用时出现未知错误!"); + } + } + + function drawToolbox_setBatchUseBtn(ctx, x, y, r, h, style, lineWidth) { + try { + const selectedItem = getSelectedItem(); + let canBatchUse = eval(core.material.items[selectedItem]?.canBatchUse); + if (!canBatchUse) return; + } catch (error) { + console.error(error); + return; + } + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 4; + var font = core.ui._buildFont(fontSize); + var text = "批量使用"; + var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2; + + core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth); + core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font); + + var todo = function () { + core.utils.myprompt("输入要使用该物品的次数(0~99)。", null, (value) => { + value = parseInt(value); + const id = getSelectedItem(); + + if (Number.isNaN(value) || value < 0 || value > 99) { + core.drawFailTip("输入不合法!"); + return; + } + if (!core.canUseItem(id)) { + core.drawFailTip("当前无法使用该道具!"); + return; + } + core.closePanel(); + batchUse(id, value); + }); + }; + addUIEventListener(x, y, w, h, todo); + } + + function drawToolbox_setHideBtn(ctx, x, y, r, h, style, lineWidth) { + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 4; + var font = core.ui._buildFont(fontSize); + var text = "显示/隐藏"; + var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2; + + core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth); + core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font); + + var todo = function () { + //debugger; + var id = getSelectedItem(); + let hideInfo = core.getFlag("hideInfo", {}); + console.log(id); + if (hideInfo.hasOwnProperty(id)) { + hideInfo[id] = !hideInfo[id]; + core.setFlag("hideInfo", hideInfo); + } else { + hideInfo[id] = !core.material.items[id].hideInToolbox; + core.setFlag("hideInfo", hideInfo); + } + if (core.status.event.id === "toolbox") core.plugin.drawToolbox(); + else if (core.status.event.id === "equipbox") + core.plugin.drawEquipbox(); + }; + addUIEventListener(x, y, w, h, todo); + } + + ui.prototype.getToolboxItems = function (cls, showHide) { + let list = Object.keys(core.status.hero.items[cls] || {}); + if (cls === "all") { + for (let name in core.status.hero.items) { + if (name == "equips") continue; + list = list.concat(Object.keys(core.status.hero.items[name])); + } + if (!showHide) + list = list.filter(function (id2) { + const hideInfo = core.getFlag("hideInfo", {}); + if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2]; + else return !core.material.items[id2].hideInToolbox; + }); + list = list.sort(); + return list; + } + if (cls === "equips") { + if (!showHide) + list = list.filter(function (id2) { + const hideInfo = core.getFlag("hideInfo", {}); + if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2]; + else return !core.material.items[id2].hideInToolbox; + }); + + list = list.sort(); + return list; + } + if (this.uidata.getToolboxItems) { + return this.uidata.getToolboxItems(cls, showHide); + } + if (!showHide) + list = list.filter(function (id2) { + return !core.material.items[id2].hideInToolbox; + }); + list = list.sort(); + return list; + }; + + function drawToolbox_setShowHideBtn(ctx, x, y, h, style) { + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 6; + var font = core.ui._buildFont(fontSize); + var text = "显示隐藏"; + var w = core.calWidth(ctx, text, font); + h += 4; + const squareSize = h - 6; + + x -= w + squareSize + 26; + + const border = 2; + core.fillRect(ctx, x, y, squareSize, squareSize, " #F5F5F5"); + if (core.hasFlag("showHideItem")) { + core.fillRect( + ctx, + x + border, + y + border, + squareSize - 2 * border, + squareSize - 2 * border, + "lime" + ); + } + core.fillText(ctx, text, x + squareSize + 2, y + 4, style, font); + + var todo = function () { + core.setFlag("showHideItem", !core.getFlag("showHideItem", false)); + if (core.status.event.id === "toolbox") core.plugin.drawToolbox(); + else if (core.status.event.id === "equipbox") + core.plugin.drawEquipbox(); + }; + addUIEventListener(x, y, w, h, todo); + } + + function drawItemListbox_setPageBtn( + ctx, + left, + right, + bottom, + r, + style, + lineWidth + ) { + var offset = lineWidth / 2 + r; + + var x = left + offset; + var y = bottom - offset; + var pos = (Math.sqrt(2) / 2) * (r - lineWidth / 2); + core.fillPolygon( + ctx, + [ + [x - pos, y], + [x + pos - 2, y - pos], + [x + pos - 2, y + pos], + ], + style + ); + core.strokeCircle(ctx, x, y, r, style, lineWidth); + var todo = function () { + core.addItemListboxPage(-1); + }; + addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); + + x = right - offset; + core.fillPolygon( + ctx, + [ + [x + pos, y], + [x - pos + 2, y - pos], + [x - pos + 2, y + pos], + ], + style + ); + core.strokeCircle(ctx, x, y, r, style, lineWidth); + var todo = function () { + core.addItemListboxPage(1); + }; + addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); + } + + this.clickItemFunc = function (id) { + var info = core.status.thisUIEventInfo; + if (!info) return; + if (info.select.id == id) return core.useSelectItemInBox(); + info.select = {}; + info.select.id = id; + core.setIndexAndSelect("index"); + refreshBox(); + }; + + this.clickOneEquipbox = function (id, type) { + var info = core.status.thisUIEventInfo; + if (!info) return; + if (info.select.id == id && info.select.type == type) + core.useSelectItemInBox(); + else + core.status.thisUIEventInfo.select = { + id: id, + type: type, + action: "unload", + }; + return refreshBox(); + }; + + this.useSelectItemInBox = function () { + var info = core.status.thisUIEventInfo; + if (!info) return; + if (!info.select.id) return; + var id = info.select.id; + if (core.status.event.id == "toolbox") { + core.events.tryUseItem(id); + // core.closePanel(); + } else if (core.status.event.id == "equipbox") { + var action = info.select.action || "load"; + info.index = 1; + if (action == "load") { + var type = core.getEquipTypeById(id); + let equipClsid = core.material.items[id]?.equipCls; + let equipCls0 = core.material.items[core.getEquip(0)]?.equipCls; + let equipCls1 = core.material.items[core.getEquip(1)]?.equipCls; + if (equipClsid === "双手剑") { + core.unloadEquip(0, function () { + core.status.route.push("unEquip:" + 0); + }); + core.unloadEquip(1, function () { + core.status.route.push("unEquip:" + 1); + }); + } + if ( + equipCls0 === "双手剑" && + !(equipClsid === "饰品" || equipClsid === "护具") + ) { + core.unloadEquip(0, function () { + core.status.route.push("unEquip:" + 0); + }); + } + core.loadEquip(id, function () { + core.status.route.push("equip:" + id); + info.select.type = type; + core.setIndexAndSelect("select"); + core.drawEquipbox(); + }); + } else { + var type = info.select.type; + core.unloadEquip(type, function () { + core.status.route.push("unEquip:" + type); + info.select.type = type; + info.select.action = "load"; + core.setIndexAndSelect("select"); + core.drawEquipbox(); + }); + } + } + core.updateStatusBar(); + }; + + this.setIndexAndSelect = function (toChange) { + var info = core.status.thisUIEventInfo; + if (!info) return; + setPageItems(info.page); + var index = info.index || 1; + var items = info.pageItems; + + info.select.action = null; + info.select.type = null; + if (toChange == "index") info.index = items.indexOf(info.select.id) + 1; + info.select.id = items[info.index - 1]; + }; + + this.addItemListboxPage = function (num) { + var info = core.status.thisUIEventInfo; + if (!info) return; + var maxPage = info.maxPage || 1; + info.page = info.page || 1; + info.page += num; + if (info.page <= 0) info.page = maxPage; + if (info.page > maxPage) info.page = 1; + info.index = 1; + setPageItems(info.page); + core.setIndexAndSelect("select"); + refreshBox(); + }; + + this.addItemListboxIndex = function (num) { + var info = core.status.thisUIEventInfo; + if (!info) return; + var maxItem = info.maxItem || 0; + info.index = info.index || 0; + info.index += num; + if (info.index <= 0) info.index = 1; + if (info.index > maxItem) info.index = maxItem; + core.setIndexAndSelect("select"); + refreshBox(); + }; + + this.addEquipboxType = function (num) { + var info = core.status.thisUIEventInfo; + var type = info.select.type; + if (type == null && num > 0) info.select.type = 0; + else info.select.type = type + num; + var max = core.status.globalAttribute.equipName.length; + if (info.select.type >= max) { + info.select = {}; + core.setIndexAndSelect("select"); + return core.addItemListboxPage(0); + } else { + var m = Math.abs(info.select.type); + if (info.select.type < 0) info.select.type = max - m; + core.setIndexAndSelect("select"); + refreshBox(); + return; + } + }; + + core.actions._keyDownToolbox = function (keycode) { + if (!core.status.thisEventClickArea) return; + if (keycode == 37) { + // left + core.addItemListboxPage(-1); + return; + } + if (keycode == 38) { + // up + core.addItemListboxIndex(-1); + return; + } + if (keycode == 39) { + // right + core.addItemListboxPage(1); + return; + } + if (keycode == 40) { + // down + core.addItemListboxIndex(1); + return; + } + }; + + ////// 工具栏界面时,放开某个键的操作 ////// + core.actions._keyUpToolbox = function (keycode) { + if (keycode == 81) { + core.ui.closePanel(); + if (core.isReplaying()) core.control._replay_equipbox(); + else core.openEquipbox(); + return; + } + if (keycode == 84 || keycode == 27 || keycode == 88) { + core.closePanel(); + return; + } + if (keycode == 13 || keycode == 32 || keycode == 67) { + var info = core.status.thisUIEventInfo; + if (info.select) { + core.useSelectItemInBox(); + } + return; + } + }; + + core.actions._keyDownEquipbox = function (keycode) { + if (!core.status.thisEventClickArea) return; + if (keycode == 37) { + // left + var info = core.status.thisUIEventInfo; + if (info.index != null) return core.addItemListboxPage(-1); + return core.addEquipboxType(-1); + } + if (keycode == 38) { + // up + var info = core.status.thisUIEventInfo; + if (info.index == 1) { + info.select.type = core.status.globalAttribute.equipName.length - 1; + core.setIndexAndSelect(); + return refreshBox(); + } + if (info.index) return core.addItemListboxIndex(-1); + return core.addEquipboxType(-1 * info.equips); + } + if (keycode == 39) { + // right + var info = core.status.thisUIEventInfo; + if (info.index != null) return core.addItemListboxPage(1); + return core.addEquipboxType(1); + } + if (keycode == 40) { + // down + var info = core.status.thisUIEventInfo; + if (info.index) return core.addItemListboxIndex(1); + return core.addEquipboxType(info.equips); + } + }; + + core.actions._keyUpEquipbox = function (keycode, altKey) { + if (altKey && keycode >= 48 && keycode <= 57) { + core.items.quickSaveEquip(keycode - 48); + return; + } + if (keycode == 84) { + core.ui.closePanel(); + if (core.isReplaying()) core.control._replay_toolbox(); + else core.openToolbox(); + return; + } + if (keycode == 81 || keycode == 27 || keycode == 88) { + core.closePanel(); + return; + } + if (keycode == 13 || keycode == 32 || keycode == 67) { + var info = core.status.thisUIEventInfo; + if (info.select) core.useSelectItemInBox(); + return; + } + }; + + core.registerAction( + "ondown", + "inEventClickAction", + function (x, y, px, py) { + if (!core.status.thisEventClickArea) return false; + var info = core.status.thisEventClickArea; + for (var i = 0; i < info.length; i++) { + var obj = info[i]; + if ( + px >= obj.x && + px <= obj.x + obj.width && + py > obj.y && + py < obj.y + obj.height + ) { + if (obj.todo) obj.todo(); + break; + } + } + return true; + }, + 51 + ); + core.registerAction( + "onclick", + "stopClick", + function () { + if (core.status.thisEventClickArea) return true; + }, + 51 + ); + + function addUIEventListener(x, y, width, height, todo) { + if (!core.status.thisEventClickArea) return; + var obj = { + x: x, + y: y, + width: width, + height: height, + todo: todo, + }; + core.status.thisEventClickArea.push(obj); + } + + this.initThisEventInfo = function () { + core.status.thisUIEventInfo = { + page: 1, + select: {}, + }; + core.status.thisEventClickArea = []; + }; + + function refreshBox() { + if (!core.status.event.id) return; + if (core.status.event.id == "toolbox") core.drawToolbox(); + else core.drawEquipbox(); + } + + core.ui.closePanel = function () { + core.dom.saveLoad.style.display = "none" + if (core.status.hero && core.status.hero.flags) { + // 清除全部临时变量 + Object.keys(core.status.hero.flags).forEach(function (name) { + if (name.startsWith("@temp@") || /^arg\d+$/.test(name)) { + delete core.status.hero.flags[name]; + } + }); + } + this.clearUI(); + core.maps.generateGroundPattern(); + core.updateStatusBar(true); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + core.status.event.selection = null; + core.status.event.ui = null; + core.status.event.interval = null; + core.status.thisUIEventInfo = null; + core.status.thisEventClickArea = null; + }; + + this.getItemClsName = function (item) { + if (item == null) return itemClsName; + if (item.cls == "equips") { + if (typeof item.equip.type == "string") return item.equip.type; + var type = core.getEquipTypeById(item.id); + return core.status.globalAttribute.equipName[type]; + } else return itemClsName[item.cls] || item.cls; + }; + + core.events.openToolbox = function (fromUserAction) { + if (core.isReplaying()) return; + if (!this._checkStatus("toolbox", fromUserAction)) return; + core.initThisEventInfo(); + let info = core.status.thisUIEventInfo; + info.index = 1; + core.setIndexAndSelect("select"); + core.drawToolbox(); + }; + + core.events.openEquipbox = function (fromUserAction) { + if (core.isReplaying()) return; + if (!this._checkStatus("equipbox", fromUserAction)) return; + core.initThisEventInfo(); + let info = core.status.thisUIEventInfo; + info.select.type = 0; + core.setIndexAndSelect("select"); + core.drawEquipbox(); + }; + + core.control._replay_toolbox = function () { + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); + if (core.isMoving() || core.status.replay.animate || core.status.event.id) + return core.drawTip("请等待当前事件的处理结束"); + + core.lockControl(); + core.status.event.id = "toolbox"; + core.drawToolbox(); + }; + + core.control._replay_equipbox = function () { + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) return core.drawTip("请先暂停录像"); + if (core.isMoving() || core.status.replay.animate || core.status.event.id) + return core.drawTip("请等待当前事件的处理结束"); + + core.lockControl(); + core.status.event.id = "equipbox"; + core.drawEquipbox(); + }; + + core.control._replayAction_item = function (action) { + if (action.indexOf("item:") != 0) return false; + var itemId = action.substring(5); + if (!core.canUseItem(itemId)) return false; + if ( + core.material.items[itemId].hideInReplay || + core.status.replay.speed == 24 + ) { + core.useItem(itemId, false, core.replay); + return true; + } + core.status.event.id = "toolbox"; + core.initThisEventInfo(); + var info = core.status.thisUIEventInfo; + var items = core.getToolboxItems( + "all", + core.getFlag("showHideItem", false) + ); + setPageItems(1); + var index = items.indexOf(itemId) + 1; + info.page = Math.ceil(index / info.maxItem); + info.index = index % info.maxItem || info.maxItem; + core.setIndexAndSelect("select"); + setPageItems(info.page); + core.drawToolbox(); + setTimeout(function () { + core.ui.closePanel(); + core.useItem(itemId, false, core.replay); + }, core.control.__replay_getTimeout()); + return true; + }; + + core.control._replayAction_equip = function (action) { + if (action.indexOf("equip:") != 0) return false; + var itemId = action.substring(6); + var items = core.getToolboxItems( + "equips", + core.getFlag("showHideItem", false) + ); + var index = items.indexOf(itemId) + 1; + if (index < 1) { + core.removeFlag("__doNotCheckAutoEvents__"); + return false; + } + + var cb = function () { + var next = core.status.replay.toReplay[0] || ""; + if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) { + core.removeFlag("__doNotCheckAutoEvents__"); + core.checkAutoEvents(); + } + core.replay(); + }; + core.setFlag("__doNotCheckAutoEvents__", true); + + core.status.route.push(action); + if ( + core.material.items[itemId].hideInReplay || + core.status.replay.speed == 24 + ) { + core.loadEquip(itemId, cb); + return true; + } + core.status.event.id = "equipbox"; + core.initThisEventInfo(); + var info = core.status.thisUIEventInfo; + setPageItems(1); + info.page = Math.ceil(index / info.maxItem); + info.index = index % info.maxItem || info.maxItem; + core.setIndexAndSelect("select"); + setPageItems(info.page); + core.drawEquipbox(); + setTimeout(function () { + core.ui.closePanel(); + core.loadEquip(itemId, cb); + }, core.control.__replay_getTimeout()); + return true; + }; + + core.control._replayAction_unEquip = function (action) { + if (action.indexOf("unEquip:") != 0) return false; + var equipType = parseInt(action.substring(8)); + if (!core.isset(equipType)) { + core.removeFlag("__doNotCheckAutoEvents__"); + return false; + } + + var cb = function () { + var next = core.status.replay.toReplay[0] || ""; + if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) { + core.removeFlag("__doNotCheckAutoEvents__"); + core.checkAutoEvents(); + } + core.replay(); + }; + core.setFlag("__doNotCheckAutoEvents__", true); + + core.status.route.push(action); + if (core.status.replay.speed == 24) { + core.unloadEquip(equipType, cb); + return true; + } + core.status.event.id = "equipbox"; + core.initThisEventInfo(); + var info = core.status.thisUIEventInfo; + setPageItems(1); + info.select.type = equipType; + core.setIndexAndSelect(); + core.drawEquipbox(); + setTimeout(function () { + core.ui.closePanel(); + core.unloadEquip(equipType, cb); + }, core.control.__replay_getTimeout()); + return true; + }; + core.registerReplayAction("item", core.control._replayAction_item); + core.registerReplayAction("equip", core.control._replayAction_equip); + core.registerReplayAction("unEquip", core.control._replayAction_unEquip); +}, "技能树": function () { // 在此增加新插件 // @@ -8034,7 +9068,42 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = return arr; } } + /** + * 图片叠加滤镜 + * @param {img} image 需要叠加的图片, + * @param {color} style 需要叠加的颜色 + */ + function imagelighter(image, style) { + // 创建一个canvas元素 + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + // 设置canvas的尺寸与图片相同 + canvas.width = image.width; + canvas.height = image.height; + ctx.drawImage(image, 0, 0); + // 创建一个临时canvas用于红色滤镜 + const tempCanvas = document.createElement("canvas"); + const tempCtx = tempCanvas.getContext("2d"); + tempCanvas.width = image.width; + tempCanvas.height = image.height; + + // 在临时canvas上绘制红色滤镜 + tempCtx.fillStyle = style ?? "rgba(255, 0, 0, 0.5)"; // 半透明红色 + tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height); + // 使用lighter混合模式叠加红色滤镜 + ctx.globalCompositeOperation = "lighter"; + ctx.drawImage(tempCanvas, 0, 0); + // 使用destination-in混合模式保留原始图片的透明度 + ctx.globalCompositeOperation = "destination-in"; + ctx.drawImage(image, 0, 0); + + // 恢复默认混合模式 + ctx.globalCompositeOperation = "source-over"; + + // 返回处理后的canvas + return canvas; + } /** * 获取一个方向的反方向 * @example backDir('up'); // 'down' @@ -8388,6 +9457,35 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = yellowgreen: "#9acd32", transparent: "#0000", }; + // 计算两个数的最大公约数 + function gcdOfTwo(a, b) { + while (b !== 0) { + let temp = b; + b = a % b; + a = temp; + } + return a; + } + + // 计算任意项整数的最大公约数 + function gcd(...numbers) { + if (numbers.length < 2) { + throw new Error("至少需要两个数"); + } + return numbers.reduce((a, b) => gcdOfTwo(a, b)); + } + // 计算两个数的最小公倍数 + function lcmOfTwo(a, b) { + return (a * b) / gcdOfTwo(a, b); + } + + // 计算任意项整数的最小公倍数 + function lcm(...numbers) { + if (numbers.length < 2) { + throw new Error("至少需要两个数"); + } + return numbers.reduce((a, b) => lcmOfTwo(a, b)); + } if (has(core.plugin.utils)) { throw new ReferenceError( @@ -8395,6 +9493,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); } core.plugin.utils = { + imagelighter, + gcdOfTwo, + lcmOfTwo, + gcd, + lcm, has, slide, backDir, @@ -8449,8 +9552,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "音频系统": function () { - // 在此增加新插件 - /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: + // 在此增加新插件 + /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: <script src="libs/thirdparty/ogg-vorbis-decoder.min.js"></script> @@ -8458,2357 +9561,2099 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = <script src="libs/thirdparty/codec-parser.min.js"></script> */ - // 将__enable置为false将关闭插件 - let __enable = true; - if (!__enable || main.mode === "editor") return; - const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; - const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; - const { CodecParser } = window.CodecParser; - const { Transition, linear } = core.plugin.animate; - - const audio = new Audio(); - const AudioStatus = { - Playing: 0, - Pausing: 1, - Paused: 2, - Stoping: 3, - Stoped: 4, - }; - const supportMap = new Map(); - const AudioType = { - Mp3: "audio/mpeg", - Wav: 'audio/wav; codecs="1"', - Flac: "audio/flac", - Opus: 'audio/ogg; codecs="opus"', - Ogg: 'audio/ogg; codecs="vorbis"', - Aac: "audio/aac", - }; - /** - * 检查一种音频类型是否能被播放 - * @param type 音频类型 AudioType - */ - function isAudioSupport(type) { - if (supportMap.has(type)) return supportMap.get(type); - else { - const support = audio.canPlayType(type); - const canPlay = support === "maybe" || support === "probably"; - supportMap.set(type, canPlay); - return canPlay; - } - } - - const typeMap = new Map([ - ["ogg", AudioType.Ogg], - ["mp3", AudioType.Mp3], - ["wav", AudioType.Wav], - ["flac", AudioType.Flac], - ["opus", AudioType.Opus], - ["aac", AudioType.Aac], - ]); - - /** - * 根据文件名拓展猜测其类型 - * @param file 文件名 string - */ - function guessTypeByExt(file) { - const ext = /\.[a-zA-Z\d]+$/.exec(file); - if (!ext?.[0]) return ""; - const type = ext[0].slice(1); - return typeMap.get(type.toLocaleLowerCase()) ?? ""; - } - - isAudioSupport(AudioType.Ogg); - isAudioSupport(AudioType.Mp3); - isAudioSupport(AudioType.Wav); - isAudioSupport(AudioType.Flac); - isAudioSupport(AudioType.Opus); - isAudioSupport(AudioType.Aac); - - function isNil(value) { - return value === void 0 || value === null; - } - - function sleep(time) { - return new Promise((res) => setTimeout(res, time)); - } - class AudioEffect { - constructor(ac) {} - /** - * 连接至其他效果器 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - connect(target, output, input) { - this.output.connect(target.input, output, input); - } - - /** - * 与其他效果器取消连接 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - disconnect(target, output, input) { - if (!target) { - if (!isNil(output)) { - this.output.disconnect(output); - } else { - this.output.disconnect(); - } - } else { - if (!isNil(output)) { - if (!isNil(input)) { - this.output.disconnect(target.input, output, input); - } else { - this.output.disconnect(target.input, output); - } - } else { - this.output.disconnect(target.input); - } - } - } - } - - class StereoEffect extends AudioEffect { - constructor(ac) { - super(ac); - const panner = ac.createPanner(); - this.input = panner; - this.output = panner; - } - - /** - * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 Number - * @param y 朝向y坐标 Number - * @param z 朝向z坐标 Number - */ - setOrientation(x, y, z) { - this.output.orientationX.value = x; - this.output.orientationY.value = y; - this.output.orientationZ.value = z; - } - /** - * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 Number - * @param y 位置y坐标 Number - * @param z 位置z坐标 Number - */ - setPosition(x, y, z) { - this.output.positionX.value = x; - this.output.positionY.value = y; - this.output.positionZ.value = z; - } - end() {} - - start() {} - } - class VolumeEffect extends AudioEffect { - constructor(ac) { - super(ac); - const gain = ac.createGain(); - this.input = gain; - this.output = gain; - } - - /** - * 设置音量大小 - * @param volume 音量大小 Number - */ - setVolume(volume) { - this.output.gain.value = volume; - } - - /** - * 获取音量大小 Number - */ - getVolume() { - return this.output.gain.value; - } - - end() {} - - start() {} - } - class ChannelVolumeEffect extends AudioEffect { - /** 所有的音量控制节点 */ - - constructor(ac) { - super(ac); - /** 所有的音量控制节点 */ - this.gain = []; - const splitter = ac.createChannelSplitter(); - const merger = ac.createChannelMerger(); - this.output = merger; - this.input = splitter; - for (let i = 0; i < 6; i++) { - const gain = ac.createGain(); - splitter.connect(gain, i); - gain.connect(merger, 0, i); - this.gain.push(gain); - } - } - - /** - * 设置某个声道的音量大小 - * @param channel 要设置的声道,可填0-5 Number - * @param volume 这个声道的音量大小 Number - */ - setVolume(channel, volume) { - if (!this.gain[channel]) return; - this.gain[channel].gain.value = volume; - } - - /** - * 获取某个声道的音量大小,可填0-5 - * @param channel 要获取的声道 Number - */ - getVolume(channel) { - if (!this.gain[channel]) return 0; - return this.gain[channel].gain.value; - } - - end() {} - - start() {} - } - class DelayEffect extends AudioEffect { - constructor(ac) { - super(ac); - - const delay = ac.createDelay(); - this.input = delay; - this.output = delay; - } - - /** - * 设置延迟时长 - * @param delay 延迟时长,单位秒 Number - */ - setDelay(delay) { - this.output.delayTime.value = delay; - } - - /** - * 获取延迟时长 - */ - getDelay() { - return this.output.delayTime.value; - } - - end() {} - - start() {} - } - class EchoEffect extends AudioEffect { - constructor(ac) { - super(ac); - /** 当前增益 */ - this.gain = 0.5; - /** 是否正在播放 */ - this.playing = false; - const delay = ac.createDelay(); - const gain = ac.createGain(); - gain.gain.value = 0.5; - delay.delayTime.value = 0.05; - delay.connect(gain); - gain.connect(delay); - /** 延迟节点 */ - this.delay = delay; - /** 反馈增益节点 */ - this.gainNode = gain; - - this.input = gain; - this.output = gain; - } - - /** - * 设置回声反馈增益大小 - * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number - */ - setFeedbackGain(gain) { - const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; - this.gain = resolved; - if (this.playing) this.gainNode.gain.value = resolved; - } - - /** - * 设置回声间隔时长 - * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number - */ - setEchoDelay(delay) { - const resolved = delay < 0.01 ? 0.01 : delay; - this.delay.delayTime.value = resolved; - } - - /** - * 获取反馈节点增益 - */ - getFeedbackGain() { - return this.gain; - } - - /** - * 获取回声间隔时长 - */ - getEchoDelay() { - return this.delay.delayTime.value; - } - - end() { - this.playing = false; - const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; - sleep(this.delay.delayTime.value * echoTime).then(() => { - if (!this.playing) this.gainNode.gain.value = 0; - }); - } - - start() { - this.playing = true; - this.gainNode.gain.value = this.gain; - } - } - - class StreamLoader { - constructor(url) { - /** 传输目标 Set<IStreamReader>*/ - this.target = new Set(); - this.loading = false; - } - - /** - * 将加载流传递给字节流读取对象 - * @param reader 字节流读取对象 IStreamReader - */ - pipe(reader) { - if (this.loading) { - console.warn( - "Cannot pipe new StreamReader object when stream is loading." - ); - return; - } - this.target.add(reader); - reader.piped(this); - return this; - } - - async start() { - if (this.loading) return; - this.loading = true; - const response = await window.fetch(this.url); - const stream = response.body; - if (!stream) { - console.error("Cannot get reader when fetching '" + this.url + "'."); - return; - } - // 获取读取器 - /** 读取流对象 */ - this.stream = stream; - const reader = response.body?.getReader(); - const targets = [...this.target]; - - await Promise.all(targets.map((v) => v.start(stream, this, response))); - if (reader && reader.read) { - // 开始流传输 - while (true) { - const { value, done } = await reader.read(); - await Promise.all( - targets.map((v) => v.pump(value, done, response)) - ); - if (done) break; - } - } else { - // 如果不支持流传输 - const buffer = await response.arrayBuffer(); - const data = new Uint8Array(buffer); - await Promise.all(targets.map((v) => v.pump(data, true, response))); - } - // 开始流传输 - while (true) { - const { value, done } = await reader.read(); - await Promise.all(targets.map((v) => v.pump(value, done, response))); - if (done) break; - } - - this.loading = false; - targets.forEach((v) => v.end(true)); - - // - } - - cancel(reason) { - if (!this.stream) return; - this.stream.cancel(reason); - this.loading = false; - this.target.forEach((v) => v.end(false, reason)); - } - } - const fileSignatures = [ - [AudioType.Mp3, [0x49, 0x44, 0x33]], - [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], - [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], - [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], - [AudioType.Aac, [0xff, 0xf1]], - [AudioType.Aac, [0xff, 0xf9]], - ]; - const oggHeaders = [ - [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], - ]; - - function checkAudioType(data) { - let audioType = ""; - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - for (const [type, value] of fileSignatures) { - if (value.every((v, i) => toCheck[i] === v)) { - audioType = type; - break; - } - } - if (audioType === AudioType.Ogg) { - // 如果是ogg的话,进一步判断是不是opus - for (const [key, value] of oggHeaders) { - const has = toCheck.some((_, i) => { - return value.every((v, ii) => toCheck[i + ii] === v); - }); - if (has) { - audioType = key; - break; - } - } - } - - return audioType; - } - class AudioDecoder { - /** - * 注册一个解码器 - * @param type 要注册的解码器允许解码的类型 - * @param decoder 解码器对象 - */ - static registerDecoder(type, decoder) { - if (!this.decoderMap) this.decoderMap = new Map(); - if (this.decoderMap.has(type)) { - console.warn( - "Audio stream decoder for audio type '" + - type + - "' has already existed." - ); - return; - } - - this.decoderMap.set(type, decoder); - } - - /** - * 解码音频数据 - * @param data 音频文件数据 - * @param player AudioPlayer实例 - */ - static async decodeAudioData(data, player) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - const type = checkAudioType(data); - if (type === "") { - console.error( - "Unknown audio type. Header: '" + [...toCheck] - .map((v) => v.toString().padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return null; - } - if (isAudioSupport(type)) { - if (data.buffer instanceof ArrayBuffer) { - return player.ac.decodeAudioData(data.buffer); - } else { - return null; - } - } else { - const Decoder = this.decoderMap.get(type); - if (!Decoder) { - return null; - } else { - const decoder = new Decoder(); - await decoder.create(); - const decodedData = await decoder.decode(data); - if (!decodedData) return null; - const buffer = player.ac.createBuffer( - decodedData.channelData.length, - decodedData.channelData[0].length, - decodedData.sampleRate - ); - decodedData.channelData.forEach((v, i) => { - buffer.copyToChannel(v, i); - }); - decoder.destroy(); - return buffer; - } - } - } - } - - class VorbisDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggVorbisDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return this.decoder?.flush(); - } - } - - class OpusDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggOpusDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return await this.decoder?.flush(); - } - } - const mimeTypeMap = { - [AudioType.Aac]: "audio/aac", - [AudioType.Flac]: "audio/flac", - [AudioType.Mp3]: "audio/mpeg", - [AudioType.Ogg]: "application/ogg", - [AudioType.Opus]: "application/ogg", - [AudioType.Wav]: "application/ogg", - }; - - function isOggPage(data) { - return !isNil(data.isFirstPage); - } - class AudioStreamSource { - constructor(context) { - this.output = context.createBufferSource(); - /** 是否已经完全加载完毕 */ - this.loaded = false; - /** 是否正在播放 */ - this.playing = false; - /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ - this.buffered = 0; - /** 已经缓冲的采样点数量 */ - this.bufferedSamples = 0; - /** 歌曲时长,加载完毕之前保持为 0 */ - this.duration = 0; - /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ - this.bufferPlayDuration = 1; - /** 音频的采样率,未成功解析出之前保持为 0 */ - this.sampleRate = 0; - //是否循环播放 - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 开始播放时刻 */ - this.lastStartTime = 0; - /** 上一次播放的缓存长度 */ - this.lastBufferSamples = 0; - - /** 是否已经获取到头文件 */ - this.headerRecieved = false; - /** 音频类型 */ - this.audioType = ""; - /** 每多长时间组成一个缓存 Float32Array */ - this.bufferChunkSize = 10; - /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ - this.audioData = []; - - this.errored = false; - this.ac = context; - } - /** 当前已经播放了多长时间 */ - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - /** - * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 - * @param size 每个缓存数据的时长,单位秒 - */ - setChunkSize(size) { - if (this.controller?.loading || this.loaded) return; - this.bufferChunkSize = size; - } - on(event, fn, context) {} - piped(controller) { - this.controller = controller; - } - - async pump(data, done) { - if (!data || this.errored) return; - if (!this.headerRecieved) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - this.audioType = checkAudioType(data); - if (!this.audioType) { - console.error( - "Unknown audio type. Header: '" + [...toCheck] - .map((v) => v.toString(16).padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return; - } - // 创建解码器 - const Decoder = AudioDecoder.decoderMap.get(this.audioType); - if (!Decoder) { - this.errored = true; - console.error( - "Cannot decode stream source type of '" + - this.audioType + - "', since there is no registered decoder for that type." - ); - return Promise.reject( - `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` - ); - } - this.decoder = new Decoder(); - // 创建数据解析器 - const mime = mimeTypeMap[this.audioType]; - const parser = new CodecParser(mime); - this.parser = parser; - await this.decoder.create(); - this.headerRecieved = true; - } - - const decoder = this.decoder; - const parser = this.parser; - if (!decoder || !parser) { - this.errored = true; - return Promise.reject( - "No parser or decoder attached in this AudioStreamSource" - ); - } - - await this.decodeData(data, decoder, parser); - if (done) await this.decodeFlushData(decoder, parser); - this.checkBufferedPlay(); - } - - /** - * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 - */ - checkSampleRate(info) { - for (const one of info) { - const frame = isOggPage(one) ? one.codecFrames[0] : one; - if (frame) { - const rate = frame.header.sampleRate; - if (this.sampleRate === 0) { - this.sampleRate = rate; - break; - } else { - if (rate !== this.sampleRate) { - console.warn("Sample rate in stream audio must be constant."); - } - } - } - } - } - - /** - * 解析音频数据 - */ - async decodeData(data, decoder, parser) { - // 解析音频数据 - const audioData = await decoder.decode(data); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.parseChunk(data)]; - - // 检查采样率 - this.checkSampleRate(audioInfo); - // 追加音频数据 - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 解码剩余数据 - */ - async decodeFlushData(decoder, parser) { - const audioData = await decoder.flush(); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.flush()]; - - this.checkSampleRate(audioInfo); - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 追加音频数据 - */ - appendDecodedData(data, info) { - const channels = data.channelData.length; - if (channels === 0) return; - if (this.audioData.length !== channels) { - this.audioData = []; - for (let i = 0; i < channels; i++) { - this.audioData.push([]); - } - } - // 计算出应该放在哪 - const chunk = this.sampleRate * this.bufferChunkSize; - const sampled = this.bufferedSamples; - const pushIndex = Math.floor(sampled / chunk); - const bufferIndex = sampled % chunk; - const dataLength = data.channelData[0].length; - let buffered = 0; - let nowIndex = pushIndex; - let toBuffer = bufferIndex; - while (buffered < dataLength) { - const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; - - for (let i = 0; i < channels; i++) { - const audioData = this.audioData[i]; - if (!audioData[nowIndex]) { - audioData.push(new Float32Array(chunk)); - } - const toPush = data.channelData[i].slice(buffered, buffered + rest); - - audioData[nowIndex].set(toPush, toBuffer); - } - buffered += rest; - nowIndex++; - toBuffer = 0; - } - - this.buffered += - info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; - this.bufferedSamples += info.reduce( - (prev, curr) => prev + curr.samples, - 0 - ); - } - - /** - * 检查已缓冲内容,并在未开始播放时播放 - */ - checkBufferedPlay() { - if (this.playing || this.sampleRate === 0) return; - const played = this.lastBufferSamples / this.sampleRate; - const dt = this.buffered - played; - if (this.loaded) { - this.playAudio(played); - return; - } - if (dt < this.bufferPlayDuration) return; - - this.lastBufferSamples = this.bufferedSamples; - // 需要播放 - this.mergeBuffers(); - if (!this.buffer) return; - if (this.playing) this.output.stop(); - this.createSourceNode(this.buffer); - this.output.loop = false; - this.output.start(0, played); - this.lastStartTime = this.ac.currentTime; - this.playing = true; - this.output.addEventListener("ended", () => { - this.playing = false; - this.checkBufferedPlay(); - }); - } - - mergeBuffers() { - const buffer = this.ac.createBuffer( - this.audioData.length, - this.bufferedSamples, - this.sampleRate - ); - const chunk = this.sampleRate * this.bufferChunkSize; - const bufferedChunks = Math.floor(this.bufferedSamples / chunk); - const restLength = this.bufferedSamples % chunk; - for (let i = 0; i < this.audioData.length; i++) { - const audio = this.audioData[i]; - const data = new Float32Array(this.bufferedSamples); - for (let j = 0; j < bufferedChunks; j++) { - data.set(audio[j], chunk * j); - } - if (restLength !== 0) { - data.set( - audio[bufferedChunks].slice(0, restLength), - chunk * bufferedChunks - ); - } - - buffer.copyToChannel(data, i, 0); - } - this.buffer = buffer; - } - - async start() { - delete this.buffer; - this.headerRecieved = false; - this.audioType = ""; - this.errored = false; - this.buffered = 0; - this.sampleRate = 0; - this.bufferedSamples = 0; - this.duration = 0; - this.loaded = false; - if (this.playing) this.output.stop(); - this.playing = false; - this.lastStartTime = this.ac.currentTime; - } - - end(done, reason) { - if (done && this.buffer) { - this.loaded = true; - delete this.controller; - this.mergeBuffers(); - - this.duration = this.buffered; - this.audioData = []; - this.decoder?.destroy(); - delete this.decoder; - delete this.parser; - } else { - console.warn( - "Unexpected end when loading stream audio, reason: '" + - (reason ?? "") + - "'" - ); - } - } - - playAudio(when) { - if (!this.buffer) return; - this.lastStartTime = this.ac.currentTime; - if (this.playing) this.output.stop(); - if (this.player.status !== AudioStatus.Playing) { - this.player.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.playing = true; - - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.player.status === AudioStatus.Playing) { - this.player.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - /** - * 开始播放这个音频源 - */ - play(when) { - if (this.playing || this.errored) return; - if (this.loaded && this.buffer) { - this.playing = true; - this.playAudio(when); - } else { - this.controller?.start(); - } - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - if (this.playing) this.output.stop(); - this.playing = false; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - /** - * 停止播放这个音频源 - * @returns 音频暂停的时刻 number - */ - stop() { - if (this.playing) this.output.stop(); - this.playing = false; - return this.ac.currentTime - this.lastStartTime; - } - /** - * 连接到音频路由图上,每次调用播放的时候都会执行一次 - * @param target 连接至的目标 IAudioInput - */ - connect(target) { - this.target = target; - } - /** - * 设置是否循环播放 - * @param loop 是否循环 boolean) - */ - setLoop(loop) { - this.loop = loop; - } - } - class AudioElementSource { - constructor(context) { - const audio = new Audio(); - audio.preload = "none"; - this.output = context.createMediaElementSource(audio); - this.audio = audio; - this.ac = context; - audio.addEventListener("play", () => { - this.playing = true; - if (this.player.status !== AudioStatus.Playing) { - this.player.status = AudioStatus.Playing; - } - }); - audio.addEventListener("ended", () => { - this.playing = false; - if (this.player.status === AudioStatus.Playing) { - this.player.status = AudioStatus.Stoped; - } - }); - } - get duration() { - return this.audio.duration; - } - get currentTime() { - return this.audio.currentTime; - } - /** - * 设置音频源的路径 - * @param url 音频路径 - */ - setSource(url) { - this.audio.src = url; - } - - play(when = 0) { - if (this.playing) return; - this.audio.currentTime = when; - this.audio.play(); - } - - stop() { - this.audio.pause(); - this.playing = false; - if (this.player.status === AudioStatus.Playing) { - this.player.status = AudioStatus.Stoped; - } - return this.audio.currentTime; - } - - connect(target) { - this.output.connect(target.input); - } - - setLoop(loop) { - this.audio.loop = loop; - } - } - class AudioBufferSource { - constructor(context) { - this.output = context.createBufferSource(); - /** 是否循环 */ - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 播放开始时刻 */ - this.lastStartTime = 0; - this.duration = 0; - this.ac = context; - } - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - - /** - * 设置音频源数据 - * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer - */ - async setBuffer(buffer) { - if (buffer instanceof ArrayBuffer) { - this.buffer = await this.ac.decodeAudioData(buffer); - } else { - this.buffer = buffer; - } - this.duration = this.buffer.duration; - } - - play(when) { - if (this.playing || !this.buffer) return; - this.playing = true; - this.lastStartTime = this.ac.currentTime; - if (this.player.status !== AudioStatus.Playing) { - this.player.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.player.status === AudioStatus.Playing) { - this.player.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - - stop() { - this.output.stop(); - return this.ac.currentTime - this.lastStartTime; - } - - connect(target) { - this.target = target; - } - - setLoop(loop) { - this.loop = loop; - } - } - class AudioPlayer { - constructor() { - /** 音频播放上下文 */ - this.ac = new AudioContext(); - /** 音量节点 */ - this.gain = this.ac.createGain(); - this.gain.connect(this.ac.destination); - this.audioRoutes = new Map(); - } - /** - * 解码音频数据 - * @param data 音频数据 - */ - decodeAudioData(data) { - return AudioDecoder.decodeAudioData(data, this); - } - /** - * 设置音量 - * @param volume 音量 - */ - setVolume(volume) { - this.gain.gain.value = volume; - } - - /** - * 获取音量 - */ - getVolume() { - return this.gain.gain.value; - } - - /** - * 创建一个音频源 - * @param Source 音频源类 - */ - createSource(Source) { - return new Source(this.ac); - } - - /** - * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 - */ - createStreamSource() { - return new AudioStreamSource(this.ac); - } - - /** - * 创建一个通过 audio 元素播放的音频源 - */ - createElementSource() { - return new AudioElementSource(this.ac); - } - - /** - * 创建一个通过 AudioBuffer 播放的音频源 - */ - createBufferSource() { - return new AudioBufferSource(this.ac); - } - - /** - * 获取音频目的地 - */ - getDestination() { - return this.gain; - } - - /** - * 创建一个音频效果器 - * @param Effect 效果器类 - */ - createEffect(Effect) { - return new Effect(this.ac); - } - - /** - * 创建一个修改音量的效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * |----------| - * ``` - */ - createVolumeEffect() { - return new VolumeEffect(this.ac); - } - - /** - * 创建一个立体声效果器 - * ```txt - * |------------| - * Input ----> | PannerNode | ----> Output - * |------------| - * ``` - */ - createStereoEffect() { - return new StereoEffect(this.ac); - } - - /** - * 创建一个修改单个声道音量的效果器 - * ```txt - * |----------| - * -> | GainNode | \ - * |--------------| / |----------| -> |------------| - * Input ----> | SplitterNode | ...... | MergerNode | ----> Output - * |--------------| \ |----------| -> |------------| - * -> | GainNode | / - * |----------| - * ``` - */ - createChannelVolumeEffect() { - return new ChannelVolumeEffect(this.ac); - } - - /** - * 创建一个延迟效果器 - * |-----------| - * Input ----> | DelayNode | ----> Output - * |-----------| - */ - createDelay() { - return new DelayEffect(this.ac); - } - - /** - * 创建一个回声效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * ^ |----------| | - * | | - * | |------------| ↓ - * |-- | Delay Node | <-- - * |------------| - * ``` - */ - createEchoEffect() { - return new EchoEffect(this.ac); - } - - /** - * 创建一个音频播放路由 - * @param source 音频源 - */ - createRoute(source) { - return new AudioRoute(source, this); - } - - /** - * 添加一个音频播放路由,可以直接被播放 - * @param id 这个音频播放路由的名称 - * @param route 音频播放路由对象 - */ - addRoute(id, route) { - if (!this.audioRoutes) this.audioRoutes = new Map(); - if (this.audioRoutes.has(id)) { - console.warn( - "Audio route with id of '" + - id + - "' has already existed. New route will override old route." - ); - } - this.audioRoutes.set(id, route); - } - - /** - * 根据名称获取音频播放路由对象 - * @param id 音频播放路由的名称 - */ - getRoute(id) { - return this.audioRoutes.get(id); - } - /** - * 移除一个音频播放路由 - * @param id 要移除的播放路由的名称 - */ - removeRoute(id) { - this.audioRoutes.delete(id); - } - /** - * 播放音频 - * @param id 音频名称 - * @param when 从音频的哪个位置开始播放,单位秒 - */ - play(id, when) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot play audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - - route.play(when); - } - - /** - * 暂停音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - pause(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.pause(); - } - - /** - * 停止音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - stop(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot stop audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.stop(); - } - - /** - * 继续音频播放 - * @param id 音频名称 - */ - resume(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - route.resume(); - } - - /** - * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 - * @param y 位置y坐标 - * @param z 位置z坐标 - */ - setListenerPosition(x, y, z) { - const listener = this.ac.listener; - listener.positionX.value = x; - listener.positionY.value = y; - listener.positionZ.value = z; - } - - /** - * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 - * @param y 朝向y坐标 - * @param z 朝向z坐标 - */ - setListenerOrientation(x, y, z) { - const listener = this.ac.listener; - listener.forwardX.value = x; - listener.forwardY.value = y; - listener.forwardZ.value = z; - } - - /** - * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 头顶朝向x坐标 - * @param y 头顶朝向y坐标 - * @param z 头顶朝向z坐标 - */ - setListenerUp(x, y, z) { - const listener = this.ac.listener; - listener.upX.value = x; - listener.upY.value = y; - listener.upZ.value = z; - } - } - class AudioRoute { - constructor(source, player) { - this.output = source.output; - - /** 效果器路由图 */ - this.effectRoute = []; - - /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ - this.endTime = 0; - /** 暂停时播放了多长时间 */ - this.pauseCurrentTime = 0; - /** 当前播放状态 */ - this.player = player; - this.player.status = AudioStatus.Stoped; - this.shouldStop = false; - /** - * 每次暂停或停止时自增,用于判断当前正在处理的情况。 - * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 - */ - this.stopIdentifier = 0; - /** 暂停时刻 */ - this.pauseTime = 0; - this.source = source; - this.source.player = player; - } - /** 音频时长,单位秒 */ - get duration() { - return this.source.duration; - } - /** 当前播放了多长时间,单位秒 */ - get currentTime() { - if (this.player.status === AudioStatus.Paused) { - return this.pauseCurrentTime; - } else { - return this.source.currentTime; - } - } - set currentTime(time) { - this.source.stop(); - this.source.play(time); - } - /** - * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 - * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 - */ - setEndTime(time) { - this.endTime = time; - } - - /** - * 当音频播放时执行的函数,可以用于音频淡入效果 - * @param fn 音频开始播放时执行的函数 - */ - onStart(fn) { - this.audioStartHook = fn; - } - - /** - * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 - * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 - * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 - */ - onEnd(fn) { - this.audioEndHook = fn; - } - - /** - * 开始播放这个音频 - * @param when 从音频的什么时候开始播放,单位秒 - */ - play(when = 0) { - if (this.player.status === AudioStatus.Playing) return; - this.link(); - if (this.effectRoute.length > 0) { - const first = this.effectRoute[0]; - this.source.connect(first); - const last = this.effectRoute.at(-1); - last.connect({ input: this.player.getDestination() }); - } else { - this.source.connect({ input: this.player.getDestination() }); - } - this.source.play(when); - this.player.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - if (this.source.player.status !== AudioStatus.Playing) { - this.source.player.status = AudioStatus.Playing; - } - } - - /** - * 暂停音频播放 - */ - async pause() { - if (this.player.status !== AudioStatus.Playing) return; - this.player.status = AudioStatus.Pausing; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.player.status !== AudioStatus.Pausing || - this.stopIdentifier !== identifier - ) { - return; - } - this.pauseCurrentTime = this.source.currentTime; - const time = this.source.stop(); - this.pauseTime = time; - if (this.shouldStop) { - this.player.status = AudioStatus.Stoped; - this.endAllEffect(); - - this.shouldStop = false; - } else { - this.player.status = AudioStatus.Paused; - this.endAllEffect(); - } - this.endAllEffect(); - } - - /** - * 继续音频播放 - */ - resume() { - if (this.player.status === AudioStatus.Playing) return; - if ( - this.player.status === AudioStatus.Pausing || - this.player.status === AudioStatus.Stoping - ) { - this.audioStartHook?.(this); - - return; - } - if (this.player.status === AudioStatus.Paused) { - this.play(this.pauseTime); - } else { - this.play(0); - } - this.player.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - } - - /** - * 停止音频播放 - */ - async stop() { - if (this.status !== AudioStatus.Playing) { - if (this.status === AudioStatus.Pausing) { - this.shouldStop = true; - } - return; - } - this.status = AudioStatus.Stoping; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Stoping || - this.stopIdentifier !== identifier - ) { - return; - } - this.source.stop(); - this.status = AudioStatus.Stoped; - this.pauseTime = 0; - this.endAllEffect(); - } - - /** - * 添加效果器 - * @param effect 要添加的效果,可以是数组,表示一次添加多个 - * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 - */ - addEffect(effect, index) { - if (isNil(index)) { - if (effect instanceof Array) { - this.effectRoute.push(...effect); - } else { - this.effectRoute.push(effect); - } - } else { - if (effect instanceof Array) { - this.effectRoute.splice(index, 0, ...effect); - } else { - this.effectRoute.splice(index, 0, effect); - } - } - this.setOutput(); - if (this.source.playing) this.link(); - } - - /** - * 移除一个效果器 - * @param effect 要移除的效果 - */ - removeEffect(effect) { - const index = this.effectRoute.indexOf(effect); - if (index === -1) return; - this.effectRoute.splice(index, 1); - effect.disconnect(); - this.setOutput(); - if (this.source.playing) this.link(); - } - - setOutput() { - const effect = this.effectRoute.at(-1); - if (!effect) this.output = this.source.output; - else this.output = effect.output; - } - - /** - * 连接音频路由图 - */ - link() { - this.effectRoute.forEach((v) => v.disconnect()); - this.effectRoute.forEach((v, i) => { - const next = this.effectRoute[i + 1]; - if (next) { - v.connect(next); - } - }); - } - - startAllEffect() { - this.effectRoute.forEach((v) => v.start()); - } - - endAllEffect() { - this.effectRoute.forEach((v) => v.end()); - } - } - - const audioPlayer = new AudioPlayer(); - - class BgmController { - constructor(player) { - this.mainGain = player.createVolumeEffect(); - this.player = player; - /** bgm音频名称的前缀 */ - this.prefix = "bgms."; - /** 每个 bgm 的音量控制器 */ - this.gain = new Map(); - - /** 正在播放的 bgm */ - this.playingBgm = ""; - /** 是否正在播放 */ - this.playing = false; - - /** 是否已经启用 */ - this.enabled = true; - /** 是否屏蔽所有的音乐切换 */ - this.blocking = false; - /** 渐变时长 */ - this.transitionTime = 2000; - } - - /** - * 设置音频渐变时长 - * @param time 渐变时长 - */ - setTransitionTime(time) { - this.transitionTime = time; - for (const [, value] of this.gain) { - value.transition.time(time); - } - } - - /** - * 屏蔽音乐切换 - */ - blockChange() { - this.blocking = true; - } - - /** - * 取消屏蔽音乐切换 - */ - unblockChange() { - this.blocking = false; - } - - /** - * 设置总音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.mainGain.setVolume(volume); - this._volume = volume; - } - /** - * 获取总音量大小 - */ - getVolume() { - return this.mainGain.getVolume(); - } - /** - * 设置是否启用 - * @param enabled 是否启用 - */ - setEnabled(enabled) { - if (enabled) this.resume(); - else this.stop(); - this.enabled = enabled; - } - - /** - * 设置 bgm 音频名称的前缀 - */ - setPrefix(prefix) { - this.prefix = prefix; - } - - getId(name) { - return `${this.prefix}${name}`; - } - - /** - * 根据 bgm 名称获取其 AudioRoute 实例 - * @param id 音频名称 - */ - get(id) { - return this.player.getRoute(this.getId(id)); - } - - /** - * 添加一个 bgm - * @param id 要添加的 bgm 的名称 - * @param url 指定 bgm 的加载地址 - */ - addBgm(id, url = `project/bgms/${id}`) { - const type = guessTypeByExt(id); - if (!type) { - console.warn( - "Unknown audio extension name: '" + - id.split(".").slice(0, -1).join(".") + - "'" - ); - return; - } - const gain = this.player.createVolumeEffect(); - if (isAudioSupport(type)) { - const source = audioPlayer.createElementSource(); - source.setSource(url); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } else { - const source = audioPlayer.createStreamSource(); - const stream = new StreamLoader(url); - stream.pipe(source); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } - } - - /** - * 移除一个 bgm - * @param id 要移除的 bgm 的名称 - */ - removeBgm(id) { - this.player.removeRoute(this.getId(id)); - const gain = this.gain.get(id); - gain?.transition.ticker.destroy(); - this.gain.delete(id); - } - - setTransition(id, route, gain) { - const transition = new Transition(); - transition - .time(this.transitionTime) - .mode(linear()) - .transition("volume", 0); - - const tick = () => { - gain.setVolume(transition.value.volume); - }; - - /** - * @param expect 在结束时应该是正在播放还是停止 - */ - const setTick = async (expect) => { - transition.ticker.remove(tick); - transition.ticker.add(tick); - const identifier = route.stopIdentifier; - await sleep(this.transitionTime + 500); - if (route.status === expect && identifier === route.stopIdentifier) { - transition.ticker.remove(tick); - if (route.status === AudioStatus.Playing) { - gain.setVolume(1); - } else { - gain.setVolume(0); - } - } - }; - - route.onStart(async () => { - transition.transition("volume", 1); - setTick(AudioStatus.Playing); - }); - route.onEnd(() => { - transition.transition("volume", 0); - setTick(AudioStatus.Paused); - }); - route.setEndTime(this.transitionTime); - - this.gain.set(id, { effect: gain, transition }); - } - - /** - * 播放一个 bgm - * @param id 要播放的 bgm 名称 - */ - play(id, when) { - if (this.blocking) return; - if (id !== this.playingBgm && this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playingBgm = id; - if (!this.enabled) return; - this.player.play(this.getId(id), when); - this.playing = true; - if (this.player.status !== AudioStatus.Playing) { - this.player.status = AudioStatus.Playing; - } - } - - /** - * 继续当前的 bgm - */ - resume() { - if (this.blocking || !this.enabled || this.playing) return; - if (this.playingBgm) { - this.player.resume(this.getId(this.playingBgm)); - } - this.playing = true; - } - - /** - * 暂停当前的 bgm - */ - pause() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playing = false; - } - - /** - * 停止当前的 bgm - */ - stop() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.stop(this.getId(this.playingBgm)); - } - this.playing = false; - } - } - const bgmController = new BgmController(audioPlayer); - - class SoundPlayer { - constructor(player) { - /** 每个音效的唯一标识符 */ - this.num = 0; - this.enabled = true; - this.gain = player.createVolumeEffect(); - /** 每个音效的数据 */ - this.buffer = new Map(); - /** 所有正在播放的音乐 */ - this.playing = new Set(); - this.player = player; - } - /** - * 设置是否启用音效 - * @param enabled 是否启用音效 - */ - setEnabled(enabled) { - if (!enabled) this.stopAllSounds(); - this.enabled = enabled; - } - - /** - * 设置音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.gain.setVolume(volume); - } - /** - * 获取音量大小 - */ - getVolume() { - return this.gain.getVolume(); - } - /** - * 添加一个音效 - * @param id 音效名称 - * @param data 音效的Uint8Array数据 - */ - async add(id, data) { - const buffer = await this.player.decodeAudioData(data); - if (!buffer) { - console.warn( - "Cannot decode sound '" + - id + - "', since audio file may not supported by 2.b." - ); - return; - } - this.buffer.set(id, buffer); - } - - /** - * 播放一个音效 - * @param id 音效名称 - * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 - * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 - */ - play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { - if (!this.enabled) return -1; - const buffer = this.buffer.get(id); - if (!buffer) { - console.warn( - "Cannot play sound '" + - id + - "', since there is no added data named it." - ); - return -1; - } - const soundNum = this.num++; - - const source = this.player.createBufferSource(); - source.setBuffer(buffer); - const route = this.player.createRoute(source); - const stereo = this.player.createStereoEffect(); - stereo.setPosition(position[0], position[1], position[2]); - stereo.setOrientation(orientation[0], orientation[1], orientation[2]); - route.addEffect([stereo, this.gain]); - this.player.addRoute(`sounds.${soundNum}`, route); - route.play(); - source.output.addEventListener("ended", () => { - this.playing.delete(soundNum); - }); - this.playing.add(soundNum); - return soundNum; - } - - /** - * 停止一个音效 - * @param num 音效的唯一 id - */ - stop(num) { - const id = `sounds.${num}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - this.playing.delete(num); - } - } - - /** - * 停止播放所有音效 - */ - stopAllSounds() { - this.playing.forEach((v) => { - const id = `sounds.${v}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - } - }); - this.playing.clear(); - } - } - const soundPlayer = new SoundPlayer(audioPlayer); - - function loadAllBgm() { - const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; - for (const bgm of data.main.bgms) { - bgmController.addBgm(bgm); - } - } - loadAllBgm(); - AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); - AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); - - core.plugin.audioSystem = { - AudioType, - AudioDecoder, - AudioStatus, - checkAudioType, - isAudioSupport, - audioPlayer, - soundPlayer, - bgmController, - guessTypeByExt, - BgmController, - SoundPlayer, - EchoEffect, - DelayEffect, - ChannelVolumeEffect, - VolumeEffect, - StereoEffect, - AudioEffect, - AudioPlayer, - AudioRoute, - AudioStreamSource, - AudioElementSource, - AudioBufferSource, - loadAllBgm, - StreamLoader, - }; - //bgm相关复写 - control.prototype.playBgm = (bgm, when) => { - bgmController.play(bgm, when); - core.setMusicBtn(); - }; - control.prototype.pauseBgm = () => { - bgmController.pause(); - core.setMusicBtn(); - }; - - control.prototype.resumeBgm = function () { - bgmController.resume(); - core.setMusicBtn(); - }; - control.prototype.checkBgm = function () { - if (bgmController.playing) return; - if (core.musicStatus.bgmStatus) { - if (bgmController.playingBgm) { - bgmController.play(bgmController.playingBgm); - } else { - play(main.startBgm, 0); - } - } else { - pause(); - } - }; - control.prototype.triggerBgm = function () { - core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; - if (bgmController.playing) bgmController.pause(); - else bgmController.resume(); - core.setMusicBtn(); - core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); - }; - //sound相关复写 - control.prototype.playSound = function ( - sound, - _pitch, - callback, - position, - orientation - ) { - if (main.mode != "play" || !core.musicStatus.soundStatus) return; - const name = core.getMappedName(sound); - const num = soundPlayer.play(name, position, orientation); - const route = audioPlayer.getRoute(`sounds.${num}`); - if (!route) { - callback?.(); - return -1; - } else { - sleep(route.duration).then(() => callback?.()); - return num; - } - }; - control.prototype.stopSound = function (id) { - if (isNil(id)) { - soundPlayer.stopAllSounds(); - } else { - soundPlayer.stop(id); - } - }; - control.prototype.getPlayingSounds = function () { - return [...soundPlayer.playing]; - }; - //sound加载复写 - loader.prototype._loadOneSound_decodeData = function (name, data) { - if (data instanceof Blob) { - var blobReader = new zip.BlobReader(data); - blobReader.init(function () { - blobReader.readUint8Array(0, blobReader.size, function (uint8) { - //core.loader._loadOneSound_decodeData(name, uint8.buffer); - soundPlayer.add(name, uint8); - }); - }); - return; - } - if (data instanceof ArrayBuffer) { - const uint8 = new Uint8Array(data); - soundPlayer.add(name, uint8); - } - }; - //音量控制复写 - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { - var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); - if (value == 0 && delta < 0) return; - core.musicStatus.userVolume = core.clamp( - Math.pow(value + delta, 2) / 100, - 0, - 1 - ); - //audioContext 音效 不受designVolume 影响 - if (core.musicStatus.gainNode != null) - core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - core.setLocalStorage("userVolume", core.musicStatus.userVolume); - core.playSound("确定"); - core.ui._drawSwitchs_sounds(); - }; -}, - "怪物碎裂特效": function () { - // 在此增加新插件 - // -------------------- 安装说明 -------------------- // - // 先安装两个在插件简介中说明的前置插件 - // 然后再将本插件复制到插件编写中即可 - // 插件自带一个打怪后显示碎裂特效的功能 - // -------------------- 使用说明 -------------------- // - /* - - 本插件的核心是一个名为 applyFragWith 的函数,打怪后的碎裂特效也是由它执行的。 - 我们来说明一下这个函数的使用方式。 - 1. 引入 - 你可以使用 const { applyFragWith } = core.plugin.frag; 在任何地方来引入这个函数。 - - 2. 函数的参数 - 该函数有三个参数,分别是canvas, length, time。 - 其中,第一个参数意思是,在执行碎裂时,其内容由该画布决定,这个特效并不会修改传入的画布,因此原画布的内容会依然存在 - 第二个参数指的是每个碎片的边长,虽然原则上每个碎片都是正方形,但边缘一周的碎片可能不是正方形,但中间的碎片一定是 - 第三个参数指的是这个特效要执行多长时间 - 第四个参数是一个对象,包含四种配置量,均为可选,分别是maxMoveLength,moveFlush,maxRotate,fragTiming - 当这些不存在时会默认取同名的常量作为默认值。这些值有什么用可以看下面的常量注释。 - - 3. 函数的返回值 - 这个函数会返回一个特效控制器对象,这个控制器共有三个属性。 - animation: 指的是当前特效的高级动画对象 - onEnd: 一个Promise,当这个特效执行完毕后会被 fulfilled - canvas: 特效所显示的画布。这个画布不会自动部署到样板中,需要你手动使用appendChild来部署,具体可参考打怪后碎裂的样例 - - 4. 修改一些常量 - 在下面有四个有注释的常量MAX_MOVE_LENGTH ~ FRAG_TIMING,你可以根据你自己的需要来更改。 - - */ - - if (main.replayChecking) return (core.plugin.frag = {}); - - const { Animation, linear, sleep } = core.plugin.animate; - const { has } = core.plugin.utils; - - /** 最大移动距离,最终位置距离中心的距离变成原来的几倍 */ - const MAX_MOVE_LENGTH = 1.15; - /** 移动距离波动,在最大移动距离的基础上加上多少倍距离的波动距离 */ - const MOVE_FLUSH = 0.7; - /** 最大旋转角,单位是弧度,每个碎片都会有自己的旋转程度,是随机的 */ - const MAX_ROTATE = 0.5; - /** 碎裂动画的速率曲线函数 */ - const FRAG_TIMING = linear(); - + // 将__enable置为false将关闭插件 + let __enable = true; + if (!__enable || main.mode === "editor") return; + const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; + const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; + const { CodecParser } = window.CodecParser; + const { Transition, linear } = core.plugin.animate; + + const audio = new Audio(); + const AudioStatus = { + Playing: 0, + Pausing: 1, + Paused: 2, + Stoping: 3, + Stoped: 4, + }; + const supportMap = new Map(); + const AudioType = { + Mp3: "audio/mpeg", + Wav: 'audio/wav; codecs="1"', + Flac: "audio/flac", + Opus: 'audio/ogg; codecs="opus"', + Ogg: 'audio/ogg; codecs="vorbis"', + Aac: "audio/aac", + }; /** - * @param {HTMLCanvasElement} canvas 要执行特效的画布 - * @param {number} length 切分成的碎片的边长,碎片为正方形 - * @param {number} time 特效持续时长 - * @returns 返回一个碎裂特效控制器,是一个对象,详见开头的使用注释 + * 检查一种音频类型是否能被播放 + * @param type 音频类型 AudioType */ - function applyFragWith(canvas, length = 4, time = 2000, config = {}) { - // 先切分图片 - const imgs = splitCanvas(canvas, length); - const cx = canvas.width / 2; - const cy = canvas.height / 2; - - let maxX = 0; - let maxY = 0; - const toMove = imgs.map((v) => { - const centerX = v.x + v.canvas.width / 2; - const centerY = v.y + v.canvas.height / 2; - const onX = centerX === cx; - const onY = centerY === cy; - const mml = config.maxMoveLength ?? MAX_MOVE_LENGTH; - const mf = config.moveFlush ?? MOVE_FLUSH; - const rate = mml - 1 + Math.random() ** 3 * mf; - let endX = onY ? 0 : (centerX - cx) * rate; - let endY = onX ? 0 : (centerY - cy) * rate; - const mx = Math.abs(endX + centerX) + Math.abs(v.canvas.width); - const my = Math.abs(endY + centerY) + Math.abs(v.canvas.height); - if (mx > maxX) maxX = mx; - if (my > maxY) maxY = my; - const r = config.maxRotate ?? MAX_ROTATE; - const endRad = Math.random() * r * 2 - r; - - return { - deltaX: endX, - deltaY: endY, - endRad, - x: centerX, - y: centerY, - canvas: v.canvas, - }; - }); - - // 再执行动画 - const frag = document.createElement("canvas"); - const ctx = frag.getContext("2d"); - const ani = new Animation(); - ani.register("rate", 0); - const ft = config.fragTiming ?? FRAG_TIMING; - ani.absolute().time(time).mode(ft).apply("rate", 1); - frag.width = maxX * 2; - frag.height = maxY * 2; - ctx.save(); - const dw = maxX - canvas.width / 2; - const dh = maxY - canvas.height / 2; - - const fragFn = () => { - const rate = ani.value.rate; - const opacity = 1 - rate; - ctx.globalAlpha = opacity; - ctx.clearRect(0, 0, frag.width, frag.height); - toMove.forEach((v) => { - ctx.save(); - const nx = v.deltaX * rate; - const ny = v.deltaY * rate; - const rotate = v.endRad * rate; - - ctx.translate(nx + v.x + dw, ny + v.y + dh); - ctx.rotate(rotate); - ctx.drawImage( - v.canvas, - nx - v.canvas.width / 2, - ny - v.canvas.height / 2 - ); - ctx.restore(); - }); - }; - const onEnd = () => {}; - ani.ticker.add(fragFn); - - return makeFragManager(frag, ani, time, onEnd); - } - - function makeFragManager(canvas, ani, time, onEnd) { - const promise = sleep(time + 50); - - return { - animation: ani, - - onEnd: promise.then(() => { - ani.ticker.destroy(); - onEnd(); - }), - canvas, - }; - } - - function withImage(image, sx, sy, sw, sh) { - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d"); - canvas.width = sw; - canvas.height = sh; - ctx.drawImage(image, sx, sy, sw, sh, 0, 0, sw, sh); - return { canvas, x: sx, y: sy }; - } - - /** - * 切分画布 - * @param canvas 要被切分的画布 - * @param l 切分小块的边长 - */ - function splitCanvas(canvas, l) { - if (canvas.width / l < 2 || canvas.height / l < 2) { - console.warn("切分画布要求切分边长大于等于画布长宽的一半!"); - return []; + function isAudioSupport(type) { + if (supportMap.has(type)) return supportMap.get(type); + else { + const support = audio.canPlayType(type); + const canPlay = support === "maybe" || support === "probably"; + supportMap.set(type, canPlay); + return canPlay; } - const w = canvas.width; - const h = canvas.height; - const numX = Math.floor(w / l); - const numY = Math.floor(h / l); - const rw = (w - numX * l) / 2; - const rh = (h - numY * l) / 2; + } - const res = []; + const typeMap = new Map([ + ["ogg", AudioType.Ogg], + ["mp3", AudioType.Mp3], + ["wav", AudioType.Wav], + ["flac", AudioType.Flac], + ["opus", AudioType.Opus], + ["aac", AudioType.Aac], + ]); - if (rw > 0) { - if (rh > 0) { - res.push( - withImage(canvas, 0, 0, rw, rh), - withImage(canvas, 0, canvas.height - rh, rw, rh), - withImage(canvas, canvas.width - rw, 0, rw, rh), - withImage(canvas, canvas.width - rw, canvas.height - rh, rw, rh) - ); - } - for (const x of [0, canvas.width - rw]) { - for (let ny = 0; ny < numY; ny++) { - res.push(withImage(canvas, x, rh + l * ny, rw, l)); + /** + * 根据文件名拓展猜测其类型 + * @param file 文件名 string + */ + function guessTypeByExt(file) { + const ext = /\.[a-zA-Z\d]+$/.exec(file); + if (!ext?.[0]) return ""; + const type = ext[0].slice(1); + return typeMap.get(type.toLocaleLowerCase()) ?? ""; + } + + isAudioSupport(AudioType.Ogg); + isAudioSupport(AudioType.Mp3); + isAudioSupport(AudioType.Wav); + isAudioSupport(AudioType.Flac); + isAudioSupport(AudioType.Opus); + isAudioSupport(AudioType.Aac); + + function isNil(value) { + return value === void 0 || value === null; + } + + function sleep(time) { + return new Promise((res) => setTimeout(res, time)); + } + class AudioEffect { + constructor(ac) {} + /** + * 连接至其他效果器 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + connect(target, output, input) { + this.output.connect(target.input, output, input); + } + + /** + * 与其他效果器取消连接 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + disconnect(target, output, input) { + if (!target) { + if (!isNil(output)) { + this.output.disconnect(output); + } else { + this.output.disconnect(); + } + } else { + if (!isNil(output)) { + if (!isNil(input)) { + this.output.disconnect(target.input, output, input); + } else { + this.output.disconnect(target.input, output); + } + } else { + this.output.disconnect(target.input); } } } - if (rh > 0) { - for (const y of [0, canvas.height - rh]) { - for (let nx = 0; nx < numX; nx++) { - res.push(withImage(canvas, rw + l * nx, y, l, rh)); + } + + class StereoEffect extends AudioEffect { + constructor(ac) { + super(ac); + const panner = ac.createPanner(); + this.input = panner; + this.output = panner; + } + + /** + * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 Number + * @param y 朝向y坐标 Number + * @param z 朝向z坐标 Number + */ + setOrientation(x, y, z) { + this.output.orientationX.value = x; + this.output.orientationY.value = y; + this.output.orientationZ.value = z; + } + /** + * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 Number + * @param y 位置y坐标 Number + * @param z 位置z坐标 Number + */ + setPosition(x, y, z) { + this.output.positionX.value = x; + this.output.positionY.value = y; + this.output.positionZ.value = z; + } + end() {} + + start() {} + } + class VolumeEffect extends AudioEffect { + constructor(ac) { + super(ac); + const gain = ac.createGain(); + this.input = gain; + this.output = gain; + } + + /** + * 设置音量大小 + * @param volume 音量大小 Number + */ + setVolume(volume) { + this.output.gain.value = volume; + } + + /** + * 获取音量大小 Number + */ + getVolume() { + return this.output.gain.value; + } + + end() {} + + start() {} + } + class ChannelVolumeEffect extends AudioEffect { + /** 所有的音量控制节点 */ + + constructor(ac) { + super(ac); + /** 所有的音量控制节点 */ + this.gain = []; + const splitter = ac.createChannelSplitter(); + const merger = ac.createChannelMerger(); + this.output = merger; + this.input = splitter; + for (let i = 0; i < 6; i++) { + const gain = ac.createGain(); + splitter.connect(gain, i); + gain.connect(merger, 0, i); + this.gain.push(gain); + } + } + + /** + * 设置某个声道的音量大小 + * @param channel 要设置的声道,可填0-5 Number + * @param volume 这个声道的音量大小 Number + */ + setVolume(channel, volume) { + if (!this.gain[channel]) return; + this.gain[channel].gain.value = volume; + } + + /** + * 获取某个声道的音量大小,可填0-5 + * @param channel 要获取的声道 Number + */ + getVolume(channel) { + if (!this.gain[channel]) return 0; + return this.gain[channel].gain.value; + } + + end() {} + + start() {} + } + class DelayEffect extends AudioEffect { + constructor(ac) { + super(ac); + + const delay = ac.createDelay(); + this.input = delay; + this.output = delay; + } + + /** + * 设置延迟时长 + * @param delay 延迟时长,单位秒 Number + */ + setDelay(delay) { + this.output.delayTime.value = delay; + } + + /** + * 获取延迟时长 + */ + getDelay() { + return this.output.delayTime.value; + } + + end() {} + + start() {} + } + class EchoEffect extends AudioEffect { + constructor(ac) { + super(ac); + /** 当前增益 */ + this.gain = 0.5; + /** 是否正在播放 */ + this.playing = false; + const delay = ac.createDelay(); + const gain = ac.createGain(); + gain.gain.value = 0.5; + delay.delayTime.value = 0.05; + delay.connect(gain); + gain.connect(delay); + /** 延迟节点 */ + this.delay = delay; + /** 反馈增益节点 */ + this.gainNode = gain; + + this.input = gain; + this.output = gain; + } + + /** + * 设置回声反馈增益大小 + * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number + */ + setFeedbackGain(gain) { + const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; + this.gain = resolved; + if (this.playing) this.gainNode.gain.value = resolved; + } + + /** + * 设置回声间隔时长 + * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number + */ + setEchoDelay(delay) { + const resolved = delay < 0.01 ? 0.01 : delay; + this.delay.delayTime.value = resolved; + } + + /** + * 获取反馈节点增益 + */ + getFeedbackGain() { + return this.gain; + } + + /** + * 获取回声间隔时长 + */ + getEchoDelay() { + return this.delay.delayTime.value; + } + + end() { + this.playing = false; + const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; + sleep(this.delay.delayTime.value * echoTime).then(() => { + if (!this.playing) this.gainNode.gain.value = 0; + }); + } + + start() { + this.playing = true; + this.gainNode.gain.value = this.gain; + } + } + + class StreamLoader { + constructor(url) { + /** 传输目标 Set<IStreamReader>*/ + this.target = new Set(); + this.loading = false; + } + + /** + * 将加载流传递给字节流读取对象 + * @param reader 字节流读取对象 IStreamReader + */ + pipe(reader) { + if (this.loading) { + console.warn( + "Cannot pipe new StreamReader object when stream is loading." + ); + return; + } + this.target.add(reader); + reader.piped(this); + return this; + } + + async start() { + if (this.loading) return; + this.loading = true; + const response = await window.fetch(this.url); + const stream = response.body; + if (!stream) { + console.error("Cannot get reader when fetching '" + this.url + "'."); + return; + } + // 获取读取器 + this.stream = stream; + const reader = response.body?.getReader(); + const targets = [...this.target]; + + await Promise.all(targets.map((v) => v.start(stream, this, response))); + if (reader && reader.read) { + // 开始流传输 + while (true) { + const { value, done } = await reader.read(); + await Promise.all( + targets.map((v) => v.pump(value, done, response)) + ); + if (done) break; + } + } else { + // 如果不支持流传输 + const buffer = await response.arrayBuffer(); + const data = new Uint8Array(buffer); + await Promise.all(targets.map((v) => v.pump(data, true, response))); + } + + this.loading = false; + targets.forEach((v) => v.end(true)); + + // + } + + cancel(reason) { + if (!this.stream) return; + this.stream.cancel(reason); + this.loading = false; + this.target.forEach((v) => v.end(false, reason)); + } + } + const fileSignatures = [ + [AudioType.Mp3, [0x49, 0x44, 0x33]], + [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], + [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], + [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], + [AudioType.Aac, [0xff, 0xf1]], + [AudioType.Aac, [0xff, 0xf9]], + ]; + const oggHeaders = [ + [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], + ]; + + function checkAudioType(data) { + let audioType = ""; + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + for (const [type, value] of fileSignatures) { + if (value.every((v, i) => toCheck[i] === v)) { + audioType = type; + break; + } + } + if (audioType === AudioType.Ogg) { + // 如果是ogg的话,进一步判断是不是opus + for (const [key, value] of oggHeaders) { + const has = toCheck.some((_, i) => { + return value.every((v, ii) => toCheck[i + ii] === v); + }); + if (has) { + audioType = key; + break; } } } - for (let nx = 0; nx < numX; nx++) { - for (let ny = 0; ny < numY; ny++) { - res.push(withImage(canvas, rw + l * nx, rh + l * ny, l, l)); + + return audioType; + } + class AudioDecoder { + /** + * 注册一个解码器 + * @param type 要注册的解码器允许解码的类型 + * @param decoder 解码器对象 + */ + static registerDecoder(type, decoder) { + if (!this.decoderMap) this.decoderMap = new Map(); + if (this.decoderMap.has(type)) { + console.warn( + "Audio stream decoder for audio type '" + + type + + "' has already existed." + ); + return; + } + + this.decoderMap.set(type, decoder); + } + + /** + * 解码音频数据 + * @param data 音频文件数据 + * @param player AudioPlayer实例 + */ + static async decodeAudioData(data, player) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + const type = checkAudioType(data); + if (type === "") { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString().padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return null; + } + if (isAudioSupport(type)) { + if (data.buffer instanceof ArrayBuffer) { + return player.ac.decodeAudioData(data.buffer); + } else { + return null; + } + } else { + const Decoder = this.decoderMap.get(type); + if (!Decoder) { + return null; + } else { + const decoder = new Decoder(); + await decoder.create(); + const decodedData = await decoder.decode(data); + if (!decodedData) return null; + const buffer = player.ac.createBuffer( + decodedData.channelData.length, + decodedData.channelData[0].length, + decodedData.sampleRate + ); + decodedData.channelData.forEach((v, i) => { + buffer.copyToChannel(v, i); + }); + decoder.destroy(); + return buffer; + } } } - - return res; } - const origin = core.events.afterBattle; - core.events.afterBattle = function (enemyId, x, y) { - // 打怪特效 - if (has(x) && has(y)) { - const frame = core.status.globalAnimateStatus % 2; - // 生成怪物图像 - const canvas = document.createElement("canvas"); - canvas.width = 32; - canvas.height = 32; - core.drawIcon(canvas, enemyId, 0, 0, 32, 32, frame); - // 执行动画 - const manager = applyFragWith(canvas); - const frag = manager.canvas; - // 设置特效画布的css属性 - frag.style.imageRendering = "pixelated"; - frag.style.width = `${frag.width * core.domStyle.scale}px`; - frag.style.height = `${frag.height * core.domStyle.scale}px`; - const left = - (x * 32 + 16 - frag.width / 2 - core.bigmap.offsetX) * - core.domStyle.scale; - const top = - (y * 32 + 16 - frag.height / 2 - core.bigmap.offsetY) * - core.domStyle.scale; - frag.style.left = `${left}px`; - frag.style.top = `${top}px`; - frag.style.zIndex = "45"; - frag.style.position = "absolute"; - // 将特效画布部署到样板上 - core.dom.gameDraw.appendChild(frag); - // 当特效执行完毕后移除这个特效画布 - manager.onEnd.then(() => { - frag.remove(); - }); + class VorbisDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggVorbisDecoderWebWorker(); + await this.decoder.ready; } - return origin.apply(this, arguments); + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return this.decoder?.flush(); + } + } + + class OpusDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggOpusDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return await this.decoder?.flush(); + } + } + const mimeTypeMap = { + [AudioType.Aac]: "audio/aac", + [AudioType.Flac]: "audio/flac", + [AudioType.Mp3]: "audio/mpeg", + [AudioType.Ogg]: "application/ogg", + [AudioType.Opus]: "application/ogg", + [AudioType.Wav]: "application/ogg", }; - if ("frag" in core.plugin) { - throw new ReferenceError(`core.plugin上已存在名为frag的属性!`); + function isOggPage(data) { + return !isNil(data.isFirstPage); } - core.plugin.frag = { - applyFragWith, + class AudioStreamSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否已经完全加载完毕 */ + this.loaded = false; + /** 是否正在播放 */ + this.playing = false; + /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ + this.buffered = 0; + /** 已经缓冲的采样点数量 */ + this.bufferedSamples = 0; + /** 歌曲时长,加载完毕之前保持为 0 */ + this.duration = 0; + /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ + this.bufferPlayDuration = 1; + /** 音频的采样率,未成功解析出之前保持为 0 */ + this.sampleRate = 0; + //是否循环播放 + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 开始播放时刻 */ + this.lastStartTime = 0; + /** 上一次播放的缓存长度 */ + this.lastBufferSamples = 0; + + /** 是否已经获取到头文件 */ + this.headerRecieved = false; + /** 音频类型 */ + this.audioType = ""; + /** 每多长时间组成一个缓存 Float32Array */ + this.bufferChunkSize = 10; + /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ + this.audioData = []; + + this.errored = false; + this.ac = context; + } + /** 当前已经播放了多长时间 */ + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + /** + * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 + * @param size 每个缓存数据的时长,单位秒 + */ + setChunkSize(size) { + if (this.controller?.loading || this.loaded) return; + this.bufferChunkSize = size; + } + + piped(controller) { + this.controller = controller; + } + + async pump(data, done) { + if (!data || this.errored) return; + if (!this.headerRecieved) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + this.audioType = checkAudioType(data); + if (!this.audioType) { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString(16).padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return; + } + // 创建解码器 + const Decoder = AudioDecoder.decoderMap.get(this.audioType); + if (!Decoder) { + this.errored = true; + console.error( + "Cannot decode stream source type of '" + + this.audioType + + "', since there is no registered decoder for that type." + ); + return Promise.reject( + `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` + ); + } + this.decoder = new Decoder(); + // 创建数据解析器 + const mime = mimeTypeMap[this.audioType]; + const parser = new CodecParser(mime); + this.parser = parser; + await this.decoder.create(); + this.headerRecieved = true; + } + + const decoder = this.decoder; + const parser = this.parser; + if (!decoder || !parser) { + this.errored = true; + return Promise.reject( + "No parser or decoder attached in this AudioStreamSource" + ); + } + + await this.decodeData(data, decoder, parser); + if (done) await this.decodeFlushData(decoder, parser); + this.checkBufferedPlay(); + } + + /** + * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 + */ + checkSampleRate(info) { + for (const one of info) { + const frame = isOggPage(one) ? one.codecFrames[0] : one; + if (frame) { + const rate = frame.header.sampleRate; + if (this.sampleRate === 0) { + this.sampleRate = rate; + break; + } else { + if (rate !== this.sampleRate) { + console.warn("Sample rate in stream audio must be constant."); + } + } + } + } + } + + /** + * 解析音频数据 + */ + async decodeData(data, decoder, parser) { + // 解析音频数据 + const audioData = await decoder.decode(data); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.parseChunk(data)]; + + // 检查采样率 + this.checkSampleRate(audioInfo); + // 追加音频数据 + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 解码剩余数据 + */ + async decodeFlushData(decoder, parser) { + const audioData = await decoder.flush(); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.flush()]; + + this.checkSampleRate(audioInfo); + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 追加音频数据 + */ + appendDecodedData(data, info) { + const channels = data.channelData.length; + if (channels === 0) return; + if (this.audioData.length !== channels) { + this.audioData = []; + for (let i = 0; i < channels; i++) { + this.audioData.push([]); + } + } + // 计算出应该放在哪 + const chunk = this.sampleRate * this.bufferChunkSize; + const sampled = this.bufferedSamples; + const pushIndex = Math.floor(sampled / chunk); + const bufferIndex = sampled % chunk; + const dataLength = data.channelData[0].length; + let buffered = 0; + let nowIndex = pushIndex; + let toBuffer = bufferIndex; + while (buffered < dataLength) { + const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; + + for (let i = 0; i < channels; i++) { + const audioData = this.audioData[i]; + if (!audioData[nowIndex]) { + audioData.push(new Float32Array(chunk)); + } + const toPush = data.channelData[i].slice(buffered, buffered + rest); + + audioData[nowIndex].set(toPush, toBuffer); + } + buffered += rest; + nowIndex++; + toBuffer = 0; + } + + this.buffered += + info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; + this.bufferedSamples += info.reduce( + (prev, curr) => prev + curr.samples, + 0 + ); + } + + /** + * 检查已缓冲内容,并在未开始播放时播放 + */ + checkBufferedPlay() { + if (this.playing || this.sampleRate === 0) return; + const played = this.lastBufferSamples / this.sampleRate; + const dt = this.buffered - played; + if (this.loaded) { + this.playAudio(played); + return; + } + if (dt < this.bufferPlayDuration) return; + + this.lastBufferSamples = this.bufferedSamples; + // 需要播放 + this.mergeBuffers(); + if (!this.buffer) return; + if (this.playing) this.output.stop(); + this.createSourceNode(this.buffer); + this.output.loop = false; + this.output.start(0, played); + this.lastStartTime = this.ac.currentTime; + this.playing = true; + this.output.addEventListener("ended", () => { + this.playing = false; + this.checkBufferedPlay(); + }); + } + + mergeBuffers() { + const buffer = this.ac.createBuffer( + this.audioData.length, + this.bufferedSamples, + this.sampleRate + ); + const chunk = this.sampleRate * this.bufferChunkSize; + const bufferedChunks = Math.floor(this.bufferedSamples / chunk); + const restLength = this.bufferedSamples % chunk; + for (let i = 0; i < this.audioData.length; i++) { + const audio = this.audioData[i]; + const data = new Float32Array(this.bufferedSamples); + for (let j = 0; j < bufferedChunks; j++) { + data.set(audio[j], chunk * j); + } + if (restLength !== 0) { + data.set( + audio[bufferedChunks].slice(0, restLength), + chunk * bufferedChunks + ); + } + + buffer.copyToChannel(data, i, 0); + } + this.buffer = buffer; + } + + async start() { + delete this.buffer; + this.headerRecieved = false; + this.audioType = ""; + this.errored = false; + this.buffered = 0; + this.sampleRate = 0; + this.bufferedSamples = 0; + this.duration = 0; + this.loaded = false; + if (this.playing) this.output.stop(); + this.playing = false; + this.lastStartTime = this.ac.currentTime; + } + + end(done, reason) { + if (done && this.buffer) { + this.loaded = true; + delete this.controller; + this.mergeBuffers(); + + this.duration = this.buffered; + this.audioData = []; + this.decoder?.destroy(); + delete this.decoder; + delete this.parser; + } else { + console.warn( + "Unexpected end when loading stream audio, reason: '" + + (reason ?? "") + + "'" + ); + } + } + + playAudio(when) { + if (!this.buffer) return; + this.lastStartTime = this.ac.currentTime; + if (this.playing) this.output.stop(); + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.playing = true; + + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + /** + * 开始播放这个音频源 + */ + play(when) { + if (this.playing || this.errored) return; + if (this.loaded && this.buffer) { + this.playing = true; + this.playAudio(when); + } else { + this.controller?.start(); + } + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + if (this.playing) this.output.stop(); + this.playing = false; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + /** + * 停止播放这个音频源 + * @returns 音频暂停的时刻 number + */ + stop() { + if (this.playing) this.output.stop(); + this.playing = false; + return this.ac.currentTime - this.lastStartTime; + } + /** + * 连接到音频路由图上,每次调用播放的时候都会执行一次 + * @param target 连接至的目标 IAudioInput + */ + connect(target) { + this.target = target; + } + /** + * 设置是否循环播放 + * @param loop 是否循环 boolean) + */ + setLoop(loop) { + this.loop = loop; + } + } + class AudioElementSource { + constructor(context) { + const audio = new Audio(); + audio.preload = "none"; + this.output = context.createMediaElementSource(audio); + this.audio = audio; + this.ac = context; + audio.addEventListener("play", () => { + this.playing = true; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + }); + audio.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + }); + } + get duration() { + return this.audio.duration; + } + get currentTime() { + return this.audio.currentTime; + } + /** + * 设置音频源的路径 + * @param url 音频路径 + */ + setSource(url) { + this.audio.src = url; + } + + play(when = 0) { + if (this.playing) return; + this.audio.currentTime = when; + this.audio.play(); + } + + stop() { + this.audio.pause(); + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + return this.audio.currentTime; + } + + connect(target) { + this.output.connect(target.input); + } + + setLoop(loop) { + this.audio.loop = loop; + } + } + class AudioBufferSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否循环 */ + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 播放开始时刻 */ + this.lastStartTime = 0; + this.duration = 0; + this.ac = context; + } + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + + /** + * 设置音频源数据 + * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer + */ + async setBuffer(buffer) { + if (buffer instanceof ArrayBuffer) { + this.buffer = await this.ac.decodeAudioData(buffer); + } else { + this.buffer = buffer; + } + this.duration = this.buffer.duration; + } + + play(when) { + if (this.playing || !this.buffer) return; + this.playing = true; + this.lastStartTime = this.ac.currentTime; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + + stop() { + this.output.stop(); + return this.ac.currentTime - this.lastStartTime; + } + + connect(target) { + this.target = target; + } + + setLoop(loop) { + this.loop = loop; + } + } + class AudioPlayer { + constructor() { + /** 音频播放上下文 */ + this.ac = new AudioContext(); + /** 音量节点 */ + this.gain = this.ac.createGain(); + this.gain.connect(this.ac.destination); + this.audioRoutes = new Map(); + } + /** + * 解码音频数据 + * @param data 音频数据 + */ + decodeAudioData(data) { + return AudioDecoder.decodeAudioData(data, this); + } + /** + * 设置音量 + * @param volume 音量 + */ + setVolume(volume) { + this.gain.gain.value = volume; + } + + /** + * 获取音量 + */ + getVolume() { + return this.gain.gain.value; + } + + /** + * 创建一个音频源 + * @param Source 音频源类 + */ + createSource(Source) { + return new Source(this.ac); + } + + /** + * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 + */ + createStreamSource() { + return new AudioStreamSource(this.ac); + } + + /** + * 创建一个通过 audio 元素播放的音频源 + */ + createElementSource() { + return new AudioElementSource(this.ac); + } + + /** + * 创建一个通过 AudioBuffer 播放的音频源 + */ + createBufferSource() { + return new AudioBufferSource(this.ac); + } + + /** + * 获取音频目的地 + */ + getDestination() { + return this.gain; + } + + /** + * 创建一个音频效果器 + * @param Effect 效果器类 + */ + createEffect(Effect) { + return new Effect(this.ac); + } + + /** + * 创建一个修改音量的效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * |----------| + * ``` + */ + createVolumeEffect() { + return new VolumeEffect(this.ac); + } + + /** + * 创建一个立体声效果器 + * ```txt + * |------------| + * Input ----> | PannerNode | ----> Output + * |------------| + * ``` + */ + createStereoEffect() { + return new StereoEffect(this.ac); + } + + /** + * 创建一个修改单个声道音量的效果器 + * ```txt + * |----------| + * -> | GainNode | \ + * |--------------| / |----------| -> |------------| + * Input ----> | SplitterNode | ...... | MergerNode | ----> Output + * |--------------| \ |----------| -> |------------| + * -> | GainNode | / + * |----------| + * ``` + */ + createChannelVolumeEffect() { + return new ChannelVolumeEffect(this.ac); + } + + /** + * 创建一个延迟效果器 + * |-----------| + * Input ----> | DelayNode | ----> Output + * |-----------| + */ + createDelay() { + return new DelayEffect(this.ac); + } + + /** + * 创建一个回声效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * ^ |----------| | + * | | + * | |------------| ↓ + * |-- | Delay Node | <-- + * |------------| + * ``` + */ + createEchoEffect() { + return new EchoEffect(this.ac); + } + + /** + * 创建一个音频播放路由 + * @param source 音频源 + */ + createRoute(source) { + return new AudioRoute(source, this); + } + + /** + * 添加一个音频播放路由,可以直接被播放 + * @param id 这个音频播放路由的名称 + * @param route 音频播放路由对象 + */ + addRoute(id, route) { + if (!this.audioRoutes) this.audioRoutes = new Map(); + if (this.audioRoutes.has(id)) { + console.warn( + "Audio route with id of '" + + id + + "' has already existed. New route will override old route." + ); + } + this.audioRoutes.set(id, route); + } + + /** + * 根据名称获取音频播放路由对象 + * @param id 音频播放路由的名称 + */ + getRoute(id) { + return this.audioRoutes.get(id); + } + /** + * 移除一个音频播放路由 + * @param id 要移除的播放路由的名称 + */ + removeRoute(id) { + this.audioRoutes.delete(id); + } + /** + * 播放音频 + * @param id 音频名称 + * @param when 从音频的哪个位置开始播放,单位秒 + */ + play(id, when) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot play audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + + route.play(when); + } + + /** + * 暂停音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + pause(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.pause(); + } + + /** + * 停止音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + stop(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot stop audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.stop(); + } + + /** + * 继续音频播放 + * @param id 音频名称 + */ + resume(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + route.resume(); + } + + /** + * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 + * @param y 位置y坐标 + * @param z 位置z坐标 + */ + setListenerPosition(x, y, z) { + const listener = this.ac.listener; + listener.positionX.value = x; + listener.positionY.value = y; + listener.positionZ.value = z; + } + + /** + * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 + * @param y 朝向y坐标 + * @param z 朝向z坐标 + */ + setListenerOrientation(x, y, z) { + const listener = this.ac.listener; + listener.forwardX.value = x; + listener.forwardY.value = y; + listener.forwardZ.value = z; + } + + /** + * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 头顶朝向x坐标 + * @param y 头顶朝向y坐标 + * @param z 头顶朝向z坐标 + */ + setListenerUp(x, y, z) { + const listener = this.ac.listener; + listener.upX.value = x; + listener.upY.value = y; + listener.upZ.value = z; + } + } + class AudioRoute { + constructor(source, player) { + source.route = this; + this.output = source.output; + + /** 效果器路由图 */ + this.effectRoute = []; + + /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ + this.endTime = 0; + /** 暂停时播放了多长时间 */ + this.pauseCurrentTime = 0; + /** 当前播放状态 */ + this.player = player; + this.status = AudioStatus.Stoped; + + this.shouldStop = false; + /** + * 每次暂停或停止时自增,用于判断当前正在处理的情况。 + * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 + */ + this.stopIdentifier = 0; + /** 暂停时刻 */ + this.pauseTime = 0; + this.source = source; + this.source.player = player; + } + /** 音频时长,单位秒 */ + get duration() { + return this.source.duration; + } + /** 当前播放了多长时间,单位秒 */ + get currentTime() { + if (this.status === AudioStatus.Paused) { + return this.pauseCurrentTime; + } else { + return this.source.currentTime; + } + } + set currentTime(time) { + this.source.stop(); + this.source.play(time); + } + /** + * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 + * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 + */ + setEndTime(time) { + this.endTime = time; + } + + /** + * 当音频播放时执行的函数,可以用于音频淡入效果 + * @param fn 音频开始播放时执行的函数 + */ + onStart(fn) { + this.audioStartHook = fn; + } + + /** + * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 + * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 + * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 + */ + onEnd(fn) { + this.audioEndHook = fn; + } + + /** + * 开始播放这个音频 + * @param when 从音频的什么时候开始播放,单位秒 + */ + async play(when = 0) { + if (this.status === AudioStatus.Playing) return; + this.link(); + await this.player.ac.resume(); + if (this.effectRoute.length > 0) { + const first = this.effectRoute[0]; + this.source.connect(first); + const last = this.effectRoute.at(-1); + last.connect({ input: this.player.getDestination() }); + } else { + this.source.connect({ input: this.player.getDestination() }); + } + this.source.play(when); + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + if (this.status !== AudioStatus.Playing) { + this.status = AudioStatus.Playing; + } + } + + /** + * 暂停音频播放 + */ + async pause() { + if (this.status !== AudioStatus.Playing) return; + this.status = AudioStatus.Pausing; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Pausing || + this.stopIdentifier !== identifier + ) { + return; + } + this.pauseCurrentTime = this.source.currentTime; + const time = this.source.stop(); + this.pauseTime = time; + if (this.shouldStop) { + this.status = AudioStatus.Stoped; + this.endAllEffect(); + + this.shouldStop = false; + } else { + this.status = AudioStatus.Paused; + this.endAllEffect(); + } + this.endAllEffect(); + } + + /** + * 继续音频播放 + */ + resume() { + if (this.status === AudioStatus.Playing) return; + if ( + this.status === AudioStatus.Pausing || + this.status === AudioStatus.Stoping + ) { + this.audioStartHook?.(this); + + return; + } + if (this.status === AudioStatus.Paused) { + this.play(this.pauseTime); + } else { + this.play(0); + } + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + } + + /** + * 停止音频播放 + */ + async stop() { + if (this.status !== AudioStatus.Playing) { + if (this.status === AudioStatus.Pausing) { + this.shouldStop = true; + } + return; + } + this.status = AudioStatus.Stoping; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Stoping || + this.stopIdentifier !== identifier + ) { + return; + } + this.source.stop(); + this.status = AudioStatus.Stoped; + this.pauseTime = 0; + this.endAllEffect(); + } + + /** + * 添加效果器 + * @param effect 要添加的效果,可以是数组,表示一次添加多个 + * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 + */ + addEffect(effect, index) { + if (isNil(index)) { + if (effect instanceof Array) { + this.effectRoute.push(...effect); + } else { + this.effectRoute.push(effect); + } + } else { + if (effect instanceof Array) { + this.effectRoute.splice(index, 0, ...effect); + } else { + this.effectRoute.splice(index, 0, effect); + } + } + this.setOutput(); + if (this.source.playing) this.link(); + } + + /** + * 移除一个效果器 + * @param effect 要移除的效果 + */ + removeEffect(effect) { + const index = this.effectRoute.indexOf(effect); + if (index === -1) return; + this.effectRoute.splice(index, 1); + effect.disconnect(); + this.setOutput(); + if (this.source.playing) this.link(); + } + + setOutput() { + const effect = this.effectRoute.at(-1); + if (!effect) this.output = this.source.output; + else this.output = effect.output; + } + + /** + * 连接音频路由图 + */ + link() { + this.effectRoute.forEach((v) => v.disconnect()); + this.effectRoute.forEach((v, i) => { + const next = this.effectRoute[i + 1]; + if (next) { + v.connect(next); + } + }); + } + + startAllEffect() { + this.effectRoute.forEach((v) => v.start()); + } + + endAllEffect() { + this.effectRoute.forEach((v) => v.end()); + } + } + + const audioPlayer = new AudioPlayer(); + + class BgmController { + constructor(player) { + this.mainGain = player.createVolumeEffect(); + this.player = player; + /** bgm音频名称的前缀 */ + this.prefix = "bgms."; + /** 每个 bgm 的音量控制器 */ + this.gain = new Map(); + + /** 正在播放的 bgm */ + this.playingBgm = ""; + /** 是否正在播放 */ + this.playing = false; + + /** 是否已经启用 */ + this.enabled = true; + /** 是否屏蔽所有的音乐切换 */ + this.blocking = false; + /** 渐变时长 */ + this.transitionTime = 2000; + } + + /** + * 设置音频渐变时长 + * @param time 渐变时长 + */ + setTransitionTime(time) { + this.transitionTime = time; + for (const [, value] of this.gain) { + value.transition.time(time); + } + } + + /** + * 屏蔽音乐切换 + */ + blockChange() { + this.blocking = true; + } + + /** + * 取消屏蔽音乐切换 + */ + unblockChange() { + this.blocking = false; + } + + /** + * 设置总音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.mainGain.setVolume(volume); + this._volume = volume; + } + /** + * 获取总音量大小 + */ + getVolume() { + return this.mainGain.getVolume(); + } + /** + * 设置是否启用 + * @param enabled 是否启用 + */ + setEnabled(enabled) { + if (enabled) this.resume(); + else this.stop(); + this.enabled = enabled; + } + + /** + * 设置 bgm 音频名称的前缀 + */ + setPrefix(prefix) { + this.prefix = prefix; + } + + getId(name) { + return `${this.prefix}${name}`; + } + + /** + * 根据 bgm 名称获取其 AudioRoute 实例 + * @param id 音频名称 + */ + get(id) { + return this.player.getRoute(this.getId(id)); + } + + /** + * 添加一个 bgm + * @param id 要添加的 bgm 的名称 + * @param url 指定 bgm 的加载地址 + */ + addBgm(id, url = `project/bgms/${id}`) { + const type = guessTypeByExt(id); + if (!type) { + console.warn( + "Unknown audio extension name: '" + + id.split(".").slice(0, -1).join(".") + + "'" + ); + return; + } + const gain = this.player.createVolumeEffect(); + if (isAudioSupport(type)) { + const source = audioPlayer.createElementSource(); + source.setSource(url); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } else { + const source = audioPlayer.createStreamSource(); + const stream = new StreamLoader(url); + stream.pipe(source); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } + } + + /** + * 移除一个 bgm + * @param id 要移除的 bgm 的名称 + */ + removeBgm(id) { + this.player.removeRoute(this.getId(id)); + const gain = this.gain.get(id); + gain?.transition.ticker.destroy(); + this.gain.delete(id); + } + + setTransition(id, route, gain) { + const transition = new Transition(); + transition + .time(this.transitionTime) + .mode(linear()) + .transition("volume", 0); + + const tick = () => { + gain.setVolume(transition.value.volume); + }; + + /** + * @param expect 在结束时应该是正在播放还是停止 + */ + const setTick = async (expect) => { + transition.ticker.remove(tick); + transition.ticker.add(tick); + const identifier = route.stopIdentifier; + await sleep(this.transitionTime + 500); + if (route.status === expect && identifier === route.stopIdentifier) { + transition.ticker.remove(tick); + if (route.status === AudioStatus.Playing) { + gain.setVolume(1); + } else { + gain.setVolume(0); + } + } + }; + + route.onStart(async () => { + transition.transition("volume", 1); + setTick(AudioStatus.Playing); + }); + route.onEnd(() => { + transition.transition("volume", 0); + setTick(AudioStatus.Paused); + }); + route.setEndTime(this.transitionTime); + + this.gain.set(id, { effect: gain, transition }); + } + + /** + * 播放一个 bgm + * @param id 要播放的 bgm 名称 + */ + play(id, when) { + if (this.blocking) return; + if (id !== this.playingBgm && this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playingBgm = id; + if (!this.enabled) return; + this.player.play(this.getId(id), when); + this.playing = true; + } + + /** + * 继续当前的 bgm + */ + resume() { + if (this.blocking || !this.enabled || this.playing) return; + if (this.playingBgm) { + this.player.resume(this.getId(this.playingBgm)); + } + this.playing = true; + } + + /** + * 暂停当前的 bgm + */ + pause() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playing = false; + } + + /** + * 停止当前的 bgm + */ + stop() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.stop(this.getId(this.playingBgm)); + } + this.playing = false; + } + } + const bgmController = new BgmController(audioPlayer); + + class SoundPlayer { + constructor(player) { + /** 每个音效的唯一标识符 */ + this.num = 0; + this.enabled = true; + this.gain = player.createVolumeEffect(); + /** 每个音效的数据 */ + this.buffer = new Map(); + /** 所有正在播放的音乐 */ + this.playing = new Set(); + this.player = player; + } + /** + * 设置是否启用音效 + * @param enabled 是否启用音效 + */ + setEnabled(enabled) { + if (!enabled) this.stopAllSounds(); + this.enabled = enabled; + } + + /** + * 设置音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.gain.setVolume(volume); + } + /** + * 获取音量大小 + */ + getVolume() { + return this.gain.getVolume(); + } + /** + * 添加一个音效 + * @param id 音效名称 + * @param data 音效的Uint8Array数据 + */ + async add(id, data) { + const buffer = await this.player.decodeAudioData(data); + if (!buffer) { + console.warn( + "Cannot decode sound '" + + id + + "', since audio file may not supported by 2.b." + ); + return; + } + this.buffer.set(id, buffer); + } + + /** + * 播放一个音效 + * @param id 音效名称 + * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 + * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 + */ + play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { + if (!this.enabled || !id) return -1; + const buffer = this.buffer.get(id); + if (!buffer) { + console.warn( + "Cannot play sound '" + + id + + "', since there is no added data named it." + ); + return -1; + } + const soundNum = this.num++; + + const source = this.player.createBufferSource(); + source.setBuffer(buffer); + const route = this.player.createRoute(source); + const stereo = this.player.createStereoEffect(); + stereo.setPosition(position[0], position[1], position[2]); + stereo.setOrientation(orientation[0], orientation[1], orientation[2]); + route.addEffect([stereo, this.gain]); + this.player.addRoute(`sounds.${soundNum}`, route); + route.play(); + source.output.addEventListener("ended", () => { + this.playing.delete(soundNum); + }); + this.playing.add(soundNum); + return soundNum; + } + + /** + * 停止一个音效 + * @param num 音效的唯一 id + */ + stop(num) { + const id = `sounds.${num}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + this.playing.delete(num); + } + } + + /** + * 停止播放所有音效 + */ + stopAllSounds() { + this.playing.forEach((v) => { + const id = `sounds.${v}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + } + }); + this.playing.clear(); + } + } + const soundPlayer = new SoundPlayer(audioPlayer); + + function loadAllBgm() { + const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; + for (const bgm of data.main.bgms) { + bgmController.addBgm(bgm); + } + } + loadAllBgm(); + AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); + AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); + + core.plugin.audioSystem = { + AudioType, + AudioDecoder, + AudioStatus, + checkAudioType, + isAudioSupport, + audioPlayer, + soundPlayer, + bgmController, + guessTypeByExt, + BgmController, + SoundPlayer, + EchoEffect, + DelayEffect, + ChannelVolumeEffect, + VolumeEffect, + StereoEffect, + AudioEffect, + AudioPlayer, + AudioRoute, + AudioStreamSource, + AudioElementSource, + AudioBufferSource, + loadAllBgm, + StreamLoader, + }; + //bgm相关复写 + control.prototype.playBgm = (bgm, when) => { + bgm = core.getMappedName(bgm); + bgmController.play(bgm, when); + core.setMusicBtn(); + }; + control.prototype.pauseBgm = () => { + bgmController.pause(); + core.setMusicBtn(); + }; + + control.prototype.resumeBgm = function () { + bgmController.resume(); + core.setMusicBtn(); + }; + control.prototype.checkBgm = function () { + core.playBgm(bgmController.playingBgm || main.startBgm); + }; + control.prototype.triggerBgm = function () { + core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; + if (bgmController.playing) bgmController.pause(); + else bgmController.resume(); + core.setMusicBtn(); + core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); + }; + //sound相关复写 + control.prototype.playSound = function ( + sound, + _pitch, + callback, + position, + orientation + ) { + if (main.mode != "play" || !core.musicStatus.soundStatus) return; + const name = core.getMappedName(sound); + const num = soundPlayer.play(name, position, orientation); + const route = audioPlayer.getRoute(`sounds.${num}`); + if (!route) { + callback?.(); + return -1; + } else { + sleep(route.duration * 1000).then(() => callback?.()); + return num; + } + }; + control.prototype.stopSound = function (id) { + if (isNil(id)) { + soundPlayer.stopAllSounds(); + } else { + soundPlayer.stop(id); + } + }; + control.prototype.getPlayingSounds = function () { + return [...soundPlayer.playing]; + }; + //sound加载复写 + loader.prototype._loadOneSound_decodeData = function (name, data) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + //core.loader._loadOneSound_decodeData(name, uint8.buffer); + soundPlayer.add(name, uint8); + }); + }); + return; + } + if (data instanceof ArrayBuffer) { + const uint8 = new Uint8Array(data); + soundPlayer.add(name, uint8); + } + }; + //音量控制复写 + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { + var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); + if (value == 0 && delta < 0) return; + core.musicStatus.userVolume = core.clamp( + Math.pow(value + delta, 2) / 100, + 0, + 1 + ); + //audioContext 音效 不受designVolume 影响 + if (core.musicStatus.gainNode != null) + core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + core.setLocalStorage("userVolume", core.musicStatus.userVolume); + core.playSound("确定"); + core.ui._drawSwitchs_sounds(); }; }, "自定义常用事件": function () { - // editorBlocklyconfigPlus.js - // 自訂常見事件模板插件 - // 本插件引用了通用函數插件(Utility.js) - // 適用樣板:2.10.3 - // 請注意: - // 此插件對事件編輯器(editor_blocklyconfig)進行複寫,若還有其它針對事件編輯器做複寫的插件,請謹慎使用! - // 此插件對表格操作行為(editor_mode.doActionList)進行複寫,若還有其它對表格操作行為做複寫的插件,請謹慎使用! - // 使用方法: - // 現在在主頁下拉選單多了個常用事件模版,在那邊可以自由設定常用事件模板。 - // 設定完後按F5刷新,再到事件編輯器看就有你設定好的常用事件模板了。 + // editorBlocklyconfigPlus.js + // 自訂常見事件模板插件 + // 本插件引用了通用函數插件(Utility.js) + // 適用樣板:2.10.3 + // 請注意: + // 此插件對事件編輯器(editor_blocklyconfig)進行複寫,若還有其它針對事件編輯器做複寫的插件,請謹慎使用! + // 此插件對表格操作行為(editor_mode.doActionList)進行複寫,若還有其它對表格操作行為做複寫的插件,請謹慎使用! + // 使用方法: + // 現在在主頁下拉選單多了個常用事件模版,在那邊可以自由設定常用事件模板。 + // 設定完後按F5刷新,再到事件編輯器看就有你設定好的常用事件模板了。 - if (main.mode == "editor") { - //#region 配置表格初始化 - let TableFileName = "project/table/CommonEventTemplate_comment.js"; - let TableRow = ` + if (main.mode == "editor") { + //#region 配置表格初始化 + let TableFileName = "project/table/CommonEventTemplate_comment.js"; + let TableRow = ` var CommonEventTemplate_comment = {"_type": "object", "_data": { "CommonEventTemplate": { @@ -10851,241 +11696,221 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = } }} `; - if (!events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate) { - /** - * @type {{[EvnetName:actionParserJson]}} - */ - events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate = { - 检测音乐如果没有开启则系统提示开启: [ - { - type: "if", - condition: "!core.musicStatus.bgmStatus", - true: [ - "\t[系统提示]你当前音乐处于关闭状态,本塔开音乐游戏效果更佳", - ], - false: [], - }, - ], - 仿新新魔塔一次性商人: [ - { - type: "if", - condition: "switch:A", - true: [ - "\t[行商,trader]\b[this]这是购买我的道具后我给玩家的提示。", - { - type: "comment", - text: "下一条指令可视情况使用或不使用", - }, - { - type: "hide", - remove: true, - time: 250, - }, - ], - false: [ - { - type: "confirm", - text: "我有3把黄钥匙,\n你出50金币就卖给你。", - yes: [ - { - type: "if", - condition: "status:money>=50", - true: [ - { - type: "setValue", - name: "status:money", - operator: "-=", - value: "50", - }, - { - type: "setValue", - name: "item:yellowKey", - operator: "+=", - value: "3", - }, - { - type: "playSound", - name: "确定", - stop: true, - }, - { - type: "setValue", - name: "switch:A", - value: "true", - }, - ], - false: [ - { - type: "playSound", - name: "操作失败", - }, - "\t[行商,trader]\b[this]你的金币不足!", - ], - }, - ], - no: [], - }, - ], - }, - ], - 全地图选中一个点: [ - { - type: "comment", - text: "全地图选中一个点,需要用鼠标或触屏操作", - }, - { - type: "setValue", - name: "temp:X", - value: "status:x", - }, - { - type: "setValue", - name: "temp:Y", - value: "status:y", - }, - { - type: "tip", - text: "再次点击闪烁位置确认", - }, - { - type: "while", - condition: "true", - data: [ - { - type: "drawSelector", - image: "winskin.webp", - code: 1, - x: "32*temp:X", - y: "32*temp:Y", - width: 32, - height: 32, - }, - { - type: "wait", - }, - { - type: "if", - condition: "(flag:type === 1)", - true: [ - { - type: "if", - condition: "((temp:X===flag:x)&&(temp:Y===flag:y))", - true: [ - { - type: "break", - n: 1, - }, - ], - }, - { - type: "setValue", - name: "temp:X", - value: "flag:x", - }, - { - type: "setValue", - name: "temp:Y", - value: "flag:y", - }, - ], - }, - ], - }, - { - type: "drawSelector", - code: 1, - }, - { - type: "comment", - text: "流程进行到这里可以对[X,Y]点进行处理,比如", - }, - { - type: "closeDoor", - id: "yellowDoor", - loc: ["temp:X", "temp:Y"], - }, - ], - 多阶段Boss战斗: [ - { - type: "comment", - text: "多阶段boss,请直接作为战后事件使用", - }, - { - type: "setValue", - name: "switch:A", - operator: "+=", - value: "1", - }, - { - type: "switch", - condition: "switch:A", - caseList: [ - { - case: "1", - action: [ - { - type: "setBlock", - number: "redSlime", - }, - "\t[2阶段boss,redSlime]\b[this]你以为你已经打败我了吗?没听说过史莱姆有九条命吗?", - ], - }, - { - case: "2", - action: [ - { - type: "setBlock", - number: "blackSlime", - }, - "\t[3阶段boss,blackSlime]\b[this]不能消灭我的,只会让我更强大!", - ], - }, - { - case: "3", - action: [ - { - type: "setBlock", - number: "slimelord", - }, - "\t[4阶段boss,slimelord]\b[this]我还能打!", - ], - }, - { - case: "4", - action: ["\t[4阶段boss,slimelord]我一定会回来的!"], - }, - ], - }, - ], - }; - } - //#endregion + if (!events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate) { + /** + * @type {{[EvnetName:actionParserJson]}} + */ + events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate = { + 检测音乐如果没有开启则系统提示开启: [{ + type: "if", + condition: "!core.musicStatus.bgmStatus", + true: [ + "\t[系统提示]你当前音乐处于关闭状态,本塔开音乐游戏效果更佳", + ], + false: [], + }, ], + 仿新新魔塔一次性商人: [{ + type: "if", + condition: "switch:A", + true: [ + "\t[行商,trader]\b[this]这是购买我的道具后我给玩家的提示。", + { + type: "comment", + text: "下一条指令可视情况使用或不使用", + }, + { + type: "hide", + remove: true, + time: 250, + }, + ], + false: [{ + type: "confirm", + text: "我有3把黄钥匙,\n你出50金币就卖给你。", + yes: [{ + type: "if", + condition: "status:money>=50", + true: [{ + type: "setValue", + name: "status:money", + operator: "-=", + value: "50", + }, + { + type: "setValue", + name: "item:yellowKey", + operator: "+=", + value: "3", + }, + { + type: "playSound", + name: "确定", + stop: true, + }, + { + type: "setValue", + name: "switch:A", + value: "true", + }, + ], + false: [{ + type: "playSound", + name: "操作失败", + }, + "\t[行商,trader]\b[this]你的金币不足!", + ], + }, ], + no: [], + }, ], + }, ], + 全地图选中一个点: [{ + type: "comment", + text: "全地图选中一个点,需要用鼠标或触屏操作", + }, + { + type: "setValue", + name: "temp:X", + value: "status:x", + }, + { + type: "setValue", + name: "temp:Y", + value: "status:y", + }, + { + type: "tip", + text: "再次点击闪烁位置确认", + }, + { + type: "while", + condition: "true", + data: [{ + type: "drawSelector", + image: "winskin.webp", + code: 1, + x: "32*temp:X", + y: "32*temp:Y", + width: 32, + height: 32, + }, + { + type: "wait", + }, + { + type: "if", + condition: "(flag:type === 1)", + true: [{ + type: "if", + condition: "((temp:X===flag:x)&&(temp:Y===flag:y))", + true: [{ + type: "break", + n: 1, + }, ], + }, + { + type: "setValue", + name: "temp:X", + value: "flag:x", + }, + { + type: "setValue", + name: "temp:Y", + value: "flag:y", + }, + ], + }, + ], + }, + { + type: "drawSelector", + code: 1, + }, + { + type: "comment", + text: "流程进行到这里可以对[X,Y]点进行处理,比如", + }, + { + type: "closeDoor", + id: "yellowDoor", + loc: ["temp:X", "temp:Y"], + }, + ], + 多阶段Boss战斗: [{ + type: "comment", + text: "多阶段boss,请直接作为战后事件使用", + }, + { + type: "setValue", + name: "switch:A", + operator: "+=", + value: "1", + }, + { + type: "switch", + condition: "switch:A", + caseList: [{ + case: "1", + action: [{ + type: "setBlock", + number: "redSlime", + }, + "\t[2阶段boss,redSlime]\b[this]你以为你已经打败我了吗?没听说过史莱姆有九条命吗?", + ], + }, + { + case: "2", + action: [{ + type: "setBlock", + number: "blackSlime", + }, + "\t[3阶段boss,blackSlime]\b[this]不能消灭我的,只会让我更强大!", + ], + }, + { + case: "3", + action: [{ + type: "setBlock", + number: "slimelord", + }, + "\t[4阶段boss,slimelord]\b[this]我还能打!", + ], + }, + { + case: "4", + action: ["\t[4阶段boss,slimelord]我一定会回来的!"], + }, + ], + }, + ], + }; + } + //#endregion - // 新增模板選項 - let editModeSelect = document.getElementById("editModeSelect"); - let newEditModeOption = document.createElement("option"); - newEditModeOption.value = "CommonEventTemplate"; - newEditModeOption.text = "常見事件模板"; - editModeSelect.add(newEditModeOption); + // 新增模板選項 + let editModeSelect = document.getElementById("editModeSelect"); + let newEditModeOption = document.createElement("option"); + newEditModeOption.value = "CommonEventTemplate"; + newEditModeOption.text = "常見事件模板"; + editModeSelect.add(newEditModeOption); - //檢查可用的編輯模板ID - let leftIDNumber = 11 - 1; - let ExistLeftElement = document.querySelector(".main"); - while (ExistLeftElement) { - leftIDNumber++; - ExistLeftElement = document.getElementById(`left${leftIDNumber}`); - } + //檢查可用的編輯模板ID + let leftIDNumber = 11 - 1; + let ExistLeftElement = document.querySelector(".main"); + while (ExistLeftElement) { + leftIDNumber++; + ExistLeftElement = document.getElementById(`left${leftIDNumber}`); + } - //新增編輯模板 - let MainDiv = document.querySelector(".main"); + //新增編輯模板 + let MainDiv = document.querySelector(".main"); - let CommonEventTemplateMainDiv = document.createElement("div"); - CommonEventTemplateMainDiv.id = `left${leftIDNumber}`; - CommonEventTemplateMainDiv.className = "leftTab"; - CommonEventTemplateMainDiv.style.zIndex = "-1"; - CommonEventTemplateMainDiv.style.opacity = "0"; + let CommonEventTemplateMainDiv = document.createElement("div"); + CommonEventTemplateMainDiv.id = `left${leftIDNumber}`; + CommonEventTemplateMainDiv.className = "leftTab"; + CommonEventTemplateMainDiv.style.zIndex = "-1"; + CommonEventTemplateMainDiv.style.opacity = "0"; - CommonEventTemplateMainDiv.innerHTML = ` + CommonEventTemplateMainDiv.innerHTML = ` <!-- CommonEventTemplate --> <h3 class="leftTabHeader"> 常見事件模板 @@ -11108,980 +11933,968 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = </div> </div> `; - MainDiv.appendChild(CommonEventTemplateMainDiv); + MainDiv.appendChild(CommonEventTemplateMainDiv); - (async function () { - //等待編輯器初始化 - while (!editor_mode.ids) { - await Sleep(100); - } - //新增編輯模板ID - editor_mode.ids["CommonEventTemplate"] = `left${leftIDNumber}`; - editor_mode.init_dom_ids(); - //切換至常見事件模板 - editor_mode.CommonEventTemplate = function (callback) { - var objs = []; - editor.file.editCommonEventTemplate([], function (objs_) { - objs = objs_; - //console.log(objs_) - }); - //只查询不修改时,内部实现不是异步的,所以可以这么写 - var tableinfo = editor.table.objToTable(objs[0], objs[1]); - document.getElementById( - "table_298572d8-93dd-4c6e-a278-6a7d49831e3a" - ).innerHTML = tableinfo.HTML; - tableinfo.listen(tableinfo.guids); - if (Boolean(callback)) callback(); - }; + (async function () { + //等待編輯器初始化 + while (!editor_mode.ids) { + await Sleep(100); + } + //新增編輯模板ID + editor_mode.ids["CommonEventTemplate"] = `left${leftIDNumber}`; + editor_mode.init_dom_ids(); + //切換至常見事件模板 + editor_mode.CommonEventTemplate = function (callback) { + var objs = []; + editor.file.editCommonEventTemplate([], function (objs_) { + objs = objs_; + //console.log(objs_) + }); + //只查询不修改时,内部实现不是异步的,所以可以这么写 + var tableinfo = editor.table.objToTable(objs[0], objs[1]); + document.getElementById( + "table_298572d8-93dd-4c6e-a278-6a7d49831e3a" + ).innerHTML = tableinfo.HTML; + tableinfo.listen(tableinfo.guids); + if (Boolean(callback)) callback(); + }; - //檢查配置表格存在 - let TableRowExist = null; - fs.readFile(TableFileName, "base64", function (err, data) { - if (err) { - console.log(`察覺常見事件模板配置表格不存在,原因:${err}`); - console.log("新建一個常見事件模板配置表格。"); - TableRowExist = false; - } else { - TableRowExist = true; - } - }); - //等待配置表格載入完畢(最多0.3秒,超過則視為失敗) - for (let i = 0; i < 3; i++) { - if (TableRowExist == null) { - await Sleep(100); - } - } - //配置表格初始化 - if (TableRowExist != true) { - fs.mkdir("project/table", function (err, data) { - if (err) throw `常見事件模板配置表格目錄初始化失敗,原因:${err}`; - }); - fs.writeFile( - TableFileName, - editor.util.encode64(TableRow || ""), - "base64", - function (err, data) { - if (err) throw `常見事件模板配置表格文件初始化失敗,原因:${err}`; - } - ); - } - //載入配置表格 - //editor.file.loadCommentjs(callback); - (function () { - var key = "CommonEventTemplate_comment"; - var script = document.createElement("script"); - script.src = "project/table/" + key + ".js"; - document.body.appendChild(script); - script.onload = function () { - editor.file[key] = eval(key.replace(".", "_")); - var loaded = Boolean(editor.file[key]); - }; - })(); - //按下配置表格 - editor_multi.CommonEventTemplateEditCommentJs = function (mod) { - editor_multi.lintAutocomplete = true; - editor_multi.setLint(); - editor_multi.importFile(TableFileName); - }; + //檢查配置表格存在 + let TableRowExist = null; + fs.readFile(TableFileName, "base64", function (err, data) { + if (err) { + console.log(`察覺常見事件模板配置表格不存在,原因:${err}`); + console.log("新建一個常見事件模板配置表格。"); + TableRowExist = false; + } else { + TableRowExist = true; + } + }); + //等待配置表格載入完畢(最多0.3秒,超過則視為失敗) + for (let i = 0; i < 3; i++) { + if (TableRowExist == null) { + await Sleep(100); + } + } + //配置表格初始化 + if (TableRowExist != true) { + fs.mkdir("project/table", function (err, data) { + if (err) throw `常見事件模板配置表格目錄初始化失敗,原因:${err}`; + }); + fs.writeFile( + TableFileName, + editor.util.encode64(TableRow || ""), + "base64", + function (err, data) { + if (err) throw `常見事件模板配置表格文件初始化失敗,原因:${err}`; + } + ); + } + //載入配置表格 + //editor.file.loadCommentjs(callback); + (function () { + var key = "CommonEventTemplate_comment"; + var script = document.createElement("script"); + script.src = "project/table/" + key + ".js"; + document.body.appendChild(script); + script.onload = function () { + editor.file[key] = eval(key.replace(".", "_")); + var loaded = Boolean(editor.file[key]); + }; + })(); + //按下配置表格 + editor_multi.CommonEventTemplateEditCommentJs = function (mod) { + editor_multi.lintAutocomplete = true; + editor_multi.setLint(); + editor_multi.importFile(TableFileName); + }; - //定義表格操作行為 - editor_mode.OriginDoActionList = editor_mode.doActionList; - editor_mode.doActionList = function (mode, actionList, callback) { - if (editor_mode.mode == "CommonEventTemplate") { - if (actionList.length == 0) return; - printf("修改中..."); - var cb = function (objs_) { - if (objs_.slice(-1)[0] != null) { - printe(objs_.slice(-1)[0]); - throw objs_.slice(-1)[0]; - } - var str = "修改成功!"; - if ( - data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.name == - "template" - ) - str += "<br/>请注意:全塔属性的name尚未修改,请及时予以设置。"; - printf(str); - if (callback) callback(); - }; - editor.file.editCommonEventTemplate(actionList, cb); - } else { - editor_mode.OriginDoActionList(mode, actionList, callback); - } - }; - //添加表格列 - editor.table.CommonEventTemplateAddFunc = function () { - let obj = events_c12a15a8_c380_4b28_8144_256cba95f760; + //定義表格操作行為 + editor_mode.OriginDoActionList = editor_mode.doActionList; + editor_mode.doActionList = function (mode, actionList, callback) { + if (editor_mode.mode == "CommonEventTemplate") { + if (actionList.length == 0) return; + printf("修改中..."); + var cb = function (objs_) { + if (objs_.slice(-1)[0] != null) { + printe(objs_.slice(-1)[0]); + throw objs_.slice(-1)[0]; + } + var str = "修改成功!"; + if ( + data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.name == + "template" + ) + str += "<br/>请注意:全塔属性的name尚未修改,请及时予以设置。"; + printf(str); + if (callback) callback(); + }; + editor.file.editCommonEventTemplate(actionList, cb); + } else { + editor_mode.OriginDoActionList(mode, actionList, callback); + } + }; + //添加表格列 + editor.table.CommonEventTemplateAddFunc = function () { + let obj = events_c12a15a8_c380_4b28_8144_256cba95f760; - // 1.输入id - let newid = prompt("请输入新项的ID(支持中文)"); - if (newid == null || newid.length == 0) { - return; - } + // 1.输入id + let newid = prompt("请输入新项的ID(支持中文)"); + if (newid == null || newid.length == 0) { + return; + } - // 2.检查id是否符合规范或与已有id重复 - var conflict = true; - var basefield = "".replace(/\[[^\[]*\]$/, ""); + // 2.检查id是否符合规范或与已有id重复 + var conflict = true; + var basefield = "".replace(/\[[^\[]*\]$/, ""); - try { - var baseobj = eval("obj" + basefield); - conflict = newid in baseobj; - } catch (ee) { - // 理论上这里不会发生错误 - printe(ee); - throw ee; - } + try { + var baseobj = eval("obj" + basefield); + conflict = newid in baseobj; + } catch (ee) { + // 理论上这里不会发生错误 + printe(ee); + throw ee; + } - if (conflict) { - printe("id已存在, 请直接修改该项的值"); - return; - } + if (conflict) { + printe("id已存在, 请直接修改该项的值"); + return; + } - // 3.添加 - editor_mode.addAction(["add", basefield + "['" + newid + "']", null]); - editor_mode.onmode("save", function () { - printf("添加成功,刷新后生效;也可以继续新增其他项目。"); - }); //自动保存 删掉此行的话点保存按钮才会保存 - }; - //對表格的存讀 - editor.file.editCommonEventTemplate = function (actionList, callback) { - /*actionList:[ + // 3.添加 + editor_mode.addAction(["add", basefield + "['" + newid + "']", null]); + editor_mode.onmode("save", function () { + printf("添加成功,刷新后生效;也可以继续新增其他项目。"); + }); //自动保存 删掉此行的话点保存按钮才会保存 + }; + //對表格的存讀 + editor.file.editCommonEventTemplate = function (actionList, callback) { + /*actionList:[ ["change","['test']",['123']], ] 为[]时只查询不修改 */ - var data_obj = - events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate; - checkCallback(callback); - if (isset(actionList) && actionList.length > 0) { - actionList.forEach(function (value) { - value[1] = "['CommonEventTemplate']" + value[1]; - }); - editor.file.saveSetting("events", actionList, function (err) { - callback([err]); - }); - } else { - callback([ - Object.assign({}, data_obj), - editor.file.CommonEventTemplate_comment._data.CommonEventTemplate, - null, - ]); - } - }; - })(); + var data_obj = + events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate; + checkCallback(callback); + if (isset(actionList) && actionList.length > 0) { + actionList.forEach(function (value) { + value[1] = "['CommonEventTemplate']" + value[1]; + }); + editor.file.saveSetting("events", actionList, function (err) { + callback([err]); + }); + } else { + callback([ + Object.assign({}, data_obj), + editor.file.CommonEventTemplate_comment._data.CommonEventTemplate, + null, + ]); + } + }; + })(); - //複寫事件編輯器(editor_blocklyconfig) - editor_blocklyconfig = function () { - // start mark sfergsvae + //複寫事件編輯器(editor_blocklyconfig) + editor_blocklyconfig = function () { + // start mark sfergsvae - (function () { - var getCategory = function (name, custom) { - for (var node of document.getElementById("toolbox").children) { - if (node.getAttribute("name") == name) return node; - } - var node = document.createElement("category"); - node.setAttribute("name", name); - if (custom) node.setAttribute("custom", custom); - document.getElementById("toolbox").appendChild(node); - return node; - }; + (function () { + var getCategory = function (name, custom) { + for (var node of document.getElementById("toolbox").children) { + if (node.getAttribute("name") == name) return node; + } + var node = document.createElement("category"); + node.setAttribute("name", name); + if (custom) node.setAttribute("custom", custom); + document.getElementById("toolbox").appendChild(node); + return node; + }; - var toolboxObj = { - 入口方块: [ - '<label text="入口方块会根据当前类型在此数组中筛选,具体控制在editor_blockly.entranceCategoryCallback中"></label>', - MotaActionFunctions.actionParser.parse( - [ - "欢迎使用事件编辑器", - "本事件触发一次后会消失", - { type: "hide", time: 500 }, - ], - "event" - ), - MotaActionFunctions.actionParser.parse( - { - condition: "flag:__door__===2", - currentFloor: true, - priority: 0, - delayExecute: false, - multiExecute: false, - data: [{ type: "openDoor", loc: [10, 5] }], - }, - "autoEvent" - ), - MotaActionBlocks["changeFloor_m"].xmlText(), - MotaActionFunctions.actionParser.parse( - [ - { - id: "shop1", - text: "\t[贪婪之神,moneyShop]勇敢的武士啊, 给我${20+2*flag:shop1}金币就可以:", - textInList: "1F金币商店", - choices: [ - { - text: "生命+800", - need: "status:money>=20+2*flag:shop1", - action: [ - { - type: "comment", - text: "新版商店中需要手动扣减金币和增加访问次数", - }, - { - type: "setValue", - name: "status:money", - operator: "-=", - value: "20+2*flag:shop1", - }, - { - type: "setValue", - name: "flag:shop1", - operator: "+=", - value: "1", - }, - { - type: "setValue", - name: "status:hp", - operator: "+=", - value: "800", - }, - ], - }, - ], - }, - { - id: "itemShop", - item: true, - textInList: "道具商店", - choices: [{ id: "yellowKey", number: 10, money: 10 }], - }, - { - id: "keyShop1", - textInList: "回收钥匙商店", - commonEvent: "回收钥匙商店", - args: "", - }, - ], - "shop" - ), - MotaActionBlocks["common_m"].xmlText(), - MotaActionBlocks["beforeBattle_m"].xmlText(), - MotaActionBlocks["afterBattle_m"].xmlText(), - MotaActionBlocks["afterGetItem_m"].xmlText(), - MotaActionBlocks["afterOpenDoor_m"].xmlText(), - MotaActionBlocks["firstArrive_m"].xmlText(), - MotaActionBlocks["eachArrive_m"].xmlText(), - MotaActionBlocks["level_m"].xmlText(), - MotaActionFunctions.actionParser.parse( - [["MTx", ""]], - "floorPartition" - ), - MotaActionBlocks["commonEvent_m"].xmlText(), - MotaActionBlocks["item_m"].xmlText(), - MotaActionFunctions.actionParser.parse( - [ - { - title: "简单", - name: "Easy", - hard: 1, - action: [ - { type: "comment", text: "在这里写该难度需执行的事件" }, - ], - }, - ], - "levelChoose" - ), - MotaActionFunctions.actionParser.parse( - { - type: 0, - value: { atk: 10 }, - percentage: { speed: 10 }, - }, - "equip" - ), - MotaActionFunctions.actionParser.parse( - [ - { - name: "bg.webp", - x: 0, - y: 0, - canvas: "bg", - }, - ], - "floorImage" - ), - MotaActionFunctions.actionParser.parse( - { - time: 160, - openSound: "door.opus", - closeSound: "door.opus", - keys: { yellowKey: 1, orangeKey: 1 }, - }, - "doorInfo" - ), - MotaActionBlocks["faceIds_m"].xmlText(), - MotaActionBlocks["mainStyle_m"].xmlText(), - MotaActionFunctions.actionParser.parse( - { - 背景音乐: "bgm.opus", - 确定: "confirm.opus", - 攻击: "attack.opus", - 背景图: "bg.webp", - 领域: "zone", - 文件名: "file.jpg", - }, - "nameMap" - ), - MotaActionFunctions.actionParser.parse( - [{ name: "hero.webp", width: 32, height: 32, prefix: "hero_" }], - "splitImages" - ), - ], - 显示文字: [ - MotaActionBlocks["text_0_s"].xmlText(), - MotaActionBlocks["text_1_s"].xmlText(), - MotaActionFunctions.actionParser.parseList( - "\t[小妖精,fairy]\f[fairy.webp,0,0]欢迎使用事件编辑器(双击方块可直接预览)" - ), - MotaActionBlocks["over_s"].xmlText(), - MotaActionFunctions.actionParser.parseList([ - { - type: "overlist", - image: "bg_5043.webp", - memory: false, - hidetime: 30, - list: [ - { - text: "", - sound: "", - time: 50, - textColor: "255,255,255,1", - boldColor: "0,0,0,1", - font: "bold 48px Verdana", - frame: 0, - }, - ], - }, - ]), - MotaActionFunctions.actionParser.parseList([ - { - type: "cgtext", - bg: "bg_5043.webp", - memory: false, - WindowSkin: false, - head: { name: "face_050445.webp", px: -300 }, - name: "菲奥奈", - time: 0, - wait: 2000, - sound: "", - text: "这句话显示在对话框内", - bodyList: [ - { name: "tati_050145a.webp", px: 100, filter: false }, - ], - }, - ]), - MotaActionBlocks["moveTextBox_s"].xmlText(), - MotaActionBlocks["clearTextBox_s"].xmlText(), - MotaActionBlocks["comment_s"].xmlText(), - MotaActionBlocks["autoText_s"].xmlText(), - MotaActionBlocks["scrollText_s"].xmlText(), - MotaActionBlocks["setText_s"].xmlText(), - MotaActionBlocks["tip_s"].xmlText(), - MotaActionBlocks["addPop_s"].xmlText(), - MotaActionBlocks["confirm_s"].xmlText(), - MotaActionBlocks["choices_s"].xmlText([ - "选择剑或者盾", - "流浪者", - "man", - 0, - "", - MotaActionBlocks["choicesContext"].xmlText([ - "剑", - "", - "", - null, - "", - "", - MotaActionFunctions.actionParser.parseList([ - { type: "openDoor", loc: [3, 3] }, - ]), - ]), - ]), - MotaActionBlocks["win_s"].xmlText(), - MotaActionBlocks["lose_s"].xmlText(), - MotaActionBlocks["restart_s"].xmlText(), - ], - 数据相关: [ - MotaActionBlocks["setValue_s"].xmlText([ - MotaActionBlocks["idIdList_e"].xmlText(["status", "生命"]), - "=", - "", - false, - ]), - MotaActionBlocks["setEnemy_s"].xmlText(), - MotaActionBlocks["setEnemyOnPoint_s"].xmlText(), - MotaActionBlocks["resetEnemyOnPoint_s"].xmlText(), - MotaActionBlocks["moveEnemyOnPoint_s"].xmlText(), - MotaActionBlocks["moveEnemyOnPoint_1_s"].xmlText(), - MotaActionBlocks["setEquip_s"].xmlText(), - MotaActionBlocks["setFloor_s"].xmlText(), - MotaActionBlocks["setGlobalAttribute_s"].xmlText(), - MotaActionBlocks["setGlobalValue_s"].xmlText(), - MotaActionBlocks["setGlobalFlag_s"].xmlText(), - MotaActionBlocks["setNameMap_s"].xmlText(), - MotaActionBlocks["input_s"].xmlText(), - MotaActionBlocks["input2_s"].xmlText(), - MotaActionBlocks["update_s"].xmlText(), - MotaActionBlocks["moveAction_s"].xmlText(), - MotaActionBlocks["changeFloor_s"].xmlText(), - MotaActionBlocks["changePos_s"].xmlText(), - MotaActionBlocks["battle_s"].xmlText(), - MotaActionBlocks["useItem_s"].xmlText(), - MotaActionBlocks["loadEquip_s"].xmlText(), - MotaActionBlocks["unloadEquip_s"].xmlText(), - MotaActionBlocks["openShop_s"].xmlText(), - MotaActionBlocks["disableShop_s"].xmlText(), - MotaActionBlocks["setHeroIcon_s"].xmlText(), - MotaActionBlocks["follow_s"].xmlText(), - MotaActionBlocks["unfollow_s"].xmlText(), - ], - 地图处理: [ - MotaActionBlocks["battle_1_s"].xmlText(), - MotaActionBlocks["openDoor_s"].xmlText(), - MotaActionBlocks["closeDoor_s"].xmlText(), - MotaActionBlocks["show_s"].xmlText(), - MotaActionBlocks["hide_s"].xmlText(), - MotaActionBlocks["setBlock_s"].xmlText(), - MotaActionBlocks["setBlockOpacity_s"].xmlText(), - MotaActionBlocks["setBlockFilter_s"].xmlText(), - MotaActionBlocks["turnBlock_s"].xmlText(), - MotaActionBlocks["moveHero_s"].xmlText(), - MotaActionBlocks["move_s"].xmlText(), - MotaActionBlocks["jumpHero_s"].xmlText(), - MotaActionBlocks["jumpHero_1_s"].xmlText(), - MotaActionBlocks["jump_s"].xmlText(), - MotaActionBlocks["jump_1_s"].xmlText(), - MotaActionBlocks["showBgFgMap_s"].xmlText(), - MotaActionBlocks["hideBgFgMap_s"].xmlText(), - MotaActionBlocks["setBgFgBlock_s"].xmlText(), - MotaActionBlocks["showFloorImg_s"].xmlText(), - MotaActionBlocks["hideFloorImg_s"].xmlText(), - ], - 事件控制: [ - MotaActionBlocks["if_1_s"].xmlText(), - MotaActionBlocks["if_s"].xmlText(), - MotaActionFunctions.actionParser.parseList({ - type: "switch", - condition: "判别值", - caseList: [ - { - action: [ - { type: "comment", text: "当判别值是值的场合执行此事件" }, - ], - }, - { - case: "default", - action: [ - { - type: "comment", - text: "当没有符合的值的场合执行default事件", - }, - ], - }, - ], - }), - MotaActionFunctions.actionParser.parseList({ - type: "for", - name: "temp:A", - from: "0", - to: "12", - step: "1", - data: [], - }), - MotaActionFunctions.actionParser.parseList({ - type: "forEach", - name: "temp:A", - list: ["status:atk", "status:def"], - data: [], - }), - MotaActionBlocks["while_s"].xmlText(), - MotaActionBlocks["dowhile_s"].xmlText(), - MotaActionBlocks["break_s"].xmlText(), - MotaActionBlocks["continue_s"].xmlText(), - MotaActionBlocks["exit_s"].xmlText(), - MotaActionBlocks["trigger_s"].xmlText(), - MotaActionBlocks["insert_1_s"].xmlText(), - MotaActionBlocks["insert_2_s"].xmlText(), - ], - 特效表现: [ - MotaActionBlocks["sleep_s"].xmlText(), - MotaActionBlocks["changebg_s"].xmlText(), - MotaActionFunctions.actionParser.parseList({ - type: "wait", - timeout: 0, - data: [ - { - case: "keyboard", - keycode: "13,32", - action: [ - { - type: "comment", - text: "当按下回车(keycode=13)或空格(keycode=32)时执行此事件\n超时剩余时间会写入flag:timeout", - }, - ], - }, - { - case: "mouse", - px: [0, 32], - py: [0, 32], - action: [ - { - type: "comment", - text: "当点击地图左上角时执行此事件\n超时剩余时间会写入flag:timeout", - }, - ], - }, - { - case: "condition", - condition: "flag:type==0\n&&flag:keycode==13", - action: [ - { - type: "comment", - text: "当满足自定义条件时会执行此事件\n超时剩余时间会写入flag:timeout", - }, - ], - }, - { - case: "timeout", - action: [ - { type: "comment", text: "当超时未操作时执行此事件" }, - ], - }, - ], - }), - MotaActionBlocks["waitAsync_s"].xmlText(), - MotaActionBlocks["stopAsync_s"].xmlText(), - MotaActionBlocks["op_s"].xmlText(), - MotaActionBlocks["drawWarning_s"].xmlText(), - MotaActionBlocks["changeMouse_s"].xmlText(), - MotaActionBlocks["removeMouse_s"].xmlText(), - MotaActionBlocks["vibrate_s"].xmlText(), - MotaActionBlocks["setanimate_s"].xmlText(), - MotaActionBlocks["deleteanimate_s"].xmlText(), - MotaActionBlocks["playanimate_s"].xmlText(), - MotaActionBlocks["clearanimate_s"].xmlText(), - MotaActionBlocks["animate_s"].xmlText(), - MotaActionBlocks["animate_1_s"].xmlText(), - MotaActionBlocks["stopAnimate_s"].xmlText(), - MotaActionBlocks["setViewport_s"].xmlText(), - MotaActionBlocks["setViewport_1_s"].xmlText(), - MotaActionBlocks["lockViewport_s"].xmlText(), - MotaActionBlocks["showStatusBar_s"].xmlText(), - MotaActionBlocks["hideStatusBar_s"].xmlText(), - MotaActionBlocks["setHeroOpacity_s"].xmlText(), - MotaActionBlocks["setCurtain_0_s"].xmlText(), - MotaActionBlocks["setCurtain_1_s"].xmlText(), - MotaActionBlocks["screenFlash_s"].xmlText(), - MotaActionBlocks["setWeather_s"].xmlText(), - MotaActionBlocks["callBook_s"].xmlText(), - MotaActionBlocks["callSave_s"].xmlText(), - MotaActionBlocks["autoSave_s"].xmlText(), - MotaActionBlocks["forbidSave_s"].xmlText(), - MotaActionBlocks["callLoad_s"].xmlText(), - ], - 音像处理: [ - MotaActionBlocks["animationDrawable_s"].xmlText(), - MotaActionBlocks["setanimate_s"].xmlText(), - MotaActionBlocks["deleteanimate_s"].xmlText(), - MotaActionBlocks["playanimate_s"].xmlText(), - MotaActionBlocks["clearanimate_s"].xmlText(), - MotaActionBlocks["showImage_s"].xmlText(), - MotaActionBlocks["showImage_1_s"].xmlText(), - MotaActionBlocks["hideImage_s"].xmlText(), - MotaActionBlocks["showTextImage_s"].xmlText(), - MotaActionBlocks["moveImage_s"].xmlText(), - MotaActionBlocks["rotateImage_s"].xmlText(), - MotaActionBlocks["scaleImage_s"].xmlText(), - MotaActionBlocks["showGif_s"].xmlText(), - MotaActionBlocks["playBgm_s"].xmlText(), - MotaActionBlocks["playStereo_s"].xmlText(), - MotaActionBlocks["moveStereo_s"].xmlText(), - MotaActionBlocks["pauseBgm_s"].xmlText(), - MotaActionBlocks["resumeBgm_s"].xmlText(), - MotaActionBlocks["loadBgm_s"].xmlText(), - MotaActionBlocks["freeBgm_s"].xmlText(), - MotaActionBlocks["playSound_s"].xmlText(), - MotaActionBlocks["playSound_1_s"].xmlText(), - MotaActionBlocks["stopSound_s"].xmlText(), - MotaActionBlocks["setVolume_s"].xmlText(), - MotaActionBlocks["setBgmSpeed_s"].xmlText(), - ], - UI绘制: [ - MotaActionBlocks["previewUI_s"].xmlText(), - MotaActionBlocks["clearMap_s"].xmlText(), - MotaActionBlocks["setAttribute_s"].xmlText(), - MotaActionBlocks["setFilter_s"].xmlText(), - MotaActionBlocks["fillText_s"].xmlText(), - MotaActionBlocks["fillBoldText_s"].xmlText(), - MotaActionBlocks["drawTextContent_s"].xmlText(), - MotaActionBlocks["fillRect_s"].xmlText(), - MotaActionBlocks["strokeRect_s"].xmlText(), - MotaActionBlocks["drawLine_s"].xmlText(), - MotaActionBlocks["drawArrow_s"].xmlText(), - MotaActionBlocks["fillPolygon_s"].xmlText(), - MotaActionBlocks["strokePolygon_s"].xmlText(), - MotaActionBlocks["fillEllipse_s"].xmlText(), - MotaActionBlocks["strokeEllipse_s"].xmlText(), - MotaActionBlocks["fillArc_s"].xmlText(), - MotaActionBlocks["strokeArc_s"].xmlText(), - MotaActionBlocks["drawImage_s"].xmlText(), - MotaActionBlocks["drawImage_1_s"].xmlText(), - MotaActionBlocks["drawIcon_s"].xmlText(), - MotaActionBlocks["drawBackground_s"].xmlText(), - MotaActionBlocks["drawSelector_s"].xmlText(), - MotaActionBlocks["drawSelector_1_s"].xmlText(), - ], - 原生脚本: [ - MotaActionBlocks["function_s"].xmlText(), - MotaActionBlocks["unknown_s"].xmlText(), - ], - 值块: [ - MotaActionBlocks["setValue_s"].xmlText([ - MotaActionBlocks["idIdList_e"].xmlText(["status", "生命"]), - "=", - "", - false, - ]), - MotaActionBlocks["expression_arithmetic_0"].xmlText(), - MotaActionBlocks["idFlag_e"].xmlText(), - MotaActionBlocks["idTemp_e"].xmlText(), - MotaActionBlocks["negate_e"].xmlText(), - MotaActionBlocks["unaryOperation_e"].xmlText(), - MotaActionBlocks["bool_e"].xmlText(), - MotaActionBlocks["idString_e"].xmlText(), - MotaActionBlocks["idIdList_e"].xmlText(), - MotaActionBlocks["idFixedList_e"].xmlText(), - MotaActionBlocks["enemyattr_e"].xmlText(), - MotaActionBlocks["blockId_e"].xmlText(), - MotaActionBlocks["blockNumber_e"].xmlText(), - MotaActionBlocks["blockCls_e"].xmlText(), - MotaActionBlocks["hasEquip_e"].xmlText(), - MotaActionBlocks["equip_e"].xmlText(), - MotaActionBlocks["nextXY_e"].xmlText(), - MotaActionBlocks["isReplaying_e"].xmlText(), - MotaActionBlocks["hasVisitedFloor_e"].xmlText(), - MotaActionBlocks["isShopVisited_e"].xmlText(), - MotaActionBlocks["canBattle_e"].xmlText(), - MotaActionBlocks["damage_e"].xmlText(), - MotaActionBlocks["damage_1_e"].xmlText(), - MotaActionBlocks["rand_e"].xmlText(), - MotaActionBlocks["evalString_e"].xmlText(), - ], - 常见事件模板: [ - '<label text="此处只是占位符,实际定义在#region 動態常見事件模板"></label>', - ], - 最近使用事件: [ - '<label text="此处只是占位符,实际定义在editor_blockly.searchBlockCategoryCallback中"></label>', - ], - }; - var toolboxgap = '<sep gap="5"></sep>'; - //xml_text = MotaActionFunctions.actionParser.parse(obj,type||'event') - //MotaActionBlocks['idString_e'].xmlText() + var toolboxObj = { + 入口方块: [ + '<label text="入口方块会根据当前类型在此数组中筛选,具体控制在editor_blockly.entranceCategoryCallback中"></label>', + MotaActionFunctions.actionParser.parse( + [ + "欢迎使用事件编辑器", + "本事件触发一次后会消失", + { type: "hide", time: 500 }, + ], + "event" + ), + MotaActionFunctions.actionParser.parse({ + condition: "flag:__door__===2", + currentFloor: true, + priority: 0, + delayExecute: false, + multiExecute: false, + data: [{ type: "openDoor", loc: [10, 5] }], + }, + "autoEvent" + ), + MotaActionBlocks["changeFloor_m"].xmlText(), + MotaActionFunctions.actionParser.parse( + [{ + id: "shop1", + text: "\t[贪婪之神,moneyShop]勇敢的武士啊, 给我${20+2*flag:shop1}金币就可以:", + textInList: "1F金币商店", + choices: [{ + text: "生命+800", + need: "status:money>=20+2*flag:shop1", + action: [{ + type: "comment", + text: "新版商店中需要手动扣减金币和增加访问次数", + }, + { + type: "setValue", + name: "status:money", + operator: "-=", + value: "20+2*flag:shop1", + }, + { + type: "setValue", + name: "flag:shop1", + operator: "+=", + value: "1", + }, + { + type: "setValue", + name: "status:hp", + operator: "+=", + value: "800", + }, + ], + }, ], + }, + { + id: "itemShop", + item: true, + textInList: "道具商店", + choices: [{ id: "yellowKey", number: 10, money: 10 }], + }, + { + id: "keyShop1", + textInList: "回收钥匙商店", + commonEvent: "回收钥匙商店", + args: "", + }, + ], + "shop" + ), + MotaActionBlocks["common_m"].xmlText(), + MotaActionBlocks["beforeBattle_m"].xmlText(), + MotaActionBlocks["afterBattle_m"].xmlText(), + MotaActionBlocks["afterGetItem_m"].xmlText(), + MotaActionBlocks["afterOpenDoor_m"].xmlText(), + MotaActionBlocks["firstArrive_m"].xmlText(), + MotaActionBlocks["eachArrive_m"].xmlText(), + MotaActionBlocks["level_m"].xmlText(), + MotaActionFunctions.actionParser.parse( + [ + ["MTx", ""] + ], + "floorPartition" + ), + MotaActionBlocks["commonEvent_m"].xmlText(), + MotaActionBlocks["item_m"].xmlText(), + MotaActionFunctions.actionParser.parse( + [{ + title: "简单", + name: "Easy", + hard: 1, + action: [ + { type: "comment", text: "在这里写该难度需执行的事件" }, + ], + }, ], + "levelChoose" + ), + MotaActionFunctions.actionParser.parse({ + type: 0, + value: { atk: 10 }, + percentage: { speed: 10 }, + }, + "equip" + ), + MotaActionFunctions.actionParser.parse( + [{ + name: "bg.webp", + x: 0, + y: 0, + canvas: "bg", + }, ], + "floorImage" + ), + MotaActionFunctions.actionParser.parse({ + time: 160, + openSound: "door.opus", + closeSound: "door.opus", + keys: { yellowKey: 1, orangeKey: 1 }, + }, + "doorInfo" + ), + MotaActionBlocks["faceIds_m"].xmlText(), + MotaActionBlocks["mainStyle_m"].xmlText(), + MotaActionFunctions.actionParser.parse({ + 背景音乐: "bgm.opus", + 确定: "confirm.opus", + 攻击: "attack.opus", + 背景图: "bg.webp", + 领域: "zone", + 文件名: "file.jpg", + }, + "nameMap" + ), + MotaActionFunctions.actionParser.parse( + [{ name: "hero.webp", width: 32, height: 32, prefix: "hero_" }], + "splitImages" + ), + ], + 显示文字: [ + MotaActionBlocks["text_0_s"].xmlText(), + MotaActionBlocks["text_1_s"].xmlText(), + MotaActionFunctions.actionParser.parseList( + "\t[小妖精,fairy]\f[fairy.webp,0,0]欢迎使用事件编辑器(双击方块可直接预览)" + ), + MotaActionBlocks["over_s"].xmlText(), + MotaActionFunctions.actionParser.parseList([{ + type: "overlist", + image: "bg_5043.webp", + memory: false, + hidetime: 30, + list: [{ + text: "", + sound: "", + time: 50, + textColor: "255,255,255,1", + boldColor: "0,0,0,1", + font: "bold 48px Verdana", + frame: 0, + }, ], + }, ]), + MotaActionBlocks["cgtextList_s"].xmlText(), + MotaActionFunctions.actionParser.parseList([{ + type: "cgtext", + bg: "bg_5043.webp", + memory: false, + WindowSkin: false, + index: 0, + head: { name: "face_050445.webp", px: -300 }, - //#region 動態常見事件模板 - let CommonEventTemplateHTML = []; + time: 0, + wait: 2000, + sound: "", - for (let commonEventName in events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate) { - if ( - events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate.hasOwnProperty( - commonEventName - ) - ) { - let actionParserJson = Array.from( - events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate[ - commonEventName - ] ?? [] - ); + bodyList: [ + { name: "tati_050145a.webp", px: 100, filter: false }, + ], + }, ]), + MotaActionBlocks["moveTextBox_s"].xmlText(), + MotaActionBlocks["clearTextBox_s"].xmlText(), + MotaActionBlocks["comment_s"].xmlText(), + MotaActionBlocks["autoText_s"].xmlText(), + MotaActionBlocks["scrollText_s"].xmlText(), + MotaActionBlocks["setText_s"].xmlText(), + MotaActionBlocks["tip_s"].xmlText(), + MotaActionBlocks["addPop_s"].xmlText(), + MotaActionBlocks["confirm_s"].xmlText(), + MotaActionBlocks["choices_s"].xmlText([ + "选择剑或者盾", + "流浪者", + "man", + 0, + "", + MotaActionBlocks["choicesContext"].xmlText([ + "剑", + "", + "", + null, + "", + "", + MotaActionFunctions.actionParser.parseList([ + { type: "openDoor", loc: [3, 3] }, + ]), + ]), + ]), + MotaActionBlocks["win_s"].xmlText(), + MotaActionBlocks["lose_s"].xmlText(), + MotaActionBlocks["restart_s"].xmlText(), + ], + 数据相关: [ + MotaActionBlocks["setValue_s"].xmlText([ + MotaActionBlocks["idIdList_e"].xmlText(["status", "生命"]), + "=", + "", + false, + ]), + MotaActionBlocks["setEnemy_s"].xmlText(), + MotaActionBlocks["setEnemyOnPoint_s"].xmlText(), + MotaActionBlocks["resetEnemyOnPoint_s"].xmlText(), + MotaActionBlocks["moveEnemyOnPoint_s"].xmlText(), + MotaActionBlocks["moveEnemyOnPoint_1_s"].xmlText(), + MotaActionBlocks["setEquip_s"].xmlText(), + MotaActionBlocks["setFloor_s"].xmlText(), + MotaActionBlocks["setGlobalAttribute_s"].xmlText(), + MotaActionBlocks["setGlobalValue_s"].xmlText(), + MotaActionBlocks["setGlobalFlag_s"].xmlText(), + MotaActionBlocks["setNameMap_s"].xmlText(), + MotaActionBlocks["input_s"].xmlText(), + MotaActionBlocks["input2_s"].xmlText(), + MotaActionBlocks["update_s"].xmlText(), + MotaActionBlocks["moveAction_s"].xmlText(), + MotaActionBlocks["changeFloor_s"].xmlText(), + MotaActionBlocks["changePos_s"].xmlText(), + MotaActionBlocks["battle_s"].xmlText(), + MotaActionBlocks["useItem_s"].xmlText(), + MotaActionBlocks["loadEquip_s"].xmlText(), + MotaActionBlocks["unloadEquip_s"].xmlText(), + MotaActionBlocks["openShop_s"].xmlText(), + MotaActionBlocks["disableShop_s"].xmlText(), + MotaActionBlocks["setHeroIcon_s"].xmlText(), + MotaActionBlocks["follow_s"].xmlText(), + MotaActionBlocks["unfollow_s"].xmlText(), + ], + 地图处理: [ + MotaActionBlocks["battle_1_s"].xmlText(), + MotaActionBlocks["openDoor_s"].xmlText(), + MotaActionBlocks["closeDoor_s"].xmlText(), + MotaActionBlocks["show_s"].xmlText(), + MotaActionBlocks["hide_s"].xmlText(), + MotaActionBlocks["setBlock_s"].xmlText(), + MotaActionBlocks["setBlockOpacity_s"].xmlText(), + MotaActionBlocks["setBlockFilter_s"].xmlText(), + MotaActionBlocks["turnBlock_s"].xmlText(), + MotaActionBlocks["moveHero_s"].xmlText(), + MotaActionBlocks["move_s"].xmlText(), + MotaActionBlocks["jumpHero_s"].xmlText(), + MotaActionBlocks["jumpHero_1_s"].xmlText(), + MotaActionBlocks["jump_s"].xmlText(), + MotaActionBlocks["jump_1_s"].xmlText(), + MotaActionBlocks["showBgFgMap_s"].xmlText(), + MotaActionBlocks["hideBgFgMap_s"].xmlText(), + MotaActionBlocks["setBgFgBlock_s"].xmlText(), + MotaActionBlocks["showFloorImg_s"].xmlText(), + MotaActionBlocks["hideFloorImg_s"].xmlText(), + ], + 事件控制: [ + MotaActionBlocks["if_1_s"].xmlText(), + MotaActionBlocks["if_s"].xmlText(), + MotaActionFunctions.actionParser.parseList({ + type: "switch", + condition: "判别值", + caseList: [{ + action: [ + { type: "comment", text: "当判别值是值的场合执行此事件" }, + ], + }, + { + case: "default", + action: [{ + type: "comment", + text: "当没有符合的值的场合执行default事件", + }, ], + }, + ], + }), + MotaActionFunctions.actionParser.parseList({ + type: "for", + name: "temp:A", + from: "0", + to: "12", + step: "1", + data: [], + }), + MotaActionFunctions.actionParser.parseList({ + type: "forEach", + name: "temp:A", + list: ["status:atk", "status:def"], + data: [], + }), + MotaActionBlocks["while_s"].xmlText(), + MotaActionBlocks["dowhile_s"].xmlText(), + MotaActionBlocks["break_s"].xmlText(), + MotaActionBlocks["continue_s"].xmlText(), + MotaActionBlocks["exit_s"].xmlText(), + MotaActionBlocks["trigger_s"].xmlText(), + MotaActionBlocks["insert_1_s"].xmlText(), + MotaActionBlocks["insert_2_s"].xmlText(), + ], + 特效表现: [ + MotaActionBlocks["sleep_s"].xmlText(), + MotaActionBlocks["setq_s"].xmlText(), + MotaActionBlocks["setcgs_s"].xmlText(), + MotaActionBlocks["setmusics_s"].xmlText(), + MotaActionBlocks["changebg_s"].xmlText(), + MotaActionBlocks["drawbackground_s"].xmlText(), + MotaActionBlocks["clearbackground_s"].xmlText(), + MotaActionFunctions.actionParser.parseList({ + type: "wait", + timeout: 0, + data: [{ + case: "keyboard", + keycode: "13,32", + action: [{ + type: "comment", + text: "当按下回车(keycode=13)或空格(keycode=32)时执行此事件\n超时剩余时间会写入flag:timeout", + }, ], + }, + { + case: "mouse", + px: [0, 32], + py: [0, 32], + action: [{ + type: "comment", + text: "当点击地图左上角时执行此事件\n超时剩余时间会写入flag:timeout", + }, ], + }, + { + case: "condition", + condition: "flag:type==0\n&&flag:keycode==13", + action: [{ + type: "comment", + text: "当满足自定义条件时会执行此事件\n超时剩余时间会写入flag:timeout", + }, ], + }, + { + case: "timeout", + action: [ + { type: "comment", text: "当超时未操作时执行此事件" }, + ], + }, + ], + }), + MotaActionBlocks["waitAsync_s"].xmlText(), + MotaActionBlocks["stopAsync_s"].xmlText(), + MotaActionBlocks["op_s"].xmlText(), + MotaActionBlocks["drawWarning_s"].xmlText(), + MotaActionBlocks["changeMouse_s"].xmlText(), + MotaActionBlocks["removeMouse_s"].xmlText(), + MotaActionBlocks["vibrate_s"].xmlText(), + MotaActionBlocks["animate_s"].xmlText(), + MotaActionBlocks["animate_1_s"].xmlText(), + MotaActionBlocks["animateResize_s"].xmlText(), + MotaActionBlocks["moveAnimate_s"].xmlText(), + MotaActionBlocks["pauseAnimate_s"].xmlText(), + MotaActionBlocks["remuseAnimate_s"].xmlText(), + MotaActionBlocks["stopAnimate_s"].xmlText(), + MotaActionBlocks["setViewport_s"].xmlText(), + MotaActionBlocks["setViewport_1_s"].xmlText(), + MotaActionBlocks["lockViewport_s"].xmlText(), + MotaActionBlocks["showStatusBar_s"].xmlText(), + MotaActionBlocks["hideStatusBar_s"].xmlText(), + MotaActionBlocks["setHeroOpacity_s"].xmlText(), + MotaActionBlocks["setCurtain_0_s"].xmlText(), + MotaActionBlocks["setCurtain_1_s"].xmlText(), + MotaActionBlocks["screenFlash_s"].xmlText(), + MotaActionBlocks["setWeather_s"].xmlText(), + MotaActionBlocks["callBook_s"].xmlText(), + MotaActionBlocks["callSave_s"].xmlText(), + MotaActionBlocks["autoSave_s"].xmlText(), + MotaActionBlocks["forbidSave_s"].xmlText(), + MotaActionBlocks["callLoad_s"].xmlText(), + ], + 音像处理: [ + MotaActionBlocks["animationDrawable_s"].xmlText(), + MotaActionBlocks["setanimate_s"].xmlText(), + MotaActionBlocks["deleteanimate_s"].xmlText(), + MotaActionBlocks["playanimate_s"].xmlText(), + MotaActionBlocks["clearanimate_s"].xmlText(), + MotaActionBlocks["animateloop_s"].xmlText(), + MotaActionBlocks["animatereverse_s"].xmlText(), + MotaActionBlocks["animatepause_s"].xmlText(), + MotaActionBlocks["animatemove_s"].xmlText(), + MotaActionBlocks["introAndLoop_s"].xmlText(), + MotaActionBlocks["showImage_s"].xmlText(), + MotaActionBlocks["showImage_1_s"].xmlText(), + MotaActionBlocks["hideImage_s"].xmlText(), + MotaActionBlocks["showTextImage_s"].xmlText(), + MotaActionBlocks["moveImage_s"].xmlText(), + MotaActionBlocks["rotateImage_s"].xmlText(), + MotaActionBlocks["scaleImage_s"].xmlText(), + MotaActionBlocks["showGif_s"].xmlText(), + MotaActionBlocks["playBgm_s"].xmlText(), + MotaActionBlocks["pauseBgm_s"].xmlText(), + MotaActionBlocks["resumeBgm_s"].xmlText(), + MotaActionBlocks["loadBgm_s"].xmlText(), + MotaActionBlocks["freeBgm_s"].xmlText(), + MotaActionBlocks["playSound_s"].xmlText(), + MotaActionBlocks["playSound_1_s"].xmlText(), + MotaActionBlocks["stopSound_s"].xmlText(), + MotaActionBlocks["setVolume_s"].xmlText(), + MotaActionBlocks["setBgmSpeed_s"].xmlText(), + ], + UI绘制: [ + MotaActionBlocks["previewUI_s"].xmlText(), + MotaActionBlocks["clearMap_s"].xmlText(), + MotaActionBlocks["setAttribute_s"].xmlText(), + MotaActionBlocks["setFilter_s"].xmlText(), + MotaActionBlocks["fillText_s"].xmlText(), + MotaActionBlocks["fillBoldText_s"].xmlText(), + MotaActionBlocks["drawTextContent_s"].xmlText(), + MotaActionBlocks["fillRect_s"].xmlText(), + MotaActionBlocks["strokeRect_s"].xmlText(), + MotaActionBlocks["drawLine_s"].xmlText(), + MotaActionBlocks["drawArrow_s"].xmlText(), + MotaActionBlocks["fillPolygon_s"].xmlText(), + MotaActionBlocks["strokePolygon_s"].xmlText(), + MotaActionBlocks["fillEllipse_s"].xmlText(), + MotaActionBlocks["strokeEllipse_s"].xmlText(), + MotaActionBlocks["fillArc_s"].xmlText(), + MotaActionBlocks["strokeArc_s"].xmlText(), + MotaActionBlocks["drawImage_s"].xmlText(), + MotaActionBlocks["drawImage_1_s"].xmlText(), + MotaActionBlocks["drawIcon_s"].xmlText(), + MotaActionBlocks["drawBackground_s"].xmlText(), + MotaActionBlocks["drawSelector_s"].xmlText(), + MotaActionBlocks["drawSelector_1_s"].xmlText(), + ], + 原生脚本: [ + MotaActionBlocks["function_s"].xmlText(), + MotaActionBlocks["unknown_s"].xmlText(), + ], + 值块: [ + MotaActionBlocks["setValue_s"].xmlText([ + MotaActionBlocks["idIdList_e"].xmlText(["status", "生命"]), + "=", + "", + false, + ]), + MotaActionBlocks["expression_arithmetic_0"].xmlText(), + MotaActionBlocks["idFlag_e"].xmlText(), + MotaActionBlocks["idTemp_e"].xmlText(), + MotaActionBlocks["negate_e"].xmlText(), + MotaActionBlocks["unaryOperation_e"].xmlText(), + MotaActionBlocks["bool_e"].xmlText(), + MotaActionBlocks["idString_e"].xmlText(), + MotaActionBlocks["idIdList_e"].xmlText(), + MotaActionBlocks["idFixedList_e"].xmlText(), + MotaActionBlocks["enemyattr_e"].xmlText(), + MotaActionBlocks["blockId_e"].xmlText(), + MotaActionBlocks["blockNumber_e"].xmlText(), + MotaActionBlocks["blockCls_e"].xmlText(), + MotaActionBlocks["hasEquip_e"].xmlText(), + MotaActionBlocks["equip_e"].xmlText(), + MotaActionBlocks["nextXY_e"].xmlText(), + MotaActionBlocks["isReplaying_e"].xmlText(), + MotaActionBlocks["hasVisitedFloor_e"].xmlText(), + MotaActionBlocks["isShopVisited_e"].xmlText(), + MotaActionBlocks["canBattle_e"].xmlText(), + MotaActionBlocks["damage_e"].xmlText(), + MotaActionBlocks["damage_1_e"].xmlText(), + MotaActionBlocks["rand_e"].xmlText(), + MotaActionBlocks["evalString_e"].xmlText(), + ], + 常见事件模板: [ + '<label text="此处只是占位符,实际定义在#region 動態常見事件模板"></label>', + ], + 最近使用事件: [ + '<label text="此处只是占位符,实际定义在editor_blockly.searchBlockCategoryCallback中"></label>', + ], + }; + var toolboxgap = '<sep gap="5"></sep>'; + //xml_text = MotaActionFunctions.actionParser.parse(obj,type||'event') + //MotaActionBlocks['idString_e'].xmlText() - let labelHTML = ""; - let blockHTML = ""; + //#region 動態常見事件模板 + let CommonEventTemplateHTML = []; - labelHTML = `<label text="${commonEventName}"></label>`; + for (let commonEventName in events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate) { + if ( + events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate.hasOwnProperty( + commonEventName + ) + ) { + let actionParserJson = Array.from( + events_c12a15a8_c380_4b28_8144_256cba95f760.CommonEventTemplate[ + commonEventName + ] ?? [] + ); - if (actionParserJson.length > 1) { - actionParserJson = { - type: "if", - condition: "true", - true: actionParserJson, - }; - } else if (actionParserJson.length < 1) { - actionParserJson = [ - "空的常用事件模板。\n請在主頁下拉菜單中,選擇常用事件模板,進行編輯。\n編輯後需按F5刷新事件編輯器。", - ]; - } - blockHTML = - MotaActionFunctions.actionParser.parseList(actionParserJson); + let labelHTML = ""; + let blockHTML = ""; - CommonEventTemplateHTML.push(labelHTML); - CommonEventTemplateHTML.push(blockHTML); - } - } + labelHTML = `<label text="${commonEventName}"></label>`; - toolboxObj["常见事件模板"] = CommonEventTemplateHTML; - //#endregion + if (actionParserJson.length > 1) { + actionParserJson = { + type: "if", + condition: "true", + true: actionParserJson, + }; + } else if (actionParserJson.length < 1) { + actionParserJson = [ + "空的常用事件模板。\n請在主頁下拉菜單中,選擇常用事件模板,進行編輯。\n編輯後需按F5刷新事件編輯器。", + ]; + } + blockHTML = + MotaActionFunctions.actionParser.parseList(actionParserJson); - for (var name in toolboxObj) { - var custom = null; - if (name == "最近使用事件") custom = "searchBlockCategory"; - if (name == "入口方块") custom = "entranceCategory"; - getCategory(name, custom).innerHTML = - toolboxObj[name].join(toolboxgap); - } + CommonEventTemplateHTML.push(labelHTML); + CommonEventTemplateHTML.push(blockHTML); + } + } - var blocklyArea = document.getElementById("blocklyArea"); - var blocklyDiv = document.getElementById("blocklyDiv"); - var workspace = Blockly.inject(blocklyDiv, { - media: "_server/blockly/media/", - toolbox: document.getElementById("toolbox"), - zoom: { - controls: true, - wheel: false, //滚轮改为上下(shift:左右)翻滚 - startScale: 1.0, - maxScale: 3, - minScale: 0.3, - scaleSpeed: 1.08, - }, - trashcan: false, - }); + toolboxObj["常见事件模板"] = CommonEventTemplateHTML; + //#endregion - editor_blockly.isCommonEntry = function () { - var commonEntries = [ - "beforeBattle", - "afterBattle", - "afterOpenDoor", - "firstArrive", - "eachArrive", - "commonEvent", - "item", - ]; - return commonEntries.indexOf(editor_blockly.entryType) >= 0; - }; + for (var name in toolboxObj) { + var custom = null; + if (name == "最近使用事件") custom = "searchBlockCategory"; + if (name == "入口方块") custom = "entranceCategory"; + getCategory(name, custom).innerHTML = + toolboxObj[name].join(toolboxgap); + } - editor_blockly.entranceCategoryCallback = function (workspace) { - var list = toolboxObj["入口方块"]; - var xmlList = []; - var eventType = - (editor_blockly.isCommonEntry() - ? "common" - : editor_blockly.entryType) + "_m"; - for (var ii = 0, blockText; (blockText = list[ii]); ii++) { - if ( - new RegExp('<block type="' + eventType + '">').exec(blockText) - ) { - var block = Blockly.Xml.textToDom( - "<xml>" + blockText + "</xml>" - ).firstChild; - block.setAttribute("gap", 5); - xmlList.push(block); - } - } - return xmlList; - }; + var blocklyArea = document.getElementById("blocklyArea"); + var blocklyDiv = document.getElementById("blocklyDiv"); + var workspace = Blockly.inject(blocklyDiv, { + media: "_server/blockly/media/", + toolbox: document.getElementById("toolbox"), + zoom: { + controls: true, + wheel: false, //滚轮改为上下(shift:左右)翻滚 + startScale: 1.0, + maxScale: 3, + minScale: 0.3, + scaleSpeed: 1.08, + }, + trashcan: false, + }); - workspace.registerToolboxCategoryCallback( - "entranceCategory", - editor_blockly.entranceCategoryCallback - ); + editor_blockly.isCommonEntry = function () { + var commonEntries = [ + "beforeBattle", + "afterBattle", + "afterOpenDoor", + "firstArrive", + "eachArrive", + "commonEvent", + "item", + ]; + return commonEntries.indexOf(editor_blockly.entryType) >= 0; + }; - editor_blockly.searchBlockCategoryCallback = function (workspace) { - var xmlList = []; - var labels = editor_blockly.searchBlock(); - for (var i = 0; i < labels.length; i++) { - var blockText = - "<xml>" + MotaActionBlocks[labels[i]].xmlText() + "</xml>"; - var block = Blockly.Xml.textToDom(blockText).firstChild; - block.setAttribute("gap", 5); - xmlList.push(block); - } - return xmlList; - }; + editor_blockly.entranceCategoryCallback = function (workspace) { + var list = toolboxObj["入口方块"]; + var xmlList = []; + var eventType = + (editor_blockly.isCommonEntry() ? + "common" : + editor_blockly.entryType) + "_m"; + for (var ii = 0, blockText; + (blockText = list[ii]); ii++) { + if ( + new RegExp('<block type="' + eventType + '">').exec(blockText) + ) { + var block = Blockly.Xml.textToDom( + "<xml>" + blockText + "</xml>" + ).firstChild; + block.setAttribute("gap", 5); + xmlList.push(block); + } + } + return xmlList; + }; - workspace.registerToolboxCategoryCallback( - "searchBlockCategory", - editor_blockly.searchBlockCategoryCallback - ); + workspace.registerToolboxCategoryCallback( + "entranceCategory", + editor_blockly.entranceCategoryCallback + ); - var onresize = function (e) { - blocklyDiv.style.width = blocklyArea.offsetWidth + "px"; - blocklyDiv.style.height = blocklyArea.offsetHeight + "px"; - Blockly.svgResize(workspace); - }; - if (typeof editor !== "undefined" && !editor.isMobile) - window.addEventListener("resize", onresize, false); - onresize(); - //Blockly.svgResize(workspace); + editor_blockly.searchBlockCategoryCallback = function (workspace) { + var xmlList = []; + var labels = editor_blockly.searchBlock(); + for (var i = 0; i < labels.length; i++) { + var blockText = + "<xml>" + MotaActionBlocks[labels[i]].xmlText() + "</xml>"; + var block = Blockly.Xml.textToDom(blockText).firstChild; + block.setAttribute("gap", 5); + xmlList.push(block); + } + return xmlList; + }; - //Blockly.bindEventWithChecks_(workspace.svgGroup_,"wheel",workspace,function(e){}); - document.getElementById("blocklyDiv").onmousewheel = function (e) { - //console.log(e); - e.preventDefault(); - var hvScroll = e.shiftKey ? "hScroll" : "vScroll"; - var mousewheelOffsetValue = - (20 / 380) * workspace.scrollbar[hvScroll].handleLength_ * 3; - workspace.scrollbar[hvScroll].handlePosition_ += - (e.deltaY || 0) + (e.detail || 0) > 0 - ? mousewheelOffsetValue - : -mousewheelOffsetValue; - workspace.scrollbar[hvScroll].onScroll_(); - // workspace.setScale(workspace.scale); - }; + workspace.registerToolboxCategoryCallback( + "searchBlockCategory", + editor_blockly.searchBlockCategoryCallback + ); - var doubleClickCheck = [[0, "abc"]]; + var onresize = function (e) { + blocklyDiv.style.width = blocklyArea.offsetWidth + "px"; + blocklyDiv.style.height = blocklyArea.offsetHeight + "px"; + Blockly.svgResize(workspace); + }; + if (typeof editor !== "undefined" && !editor.isMobile) + window.addEventListener("resize", onresize, false); + onresize(); + //Blockly.svgResize(workspace); - function omitedcheckUpdateFunction(event) { - if (event.type === "create") { - editor_blockly.addIntoLastUsedType(event.blockId); - } - if (event.type === "ui" && event.element == "click") { - var newClick = [new Date().getTime(), event.blockId]; - var lastClick = doubleClickCheck.shift(); - doubleClickCheck.push(newClick); - if (newClick[0] - lastClick[0] < 500) { - if (newClick[1] === lastClick[1]) { - editor_blockly.doubleClickBlock(newClick[1]); - } - } - } - // Only handle these events - if (["create", "move", "change", "delete"].indexOf(event.type) < 0) - return; - if (editor_blockly.workspace.topBlocks_.length >= 2) { - editor_blockly.setValue("入口方块只能有一个"); - return; - } - var eventType = editor_blockly.entryType; - if (editor_blockly.workspace.topBlocks_.length == 1) { - var blockType = editor_blockly.workspace.topBlocks_[0].type; - if ( - blockType !== eventType + "_m" && - !(editor_blockly.isCommonEntry() && blockType == "common_m") - ) { - editor_blockly.setValue("入口方块类型错误"); - return; - } - } - try { - var code = Blockly.JavaScript.workspaceToCode(workspace).replace( - /\\(i|c|d|e|g|z)/g, - "\\\\$1" - ); - editor_blockly.setValue(code); - } catch (error) { - editor_blockly.setValue(String(error)); - if (error instanceof OmitedError) { - var blockName = error.blockName; - var varName = error.varName; - var block = error.block; - } - // console.log(error); - } - } + //Blockly.bindEventWithChecks_(workspace.svgGroup_,"wheel",workspace,function(e){}); + document.getElementById("blocklyDiv").onmousewheel = function (e) { + //console.log(e); + e.preventDefault(); + var hvScroll = e.shiftKey ? "hScroll" : "vScroll"; + var mousewheelOffsetValue = + (20 / 380) * workspace.scrollbar[hvScroll].handleLength_ * 3; + workspace.scrollbar[hvScroll].handlePosition_ += + (e.deltaY || 0) + (e.detail || 0) > 0 ? + mousewheelOffsetValue : + -mousewheelOffsetValue; + workspace.scrollbar[hvScroll].onScroll_(); + // workspace.setScale(workspace.scale); + }; - workspace.addChangeListener(omitedcheckUpdateFunction); + var doubleClickCheck = [ + [0, "abc"] + ]; - workspace.addChangeListener(Blockly.Events.disableOrphans); + function omitedcheckUpdateFunction(event) { + if (event.type === "create") { + editor_blockly.addIntoLastUsedType(event.blockId); + } + if (event.type === "ui" && event.element == "click") { + var newClick = [new Date().getTime(), event.blockId]; + var lastClick = doubleClickCheck.shift(); + doubleClickCheck.push(newClick); + if (newClick[0] - lastClick[0] < 500) { + if (newClick[1] === lastClick[1]) { + editor_blockly.doubleClickBlock(newClick[1]); + } + } + } + // Only handle these events + if (["create", "move", "change", "delete"].indexOf(event.type) < 0) + return; + if (editor_blockly.workspace.topBlocks_.length >= 2) { + editor_blockly.setValue("入口方块只能有一个"); + return; + } + var eventType = editor_blockly.entryType; + if (editor_blockly.workspace.topBlocks_.length == 1) { + var blockType = editor_blockly.workspace.topBlocks_[0].type; + if ( + blockType !== eventType + "_m" && + !(editor_blockly.isCommonEntry() && blockType == "common_m") + ) { + editor_blockly.setValue("入口方块类型错误"); + return; + } + } + try { + var code = Blockly.JavaScript.workspaceToCode(workspace).replace( + /\\(i|c|d|e|g|z)/g, + "\\\\$1" + ); + editor_blockly.setValue(code); + } catch (error) { + editor_blockly.setValue(String(error)); + if (error instanceof OmitedError) { + var blockName = error.blockName; + var varName = error.varName; + var block = error.block; + } + // console.log(error); + } + } - editor_blockly.workspace = workspace; + workspace.addChangeListener(omitedcheckUpdateFunction); - MotaActionFunctions.workspace = function () { - return editor_blockly.workspace; - }; + workspace.addChangeListener(Blockly.Events.disableOrphans); - // 因为在editor_blockly.parse里已经HTML转义过一次了,所以这里要覆盖掉以避免在注释中出现<等 - MotaActionFunctions.xmlText = function ( - ruleName, - inputs, - isShadow, - comment, - collapsed, - disabled - ) { - var rule = MotaActionBlocks[ruleName]; - var blocktext = isShadow ? "shadow" : "block"; - var xmlText = []; - xmlText.push( - "<" + - blocktext + - ' type="' + - ruleName + - '"' + - (collapsed ? ' collapsed="true"' : "") + - (disabled ? ' disabled="true"' : "") + - ">" - ); - if (!inputs) inputs = []; - for (var ii = 0, inputType; (inputType = rule.argsType[ii]); ii++) { - var input = inputs[ii]; - var _input = ""; - var noinput = input === null || input === undefined; - if ( - noinput && - inputType === "field" && - MotaActionBlocks[rule.argsGrammarName[ii]].type !== - "field_dropdown" - ) - continue; - if (noinput && inputType === "field") { - noinput = false; - input = rule.fieldDefault(rule.args[ii]); - } - if (noinput) input = ""; - if ( - inputType === "field" && - MotaActionBlocks[rule.argsGrammarName[ii]].type === - "field_checkbox" - ) - input = input ? "TRUE" : "FALSE"; - if (inputType !== "field") { - var subList = false; - var subrulename = rule.argsGrammarName[ii]; - var subrule = MotaActionBlocks[subrulename]; - if (subrule instanceof Array) { - subrulename = subrule[subrule.length - 1]; - subrule = MotaActionBlocks[subrulename]; - subList = true; - } - _input = subrule.xmlText([], true); - if (noinput && !subList && !isShadow) { - //无输入的默认行为是: 如果语句块的备选方块只有一个,直接代入方块 - input = subrule.xmlText(); - } - } - xmlText.push("<" + inputType + ' name="' + rule.args[ii] + '">'); - xmlText.push(_input + input); - xmlText.push("</" + inputType + ">"); - } - if (comment) { - xmlText.push("<comment>"); - xmlText.push(comment); - xmlText.push("</comment>"); - } - var next = inputs[rule.args.length]; - if (next) { - //next - xmlText.push("<next>"); - xmlText.push(next); - xmlText.push("</next>"); - } - xmlText.push("</" + blocktext + ">"); - return xmlText.join(""); - }; - })(); + editor_blockly.workspace = workspace; - // end mark sfergsvae - } - .toString() - .split("// start mark sfergsvae")[1] - .split("// end mark sfergsvae")[0]; - } - }, + MotaActionFunctions.workspace = function () { + return editor_blockly.workspace; + }; + + // 因为在editor_blockly.parse里已经HTML转义过一次了,所以这里要覆盖掉以避免在注释中出现<等 + MotaActionFunctions.xmlText = function ( + ruleName, + inputs, + isShadow, + comment, + collapsed, + disabled + ) { + var rule = MotaActionBlocks[ruleName]; + var blocktext = isShadow ? "shadow" : "block"; + var xmlText = []; + xmlText.push( + "<" + + blocktext + + ' type="' + + ruleName + + '"' + + (collapsed ? ' collapsed="true"' : "") + + (disabled ? ' disabled="true"' : "") + + ">" + ); + if (!inputs) inputs = []; + for (var ii = 0, inputType; + (inputType = rule.argsType[ii]); ii++) { + var input = inputs[ii]; + var _input = ""; + var noinput = input === null || input === undefined; + if ( + noinput && + inputType === "field" && + MotaActionBlocks[rule.argsGrammarName[ii]].type !== + "field_dropdown" + ) + continue; + if (noinput && inputType === "field") { + noinput = false; + input = rule.fieldDefault(rule.args[ii]); + } + if (noinput) input = ""; + if ( + inputType === "field" && + MotaActionBlocks[rule.argsGrammarName[ii]].type === + "field_checkbox" + ) + input = input ? "TRUE" : "FALSE"; + if (inputType !== "field") { + var subList = false; + var subrulename = rule.argsGrammarName[ii]; + var subrule = MotaActionBlocks[subrulename]; + if (subrule instanceof Array) { + subrulename = subrule[subrule.length - 1]; + subrule = MotaActionBlocks[subrulename]; + subList = true; + } + _input = subrule.xmlText([], true); + if (noinput && !subList && !isShadow) { + //无输入的默认行为是: 如果语句块的备选方块只有一个,直接代入方块 + input = subrule.xmlText(); + } + } + xmlText.push("<" + inputType + ' name="' + rule.args[ii] + '">'); + xmlText.push(_input + input); + xmlText.push("</" + inputType + ">"); + } + if (comment) { + xmlText.push("<comment>"); + xmlText.push(comment); + xmlText.push("</comment>"); + } + var next = inputs[rule.args.length]; + if (next) { + //next + xmlText.push("<next>"); + xmlText.push(next); + xmlText.push("</next>"); + } + xmlText.push("</" + blocktext + ">"); + return xmlText.join(""); + }; + })(); + + // end mark sfergsvae + } + .toString() + .split("// start mark sfergsvae")[1] + .split("// end mark sfergsvae")[0]; + } +}, "夹击激光动画": function () { function createCanvas(name, zIndex) { if (!name) return; @@ -12461,2035 +13274,2079 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "小地图": function () { - // 在此增加新插件 - // ----- 不可自定义 杂七杂八的变量 - /** @type {{[x: string]: BFSResult}} */ - let mapCache = {}; // 地图缓存 - let drawCache = {}; // 绘制信息缓存 - let status = "none"; // 当前的绘制状态 - /** @type {{[x: string]: Sprite}} */ - let sprites = {}; // 当前所有的sprite - /** @type {{[x: string]: Sprite}} */ - let canDrag = {}; // 可以拖拽的sprite - /** @type {{[x: string]: Button}} */ - let areaSprite = {}; // 区域列表对应的sprite - let clicking = false; // 是否正在点击,用于拖拽判定 - let drawingMap = ""; // 正在绘制的中心楼层 - let nowScale = 0; // 当前绘制的放缩比例 - let lastTouch = {}; // 上一次的单点点击信息 - let lastLength = 0; // 手机端缩放时上一次的两指间距离 - let nowDepth = 0; // 当前的遍历深度 - let drawedThumbnail = {}; // 已经绘制过的缩略图 - let moved = false; // 鼠标按下后是否移动了 - let noBorder = false; // 是否是无边框拼接模式 - let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 - let areaPage = 0; // 区域显示的当前页数 - let nowArea = 0; // 当前区域index - let selecting = ""; // 选择时当前正在选择的地图 + // 在此增加新插件 + // ----- 不可自定义 杂七杂八的变量 + /** @type {{[x: string]: BFSResult}} */ + let mapCache = {}; // 地图缓存 + let drawCache = {}; // 绘制信息缓存 + let status = "none"; // 当前的绘制状态 + /** @type {{[x: string]: Sprite}} */ + let sprites = {}; // 当前所有的sprite + /** @type {{[x: string]: Sprite}} */ + let canDrag = {}; // 可以拖拽的sprite + /** @type {{[x: string]: Button}} */ + let areaSprite = {}; // 区域列表对应的sprite + let clicking = false; // 是否正在点击,用于拖拽判定 + let drawingMap = ""; // 正在绘制的中心楼层 + let nowScale = 0; // 当前绘制的放缩比例 + let lastTouch = {}; // 上一次的单点点击信息 + let lastLength = 0; // 手机端缩放时上一次的两指间距离 + let nowDepth = 0; // 当前的遍历深度 + let drawedThumbnail = {}; // 已经绘制过的缩略图 + let moved = false; // 鼠标按下后是否移动了 + let noBorder = false; // 是否是无边框拼接模式 + let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 + let areaPage = 0; // 区域显示的当前页数 + let nowArea = 0; // 当前区域index + let selecting = ""; // 选择时当前正在选择的地图 - // ---- 不可自定义,常量 - /** @type {Area} */ - let areas = []; // 区域信息 - const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 + // ---- 不可自定义,常量 + /** @type {Area} */ + let areas = []; // 区域信息 + const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 - // ---- 可自定义,默认的切换地图的图块id - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - // ---- 可自定义,默认数值 - const defaultValue = { - font: "Verdana", // 默认字体 - scale: 60, // 默认地图缩放比例 - depth: Infinity, // 默认的遍历深度 - }; + // ---- 可自定义,默认的切换地图的图块id + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + // ---- 可自定义,默认数值 + const defaultValue = { + font: "Verdana", // 默认字体 + scale: 60, // 默认地图缩放比例 + depth: Infinity, // 默认的遍历深度 + }; - // ---- 不可自定义,计算数据 - const dirData = { - up: [1, 0], - down: [-1, 0], - left: [0, 1], - right: [0, -1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let ignoreEnemies = (this.ignoreEnemies = []); + // ---- 不可自定义,计算数据 + const dirData = { + up: [1, 0], + down: [-1, 0], + left: [0, 1], + right: [0, -1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let ignoreEnemies = (this.ignoreEnemies = []); - let allChangeEntries = Object.entries(defaultChange); + let allChangeEntries = Object.entries(defaultChange); - this.setq = function (floorId) { - core.setFlag("任务地点", floorId); - }; + this.setq = function (floorId) { + core.setFlag("任务地点", floorId); + }; - const reset = core.events.resetGame; - this.bfs = function () { - areas = []; - // 获取所有分区,使用异步函数,保证不会卡顿 - // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 - (async function () { - let all = core.floorIds.slice(); - const scanned = { - [all[0]]: true, - }; - while (all.length > 0) { - let now = all.shift(); - if (core.status.maps[now].deleted) continue; - if (!now) return; - await new Promise((res) => { - const result = core.plugin.bfsSearch(now, Infinity, true); - mapCache[`${now}_Infinity_false`] = result; - areas.push({ name: core.floors[now].areas, maps: result.order }); - for (const map of result.order) { - scanned[map] = true; - all = all.filter((v) => !result.order.includes(v)); - } - res("success"); - }).then(() => { - core.setFlag("areas", areas); - }); - } - })(); - }; - core.events.resetGame = function () { - reset.apply(core.events, arguments); - core.plugin.bfs(); - }; - /** - * 广度优先搜索搜索地图路径 - * @param {string} center 中心地图的id - * @param {number} depth 搜索深度 - * @param {boolean} noCache 是否不使用缓存 - * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y - */ - this.bfsSearch = function bfsSearch(center, depth, noCache) { - // 检查缓存 - const id = `${center}_${depth}_${noBorder}`; - if (mapCache[id] && !noCache) return mapCache[id]; - const used = { - [center]: true, - }; // 搜索过的楼层 - let queue = []; - let stack = [center]; // 当前栈 - let nowDepth = -1; - const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 + const reset = core.events.resetGame; + this.bfs = function () { + areas = []; + // 获取所有分区,使用异步函数,保证不会卡顿 + // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 + (async function () { + let all = core.floorIds.slice(); + const scanned = { + [all[0]]: true, + }; + while (all.length > 0) { + let now = all.shift(); + if (core.status.maps[now].deleted) continue; + if (!now) return; + await new Promise((res) => { + const result = core.plugin.bfsSearch(now, Infinity, true); + mapCache[`${now}_Infinity_false`] = result; + areas.push({ name: core.floors[now].areas, maps: result.order }); + for (const map of result.order) { + scanned[map] = true; + all = all.filter((v) => !result.order.includes(v)); + } + res("success"); + }).then(() => { + core.setFlag("areas", areas); + }); + } + })(); + }; + core.events.resetGame = function () { + reset.apply(core.events, arguments); + core.plugin.bfs(); + }; + /** + * 广度优先搜索搜索地图路径 + * @param {string} center 中心地图的id + * @param {number} depth 搜索深度 + * @param {boolean} noCache 是否不使用缓存 + * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y + */ + this.bfsSearch = function bfsSearch(center, depth, noCache) { + // 检查缓存 + const id = `${center}_${depth}_${noBorder}`; + if (mapCache[id] && !noCache) return mapCache[id]; + const used = { + [center]: true, + }; // 搜索过的楼层 + let queue = []; + let stack = [center]; // 当前栈 + let nowDepth = -1; + const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 - const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y - const enemies = {}; - const upOrDown = {}; - const mapdir = {}; - // 开始循环搜索 - while (nowDepth < depth && stack.length > 0) { - const now = stack.shift(); // 当前id - if (core.status.maps[now].deleted) continue; - mapdir[now] = mapdir[now] ?? []; - const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 - enemies[now] = {}; - // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 - for (const i in blocks) { - const block = blocks[i]; - // 整合漏怪检测,所以要检测怪物 - if (block.event.trigger === "battle") { - const id = block.event.id; - if (ignoreEnemies.includes(id)) continue; - else enemies[now][i] = block.event.id; - continue; - } - // 检测触发器是否为切换楼层,不是则直接跳过 - if (block.event.trigger !== "changeFloor") continue; - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - // 如果不是那六种传送门,直接忽略 - if (!dirEntries) continue; - const data = block.event.data; - const dir = dirEntries[0]; - const route = now + "_" + i.replace(",", "_") + "_" + dir; - const target = data.floorId + "_" + data.loc.join("_"); + const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y + const enemies = {}; + const upOrDown = {}; + const mapdir = {}; + // 开始循环搜索 + while (nowDepth < depth && stack.length > 0) { + const now = stack.shift(); // 当前id + if (core.status.maps[now].deleted) continue; + mapdir[now] = mapdir[now] ?? []; + const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 + enemies[now] = {}; + // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 + for (const i in blocks) { + const block = blocks[i]; + // 整合漏怪检测,所以要检测怪物 + if (block.event.trigger === "battle") { + const id = block.event.id; + if (ignoreEnemies.includes(id)) continue; + else enemies[now][i] = block.event.id; + continue; + } + // 检测触发器是否为切换楼层,不是则直接跳过 + if (block.event.trigger !== "changeFloor") continue; + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + // 如果不是那六种传送门,直接忽略 + if (!dirEntries) continue; + const data = block.event.data; + const dir = dirEntries[0]; + const route = now + "_" + i.replace(",", "_") + "_" + dir; + const target = data.floorId + "_" + data.loc.join("_"); - mapdir[now].push(dir); - if (!used[data.floorId]) { - if (dir === "upFloor" || dir === "downFloor") { - upOrDown[now] = upOrDown[id] ?? []; - upOrDown[now].push(dir); - } + mapdir[now].push(dir); + if (!used[data.floorId]) { + if (dir === "upFloor" || dir === "downFloor") { + upOrDown[now] = upOrDown[id] ?? []; + upOrDown[now].push(dir); + } - queue.push(data.floorId); // 没有搜索过,则加入栈中 - mapOrder.push(data.floorId); - used[data.floorId] = true; - } - res[route] = target; - } - if (stack.length === 0) { - stack = queue; - queue = []; - nowDepth++; - } - if (stack.length === 0 && queue.length === 0) break; - } - return { res, order: mapOrder, enemies, upOrDown, mapdir }; - }; - /** - * 获取绘制信息 - * @param {string?} center 中心地图id - * @param {number?} depth 搜索深度 - * @param {boolean?} noCache 是否不使用缓存 - * @returns {MapDrawInfo} - */ - this.getMapDrawInfo = function ( - center = core.status.floorId, - depth = defaultValue.depth, - noCache = false - ) { - nowDepth = depth; - drawingMap = center; - const id = `${center}_${depth}_${noBorder}`; - // 检查缓存 - if (drawCache[id] && !noCache) return drawCache[id]; - const map = core.plugin.bfsSearch(center, depth, noCache); - mapCache[id] = map; - const res = getDrawInfo(map.res, center, map.order); - res.upOrDown = map.upOrDown; - res.mapdir = map.mapdir; - drawCache[id] = res; - return res; - }; - /** - * 提供地图的绘制信息 - * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y - * @param {string} center 中心地图的id - * @param {string[]} order 遍历顺序 - * @returns {MapDrawInfo} 地图的绘制信息 - */ + queue.push(data.floorId); // 没有搜索过,则加入栈中 + mapOrder.push(data.floorId); + used[data.floorId] = true; + } + res[route] = target; + } + if (stack.length === 0) { + stack = queue; + queue = []; + nowDepth++; + } + if (stack.length === 0 && queue.length === 0) break; + } + return { res, order: mapOrder, enemies, upOrDown, mapdir }; + }; + /** + * 获取绘制信息 + * @param {string?} center 中心地图id + * @param {number?} depth 搜索深度 + * @param {boolean?} noCache 是否不使用缓存 + * @returns {MapDrawInfo} + */ + this.getMapDrawInfo = function ( + center = core.status.floorId, + depth = defaultValue.depth, + noCache = false + ) { + nowDepth = depth; + drawingMap = center; + const id = `${center}_${depth}_${noBorder}`; + // 检查缓存 + if (drawCache[id] && !noCache) return drawCache[id]; + const map = core.plugin.bfsSearch(center, depth, noCache); + mapCache[id] = map; + const res = getDrawInfo(map.res, center, map.order); + res.upOrDown = map.upOrDown; + res.mapdir = map.mapdir; + drawCache[id] = res; + return res; + }; + /** + * 提供地图的绘制信息 + * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y + * @param {string} center 中心地图的id + * @param {string[]} order 遍历顺序 + * @returns {MapDrawInfo} 地图的绘制信息 + */ - function getDrawInfo(map, center, order) { - // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 - const links = {}; - for (const i in map) { - const splitted = i.split("_"); - const id = splitted[0]; - if (!links[id]) links[id] = {}; - links[id][i] = map[i]; - } + function getDrawInfo(map, center, order) { + // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 + const links = {}; + for (const i in map) { + const splitted = i.split("_"); + const id = splitted[0]; + if (!links[id]) links[id] = {}; + links[id][i] = map[i]; + } - // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 - const centerFloor = core.status.maps[center]; - const visitedCenter = core.hasVisitedFloor(center); - const locs = { - // 格式:[中心x, 中心y, 宽, 高, 是否到达过] - [center]: [2, 2, 1, 1, visitedCenter], - }; - // 可以上楼下楼的地图 - const upOrDown = {}; - for (const id of order) { - const now = links[id]; - // 遍历每一个地图的连接情况 - for (const from in now) { - const to = now[from]; - // 先根据from to计算物理位置 - const fromData = from.split("_"), - toData = to.split("_"); - const dir = fromData[3]; - if (dir === "upFloor" || dir === "downFloor") continue; - if (!defaultChange[dir]) continue; - const v = dirData[dir][1], // 竖直数值 - h = dirData[dir][0], // 水平数值 - ha = Math.abs(h), - va = Math.abs(v); - const ff = id, // fromFloorId - tf = toData[0]; // toFloorId - const fromFloor = core.status.maps[ff], - toFloor = core.status.maps[tf]; - const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth - fhh = Math.floor(fromFloor.height / 2), - thw = Math.floor(toFloor.width / 2), - thh = Math.floor(toFloor.height / 2); - const fLoc = locs[id] ?? [0, 0]; - if (!locs[ff]) continue; - let x, y; - if (locs && locs[tf]) { - x = locs[tf][0]; - y = locs[tf][1]; - } else { - // 计算坐标,公式可以通过画图推断出 - x = fLoc[0] - v; - y = fLoc[1] - h; - } - locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; - } - } - // 获取地图绘制需要的长宽 - let width = 0, - height = 0; - let left, right, up, down; - for (const id in locs) { - const [x, y, w, h] = locs[id]; - if (left === void 0) { - left = right = x; - up = down = y; - } - left = Math.min(x - 1, left); - right = Math.max(x + 1, right); - up = Math.min(y - 1, up); - down = Math.max(y + 1, down); - } - width = right - left; - height = down - up; + // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 + const centerFloor = core.status.maps[center]; + const visitedCenter = core.hasVisitedFloor(center); + const locs = { + // 格式:[中心x, 中心y, 宽, 高, 是否到达过] + [center]: [2, 2, 1, 1, visitedCenter], + }; + // 可以上楼下楼的地图 + const upOrDown = {}; + for (const id of order) { + const now = links[id]; + // 遍历每一个地图的连接情况 + for (const from in now) { + const to = now[from]; + // 先根据from to计算物理位置 + const fromData = from.split("_"), + toData = to.split("_"); + const dir = fromData[3]; + if (dir === "upFloor" || dir === "downFloor") continue; + if (!defaultChange[dir]) continue; + const v = dirData[dir][1], // 竖直数值 + h = dirData[dir][0], // 水平数值 + ha = Math.abs(h), + va = Math.abs(v); + const ff = id, // fromFloorId + tf = toData[0]; // toFloorId + const fromFloor = core.status.maps[ff], + toFloor = core.status.maps[tf]; + const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth + fhh = Math.floor(fromFloor.height / 2), + thw = Math.floor(toFloor.width / 2), + thh = Math.floor(toFloor.height / 2); + const fLoc = locs[id] ?? [0, 0]; + if (!locs[ff]) continue; + let x, y; + if (locs && locs[tf]) { + x = locs[tf][0]; + y = locs[tf][1]; + } else { + // 计算坐标,公式可以通过画图推断出 + x = fLoc[0] - v; + y = fLoc[1] - h; + } + locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; + } + } + // 获取地图绘制需要的长宽 + let width = 0, + height = 0; + let left, right, up, down; + for (const id in locs) { + const [x, y, w, h] = locs[id]; + if (left === void 0) { + left = right = x; + up = down = y; + } + left = Math.min(x - 1, left); + right = Math.max(x + 1, right); + up = Math.min(y - 1, up); + down = Math.max(y + 1, down); + } + width = right - left; + height = down - up; - return { locs, width, height, layer: upOrDown }; - } + return { locs, width, height, layer: upOrDown }; + } - function mapblock(mapdir) { - let mb = ""; - if (mapdir.includes("up")) mb += "u"; - if (mapdir.includes("down")) mb += "d"; - if (mapdir.includes("left")) mb += "l"; - if (mapdir.includes("right")) mb += "r"; - return mb ? mb + ".webp" : "null.webp"; - } - core.animateFrame.globalAlphaFloor = 0; - core.animateFrame.globalAlphaFloorStatus = 1; + function mapblock(mapdir) { + let mb = ""; + if (mapdir.includes("up")) mb += "u"; + if (mapdir.includes("down")) mb += "d"; + if (mapdir.includes("left")) mb += "l"; + if (mapdir.includes("right")) mb += "r"; + return mb ? mb + ".webp" : "null.webp"; + } + core.animateFrame.globalAlphaFloor = 0; + core.animateFrame.globalAlphaFloorStatus = 1; - const tesk = document.createElement("canvas"); - tesk.width = 300; - tesk.height = 300; - const teskctx = tesk.getContext("2d"); + const tesk = document.createElement("canvas"); + tesk.width = 300; + tesk.height = 300; + const teskctx = tesk.getContext("2d"); - let line = 50; - teskctx.strokeStyle = "green"; - teskctx.fillStyle = "green"; - let now = 0; - core.registerAnimationFrame("tesk", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(teskctx); - teskctx.lineWidth = 150 - line; + let line = 50; + teskctx.strokeStyle = "green"; + teskctx.fillStyle = "green"; + let now = 0; + core.registerAnimationFrame("tesk", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + core.clearMap(teskctx); + teskctx.lineWidth = 150 - line; - if (line <= 150) { - teskctx.beginPath(); - teskctx.arc(150, 150, line, 0, Math.PI * 2); - line += 2; - teskctx.stroke(); - } else { - teskctx.beginPath(); - teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); - line += 2; - teskctx.fill(); - if (line >= 250) line = 50; - } - } - }); + if (line <= 150) { + teskctx.beginPath(); + teskctx.arc(150, 150, line, 0, Math.PI * 2); + line += 2; + teskctx.stroke(); + } else { + teskctx.beginPath(); + teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); + line += 2; + teskctx.fill(); + if (line >= 250) line = 50; + } + } + }); - /** - * 绘制小地图 - * @param {MapDrawInfo} info 地图绘制信息 - * @param {number} scale 地图的绘制比例 - */ - this.drawSmallMap = function ( - ctx, - info, - center, - sx, - sy, - sw, - sh, - scale = defaultValue.scale - ) { - core.clearMap(ctx, sx, sy, sw + 40, sh + 60); - if (core.domStyle.isVertical) { - sy += 50; - sx += 15; - } else { - sy += 60; - sx += 30; - } - core.fillRect(ctx, sx, sy, sw, sh, "#000"); - core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); - core.setTextAlign("outerUI", "center"); - core.fillBoldText1( - ctx, - core.status.maps[center].areas, - sx + sw / 2, - sy - 10, - "#FFFFFF", - "#000000", - 6, - "bold 42px Verdana" - ); - const locs = info.locs; - for (const id in locs) { - const loc = locs[id]; - let color = "#000"; - if (!loc[4]) color = "#f0f"; - const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); - const fx = x + sx, - fy = y + sy; - const mapdir = info.mapdir[id]; - const img = mapblock(mapdir); - if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; - core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); - const layer = info.upOrDown[id]; - const min = Math.min(w, h); - if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) - ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); - if (layer?.includes("upFloor")) - core.drawIcon( - ctx, - defaultChange.upFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (layer?.includes("downFloor")) - core.drawIcon( - ctx, - defaultChange.downFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); + /** + * 绘制小地图 + * @param {MapDrawInfo} info 地图绘制信息 + * @param {number} scale 地图的绘制比例 + */ + this.drawSmallMap = function ( + ctx, + info, + center, + sx, + sy, + sw, + sh, + scale = defaultValue.scale + ) { + core.clearMap(ctx, sx, sy, sw + 40, sh + 60); + if (core.domStyle.isVertical) { + sy += 50; + sx += 15; + } else { + sy += 60; + sx += 30; + } + core.fillRect(ctx, sx - 10, sy - 10, sw + 20, sh + 20, "#000"); + core.strokeRect(ctx, sx - 10, sy - 10, sw + 20, sh + 20, "#fff", 5); + core.setTextAlign("outerUI", "center"); + core.fillBoldText1( + ctx, + core.status.maps[center].areas, + sx + sw / 2, + sy - 20, + "#FFFFFF", + "#000000", + 6, + "bold 42px Verdana" + ); + const locs = info.locs; + for (const id in locs) { + const loc = locs[id]; + let color = "#000"; + if (!loc[4]) color = "#f0f"; + const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); + const fx = x + sx, + fy = y + sy; + const mapdir = info.mapdir[id]; + const img = mapblock(mapdir); + if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; + core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); + const layer = info.upOrDown[id]; + const min = Math.min(w, h); - // 显示漏怪数量 - if (core.getFlag("showEnemy")) { - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - const c = drawingMap + "_" + nowDepth + "_" + noBorder; - const n = Object.keys(mapCache[c].enemies[id]).length; - color = "#fff"; - if (n > 10) color = "#fc3"; - if (n > 20) color = "#f22"; - ctx.shadowBlur = 0.6 * nowScale; - ctx.shadowColor = "#000"; - if (n > 0) - core.fillText( - ctx, - n, - fx + (w * 3) / 10, - fy + (h * 7) / 10, - color, - 22 + "px normal" - ); - ctx.shadowBlur = 0; - } - } - }; - }, + if (layer?.includes("upFloor")) + core.drawIcon( + ctx, + defaultChange.upFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (layer?.includes("downFloor")) + core.drawIcon( + ctx, + defaultChange.downFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) + ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); + if (id === core.status.floorId) + core.drawImage( + ctx, + "hero.webp", + 0, + 0, + 32, + 19, + fx + min / 4, + fy + (min * 5) / 16, + 32, + 19 + ); + // 显示漏怪数量 + if (core.getFlag("showEnemy")) { + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + const c = drawingMap + "_" + nowDepth + "_" + noBorder; + const n = Object.keys(mapCache[c].enemies[id]).length; + color = "#fff"; + if (n > 10) color = "#fc3"; + if (n > 20) color = "#f22"; + ctx.shadowBlur = 0.6 * nowScale; + ctx.shadowColor = "#000"; + if (n > 0) + core.fillText( + ctx, + n, + fx + (w * 3) / 10, + fy + (h * 7) / 10, + color, + 22 + "px normal" + ); + ctx.shadowBlur = 0; + } + if (!core.hasVisitedFloor(id)) { + core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)"); + core.fillText( + ctx, + "?", + fx + min / 2, + fy + (min * 3) / 4, + "#FFFFFF", + "bold 42px Verdana" + ); + } + } + }; +}, "楼传": function () { - // 在此增加新插件 + // 在此增加新插件 - core.canMoveFloor = function () { - let canmove = false; - core.status.thisMap.blocks.forEach((block) => { - if ( - !block.disable && - (block.event.id == "upFloor" || block.event.id == "downFloor") - ) { - let automaticRoute = core.automaticRoute(block.x, block.y); - if (!core.flags.flyNearStair || automaticRoute.length > 0) { - let loc = automaticRoute.pop(); - loc = automaticRoute.pop(); - if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) { - canmove = true; - } - } - } - }); - return canmove; - }; - ui.prototype._drawViewMaps_drawHint = function () { - core.playSound("打开界面"); - }; + core.canMoveFloor = function () { + let canmove = false; + core.status.thisMap.blocks.forEach((block) => { + if ( + !block.disable && + (block.event.id == "upFloor" || block.event.id == "downFloor") + ) { + let automaticRoute = core.automaticRoute(block.x, block.y); + if (!core.flags.flyNearStair || automaticRoute.length > 0) { + let loc = automaticRoute.pop(); + loc = automaticRoute.pop(); + if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) { + canmove = true; + } + } + } + }); + return canmove; + }; + ui.prototype._drawViewMaps_drawHint = function () { + core.playSound("打开界面"); + }; - ////// 绘制浏览地图界面 ////// - ui.prototype._drawViewMaps = function (index, x, y) { - core.lockControl(); - core.clearMap("data"); - core.status.event.id = "viewMaps"; - this.clearUI(); - //console.log(index) - if (index == null) index = core.floorIds.indexOf(core.status.floorId); - core.animateFrame.tip = null; - core.status.checkBlock.cache = {}; - let data = this._drawViewMaps_buildData(index, x, y); - core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416); - let page = core.status.event.data.index; - let floorId = core.status.event.data.floorId; - core.ui.statusBar._update_map(floorId); - const bfs = core.plugin.bfsSearch(floorId, 1, true); - const mapdir = bfs.mapdir[floorId]; - core.setTextAlign("ui", "center"); - let size = (core.__PIXELS__ * 3) / 4; //312 - const areas = core.getFlag("areas"); + ////// 绘制浏览地图界面 ////// + ui.prototype._drawViewMaps = function (index, x, y) { + core.lockControl(); - let i = areas.findIndex((v) => v.maps.includes(floorId)); - core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444"); - core.strokeRoundRect( - "ui", - 15 - 4, - 15 - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - "当前", - 13 + 20, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); + core.clearMap("data"); + core.status.event.id = "viewMaps"; + this.clearUI(); + //console.log(index) + if (index == null) index = core.floorIds.indexOf(core.status.floorId); + core.animateFrame.tip = null; + core.status.checkBlock.cache = {}; + let data = this._drawViewMaps_buildData(index, x, y); + core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416); + let page = core.status.event.data.index; + let floorId = core.status.event.data.floorId; + core.ui.statusBar._update_map(floorId); + const bfs = core.plugin.bfsSearch(floorId, 1, true); + const mapdir = bfs.mapdir[floorId]; + core.setTextAlign("ui", "center"); + let size = (core.__PIXELS__ * 3) / 4; //312 + const areas = core.getFlag("areas"); - core.fillRoundRect( - "ui", - 15 - 2, - 15 - 2 + 35 + 8 + size + 8 - 54, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 15 - 4 + 35 + 8 + size + 8 - 54, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if ( - !core.status.maps[core.floorIds[page]].canFlyTo || - !core.hasVisitedFloor(core.floorIds[page]) - ) { - core.fillBoldText1( - "ui", - "预览", - 13 + 20, - 17 + 20 + 35 + 8 + size + 8 - 54, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "传送", - 13 + 20, - 17 + 20 + 35 + 8 + size + 8 - 54, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 4 + size - 2 + 45, - 15 - 2 + size - 4 + 45, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 45, - 15 - 4 + size - 4 + 45, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - "离开", - 15 - 4 + size - 4 + 45 + 22, - 15 - 4 + size - 4 + 45 + 26, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); + let i = areas.findIndex((v) => v.maps.includes(floorId)); + core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444"); + core.strokeRoundRect( + "ui", + 15 - 4, + 15 - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + "当前", + 13 + 20, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 15 - 2, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 15 - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("up")) { - core.fillBoldText1( - "ui", - "北▲", - 30 + 145 + 10, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "北▲", - 30 + 145 + 10, - 17 + 20, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 - 2, + 15 - 2 + 35 + 8 + size + 8 - 54, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 15 - 4 + 35 + 8 + size + 8 - 54, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if ( + !core.status.maps[core.floorIds[page]].canFlyTo || + !core.hasVisitedFloor(core.floorIds[page]) + ) { + core.fillBoldText1( + "ui", + "预览", + 13 + 20, + 17 + 20 + 35 + 8 + size + 8 - 54, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "传送", + 13 + 20, + 17 + 20 + 35 + 8 + size + 8 - 54, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 4 + size - 2 + 45, + 15 - 2 + size - 4 + 45, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 45, + 15 - 4 + size - 4 + 45, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + "离开", + 15 - 4 + size - 4 + 45 + 22, + 15 - 4 + size - 4 + 45 + 26, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); - core.fillRoundRect( - "ui", - 15 - 2, - 59 - 2, - 35 + 4, - size + 4 - 58, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 59 - 4, - 35 + 8, - size + 8 - 58, - 4, - "#444444", - 1 - ); - if (mapdir.includes("left")) { - core.fillBoldText1( - "ui", - "西", - 15 + 17, - 25 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "◀", - 15 + 17, - 45 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "西", - 15 + 17, - 25 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "◀", - 15 + 17, - 45 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 15 - 2 + size - 4, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 15 - 4 + size - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("down")) { - core.fillBoldText1( - "ui", - "南▼", - 30 + 145 + 10, - 17 + 20 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "南▼", - 30 + 145 + 10, - 17 + 20 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 15 - 2, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 15 - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("up")) { + core.fillBoldText1( + "ui", + "北▲", + 30 + 145 + 10, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "北▲", + 30 + 145 + 10, + 17 + 20, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 59 - 2, - 35 + 4, - size + 4 - 58, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 59 - 4, - 35 + 8, - size + 8 - 58, - 4, - "#444444", - 1 - ); - if (mapdir.includes("right")) { - core.fillBoldText1( - "ui", - "东", - 15 + 17 + size - 4, - 25 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "▶", - 15 + 17 + size - 4, - 45 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "东", - 15 + 17 + size - 4, - 25 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "▶", - 15 + 17 + size - 4, - 45 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 60 - 2, - 60 - 2, - size - 58 + 4, - size - 58 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 60 - 4, - 60 - 4, - size - 58 + 8, - size - 58 + 8, - 4, - "#444444", - 1 - ); - core.drawThumbnail(floorId, null, { - damage: data.damage, - ctx: "ui", - x: 58, - y: 58, - size: 0.62, - all: data.all, - }); - if ( - !core.status.maps[core.floorIds[page]].canFlyTo || - !core.hasVisitedFloor(core.floorIds[page]) - ) - core.drawImage( - "ui", - "lock.webp", - 0, - 0, - size, - size, - 58, - 58, - size - 8, - size - 8 - ); + core.fillRoundRect( + "ui", + 15 - 2, + 59 - 2, + 35 + 4, + size + 4 - 58, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 59 - 4, + 35 + 8, + size + 8 - 58, + 4, + "#444444", + 1 + ); + if (mapdir.includes("left")) { + core.fillBoldText1( + "ui", + "西", + 15 + 17, + 25 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "◀", + 15 + 17, + 45 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "西", + 15 + 17, + 25 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "◀", + 15 + 17, + 45 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 15 - 2 + size - 4, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 15 - 4 + size - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("down")) { + core.fillBoldText1( + "ui", + "南▼", + 30 + 145 + 10, + 17 + 20 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "南▼", + 30 + 145 + 10, + 17 + 20 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 60 - 2 + size - 4, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 60 - 4 + size - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - core.status.maps[floorId].areas, - 30 + 145 + 10, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillRoundRect( - "ui", - 15 - 2, - 60 - 2 + size - 4, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 60 - 4 + size - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (i === 0) { - core.fillBoldText1( - "ui", - "◀", - 30, - 17 + 65 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "◀", - 30, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 60 - 2 + size - 4, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 60 - 4 + size - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (i === areas.length - 1) { - core.fillBoldText1( - "ui", - "▶", - 30 + 300 + 10, - 17 + 65 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "▶", - 30 + 300 + 10, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 59 - 2, + 35 + 4, + size + 4 - 58, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 59 - 4, + 35 + 8, + size + 8 - 58, + 4, + "#444444", + 1 + ); + if (mapdir.includes("right")) { + core.fillBoldText1( + "ui", + "东", + 15 + 17 + size - 4, + 25 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "▶", + 15 + 17 + size - 4, + 45 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "东", + 15 + 17 + size - 4, + 25 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "▶", + 15 + 17 + size - 4, + 45 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 60 - 2, + 60 - 2, + size - 58 + 4, + size - 58 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 60 - 4, + 60 - 4, + size - 58 + 8, + size - 58 + 8, + 4, + "#444444", + 1 + ); + core.drawThumbnail(floorId, null, { + damage: data.damage, + ctx: "ui", + x: 58, + y: 58, + size: 0.62, + all: data.all, + }); + if ( + !core.status.maps[core.floorIds[page]].canFlyTo || + !core.hasVisitedFloor(core.floorIds[page]) + ) { + /*core.fillRect("ui", 58, + 58, + size - 50, + size - 50, "rgba(0,0,0,0.5)")*/ + core.getContextByName("ui").globalAlpha = 0.7; - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 15 - 2, - 80 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 15 - 4, - 80 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("upFloor")) { - core.fillBoldText1( - "ui", - "上楼", - 30 + 320 + 10, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "上楼", - 30 + 320 + 10, - 17 + 20, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 15 - 2 + size - 4, - 80 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 15 - 4 + size - 4, - 80 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("downFloor")) { - core.fillBoldText1( - "ui", - "下楼", - 30 + 320 + 10, - 17 + 20 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "下楼", - 30 + 320 + 10, - 17 + 20 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.drawImage( + "ui", + "miwu.webp", + 0, + 0, + size, + size, + 58, + 58, + size - 50, + size - 50 + ); + core.getContextByName("ui").globalAlpha = 1; + /*core.fillText("ui", '?', 188, + 278, + "rgba(255,255,255,0.2)", this._buildFont(250, true))*/ + } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 60 - 2 + size - 4, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 60 - 4 + size - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + core.status.maps[floorId].areas, + 30 + 145 + 10, + 17 + 65 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillRoundRect( + "ui", + 15 - 2, + 60 - 2 + size - 4, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 60 - 4 + size - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (i === 0) { + core.fillBoldText1( + "ui", + "◀", + 30, + 17 + 65 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "◀", + 30, + 17 + 65 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 60 - 2 + size - 4, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 60 - 4 + size - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (i === areas.length - 1) { + core.fillBoldText1( + "ui", + "▶", + 30 + 300 + 10, + 17 + 65 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "▶", + 30 + 300 + 10, + 17 + 65 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4 + 35 + 8, - 59 - 2, - 37 + 4, - (size - 58) / 2 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 35 + 8, - 59 - 4, - 37 + 8, - (size - 58) / 2 + 8, - 4, - "#444444", - 1 - ); - const title = core.status.maps[floorId].title; - //const length = title.length - fillTextVertical( - "ui", - title, - 15 - 4 + size - 4 + 45, - 85, - "#FFFFFF", - "#000000", - 18 - ); - //const uictx = main.dom.gameCanvas.ui.getContext('2d') - core.fillRoundRect( - "ui", - 15 - 2 + size - 4 + 35 + 8, - 59 - 2 + (size - 58) / 2 + 8, - 37 + 4, - 119 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 35 + 8, - 59 - 4 + (size - 58) / 2 + 8, - 37 + 8, - 119 + 8, - 4, - "#444444", - 1 - ); - if (core.getFlag("showEnemy")) { - fillTextVertical( - "ui", - "关闭漏怪检测", - 15 - 4 + size - 4 + 45, - 220, - "#FFFFFF", - "#000000", - 18 - ); - } else { - fillTextVertical( - "ui", - "开启漏怪检测", - 15 - 4 + size - 4 + 45, - 220, - "#FFFFFF", - "#000000", - 18 - ); - } + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 15 - 2, + 80 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 15 - 4, + 80 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("upFloor")) { + core.fillBoldText1( + "ui", + "上楼", + 30 + 320 + 10, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "上楼", + 30 + 320 + 10, + 17 + 20, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 15 - 2 + size - 4, + 80 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 15 - 4 + size - 4, + 80 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("downFloor")) { + core.fillBoldText1( + "ui", + "下楼", + 30 + 320 + 10, + 17 + 20 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "下楼", + 30 + 320 + 10, + 17 + 20 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - //uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150) - //fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true)) - }; + core.fillRoundRect( + "ui", + 15 - 2 + size - 4 + 35 + 8, + 59 - 2, + 37 + 4, + (size - 58) / 2 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 35 + 8, + 59 - 4, + 37 + 8, + (size - 58) / 2 + 8, + 4, + "#444444", + 1 + ); + const title = core.status.maps[floorId].title; + //const length = title.length + fillTextVertical( + "ui", + title, + 15 - 4 + size - 4 + 45, + 85, + core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", + "#000000", + 18 + ); + //const uictx = main.dom.gameCanvas.ui.getContext('2d') + core.fillRoundRect( + "ui", + 15 - 2 + size - 4 + 35 + 8, + 59 - 2 + (size - 58) / 2 + 8, + 37 + 4, + 119 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 35 + 8, + 59 - 4 + (size - 58) / 2 + 8, + 37 + 8, + 119 + 8, + 4, + "#444444", + 1 + ); + if (core.getFlag("showEnemy")) { + fillTextVertical( + "ui", + "关闭漏怪检测", + 15 - 4 + size - 4 + 45, + 220, + "#FFFFFF", + "#000000", + 18 + ); + } else { + fillTextVertical( + "ui", + "开启漏怪检测", + 15 - 4 + size - 4 + 45, + 220, + "#FFFFFF", + "#000000", + 18 + ); + } - function fillTextVertical(name, text, x, y, style, boldstyle, fontsize) { - //竖向文字绘制 + //uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150) + //fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true)) + }; - const ctx = core.ui.getContextByName(name); - if (!ctx) return; - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - fontsize *= 3; - const length = text.length; - canvas.width = fontsize * 2; - canvas.height = fontsize * length * 2; - if (style) context.fillStyle = core.arrayToRGBA(style); - if (boldstyle) context.strokeStyle = core.arrayToRGBA(boldstyle); - context.lineWidth = 2; - if (fontsize) context.font = core.ui._buildFont(fontsize, true); - let arrText = text.split(""); + function fillTextVertical(name, text, x, y, style, boldstyle, fontsize) { + //竖向文字绘制 - let arrWidth = arrText.map(function (letter) { - return context.measureText(letter).width; - }); + const ctx = core.ui.getContextByName(name); + if (!ctx) return; + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + fontsize *= 3; + const length = text.length; + canvas.width = fontsize * 2; + canvas.height = fontsize * length * 2; + if (style) context.fillStyle = core.arrayToRGBA(style); + if (boldstyle) context.strokeStyle = core.arrayToRGBA(boldstyle); + context.lineWidth = 2; + if (fontsize) context.font = core.ui._buildFont(fontsize, true); + let arrText = text.split(""); - let align = context.textAlign; + let arrWidth = arrText.map(function (letter) { + return context.measureText(letter).width; + }); - let baseline = context.textBaseline; - let sx = fontsize, - sy = fontsize * length; - if (align == "left") { - sx = sx + Math.max.apply(null, arrWidth) / 2; - } else if (align == "right") { - sx = sx - Math.max.apply(null, arrWidth) / 2; - } + let align = context.textAlign; - if ( - baseline == "bottom" || - baseline == "alphabetic" || - baseline == "ideographic" - ) { - sy = sy - arrWidth[0] / 2; - } else if (baseline == "top" || baseline == "hanging") { - sy = sy + arrWidth[0] / 2; - } + let baseline = context.textBaseline; + let sx = fontsize, + sy = fontsize * length; + if (align == "left") { + sx = sx + Math.max.apply(null, arrWidth) / 2; + } else if (align == "right") { + sx = sx - Math.max.apply(null, arrWidth) / 2; + } - context.textAlign = "center"; + if ( + baseline == "bottom" || + baseline == "alphabetic" || + baseline == "ideographic" + ) { + sy = sy - arrWidth[0] / 2; + } else if (baseline == "top" || baseline == "hanging") { + sy = sy + arrWidth[0] / 2; + } - context.textBaseline = "middle"; - context.lineWidth = 6; + context.textAlign = "center"; - // 开始逐字绘制 + context.textBaseline = "middle"; + context.lineWidth = 6; - arrText.forEach(function (letter, index) { - // 确定下一个字符的纵坐标位置 + // 开始逐字绘制 - context.strokeText(letter, sx, sy); - context.fillText(letter, sx, sy); - // 旋转坐标系还原成初始态 + arrText.forEach(function (letter, index) { + // 确定下一个字符的纵坐标位置 - context.setTransform(1, 0, 0, 1, 0, 0); + context.strokeText(letter, sx, sy); + context.fillText(letter, sx, sy); + // 旋转坐标系还原成初始态 - // 确定下一个字符的纵坐标位置 + context.setTransform(1, 0, 0, 1, 0, 0); - var letterWidth = 54; + // 确定下一个字符的纵坐标位置 - sy = sy + letterWidth; - }); + var letterWidth = 54; - // 水平垂直对齐方式还原 + sy = sy + letterWidth; + }); - context.textAlign = align; + // 水平垂直对齐方式还原 - context.textBaseline = baseline; + context.textAlign = align; - //绘制到目标位置 - ctx.drawImage( - canvas, - x, - y - (fontsize / 3) * length, - canvas.width / 3, - canvas.height / 3 - ); - } + context.textBaseline = baseline; - ////// 点击楼层传送器时的打开操作 ////// - events.prototype.useFly = function (fromUserAction) { - if (core.isReplaying()) return; - if (!core.status.maps[core.status.floorId].canFlyFrom) { - core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); - return; - } - // 从“浏览地图”页面:尝试直接传送到该层 - if (core.status.event.id == "viewMaps") { - if (!core.hasItem("fly")) { - core.playSound("操作失败"); - core.drawTip("你没有" + core.material.items["fly"].name, "fly"); - } else if ( - core.flags.flyNearStair && - !core.nearStair() && - !core.canMoveFloor() - ) { - core.playSound("操作失败"); - core.drawTip( - "无法到达楼梯边使用" + core.material.items["fly"].name, - "fly" - ); - } else { - core.flyTo(core.status.event.data.floorId); - } - return; - } + //绘制到目标位置 + ctx.drawImage( + canvas, + x, + y - (fontsize / 3) * length, + canvas.width / 3, + canvas.height / 3 + ); + } - if (!this._checkStatus("fly", fromUserAction, true)) return; - //if (core.flags.flyNearStair && !core.nearStair()) + ////// 点击楼层传送器时的打开操作 ////// + events.prototype.useFly = function (fromUserAction) { + if (!core.isPlaying()) return; + if (!core.status.maps[core.status.floorId].canFlyFrom) { + core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); + return; + } + // 从“浏览地图”页面:尝试直接传送到该层 + if (core.status.event.id == "viewMaps") { + if (!core.hasItem("fly")) { + core.playSound("操作失败"); + core.drawTip("你没有" + core.material.items["fly"].name, "fly"); + } else if ( + core.flags.flyNearStair && + !core.nearStair() && + !flags.canMoveFloor + ) { + core.playSound("操作失败"); + core.drawTip( + "无法到达楼梯边使用" + core.material.items["fly"].name, + "fly" + ); + } else { + core.flyTo(core.status.event.data.floorId); + core.updateStatusBar(); + } + return; + } - if ( - (core.flags.flyNearStair && !core.nearStair()) || - !core.canMoveFloor() - ) { - core.playSound("操作失败"); - core.drawTip( - "无法到达楼梯边使用" + core.material.items["fly"].name, - "fly" - ); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - return; - } - if (!core.canUseItem("fly")) { - core.playSound("操作失败"); - core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - return; - } - core.playSound("打开界面"); - core.useItem("fly", true); - return; - }; - ////// 系统菜单栏界面时的点击操作 ////// - actions.prototype._clickSettings = function (x, y) { - if (this._out(x)) return; - var choices = core.status.event.ui.choices; - var topIndex = this._getChoicesTopIndex(choices.length); - if (y >= topIndex && y < topIndex + choices.length) { - var selection = y - topIndex; - core.status.event.selection = selection; - switch (selection) { - case 0: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawSwitchs(); - break; - case 1: - // core.playSound('确定'); - core.ui._drawKeyBoard(); - break; - case 2: - // core.playSound('确定'); - core.clearUI(); - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - break; - case 3: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawNotes(); - break; - case 4: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawSyncSave(); - break; - case 5: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawGameInfo(); - break; - case 6: - return core.confirmRestart(); - case 7: - core.playSound("取消"); - core.ui.closePanel(); - break; - } - } - return; - }; - ////// 查看地图界面时的点击操作 ////// - actions.prototype._clickViewMaps = function (x, y, px, py) { - if (core.status.event.data == null) { - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - return; - } - let now = core.floorIds.indexOf(core.status.floorId); - let index = core.status.event.data.index; - let cx = core.status.event.data.x, - cy = core.status.event.data.y; - let floorId = core.floorIds[index], - mw = core.floors[floorId].width, - mh = core.floors[floorId].height; - let perpx = core.__PIXELS__ / 5, - cornerpx = (perpx * 3) / 4; - const bfs = core.plugin.bfsSearch(floorId, 1, true); - const mapdir = bfs.mapdir[floorId]; - const res = bfs.res; - const formto = {}; - for (let from in res) { - const to = res[from]; - const [fromfloorId, fromsx, fromsy, dir] = from.split("_"); - const [tofloorId, tosx, tosy] = to.split("_"); - if (!formto[fromfloorId]) formto[fromfloorId] = {}; - if (!formto[fromfloorId][dir]) formto[fromfloorId][dir] = tofloorId; - } - const areas = core.getFlag("areas"); - let i = areas.findIndex((v) => v.maps.includes(floorId)); + if (!this._checkStatus("fly", fromUserAction, true)) return; + //if (core.flags.flyNearStair && !core.nearStair()) - if (px >= 11 && px <= 54 && py >= 11 && py <= 54) { - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - } else if (px >= 362 && px <= 407 && py >= 191 && py <= 318) { - flags.showEnemy = !flags.showEnemy; - core.ui._drawViewMaps(index); - } else if (px >= 364 && px <= 407 && py >= 364 && py <= 407) { - core.clearMap("data"); - core.playSound("取消"); - core.ui.closePanel(); - core.getItemDetail(); - core.redrawMap(); - core.ui.statusBar._update_map(); - return; - } else if (px >= 55 && px <= 317 && py >= 11 && py <= 54) { - if (mapdir.includes("up")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].up)); - } else if (px >= 55 && px <= 317 && py >= 319 && py <= 362) { - if (mapdir.includes("down")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].down)); - } else if (px >= 11 && px <= 54 && py >= 55 && py <= 317) { - if (mapdir.includes("left")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].left)); - } else if (px >= 319 && px <= 362 && py >= 55 && py <= 317) { - if (mapdir.includes("right")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].right)); - } else if (px >= 319 && px <= 407 && py >= 11 && py <= 54) { - if (mapdir.includes("upFloor")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].upFloor)); - } else if (px >= 319 && px <= 407 && py >= 319 && py <= 362) { - if (mapdir.includes("downFloor")) - core.ui._drawViewMaps( - core.floorIds.indexOf(formto[floorId].downFloor) - ); - } else if ( - px >= 55 && - px <= 317 && - py >= 55 && - py <= 317 && - !core.isReplaying() - ) { - core.useFly(false); - return; - } else if (px >= 11 && px <= 54 && py >= 364 && py <= 407) { - if (i > 0) { - i -= 1; - core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); - } - } else if (px >= 319 && px <= 362 && py >= 364 && py <= 407) { - if (i < areas.length - 1) { - i += 1; - core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); - } - } - }; - const replayAction_fly = function (action) { - //楼层传送的录像操作 - if (action.indexOf("fly:") != 0) return false; - var floorId = action.substring(4); - var toIndex = core.floorIds.indexOf(floorId); - if ( - !core.canUseItem("fly") || - (core.flags.flyNearStair && !core.nearStair()) - ) - return false; - core.ui._drawViewMaps(toIndex); - if (core.status.replay.speed == 24) { - if (!core.flyTo(floorId, core.replay)) - core.control._replay_error(action); - return true; - } - setTimeout(function () { - if (!core.flyTo(floorId, core.replay)) - core.control._replay_error(action); - }, core.control.__replay_getTimeout()); - return true; - }; - core.registerReplayAction("fly", replayAction_fly); - ////// 查看地图界面时,放开某个键的操作 ////// - actions.prototype._keyUpViewMaps = function (keycode) { - if (core.status.event.data == null) { - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - return; - } - var floorId = core.floorIds[core.status.event.data.index]; + if ( + (core.flags.flyNearStair && !core.nearStair()) || + !flags.canMoveFloor + ) { + core.playSound("操作失败"); + core.drawTip( + "无法到达楼梯边使用" + core.material.items["fly"].name, + "fly" + ); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + return; + } + if (!core.canUseItem("fly")) { + core.playSound("操作失败"); + core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + return; + } + core.playSound("打开界面"); + core.useItem("fly", true); + core.updateStatusBar(); + return; + }; + ////// 系统菜单栏界面时的点击操作 ////// + actions.prototype._clickSettings = function (x, y) { + if (this._out(x)) return; + var choices = core.status.event.ui.choices; + var topIndex = this._getChoicesTopIndex(choices.length); + if (y >= topIndex && y < topIndex + choices.length) { + var selection = y - topIndex; + core.status.event.selection = selection; + switch (selection) { + case 0: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawSwitchs(); + break; + case 1: + // core.playSound('确定'); + core.ui._drawKeyBoard(); + break; + case 2: + // core.playSound('确定'); + core.clearUI(); + core.useItem("fly"); + break; + case 3: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawNotes(); + break; + case 4: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawSyncSave(); + break; + case 5: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawGameInfo(); + break; + case 6: + return core.confirmRestart(); + case 7: + core.playSound("取消"); + core.ui.closePanel(); + break; + } + } + return; + }; + ////// 查看地图界面时的点击操作 ////// + actions.prototype._clickViewMaps = function (x, y, px, py) { + if (core.status.event.data == null) { + core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + return; + } + let now = core.floorIds.indexOf(core.status.floorId); + let index = core.status.event.data.index; + let cx = core.status.event.data.x, + cy = core.status.event.data.y; + let floorId = core.floorIds[index], + mw = core.floors[floorId].width, + mh = core.floors[floorId].height; + let perpx = core.__PIXELS__ / 5, + cornerpx = (perpx * 3) / 4; + const bfs = core.plugin.bfsSearch(floorId, 1, true); + const mapdir = bfs.mapdir[floorId]; + const res = bfs.res; + const formto = {}; + for (let from in res) { + const to = res[from]; + const [fromfloorId, fromsx, fromsy, dir] = from.split("_"); + const [tofloorId, tosx, tosy] = to.split("_"); + if (!formto[fromfloorId]) formto[fromfloorId] = {}; + if (!formto[fromfloorId][dir]) formto[fromfloorId][dir] = tofloorId; + } + const areas = core.getFlag("areas"); + let i = areas.findIndex((v) => v.maps.includes(floorId)); - if (keycode == 27 || keycode == 71) { - core.clearMap("data"); - core.playSound("取消"); - core.ui.closePanel(); - core.getItemDetail(); - core.redrawMap(); - core.ui.statusBar._update_map(); - return; - } - if (keycode == 88) { - core.openBook(true); - return; - } - if (keycode == 86) { - core.status.event.data.damage = !core.status.event.data.damage; - core.playSound("光标移动"); - core.ui._drawViewMaps(core.status.event.data); - return; - } - if (keycode == 66) { - core.openBook(false); - return; - } - if ( - (keycode == 13 || keycode == 32 || keycode == 67) && - !core.isReplaying() - ) { - core.useFly(false); - return; - } - return; - }; - actions.prototype._keyDownViewMaps = function (keycode) { - if (core.status.event.data == null) return; + if (px >= 11 && px <= 54 && py >= 11 && py <= 54) { + core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + } else if (px >= 362 && px <= 407 && py >= 191 && py <= 318) { + flags.showEnemy = !flags.showEnemy; + core.ui._drawViewMaps(index); + } else if (px >= 364 && px <= 407 && py >= 364 && py <= 407) { + core.clearMap("data"); + core.playSound("取消"); + core.ui.closePanel(); + core.getItemDetail(); + core.redrawMap(); + core.updateStatusBar(); + core.ui.statusBar._update_map(); + return; + } else if (px >= 55 && px <= 317 && py >= 11 && py <= 54) { + if (mapdir.includes("up")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].up)); + } else if (px >= 55 && px <= 317 && py >= 319 && py <= 362) { + if (mapdir.includes("down")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].down)); + } else if (px >= 11 && px <= 54 && py >= 55 && py <= 317) { + if (mapdir.includes("left")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].left)); + } else if (px >= 319 && px <= 362 && py >= 55 && py <= 317) { + if (mapdir.includes("right")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].right)); + } else if (px >= 319 && px <= 407 && py >= 11 && py <= 54) { + if (mapdir.includes("upFloor")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].upFloor)); + } else if (px >= 319 && px <= 407 && py >= 319 && py <= 362) { + if (mapdir.includes("downFloor")) + core.ui._drawViewMaps( + core.floorIds.indexOf(formto[floorId].downFloor) + ); + } else if ( + px >= 55 && + px <= 317 && + py >= 55 && + py <= 317 && + core.isPlaying() + ) { + core.useFly(false); + return; + } else if (px >= 11 && px <= 54 && py >= 364 && py <= 407) { + if (i > 0) { + i -= 1; + core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); + } + } else if (px >= 319 && px <= 362 && py >= 364 && py <= 407) { + if (i < areas.length - 1) { + i += 1; + core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); + } + } + }; + const replayAction_fly = function (action) { + //楼层传送的录像操作 + if (action.indexOf("fly:") != 0) return false; + var floorId = action.substring(4); + var toIndex = core.floorIds.indexOf(floorId); + if ( + !core.canUseItem("fly") || + (core.flags.flyNearStair && !core.nearStair() && !flags.canMoveFloor) + ) + return false; + core.ui._drawViewMaps(toIndex); + if (core.status.replay.speed == 24) { + if (!core.flyTo(floorId, core.replay)) + core.control._replay_error(action); + return true; + } + setTimeout(function () { + if (!core.flyTo(floorId, core.replay)) + core.control._replay_error(action); + }, core.control.__replay_getTimeout()); + return true; + }; + core.registerReplayAction("fly", replayAction_fly); + ////// 查看地图界面时,放开某个键的操作 ////// - var floorId = core.floorIds[core.status.event.data.index], - mh = core.floors[floorId].height; + actions.prototype._keyUpViewMaps = function (keycode) { + if (core.status.event.data == null) { + core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + return; + } + var floorId = core.floorIds[core.status.event.data.index]; - if (keycode == 39) this._clickViewMaps(9, 1, 330, 250); - if (keycode == 37) this._clickViewMaps(9, 8, 25, 200); - if (keycode == 40) this._clickViewMaps(9, 6, 250, 330); - if (keycode == 38) this._clickViewMaps(9, 3, 200, 25); - if (keycode == 34) this._clickViewMaps(9, 3, 350, 330); - if (keycode == 33) this._clickViewMaps(9, 3, 350, 25); - return; - }; + if (keycode == 27 || keycode == 71) { + core.clearMap("data"); + core.playSound("取消"); + core.ui.closePanel(); + core.getItemDetail(); + core.redrawMap(); + core.ui.statusBar._update_map(); + core.updateStatusBar(); + return; + } - actions.prototype._sys_onmousewheel = function (direct) { - // 向下滚动是 -1 ,向上是 1 + if (keycode == 86) { + core.status.event.data.damage = !core.status.event.data.damage; + core.playSound("光标移动"); + core.ui._drawViewMaps(core.status.event.data); + return; + } + if (keycode == 66 || keycode == 88) { + if (core.isReplaying()) { + core.control._replay_book(); + } else { + core.openBook(false); + } + return; + } + if ( + (keycode == 13 || keycode == 32 || keycode == 67) && + !core.isReplaying() + ) { + core.useFly(false); + return; + } + return; + }; + actions.prototype._keyDownViewMaps = function (keycode) { + if (core.status.event.data == null) return; - if (this._checkReplaying()) { - // 滚轮控制速度 - if (direct == 1) core.speedUpReplay(); - if (direct == -1) core.speedDownReplay(); - return; - } + var floorId = core.floorIds[core.status.event.data.index], + mh = core.floors[floorId].height; - // 楼层飞行器 - if (core.status.lockControl && core.status.event.id == "fly") { - if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1)); - if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1)); - return; - } + if (keycode == 39) this._clickViewMaps(9, 1, 330, 250); + if (keycode == 37) this._clickViewMaps(9, 8, 25, 200); + if (keycode == 40) this._clickViewMaps(9, 6, 250, 330); + if (keycode == 38) this._clickViewMaps(9, 3, 200, 25); + if (keycode == 34) this._clickViewMaps(9, 3, 350, 330); + if (keycode == 33) this._clickViewMaps(9, 3, 350, 25); + return; + }; - // 怪物手册 - if (core.status.lockControl && core.status.event.id == "book") { - var pageinfo = core.ui._drawBook_pageinfo(); - if (direct == 1) - core.ui.drawBook(core.status.event.data - pageinfo.per_page); - if (direct == -1) - core.ui.drawBook(core.status.event.data + pageinfo.per_page); - return; - } + actions.prototype._sys_onmousewheel = function (direct) { + // 向下滚动是 -1 ,向上是 1 - // 存读档 - if ( - core.status.lockControl && - (core.status.event.id == "save" || core.status.event.id == "load") - ) { - var index = - core.status.event.data.page * 10 + core.status.event.data.offset; - if (direct == 1) core.ui._drawSLPanel(index - 10); - if (direct == -1) core.ui._drawSLPanel(index + 10); - return; - } + if (this._checkReplaying()) { + // 滚轮控制速度 + if (direct == 1) core.speedUpReplay(); + if (direct == -1) core.speedDownReplay(); + return; + } - // 浏览地图 - if (core.status.lockControl && core.status.event.id == "viewMaps") { - let floorId = core.floorIds[core.status.event.data.index]; - if (!flags.__visited__[floorId]) floorId = core.status.floorId; - const visit = Object.keys(flags.__visited__); - let index = visit.indexOf(floorId); - if (direct == 1) { - if (index > 0) - core.ui._drawViewMaps(core.floorIds.indexOf(visit[index - 1])); - } - if (direct == -1) { - if (index < visit.length - 1) - core.ui._drawViewMaps(core.floorIds.indexOf(visit[index + 1])); - } - return; - } + // 楼层飞行器 + if (core.status.lockControl && core.status.event.id == "fly") { + if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1)); + if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1)); + return; + } - // wait事件 - if ( - core.status.lockControl && - core.status.event.id == "action" && - core.status.event.data.type == "wait" - ) { - var timeout = - Math.max(0, core.status.event.timeout - new Date().getTime()) || 0; - core.setFlag("type", 0); - var keycode = direct == 1 ? 33 : 34; - core.setFlag("keycode", keycode); - core.setFlag("timeout", timeout); - var executed = core.events.__action_wait_afterGet( - core.status.event.data.current - ); - if (executed || !core.status.event.data.current.forceChild) { - core.status.route.push("input:" + (1e8 * timeout + keycode)); - clearTimeout(core.status.event.interval); - delete core.status.event.timeout; - core.doAction(); - } - return; - } - }; - core.registerAction( - "onmousewheel", - "_sys_onmousewheel", - actions.prototype._sys_onmousewheel, - 0 - ); - }, + // 怪物手册 + if (core.status.lockControl && core.status.event.id == "book") { + var pageinfo = core.ui._drawBook_pageinfo(); + if (direct == 1) + core.ui.drawBook(core.status.event.data - pageinfo.per_page); + if (direct == -1) + core.ui.drawBook(core.status.event.data + pageinfo.per_page); + return; + } + + // 存读档 + if ( + core.status.lockControl && + (core.status.event.id == "save" || core.status.event.id == "load") + ) { + var index = + core.status.event.data.page * 10 + core.status.event.data.offset; + if (direct == 1) core.ui._drawSLPanel(index - 10); + if (direct == -1) core.ui._drawSLPanel(index + 10); + return; + } + + // 浏览地图 + if (core.status.lockControl && core.status.event.id == "viewMaps") { + let floorId = core.floorIds[core.status.event.data.index]; + if (!flags.__visited__[floorId]) floorId = core.status.floorId; + const visit = Object.keys(flags.__visited__); + let index = visit.indexOf(floorId); + if (direct == 1) { + if (index > 0) + core.ui._drawViewMaps(core.floorIds.indexOf(visit[index - 1])); + } + if (direct == -1) { + if (index < visit.length - 1) + core.ui._drawViewMaps(core.floorIds.indexOf(visit[index + 1])); + } + return; + } + + // wait事件 + if ( + core.status.lockControl && + core.status.event.id == "action" && + core.status.event.data.type == "wait" + ) { + var timeout = + Math.max(0, core.status.event.timeout - new Date().getTime()) || 0; + core.setFlag("type", 0); + var keycode = direct == 1 ? 33 : 34; + core.setFlag("keycode", keycode); + core.setFlag("timeout", timeout); + var executed = core.events.__action_wait_afterGet( + core.status.event.data.current + ); + if (executed || !core.status.event.data.current.forceChild) { + core.status.route.push("input:" + (1e8 * timeout + keycode)); + clearTimeout(core.status.event.interval); + delete core.status.event.timeout; + core.doAction(); + } + return; + } + }; + core.registerAction( + "onmousewheel", + "_sys_onmousewheel", + actions.prototype._sys_onmousewheel, + 0 + ); +}, "CG回廊": function () { - // 在此增加新插件 - const CGUI = document.createElement("canvas"); //CGui画布设置 - CGUI.style.position = "absolute"; - CGUI.style.zIndex = 300; - CGUI.style.display = "none"; - CGUI.id = "CGUI"; - main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); - CGUI.style.top = "50%"; - CGUI.style.left = "50%"; - CGUI.style.transform = "translate(-50%,-50%)"; - const ctx = CGUI.getContext("2d"); - main.dom.CGUI = CGUI; - let page = 0; //初始页面 - let show = false; //展示状态 - CGUI.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.CG.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + // 在此增加新插件 + const CGUI = document.createElement("canvas"); //CGui画布设置 + CGUI.style.position = "absolute"; + CGUI.style.zIndex = 300; + CGUI.style.display = "none"; + CGUI.id = "CGUI"; + main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); + CGUI.style.top = "50%"; + CGUI.style.left = "50%"; + CGUI.style.transform = "translate(-50%,-50%)"; + const ctx = CGUI.getContext("2d"); + main.dom.CGUI = CGUI; + let page = 0; //初始页面 + let show = false; //展示状态 + CGUI.onclick = function (e) { + try { + e.preventDefault(); + if (core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.CG.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - class CG { - constructor() { - this.cgs; - //cg列表 - this.UIMx = [ - //空位用‘none’填充,当前ui至多4列6行 - [ - ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], - ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], - ], - [ - ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], - ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], - ], - [ - ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], - ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], - ], - [ - ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], - ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], - ], - [ - ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], - ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], - ], - [ - ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], - ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], - ], - [ - ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], - ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], - ], - [ - ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], - ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], - ], - [ - ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], - ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], - ], - ]; - } + class CG { + constructor() { + this.cgs; + //cg列表 + this.UIMx = [ + //空位用‘none’填充,当前ui3*2 + [ + ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], + ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], + ], + [ + ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], + ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], + ], + [ + ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], + ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], + ], + [ + ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], + ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], + ], + [ + ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], + ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], + ], + [ + ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], + ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], + ], + [ + ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], + ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], + ], + [ + ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], + ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], + ], + [ + ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], + ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], + ], + ]; + } - //更新 - update() { - this.background(); - this.drawUI(); - } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - CGUI.width = 1248; - CGUI.height = 2028; - } else { - CGUI.width = 2028; - CGUI.height = 1248; - } - core.setTextAlign(ctx, "center"); - } - onclick(px, py) { - //点击 + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + CGUI.width = 1248; + CGUI.height = 2028; + } else { + CGUI.width = 2028; + CGUI.height = 1248; + } + core.setTextAlign(ctx, "center"); + } + onclick(px, py) { + //点击 - if (show) { - show = !show; - core.clearMap(ctx); - this.update(); - return; - } - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const backbox = makeBox([15, 35], [210, 90]); - if (inRect(pos, backbox)) { - //离开按钮是一致的,其余的记区分横竖屏 - CGUI.style.display = "none"; - core.clearMap(ctx); - core.restart(); - return; - } - if (core.domStyle.isVertical) { - //竖屏 - const pageupbox = makeBox([200, 1830], [200, 100]); - const pagedownbox = makeBox([900, 1830], [200, 100]); + if (show) { + show = !show; + core.clearMap(ctx); + this.update(); + return; + } + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const backbox = makeBox([15, 35], [210, 90]); + if (inRect(pos, backbox)) { + //离开按钮是一致的,其余的记区分横竖屏 + CGUI.style.display = "none"; + core.clearMap(ctx); + core.restart(); + return; + } + if (core.domStyle.isVertical) { + //竖屏 + const pageupbox = makeBox([200, 1830], [200, 100]); + const pagedownbox = makeBox([900, 1830], [200, 100]); - const imagebox0 = makeBox([50, 200], [560, 420]); - const imagebox1 = makeBox([50, 750], [560, 420]); - const imagebox2 = makeBox([50, 1300], [560, 420]); + const imagebox0 = makeBox([50, 200], [560, 420]); + const imagebox1 = makeBox([50, 750], [560, 420]); + const imagebox2 = makeBox([50, 1300], [560, 420]); - const imagebox3 = makeBox([650, 200], [560, 420]); - const imagebox4 = makeBox([650, 750], [560, 420]); - const imagebox5 = makeBox([650, 1300], [560, 420]); - if (inRect(pos, pagedownbox)) { - //2代表当前最大页数-1 - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } - } else { - const pageupbox = makeBox([200, 1110], [200, 100]); - const pagedownbox = makeBox([1600, 1110], [200, 100]); - const imagebox0 = makeBox([75, 150], [600, 450]); - const imagebox1 = makeBox([725, 150], [600, 450]); - const imagebox2 = makeBox([1300, 150], [600, 450]); - const imagebox3 = makeBox([75, 650], [600, 450]); - const imagebox4 = makeBox([725, 650], [600, 450]); - const imagebox5 = makeBox([1375, 650], [600, 450]); - if (inRect(pos, pagedownbox)) { - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } - } - } - drawUI() { - //绘制页面 - core.clearMap(CGUI); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + const imagebox3 = makeBox([650, 200], [560, 420]); + const imagebox4 = makeBox([650, 750], [560, 420]); + const imagebox5 = makeBox([650, 1300], [560, 420]); + if (inRect(pos, pagedownbox)) { + //2代表当前最大页数-1 + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } + } else { + const pageupbox = makeBox([200, 1110], [200, 100]); + const pagedownbox = makeBox([1600, 1110], [200, 100]); + const imagebox0 = makeBox([75, 150], [600, 450]); + const imagebox1 = makeBox([725, 150], [600, 450]); + const imagebox2 = makeBox([1300, 150], [600, 450]); + const imagebox3 = makeBox([75, 650], [600, 450]); + const imagebox4 = makeBox([725, 650], [600, 450]); + const imagebox5 = makeBox([1375, 650], [600, 450]); + if (inRect(pos, pagedownbox)) { + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } + } + } + drawUI() { + //绘制页面 + core.clearMap(CGUI); + const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 + const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 - if (core.domStyle.isVertical) { - //竖屏 + if (core.domStyle.isVertical) { + //竖屏 - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 100, - 110, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 100, + 110, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - "上一页", - 300, - 1900, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + "上一页", + 300, + 1900, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 650, - 1900, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1000, - 1900, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 650, + 1900, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1000, + 1900, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + // 添加向上翻页和向下翻页的按钮 - // 添加3*2个4:3的画框,及图片 - for (let i = 0; i < 3; i++) { - for (let j = 0; j < 2; j++) { - const img = core.material.images.images[this.UIMx[page][j][i]]; - core.strokeRect( - ctx, - 50 + j * 600, - 200 + i * 550, - 560, - 420, - "#444444", - 5 - ); - if (this.cgs.includes(this.UIMx[page][j][i])) { - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } - } - } - } else { - //横屏 - core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 - //core.drawWindowSkin('winskin1.png', ctx, 0, 0, 2028, 1248); - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 添加3*2个4:3的画框,及图片 + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 2; j++) { + const img = core.material.images.images[this.UIMx[page][j][i]]; + core.strokeRect( + ctx, + 50 + j * 600, + 200 + i * 550, + 560, + 420, + "#444444", + 5 + ); + if (this.cgs.includes(this.UIMx[page][j][i])) { + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } + } + } + } else { + //横屏 + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 - // 添加向上翻页和向下翻页的按钮 - core.fillBoldText1( - ctx, - "上一页", - 300, - 1180, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 1000, - 1180, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1700, - 1180, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + "上一页", + 300, + 1180, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加3*2个4:3的画框 - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 3; j++) { - core.strokeRect( - ctx, - 75 + j * 650, - 150 + i * 500, - 600, - 450, - "#444444", - 2 - ); - if (this.cgs.includes(this.UIMx[page][i][j])) { - const img = core.material.images.images[this.UIMx[page][i][j]]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } - } - } - } - } - } - this.setcgs = function (img) { - const a = core.getLocalStorage("cgs", []); - if (img) { - if (!a.includes(img)) a.push(img); - core.setLocalStorage("cgs", a); - } else core.setLocalStorage("cgs"); - }; - core.ui.CG = new CG(); - main.dom.CGMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - main.core.control.checkBgm(); - page = 0; - main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); - CGUI.style.display = "block"; - main.core.ui.CG.update(); - }; - }, + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 1000, + 1180, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1700, + 1180, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + // 添加3*2个4:3的画框 + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + core.strokeRect( + ctx, + 75 + j * 650, + 150 + i * 500, + 600, + 450, + "#444444", + 2 + ); + if (this.cgs.includes(this.UIMx[page][i][j])) { + const img = core.material.images.images[this.UIMx[page][i][j]]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } + } + } + } + } + } + this.setcgs = function (img) { + const a = core.getLocalStorage("cgs", []); + if (img) { + if (!a.includes(img)) a.push(img); + core.setLocalStorage("cgs", a); + } else core.setLocalStorage("cgs"); + }; + core.ui.CG = new CG(); + main.dom.CGMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + main.core.control.checkBgm(); + page = 0; + main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); + CGUI.style.display = "block"; + main.core.ui.CG.update(); + }; +}, "光标设置": function () { // 在此增加新插件 this.changeMouse = function ( @@ -14528,1536 +15385,4107 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "信息弹出": function () { - // 在此增加新插件 - /* 弹出显示某个内容 - * 使用方法:core.addPop(px, py, value, color, boldColor, left, jump, time, show, font, speed) - * 参数说明: - * px & py: number 弹出位置 - * value: string 显示内容 - * color: string 填充颜色 - * boldColor: string 描边颜色 - */ + // 在此增加新插件 + /* 弹出显示某个内容 + * 使用方法:core.addPop(px, py, value, color, boldColor, left, jump, time, show, font, speed) + * 参数说明: + * px & py: number 弹出位置 + * value: string 显示内容 + * color: string 填充颜色 + * boldColor: string 描边颜色 + */ - // 默认字体 - var fontD = "16px Verdana"; - // 默认颜色 - var colorD = "red"; - // 默认描边颜色 - var boldColorD = "black"; + // 默认字体 + var fontD = "16px Verdana"; + // 默认颜色 + var colorD = "red"; + // 默认描边颜色 + var boldColorD = "black"; - /** 血量弹出 */ - function pop() { - var ctx = core.getContextByName("pop"); - if (!ctx) - ctx = core.createCanvas( - "pop", - 0, - 0, - core.__PIXELS__, - core.__PIXELS__, - 90 - ); - ctx.canvas.classList.add("gameCanvas", "anti-aliasing"); - core.clearMap(ctx); - core.setTextAlign("pop", "left"); - var list = core.status.pop || []; - var count = 0; - list.forEach(function (one) { - // 由frame计算出dy - var dy = 6 - one.frame * 0.2; - var dx = one.speed; - if (one.jump) { - one.py -= dy; - } - if (!one.left) { - one.px += dx; - } else { - one.px -= dx; - } - one.frame++; - // 绘制 - if (one.frame >= one.time) - core.setAlpha(ctx, 1 - (one.frame - one.time) / one.show); - else core.setAlpha(ctx, 1); - core.fillBoldText1( - ctx, - one.value, - one.px, - one.py, - one.color || "red", - one.boldColor || "black", - 2, - one.font - ); - if (one.frame >= one.time + one.show) count++; - }); - if (count > 0) list.splice(0, count); - } - let now = 0; - if (!main.replayChecking) - core.registerAnimationFrame("pop", true, (temptime) => { - if (temptime - now > 1000 / 60) { - now = temptime; - pop(); - } - }); + /** 血量弹出 */ + function pop() { + var ctx = core.getContextByName("pop"); + if (!ctx) + ctx = core.createCanvas( + "pop", + 0, + 0, + core.__PIXELS__, + core.__PIXELS__, + 90 + ); + ctx.canvas.classList.add("gameCanvas", "anti-aliasing"); + core.clearMap(ctx); + core.setTextAlign("pop", "left"); + var list = core.status.pop || []; + var count = 0; + list.forEach(function (one) { + // 由frame计算出dy + var dy = 6 - one.frame * 0.2; + var dx = one.speed; + if (one.jump) { + one.py -= dy; + } + if (!one.left) { + one.px += dx; + } else { + one.px -= dx; + } + one.frame++; + // 绘制 + if (one.frame >= one.time) + core.setAlpha(ctx, 1 - (one.frame - one.time) / one.show); + else core.setAlpha(ctx, 1); + core.fillBoldText1( + ctx, + one.value, + one.px, + one.py, + one.color || "red", + one.boldColor || "black", + 2, + one.font + ); + if (one.frame >= one.time + one.show) count++; + }); + if (count > 0) list.splice(0, count); + } + if (!main.replayChecking) + core.registerAnimationFrame("pop", true, (temptime) => { + pop(); - /** 添加弹出内容 */ - this.addPop = function ( - value, - px, - py, - color, - boldColor, - left, - jump, - time, - show, - font, - speed - ) { - var data = { - px: px, - py: py, - value: value, - color: color || colorD, - boldColor: boldColor || boldColorD, - frame: 0, - left: left || false, - jump: jump || false, - time: time || 60, - show: show || 30, - font: font || fontD, - speed: speed || 1, - }; - if (!core.status.pop) core.status.pop = [data]; - else core.status.pop.push(data); - }; - }, + }); + + /** 添加弹出内容 */ + this.addPop = function ( + value, + px, + py, + color, + boldColor, + left, + jump, + time, + show, + font, + speed + ) { + var data = { + px: px, + py: py, + value: value, + color: color || colorD, + boldColor: boldColor || boldColorD, + frame: 0, + left: left || false, + jump: jump || false, + time: time || 60, + show: show || 30, + font: font || fontD, + speed: speed || 1, + }; + if (!core.status.pop) core.status.pop = [data]; + else core.status.pop.push(data); + }; +}, "warning": function () { - // 在此增加新插件 - // 默认音效名 - var defaultSound = "jingbao.opus"; - // 默认字体名 - var defaultFont = "Verdana"; + // 默认音效名 + var defaultSound = "jingbao.mp3"; + // 默认字体名 + var defaultFont = "Verdana"; - var timeout; - /** warning提示 - * @param {number} x 横坐标 - * @param {number} y 纵坐标 - * @param {string} text 显示的文字 - */ - this.drawWarning = function (x, y, size, text, text2, warning) { - if (timeout) return; - x = x ?? 6; - y = y ?? 6; - text = text || "boss"; - text += "</br>"; - for (var i = 0; i < 10; i++) text += " "; - text += text2; - // 生成文字 - var elements = document.querySelectorAll(".gameCanvas"); - var t = document.createElement("p"); - t.innerHTML = text; - t.style.position = "absolute"; - t.style.fontSize = size * core.domStyle.scale + "px"; - t.style.left = -(300 * core.domStyle.scale) + "px"; - t.style.top = parseInt(elements[0].style.height) / 2 - 100 + "px"; - t.style.zIndex = "300"; - t.style.color = "#f11"; - t.style.fontFamily = defaultFont; - t.style.overflow = "none"; - t.style.width = "100%"; - t.classList.add("warning"); - core.dom.gameDraw.appendChild(t); - setTimeout(function () { - t.style.left = 416 * core.domStyle.scale + "px"; - }, 50); - // 计算偏移量 - var px = ((6 - x) / 12) * 50; - var py = ((6 - y) / 12) * 50; - // 修改画布的scale和transform - elements.forEach(function (v) { - if (v instanceof HTMLCanvasElement) { - v.style.transform = "scale(2)translate(" + px + "%, " + py + "%)"; - } - }); - if (!warning) core.playSound(defaultSound); - // 拉回镜头 - timeout = setTimeout(function () { - timeout = setTimeout(function () { - timeout = void 0; - core.dom.gameDraw.removeChild(t); - }, 1500); - elements.forEach(function (v) { - if (v instanceof HTMLCanvasElement) { - v.style.transform = "none"; - } - }); - }, 1600); - }; - }, - "立体声音效": function () { - // 在此增加新插件 - // 音效双声道播放 - var can = true; - if (!AudioContext) { - console.warn("该浏览器不支持AudioContext,无法播放立体声"); - can = false; - } - if (can) var ac = new AudioContext(); - var datas = {}; - - /** 播放立体声 参考:https://developer.mozilla.org/zh-CN/docs/Web/API/BaseAudioContext/createChannelSplitter - * @param {number} name 音效名 - * @param {number} left 左声道音量,默认为1 - * @param {number} right 右声道音量,默认为1 - * @param {boolean} split 音效为双声道,请填true,为单声道,请填false或不填 - * @returns 该音效的唯一id - */ - this.playStereo = function (name, left, right, split) { - if (!can) return core.playSound(name); - var sound = core.getMappedName(name); - if ( - main.mode != "play" || - !core.musicStatus.soundStatus || - !core.material.sounds[sound] - ) - return; - if (!core.status.stereo) core.status.stereo = {}; - var buffer = core.material.sounds[sound]; - var source = ac.createBufferSource(); - source.buffer = buffer; - var splitter = ac.createChannelSplitter(2); - source.connect(splitter); - var merger = ac.createChannelMerger(2); - - /* 大致流程 - gain(L) - / \ - source ---- splitter merger ---- destination - \ / - gain(R) - */ - - var L = ac.createGain(); - var R = ac.createGain(); - L.gain.value = left * core.musicStatus.userVolume; - R.gain.value = right * core.musicStatus.userVolume; - splitter.connect(L, 0, 0); - if (!split) splitter.connect(R, 0, 0); - else splitter.connect(R, 1, 0); - - var id = setTimeout(null); - core.status.stereo[id] = { source: source, L: L, R: R }; - - L.connect(merger, 0, 0); - R.connect(merger, 0, 1); - - var dest = ac.destination; - - source.onended = function () { - delete datas[id]; - source = void 0; - }; - - merger.connect(dest); - source.start(0); - return id; - }; - - /** 移动声源(渐变调整左右声道音量) - * @param {number} id 为playStereo返回的id - * @param {number} left 要渐变到的左声道音量 - * @param {number} right 要渐变到的右声道音量 - * @param {number} time 渐变时间 - */ - this.moveStereo = function (id, left, right, time) { - if (!can) return; - if (main.mode != "play" || !core.musicStatus.soundStatus) return; - var stereo = core.status.stereo[id]; - datas[id] = { - time: time, - curr: 0, - dL: - ((left - stereo.L.gain.value) / time) * - 10 * - core.musicStatus.userVolume, - dR: - ((right - stereo.R.gain.value) / time) * - 10 * - core.musicStatus.userVolume, - }; - var interval = setInterval(function () { - var data = datas[id]; - if (!data) return clearInterval(interval); - data.curr += 10; - if (data.curr >= data.time) { - clearInterval(interval); - datas[id] = void 0; - } - stereo.L.gain.value += data.dL; - stereo.R.gain.value += data.dR; - }, 10); - }; - }, + var timeout; + /** warning提示 + * @param {number} x 横坐标 + * @param {number} y 纵坐标 + * @param {string} text 显示的文字 + */ + this.drawWarning = function ( + x, + y, + text, + text2, + warning, + large = 2, + size = 36 + ) { + if (timeout) return; + x = x ?? 6; + y = y ?? 6; + text = text || "boss"; + text += "</br>"; + for (var i = 0; i < 10; i++) text += " "; + text += text2; + // 生成文字 + var elements = document.querySelectorAll(".gameCanvas"); + var t = document.createElement("p"); + t.innerHTML = text; + t.style.position = "absolute"; + t.style.fontSize = size * core.domStyle.scale + "px"; + t.style.left = -(300 * core.domStyle.scale) + "px"; + t.style.top = parseInt(elements[0].style.height) / 2 - 100 + "px"; + t.style.zIndex = "300"; + t.style.color = "#f11"; + t.style.fontFamily = defaultFont; + t.style.overflow = "none"; + t.style.width = "100%"; + t.classList.add("warning"); + core.dom.gameDraw.appendChild(t); + setTimeout(function () { + t.style.left = 416 * core.domStyle.scale + "px"; + }, 50); + // 计算偏移量 + var px = ((6 - x) / 12) * (100 - 100 / large + 2); + var py = ((6 - y) / 12) * (100 - 100 / large + 2); + // 修改画布的scale和transform + let time = 0; + let s = 1; + let sx = 0; + let sy = 0; + let cishu = 1; + core.registerAnimationFrame("big", true, function (temptime) { + if (temptime - time > 10) { + time = temptime; + s += (large - 1) / 30; + sx += px / 30; + sy += py / 30; + elements.forEach(function (v) { + if (v instanceof HTMLCanvasElement) { + v.style.transform = + "scale(" + s + ")translate(" + sx + "%, " + sy + "%)"; + } + }); + cishu++; + if (cishu == 30) { + core.unregisterAnimationFrame("big"); + } + } + }); + if (!warning) core.playSound(defaultSound); + // 拉回镜头 + timeout = setTimeout(function () { + // timeout = setTimeout(function () { + // timeout = void 0; + // core.dom.gameDraw.removeChild(t); + // }, 1500); + let time2 = 0; + let s2 = large - (large - 1) / 30; + let sx2 = px; + let sy2 = py; + let cishu2 = 1; + core.registerAnimationFrame("small", true, function (temptime) { + if (temptime - time2 > 10) { + time2 = temptime; + s2 -= (large - 1) / 30; + sx2 -= px / 30; + sy2 -= py / 30; + elements.forEach(function (v) { + if (v instanceof HTMLCanvasElement) { + v.style.transform = + "scale(" + s2 + ")translate(" + sx2 + "%, " + sy2 + "%)"; + } + }); + cishu2++; + if (cishu2 == 30) { + core.unregisterAnimationFrame("small"); + elements.forEach(function (v) { + if (v instanceof HTMLCanvasElement) { + v.style.transform = "none"; + } + }); + } + } + }); + // elements.forEach(function (v) { + // if (v instanceof HTMLCanvasElement) { + // v.style.transform = "none"; + // } + // }); + }, 1600); + }; +}, "滑动转场": function () { - // 在此增加新插件 - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - const dirData = { - //方向坐标 - up: [-1, 0], - down: [1, 0], - left: [0, -1], - right: [0, 1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let allChangeEntries = Object.entries(defaultChange); - const move = document.createElement("canvas"); - const speed = 12; - let modedata = 0; + // 在此增加新插件 + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + const dirData = { + //方向坐标 + up: [-1, 0], + down: [1, 0], + left: [0, -1], + right: [0, 1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let allChangeEntries = Object.entries(defaultChange); + const move = document.createElement("canvas"); + const speed = 12; + let modedata = 0; - move.width = 1248; - move.height = 1248; + move.width = 1248; + move.height = 1248; - const ctx = move.getContext("2d"); + const ctx = move.getContext("2d"); - events.prototype.changeFloor = function ( - floorId, - stair, - heroLoc, - time, - callback - ) { - let block = core.getBlock(hero.loc.x, hero.loc.y); - var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time); + events.prototype.changeFloor = function ( + floorId, + stair, + heroLoc, + time, + callback + ) { + let block = core.getBlock(hero.loc.x, hero.loc.y); + var info = this._changeFloor_getInfo(floorId, stair, heroLoc, time); - if (info == null) { - if (callback) callback(); - return; - } - floorId = info.floorId; - info.locked = core.status.lockControl; + if (info == null) { + if (callback) callback(); + return; + } + floorId = info.floorId; + info.locked = core.status.lockControl; - core.dom.floorNameLabel.innerText = core.status.maps[floorId].title; - core.lockControl(); - core.stopAutomaticRoute(); - core.clearContinueAutomaticRoute(); - core.status.replay.animate = true; - clearInterval(core.interval.onDownInterval); - core.interval.onDownInterval = "tmp"; + core.dom.floorNameLabel.innerText = core.status.maps[floorId].title; + core.lockControl(); + core.stopAutomaticRoute(); + core.clearContinueAutomaticRoute(); + core.status.replay.animate = true; + clearInterval(core.interval.onDownInterval); + delete core.animateFrame.tip; + core.interval.onDownInterval = "tmp"; - this._changeFloor_beforeChange(info, block, callback); - }; - events.prototype._changeFloor_beforeChange = function ( - info, - block, - callback - ) { - this._changeFloor_playSound(); - if ( - block && - block?.event && - !main.replayChecking && - !core.isReplaying() - ) { - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - if (block?.event?.trigger === "changeFloor" && dirEntries) { - const toFloorId = block.event.data.floorId; - const dir = dirEntries[0]; + this._changeFloor_beforeChange(info, block, callback); + }; + events.prototype._changeFloor_beforeChange = function ( + info, + block, + callback + ) { + this._changeFloor_playSound(); + if ( + block && + block?.event && + !main.replayChecking && + !core.isReplaying() && + !core.hasFlag("__isFlying__") && !core.hasFlag("__fromLoad__") + ) { + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + if (block?.event?.trigger === "changeFloor" && dirEntries) { + const toFloorId = block.event.data.floorId; + const dir = dirEntries[0]; - const data = core.ui._drawViewMaps_buildData( - core.floorIds.indexOf(core.status.floorId) - ); - const dataTo = core.ui._drawViewMaps_buildData( - core.floorIds.indexOf(toFloorId) - ); - const v = dirData[dir][1], // 水平数值 - h = dirData[dir][0]; //竖直数值 - ctx.clearRect(0, 0, 1248, 1248); - core.drawThumbnail(core.status.floorId, null, { - damage: data.damage, - ctx: ctx, - x: 416, - y: 416, - size: 1, - all: data.all, - }); - if (dir !== "upFloor" && dir !== "downFloor") { - core.drawThumbnail(toFloorId, null, { - damage: dataTo.damage, - ctx: ctx, - x: 416 + 416 * v, - y: 416 + 416 * h, - size: 1, - all: dataTo.all, - }); + const data = core.ui._drawViewMaps_buildData( + core.floorIds.indexOf(core.status.floorId) + ); + const dataTo = core.ui._drawViewMaps_buildData( + core.floorIds.indexOf(toFloorId) + ); + const v = dirData[dir][1], // 水平数值 + h = dirData[dir][0]; //竖直数值 + ctx.clearRect(0, 0, 1248, 1248); + core.drawThumbnail(core.status.floorId, null, { + damage: data.damage, + ctx: ctx, + x: 416, + y: 416, + size: 1, + all: data.all, + }); + if (dir !== "upFloor" && dir !== "downFloor") { + core.drawThumbnail(toFloorId, null, { + damage: dataTo.damage, + ctx: ctx, + x: 416 + 416 * v, + y: 416 + 416 * h, + size: 1, + all: dataTo.all, + }); - var _run = function () { - var cb = function () { - modedata = 0; - core.clearUI(); - core.clearMap("data"); - core.events._changeFloor_changing(info, callback); - }; + var _run = function () { + var cb = function () { + modedata = 0; + core.clearUI(); + core.clearMap("data"); + core.events._changeFloor_changing(info, callback); + }; - var animate = window.setInterval( - function () { - if (modedata >= 416) { - delete core.animateFrame.asyncId[animate]; - clearInterval(animate); - cb(); - } else { - core.clearUI(); - core.clearMap("data"); + var animate = window.setInterval( + function () { + if (modedata >= 416) { + delete core.animateFrame.asyncId[animate]; + clearInterval(animate); + cb(); + } else { + core.clearUI(); + core.clearMap("data"); - core.canvas.data.drawImage( - move, - 416 + modedata * v, - 416 + modedata * h, - 416, - 416, - 0, - 0, - 416, - 416 - ); - let status = "leftFoot"; + core.canvas.data.drawImage( + move, + 416 + modedata * v, + 416 + modedata * h, + 416, + 416, + 0, + 0, + 416, + 416 + ); + let status = "leftFoot"; - if (modedata > 208) { - status = "rightFoot"; - } - const img = core.material.images.hero; - const heroIconArr = core.material.icons.hero; - const width = core.material.icons.hero.width || 32; - const height = core.material.icons.hero.height; - const heroIcon = heroIconArr[dir]; + if (modedata > 208) { + status = "rightFoot"; + } + const img = core.material.images.hero; + const heroIconArr = core.material.icons.hero; + const width = core.material.icons.hero.width || 32; + const height = core.material.icons.hero.height; + const heroIcon = heroIconArr[dir]; - core.canvas.data.drawImage( - img, - (heroIcon[status] % 4) * width, - heroIcon.loc * height, - width, - height, - core.status.hero.loc.x * 32 - - core.bigmap.offsetX - - (modedata - (modedata * 32) / 416) * v, - core.status.hero.loc.y * 32 - - 16 - - (modedata - (modedata * 32) / 416) * h, - width, - height - ); - modedata += speed; - clearInterval(animate); - delete core.animateFrame.asyncId[animate]; - _run(); - } - }, - core.status.replay.speed == 24 - ? 1 - : 10 / core.status.replay.speed - ); + core.canvas.data.drawImage( + img, + (heroIcon[status] % 4) * width, + heroIcon.loc * height, + width, + height, + core.status.hero.loc.x * 32 - + core.bigmap.offsetX - + (modedata - (modedata * 32) / 416) * v, + core.status.hero.loc.y * 32 - + 16 - + (modedata - (modedata * 32) / 416) * h, + width, + height + ); + modedata += speed; + clearInterval(animate); + delete core.animateFrame.asyncId[animate]; + _run(); + } + }, + core.status.replay.speed == 24 ? + 1 : + 10 / core.status.replay.speed + ); - core.animateFrame.lastAsyncId = animate; - core.animateFrame.asyncId[animate] = cb; - }; - _run(); - return; - } - } - } - // 需要 setTimeout 执行,不然会出错 - window.setTimeout(function () { - if (info.time == 0) core.events._changeFloor_changing(info, callback); - else - core.showWithAnimate( - core.dom.floorMsgGroup, - info.time / 2, - function () { - core.events._changeFloor_changing(info, callback); - } - ); - }, 25); - }; - }, + core.animateFrame.lastAsyncId = animate; + core.animateFrame.asyncId[animate] = cb; + }; + _run(); + return; + } + } + } + // 需要 setTimeout 执行,不然会出错 + window.setTimeout(function () { + if (info.time == 0) core.events._changeFloor_changing(info, callback); + else + core.showWithAnimate( + core.dom.floorMsgGroup, + info.time / 2, + function () { + core.events._changeFloor_changing(info, callback); + } + ); + }, 25); + }; +}, "剧情cg": function () { - // 在此增加新插件 - const cg = document.createElement("canvas"); //cg画布设置 - cg.style.position = "absolute"; - cg.style.zIndex = 300; - cg.style.display = "none"; - cg.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", cg); - cg.style.top = "50%"; - cg.style.left = "50%"; - cg.style.transform = "translate(-50%,-50%)"; - const ctx = cg.getContext("2d"); - main.dom.cgText = cg; + // 在此增加新插件 + // 在此增加新插件 + const cg = document.createElement("canvas"); //cg画布设置 + cg.style.position = "absolute"; + cg.style.zIndex = 320; + cg.style.display = "none"; + cg.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", cg); + cg.style.top = "50%"; + cg.style.left = "50%"; + cg.style.transform = "translate(-50%,-50%)"; + const ctx = cg.getContext("2d"); + main.dom.cgText = cg; + const logcanvas = document.createElement("canvas"); //cg画布设置 + logcanvas.style.position = "absolute"; + logcanvas.style.zIndex = 321; + logcanvas.style.display = "none"; + logcanvas.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); + logcanvas.style.top = "50%"; + logcanvas.style.left = "50%"; + logcanvas.style.transform = "translate(-50%,-50%)"; + const logctx = logcanvas.getContext("2d"); + main.dom.logcanvas = logcanvas; + logcanvas.onmouseup = function (e) { + //鼠标抬起 - cg.onmouseup = function (e) { - //鼠标抬起 + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - try { - e.stopPropagation(); - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + logcanvas.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + logcanvas.ontouchend = function (e) { + //触摸抬起 - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.onmousedown = function (e) { - //鼠标按下 - try { - e.stopPropagation(); - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.ontouchend = function (e) { - //触摸抬起 + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - try { - e.preventDefault(); - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + core.insertAction(data); + core.doAction(); + } + } catch (ee) {} + }; + logcanvas.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.onmouseup = function (e) { + //鼠标抬起 - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.ontouchstart = function (e) { - //触摸按下 - try { - e.preventDefault(); - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - let auto = false; - class cgText { - constructor() { - //绘制需要的变量 - this.image = ""; - this.head = { name: "face_050445.webp", px: -300 }; - this.bodyList = [ - { name: "tati_050145a.webp", px: 100, filter: false }, - { name: "tati_120124.webp", px: 1100, filter: true }, - ]; - this.name = ""; - this.text = ""; - this.time = 0; - this.WindowSkin = false; - this.sound = ""; - this.beforeSound = 0; - this.wait = 200; - this.memory = false; - } - click(px, py) { - //点击效果 + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const savebox = makeBox([1700, 1100], [192, 96]); - const saveboxVertical = makeBox([52, 1700], [96, 192]); - const skipbox = makeBox([1400, 1100], [192, 96]); - const skipboxVertical = makeBox([52, 1400], [96, 192]); - const autobox = makeBox([1700, 900], [192, 96]); - const autoboxVertical = makeBox([256, 1700], [96, 192]); - if ( - (core.domStyle.isVertical && - inRect(pos, skipboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, skipbox)) - ) { - auto = false; - let time = 0; - core.stopSound(this.beforeSound); - core.registerAnimationFrame("skip", true, (timestamp) => { - if (timestamp > time + 50) { - time = timestamp; - if ( - core.status.event.id == "action" && - core.status.event.data.type == "cgtext" - ) { - core.setFlag("skip", true); - main.dom.cgText.style.display = "none"; - core.doAction(); - } - } - }); - } else if ( - (core.domStyle.isVertical && - inRect(pos, autoboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, autobox)) - ) { - auto = !auto; + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.ontouchend = function (e) { + //触摸抬起 - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = data.text.replace(/(\\(z))(\[.*?])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - } else if ( - (core.domStyle.isVertical && - inRect(pos, saveboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, savebox)) - ) { - //存档 - auto = false; - if (core.status.event.animateUI) return; - if (core.status.event.interval != null) return; - const current = core.clone(core.status.event.data.current); - current.showAll = true; - current.time = 0; - current.sound = ""; - current.text = current.text.replace(/(\\(z))(\[.*?])?/g, ""); //去除当前事件所有打字机效果 - cg.style.display = "none"; - const data = [{ type: "callSave" }, current]; //插入存档事件 - core.insertAction(data); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.doAction(); - } else if (!core.status.event.data) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } else { - // 正在淡入淡出的话不执行 - if (core.status.event.animateUI) return; - auto = false; + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + let auto = false; - // 打字机效果显示全部文字 - if (core.status.event.interval != null) { - const data = core.clone(core.status.event.data?.current); - data.showAll = true; - data.time = 0; - data.text = data.text.replace(/(\\(z))(\[.*?])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - return; - } else { - core.stopSound(this.beforeSound); - } + class cgText { + constructor() { + this.nobg = false; + //绘制需要的变量 + this.image = ""; + this.head = { name: "face_050445.webp", px: -300 }; + this.bodyList = [ + { name: "tati_050145a.webp", px: 100, filter: false }, + { name: "tati_120124.webp", px: 1100, filter: true }, + ]; + this.name = ""; + this.text = ""; + this.time = 0; + this.WindowSkin = false; + this.sound = ""; + this.beforeSound = 0; + this.wait = 1000; + this.memory = false; + this.textList = ""; + this.page = 1; + this.overpage = 1; + this.log = false; + this.index = 0; + } + click(px, py) { + //点击效果 - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - } + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const savebox = makeBox([1700, 1100], [192, 96]); + const saveboxVertical = makeBox([52, 1700], [96, 192]); + const skipbox = makeBox([1700, 1000], [192, 96]); + const skipboxVertical = makeBox([152, 1700], [96, 192]); + const autobox = makeBox([1700, 900], [192, 96]); + const autoboxVertical = makeBox([252, 1700], [96, 192]); + const textbox = makeBox([1700, 800], [192, 96]); + const textboxVertical = makeBox([352, 1700], [96, 192]); + const backbox = makeBox([15, 35], [210, 90]); + const backboxVertical = makeBox([1123, 15], [90, 210]); + const pageupbox = makeBox([300, 1130], [200, 100]); + const pageupboxVertical = makeBox([18, 300], [100, 200]); + const pagedownbox = makeBox([1500, 1130], [200, 100]); + const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + const soundbox = makeBox([550, 150], [100, 900]); + const soundboxVertical = makeBox([198, 550], [900, 100]); + if (this.log) { + if ( + (core.domStyle.isVertical && inRect(pos, backboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, backbox)) + ) { + core.clearMap(logctx); + core.stopSound(); + main.dom.logcanvas.style.display = "none"; + this.log = false; + } else if ( + (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pageupbox)) + ) { + core.clearMap(logctx); + if (this.page > 1) this.page--; + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pagedownbox)) + ) { + core.clearMap(logctx); + if (this.page < this.overpage) this.page++; + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && inRect(pos, soundboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, soundbox)) + ) { + if (core.domStyle.isVertical) { + const sound = + core.plugin[this.textList][ + (this.page - 1) * 6 + + Math.min(Math.floor((px - 198) / 150), 5) + ][2]; + core.stopSound(); + core.playSound(sound); + } else { + const sound = + core.plugin[this.textList][ + (this.page - 1) * 6 + + Math.min(Math.floor((py - 150) / 150), 5) + ][2]; + core.stopSound(); + core.playSound(sound); + } + } + } else { + if ( + (core.domStyle.isVertical && + inRect(pos, skipboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, skipbox)) + ) { + auto = false; + let time = 0; + core.stopSound(this.beforeSound); + core.registerAnimationFrame("skip", true, (timestamp) => { + if (timestamp > time + 50) { + time = timestamp; + if ( + core.status.event.id == "action" && + core.status.event.data.type == "cgtext" + ) { + core.setFlag("skip", true); + main.dom.cgText.style.display = "none"; + core.doAction(); + } + } + }); + } else if ( + (core.domStyle.isVertical && + inRect(pos, textboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, textbox)) + ) { + auto = false; + this.log = true; + this.overpage = Math.floor(this.index / 6) + 1; + this.page = this.overpage; + logcanvas.style.display = "block"; + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && + inRect(pos, autoboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, autobox)) + ) { + auto = !auto; - drawTextContent(ctx, content, config) { - //绘制多行文字并执行打字机效果 + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + } else if ( + (core.domStyle.isVertical && + inRect(pos, saveboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, savebox)) + ) { + //存档 + auto = false; + if (core.status.event.animateUI) return; + if (core.status.event.interval != null) return; + const current = core.clone(core.status.event.data.current); + current.showAll = true; + current.time = 0; + current.sound = ""; + current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 + cg.style.display = "none"; + core.setFlag("_cgText", true) + const data = [{ type: "callSave" }, { "type": "setValue", "name": "flag:_cgText", "value": "false" }, current]; //插入存档事件 + core.insertAction(data); - ctx = core.getContextByName(ctx); - // 设置默认配置项 - var textAttribute = - core.status.textAttribute || core.initStatus.textAttribute; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - config = core.clone(config || {}); - config.left = config.left || 0; - config.right = - config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); - config.top = config.top || 0; - config.color = core.arrayToRGBA(config.color || textAttribute.text); - if (config.bold == null) config.bold = textAttribute.bold; - config.italic = config.italic || false; - config.align = config.align || textAttribute.align || "left"; - config.fontSize = config.fontSize || textAttribute.textfont; - config.lineHeight = config.lineHeight || config.fontSize * 1.3; - config.defaultFont = config.font = config.font || globalAttribute.font; - config.time = config.time || 0; - config.letterSpacing = - config.letterSpacing == null - ? textAttribute.letterSpacing || 0 - : config.letterSpacing; + core.doAction(); + } else if (!core.status.event.data) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } else { + // 正在淡入淡出的话不执行 + if (core.status.event.animateUI) return; + auto = false; - config.index = 0; - config.currcolor = config.color; - config.currfont = config.fontSize; - config.lineMargin = Math.max( - Math.round(config.fontSize / 4), - config.lineHeight - config.fontSize - ); - config.topMargin = parseInt(config.lineMargin / 2); - config.lineMaxHeight = config.lineMargin + config.fontSize; - config.offsetX = 0; - config.offsetY = 0; - config.line = 0; - config.blocks = []; - config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); + // 打字机效果显示全部文字 + if (core.status.event.interval != null) { + const data = core.clone(core.status.event.data?.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + return; + } else { + core.stopSound(this.beforeSound); + } - // 创建一个新的临时画布 - var tempCtx = document.createElement("canvas").getContext("2d"); - if (config.isHD && ctx) { - core.maps._setHDCanvasSize( - tempCtx, - ctx.canvas.width, - ctx.canvas.height - ); - } else { - tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; - tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; - } + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + } + } - tempCtx.textBaseline = "top"; - tempCtx.font = core.ui._buildFont( - config.fontSize, - config.bold, - config.italic, - config.font - ); - tempCtx.fillStyle = config.color; - config = this._drawTextContent_draw(ctx, tempCtx, content, config); - return config; - } - _drawTextContent_draw(ctx, tempCtx, content, config) { - // Step 1: 绘制到tempCtx上,并记录下图块信息 - while (core.ui._drawTextContent_next(tempCtx, content, config)); + drawTextContent(ctx, content, config) { + //绘制多行文字并执行打字机效果 - if (ctx == null) return config; + ctx = core.getContextByName(ctx); + // 设置默认配置项 + var textAttribute = + core.status.textAttribute || core.initStatus.textAttribute; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + config = core.clone(config || {}); + config.left = config.left || 0; + config.right = + config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); + config.top = config.top || 0; + config.color = core.arrayToRGBA(config.color || textAttribute.text); + if (config.bold == null) config.bold = textAttribute.bold; + config.italic = config.italic || false; + config.align = config.align || textAttribute.align || "left"; + config.fontSize = config.fontSize || textAttribute.textfont; + config.lineHeight = config.lineHeight || config.fontSize * 1.3; + config.defaultFont = config.font = config.font || globalAttribute.font; + config.time = config.time || 0; + config.letterSpacing = + config.letterSpacing == null ? + textAttribute.letterSpacing || 0 : + config.letterSpacing; - // Step 2: 从tempCtx绘制到画布上 - config.index = 0; - var _drawNext = function () { - if (config.index >= config.blocks.length) return false; - var block = config.blocks[config.index++]; - if (block != null) { - // It works, why? - const scale = config.isHD - ? devicePixelRatio * core.domStyle.scale - : 1; - ctx.restore(); - ctx.save(); //保存设置 - if (core.domStyle.isVertical) { - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } - ctx.drawImage( - tempCtx.canvas, - block.left * scale, - block.top * scale, - block.width * scale, - block.height * scale, - config.left + block.left + block.marginLeft, - config.top + block.top + block.marginTop, - block.width, - block.height - ); - ctx.restore(); - } - return true; - }; + config.index = 0; + config.currcolor = config.color; + config.currfont = config.fontSize; + config.lineMargin = Math.max( + Math.round(config.fontSize / 4), + config.lineHeight - config.fontSize + ); + config.topMargin = parseInt(config.lineMargin / 2); + config.lineMaxHeight = config.lineMargin + config.fontSize; + config.offsetX = 0; + config.offsetY = 0; + config.line = 0; + config.blocks = []; + config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); - if (config.time == 0) { - while (_drawNext()); - if ( - (auto && !this.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - } else { - clearInterval(core.status.event.interval); - core.status.event.interval = setInterval(function () { - if (!_drawNext()) { - clearInterval(core.status.event.interval); - core.status.event.interval = null; - if ( - (auto && !this.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - }, config.time); - } + // 创建一个新的临时画布 + var tempCtx = document.createElement("canvas").getContext("2d"); + if (config.isHD && ctx) { + core.maps._setHDCanvasSize( + tempCtx, + ctx.canvas.width, + ctx.canvas.height + ); + } else { + tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; + tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; + } - return config; - } + tempCtx.textBaseline = "top"; + tempCtx.font = core.ui._buildFont( + config.fontSize, + config.bold, + config.italic, + config.font + ); + tempCtx.fillStyle = config.color; + config = this._drawTextContent_draw(ctx, tempCtx, content, config); + return config; + } + _drawTextContent_draw(ctx, tempCtx, content, config) { + // Step 1: 绘制到tempCtx上,并记录下图块信息 + while (core.ui._drawTextContent_next(tempCtx, content, config)); - update() { - this.background(); - } - background() { - const img = core.material.images.images?.[this.image]; + if (ctx == null) return config; - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; - } + // Step 2: 从tempCtx绘制到画布上 + config.index = 0; + var _drawNext = function () { + if (config.index >= config.blocks.length) return false; + var block = config.blocks[config.index++]; + if (block != null) { + // It works, why? + const scale = config.isHD ? + devicePixelRatio * core.domStyle.scale : + 1; + ctx.restore(); + ctx.save(); //保存设置 + if (core.domStyle.isVertical) { + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } + ctx.drawImage( + tempCtx.canvas, + block.left * scale, + block.top * scale, + block.width * scale, + block.height * scale, + config.left + block.left + block.marginLeft, + config.top + block.top + block.marginTop, + block.width, + block.height + ); + ctx.restore(); + } + return true; + }; - if (img) { - //绘制背景 - if (this.memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 2028, 1248); - } - this.bodyList.forEach((v) => { - //绘制立绘 - const body = core.material.images.images?.[v.name]; - if (v.filter) ctx.filter = "brightness(50%)"; - if (body) { - if (!v.w && !v.h && !v.scale) v.scale = 1.7; - if (!v.w && !v.h) { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - body.height * v.scale, - body.width * v.scale, - body.height * v.scale - ); - } else { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - (v.h ?? body.height), - v.w ?? body.width, - v.h ?? body.height - ); - } - } - ctx.filter = "none"; - }); - if (core.isPlaying() && !this.WindowSkin) - core.drawWindowSkin("winskin.webp", ctx, 30, 802, 1968, 416); //绘制对话框 - const head = core.material.images.images?.[this.head.name]; - if (head) { - //绘制头像 - ctx.drawImage( - head, - 0, - 0, - head.width, - head.height, - this.head.px, - 1248 - head.height * 2, - head.width * 2, - head.height * 2 - ); - } - if (core.isPlaying() && !this.WindowSkin) { - core.drawWindowSkin("winskin.webp", ctx, 1700, 1100, 192, 96); - core.fillBoldText1( - ctx, - "存 档", - 1736, - 1166, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin("winskin.webp", ctx, 1400, 1100, 192, 96); - core.fillBoldText1( - ctx, - "▶▶", - 1456, - 1166, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin("winskin.webp", ctx, 1700, 900, 192, 96); - let autoText = "AUTO"; - if (auto) autoText = "STOP"; - core.fillBoldText1( - ctx, - autoText, - 1722, - 966, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - } - if (this.name) - core.fillBoldText1( - ctx, - `【${this.name}】`, - 500, - 880, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); //绘制名字 - if ( - this.sound && - core.material.sounds[this.sound] && - !core.getFlag("skip", false) && - core.musicStatus.soundStatus - ) { - this.beforeSound = core.playSound(this.sound, null, () => { - if ( - this.sound && - auto && - !this.WindowSkin && - core.musicStatus.soundStatus - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - }); - } - if (this.text && !core.getFlag("skip", false)) { - //绘制对话 - this.drawTextContent(ctx, this.text, { - left: 500, - top: 950, - bold: true, - color: "#FFFFFF", - align: "left", - fontSize: 48, - time: this.time || 0, - font: "Verdana", - maxWidth: 1000, - }); - } + if (config.time == 0) { + while (_drawNext()); - ctx.restore(); - } - } - core.ui.cgText = new cgText(); - }, + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + } else { + clearInterval(core.status.event.interval); + core.status.event.interval = setInterval(function () { + if (!_drawNext()) { + clearInterval(core.status.event.interval); + core.status.event.interval = null; + + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + }, config.time); + } + + return config; + } + + update() { + this.background() + if (this.log) this.logdraw(this.page); + } + logdraw(page) { + if (core.domStyle.isVertical) { + logctx.canvas.width = 1248; + logctx.canvas.height = 2028; + logctx.save(); //保存设置 + logctx.translate(1248, 0); //重新定位右上角为基准 + logctx.rotate(Math.PI / 2); //旋转90度 + } else { + logctx.canvas.width = 2028; + logctx.canvas.height = 1248; + } + core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); + core.setTextAlign(logctx, "center"); + core.fillBoldText1( + logctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, 150); + logctx.lineTo(1928, 150); + + logctx.stroke(); + let posy = 150; + const indexList = this.textList; + core.setTextAlign(logctx, "left"); + for ( + let i = (page - 1) * 6; i <= Math.min(this.index, page * 6 - 1); i++ + ) { + const text = core.plugin[this.textList][i][1].replaceAll( + /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, + "" + ); //取消打字机 + const name = core.plugin[this.textList][i][0] ? + "【" + core.plugin[this.textList][i][0] + "】" : + ""; + const sound = core.plugin[this.textList][i][2]; + if (name) { + core.fillBoldText1( + logctx, + name, + 150, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + if (sound) core.drawImage(logctx, "sound.webp", 550, posy + 30); + if (text.length < 30) { + core.fillBoldText1( + logctx, + text, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text1 = text.slice(0, 30); + core.fillBoldText1( + logctx, + text1, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + if (text.length > 60) { + let text2 = text.slice(30, 60); + let text3 = text.slice(60); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + core.fillBoldText1( + logctx, + text3, + 650, + posy + 150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text2 = text.slice(30); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + } + + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, posy); + logctx.lineTo(1928, posy); + logctx.stroke(); + + posy += 160; + } + logctx.beginPath(); + logctx.moveTo(100, 1120); + logctx.lineTo(1928, 1120); + logctx.moveTo(100, 1110); + logctx.lineTo(1928, 1110); + logctx.stroke(); + core.fillBoldText1( + logctx, + "上一页", + 300, + 1200, + page === 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + logctx, + page + "/" + this.overpage, + 1000, + 1200, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + logctx, + "下一页", + 1500, + 1200, + page === this.overpage ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + } + + background() { + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + + this.bodyList.forEach((v) => { + //绘制立绘 + const body = core.material.images.images?.[v.name]; + if (v.filter) ctx.filter = "brightness(50%)"; + if (body) { + if (!v.w && !v.h && !v.scale) v.scale = 1.7; + if (!v.w && !v.h) { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - body.height * v.scale, + body.width * v.scale, + body.height * v.scale + ); + } else { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - (v.h ?? body.height), + v.w ?? body.width, + v.h ?? body.height + ); + } + } + ctx.filter = "none"; + }); + if (core.isPlaying() && !this.WindowSkin) + core.drawWindowSkin( + "winskin.webp", + ctx, + 30, + 780, + 1968, + 436, + null, + null, + null, + 3 + ); //绘制对话框 + const head = core.material.images.images?.[this.head.name]; + if (head) { + //绘制头像 + ctx.drawImage( + head, + 0, + 0, + head.width, + head.height, + this.head.px, + 1248 - head.height * 2.2, + head.width * 2.2, + head.height * 2.2 + ); + } + if (core.isPlaying() && !this.WindowSkin) { + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 800, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "记 录", + 1736, + 866, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1100, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "存 档", + 1736, + 1166, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1000, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "▶▶", + 1756, + 1066, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 900, + 192, + 96, + null, + null, + null, + 3 + ); + let autoText = "AUTO"; + if (auto) autoText = "STOP"; + core.fillBoldText1( + ctx, + autoText, + 1722, + 966, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + } + if (this.name) + core.fillBoldText1( + ctx, + `【${this.name}】`, + 550, + 880, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); //绘制名字 + + if ( + this.sound && + core.sounds && + !core.getFlag("skip", false) && + core.musicStatus.soundStatus + ) { + this.beforeSound = core.playSound(this.sound, null, () => { + if ( + this.sound && + auto && + !this.WindowSkin && + core.musicStatus.soundStatus + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, this.wait); + } + }); + } + if (this.text && !core.getFlag("skip", false)) { + //绘制对话 + this.drawTextContent(ctx, this.text, { + left: 550, + top: 950, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: this.time || 0, + font: "Verdana", + maxWidth: 1000, + }); + } + + ctx.restore(); + } + } + core.ui.cgText = new cgText(); +}, "旁白": function () { - // 在此增加新插件 - const over = document.createElement("canvas"); //over画布设置 - over.style.position = "absolute"; - over.style.zIndex = 310; - over.style.display = "none"; - over.id = "over"; - main.dom.gameGroup.insertAdjacentElement("afterend", over); - over.style.top = "50%"; - over.style.left = "50%"; - over.style.transform = "translate(-50%,-50%)"; - const ctx = over.getContext("2d"); - main.dom.over = over; + // 在此增加新插件 + const over = document.createElement("canvas"); //over画布设置 + over.style.position = "absolute"; + over.style.zIndex = 310; + over.style.display = "none"; + over.id = "over"; + main.dom.gameGroup.insertAdjacentElement("afterend", over); + over.style.top = "50%"; + over.style.left = "50%"; + over.style.transform = "translate(-50%,-50%)"; + const ctx1 = over.getContext("2d"); + main.dom.over = over; - this.over = function ( - image, - memory, - time = 100, - hidetime = 30, - sound = "", - textColor = "#FFFFFF", - boldColor = "#000000", - font = "bold 48px Verdana", - text = "" - ) { - if (!core.isPlaying()) { - return core.doAction(); - } - const img = core.material.images.images?.[image]; - over.style.display = "block"; - let frame = 0; - let sod = 0; - let now = 0; - core.registerAnimationFrame("over", true, (timestamp) => { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(ctx); - if (core.domStyle.isVertical) { - ctx.canvas.width = 416 * 3; - ctx.canvas.height = 676 * 3; - ctx.save(); //保存设置 - ctx.translate(416 * 3, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 676 * 3; - ctx.canvas.height = 416 * 3; - } - ctx.globalAlpha = 1; - if (img) { - //绘制背景 - if (memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 676 * 3, 416 * 3); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 676 * 3, 416 * 3); - } - frame++; - // 绘制 - if (frame <= hidetime) - core.setAlpha(ctx, 1 - (hidetime - frame) / hidetime); - if (frame > hidetime && frame <= hidetime + time) ctx.globalAlpha = 1; - if (frame > hidetime + time && frame <= hidetime * 2 + time) - core.setAlpha(ctx, 1 - (frame - hidetime - time) / hidetime); - const lisen = - sound && - core.material.sounds[sound] && - core.musicStatus.soundStatus; - if (frame == hidetime && lisen) { - sod = core.playSound(sound); - } - if (frame > hidetime * 2 + time) { - core.unregisterAnimationFrame("over"); - ctx.restore(); - over.style.display = "none"; - core.stopSound(sod); - core.doAction(); - return; - } + const temp = document.createElement("canvas") + temp.width = 676 * 3; + temp.height = 416 * 3; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - text, - 1014, - 624, - textColor, - boldColor, - 6, - font - ); + const ctx = temp.getContext("2d"); - ctx.restore(); - } - }); - }; + this.overupdate = function () { + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) - this.overlist = function ( - image, - memory, - hidetime = 30, - list = [ - { - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, - ] - ) { - if (!core.isPlaying()) { - return core.doAction(); - } - const img = core.material.images.images?.[image]; - over.style.display = "block"; - let sod = 0; - let i = 0; - let now = 0; - core.registerAnimationFrame("overlist", true, (timestamp) => { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(ctx); - if (core.domStyle.isVertical) { - ctx.canvas.width = 416 * 3; - ctx.canvas.height = 676 * 3; - ctx.save(); //保存设置 - ctx.translate(416 * 3, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 676 * 3; - ctx.canvas.height = 416 * 3; - } - ctx.globalAlpha = 1; - if (img) { - //绘制背景 - if (memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 676 * 3, 416 * 3); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 676 * 3, 416 * 3); - } - const a = list[i]; - const b = list[i - 1]; - const c = list[i - 2]; - const d = list[i - 3]; - let ay = 624, - by = 624, - cy = 624, - dy = 624; - if (i === 0 && !list[1]) { - core.over( - image, - memory, - a.time, - hidetime, - a.sound, - a.textColor, - a.boldColor, - a.font, - a.text - ); - } else { - const numa = - parseInt(a?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || - 48; - const numb = - parseInt(b?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || - 48; - const numc = - parseInt(c?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || - 48; - const numd = - parseInt(d?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || - 48; + ctx1.restore(); + } + this.over = function ( + image, + memory, + time = 100, + hidetime = 30, + sound = "", + textColor = "#FFFFFF", + boldColor = "#000000", + font = "bold 48px Verdana", + text = "" + ) { + if (!core.isPlaying()) { + return core.doAction(); + } + const img = core.material.images.images?.[image]; + over.style.display = "block"; - // 绘制 - if (a) { - if (a.frame < hidetime / 2) { - a.frame++; - core.setAlpha(ctx, 1 - (hidetime - a.frame) / hidetime); - ay += ((numa * (hidetime - a.frame)) / hidetime) * 3; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - a.text, - 1014, - ay, - a.textColor, - a.boldColor, - 6, - a.font - ); - } - if (a.frame === hidetime / 2) { - core.setAlpha(ctx, 1 - (hidetime - a.frame) / hidetime); - ay = 624 + ((numa * (hidetime - a.frame)) / hidetime) * 3; - core.setTextAlign(ctx, "center"); + let sod = 0; + let start = 0; + core.registerAnimationFrame("over", true, (timestamp) => { - core.fillBoldText1( - ctx, - a.text, - 1014, - ay, - a.textColor, - a.boldColor, - 6, - a.font - ); - if (!b) { - a.frame++; - i++; - } - } - } - if (b) { - if (b.frame > hidetime / 2 && b.frame <= hidetime) { - b.frame++; - core.setAlpha(ctx, 1 - (hidetime - b.frame) / hidetime); - by += ((numb * (hidetime - b.frame)) / hidetime) * 3; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - b.text, - 1014, - by, - b.textColor, - b.boldColor, - 6, - b.font - ); + if (start === 0) start = timestamp; + core.clearMap(ctx); - core.stopSound(sod); - } - const lisenb = - b.sound && - core.material.sounds[b.sound] && - core.musicStatus.soundStatus; - if (b.frame && lisenb) { - sod = core.playSound(sound); - } - if (b.frame > hidetime && b.frame < hidetime + b.time) { - b.frame++; - ctx.globalAlpha = 1; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - b.text, - 1014, - by, - b.textColor, - b.boldColor, - 6, - b.font - ); - } - if (b.frame == hidetime + b.time) { - ctx.globalAlpha = 1; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - b.text, - 1014, - by, - b.textColor, - b.boldColor, - 6, - b.font - ); - if (a) a.frame++; - if (b) b.frame++; - if (c) c.frame++; - i++; - } - } - if (c) { - if ( - c.frame > hidetime + c.time && - c.frame < (hidetime * 3) / 2 + c.time - ) { - c.frame++; - core.setAlpha( - ctx, - 1 - (c.frame - hidetime - c.time) / hidetime - ); - cy -= ((numc * (c.frame - hidetime - c.time)) / hidetime) * 3; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - c.text, - 1014, - cy, - c.textColor, - c.boldColor, - 6, - c.font - ); - } - if (c.frame === (hidetime * 3) / 2 + c.time) { - core.setAlpha( - ctx, - 1 - (c.frame - hidetime - c.time) / hidetime - ); - cy = - 624 - ((numc * (c.frame - hidetime - c.time)) / hidetime) * 3; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - c.text, - 1014, - cy, - c.textColor, - c.boldColor, - 6, - c.font - ); - if (!b) { - c.frame++; - i++; - } - } - } - if (d) { - if ( - d.frame > (hidetime * 3) / 2 + d.time && - d.frame < hidetime * 2 + d.time - ) { - d.frame++; - core.setAlpha( - ctx, - 1 - (d.frame - hidetime - d.time) / hidetime - ); - dy -= ((numd * (d.frame - hidetime - d.time)) / hidetime) * 3; - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - d.text, - 1014, - dy, - d.textColor, - d.boldColor, - 6, - d.font - ); - } - if (d.frame == hidetime * 2 + d.time && !c) { - core.unregisterAnimationFrame("overlist"); - ctx.restore(); - over.style.display = "none"; - core.stopSound(sod); - core.doAction(); - return; - } - } - } - ctx.restore(); - } - }); - }; + ctx.globalAlpha = 1; + if (img) { + //绘制背景 - this.changebg = function (img1, memory1, img2, memory2, time, style) { - let globalAlpha1 = 0; - let globalAlpha2 = time; - img1 = core.material.images.images?.[img1]; - img2 = core.material.images.images?.[img2]; - over.style.display = "block"; - let now = 0; - switch (style) { - case "引入": - core.registerAnimationFrame("bgin", true, (timestamp) => { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(ctx); - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 676 * 3; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 676 * 3; - ctx.canvas.height = 1248; - } - ctx.globalAlpha = globalAlpha1 / time; - if (img2) { - //绘制背景 - if (memory2) ctx.filter = "sepia(50%)"; - ctx.drawImage(img2, 0, 0, 676 * 3, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 676 * 3, 1248); - } - globalAlpha1++; - ctx.restore(); - if (globalAlpha1 >= time) { - core.unregisterAnimationFrame("bgin"); - over.style.display = "none"; - core.doAction(); - } - } - }); + if (memory) ctx.filter = "sepia(50%)"; + ctx.drawImage(img, 0, 0, 676 * 3, 416 * 3); + ctx.filter = "none"; - break; - case "引出": - core.registerAnimationFrame("bgout", true, (timestamp) => { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(ctx); - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 676 * 3; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 676 * 3; - ctx.canvas.height = 1248; - } - ctx.globalAlpha = globalAlpha2 / time; - if (img1) { - //绘制背景 - if (memory1) ctx.filter = "sepia(50%)"; - ctx.drawImage(img1, 0, 0, 676 * 3, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 676 * 3, 1248); - } - globalAlpha2--; - ctx.restore(); - if (globalAlpha2 <= 0) { - core.unregisterAnimationFrame("bgout"); - over.style.display = "none"; - core.doAction(); - } - } - }); + } else { + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 416 * 3); - break; - case "场景切换": - core.registerAnimationFrame("changebg", true, (timestamp) => { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(ctx); - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 676 * 3; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 676 * 3; - ctx.canvas.height = 1248; - } - ctx.globalAlpha = 1; - core.fillRect(ctx, 0, 0, 676 * 3, 1248); - ctx.globalAlpha = globalAlpha2 / time; - if (img1) { - //绘制背景 - if (memory1) ctx.filter = "sepia(50%)"; - ctx.drawImage(img1, 0, 0, 676 * 3, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 676 * 3, 1248); - } - ctx.globalAlpha = globalAlpha1 / time; - if (img2) { - //绘制背景 - if (memory2) ctx.filter = "sepia(50%)"; - ctx.drawImage(img2, 0, 0, 676 * 3, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 676 * 3, 1248); - } - globalAlpha2--; - globalAlpha1++; - ctx.restore(); - if (globalAlpha2 <= 0 || globalAlpha1 >= time) { - core.unregisterAnimationFrame("changebg"); - over.style.display = "none"; - core.doAction(); - } - } - }); + } + let frame = Math.floor((timestamp - start) / (1000 / 60)) + // 绘制 + if (frame <= hidetime) + core.setAlpha(ctx, 1 - (hidetime - frame) / hidetime); + if (frame > hidetime && frame <= hidetime + time) ctx.globalAlpha = 1; + if (frame > hidetime + time && frame <= hidetime * 2 + time) + core.setAlpha(ctx, 1 - (frame - hidetime - time) / hidetime); + const lisen = + sound && core.sounds[sound] && core.musicStatus.soundStatus; + if (frame == hidetime && lisen) { + sod = core.playSound(sound); + } + if (frame > hidetime * 2 + time) { + core.unregisterAnimationFrame("over"); + ctx.restore(); + over.style.display = "none"; + core.stopSound(sod); + core.doAction(); + return; + } - break; - } - }; - }, + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + text, + 1014, + 624, + textColor, + boldColor, + 6, + font + ); + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) + ctx1.restore(); + + }); + }; + + this.overlist = function ( + image, + memory, + hidetime = 30, + list = [{ + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, ] + ) { + if (!core.isPlaying()) { + return core.doAction(); + } + const img = core.material.images.images?.[image]; + over.style.display = "block"; + let sod = 0; + let i = 0; + let now = 0; + core.registerAnimationFrame("overlist", true, (timestamp) => { + if (timestamp - now > 1000 / 60) { + now = timestamp; + core.clearMap(ctx); + + ctx.globalAlpha = 1; + if (img) { + //绘制背景 + if (memory) ctx.filter = "sepia(50%)"; + + core.drawImage(ctx, img, 0, 0, 676 * 3, 416 * 3); + ctx.filter = "none"; + } else { + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 416 * 3); + } + const a = list[i]; + const b = list[i - 1]; + const c = list[i - 2]; + const d = list[i - 3]; + let ay = 624, + by = 624, + cy = 624, + dy = 624; + if (i === 0 && !list[1]) { + core.over( + image, + memory, + a.time, + hidetime, + a.sound, + a.textColor, + a.boldColor, + a.font, + a.text + ); + } else { + const numa = + parseInt(a?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || + 48; + const numb = + parseInt(b?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || + 48; + const numc = + parseInt(c?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || + 48; + const numd = + parseInt(d?.font?.match(/\s*[\d.-]+[a-zA-Z%]*\s*/)?.[0].trim()) || + 48; + + // 绘制 + if (a) { + if (a.frame < hidetime / 2) { + a.frame++; + core.setAlpha(ctx, 1 - (hidetime - a.frame) / hidetime); + ay += ((numa * (hidetime - a.frame)) / hidetime) * 3; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + a.text, + 1014, + ay, + a.textColor, + a.boldColor, + 6, + a.font + ); + } + if (a.frame === hidetime / 2) { + core.setAlpha(ctx, 1 - (hidetime - a.frame) / hidetime); + ay = 624 + ((numa * (hidetime - a.frame)) / hidetime) * 3; + core.setTextAlign(ctx, "center"); + + core.fillBoldText1( + ctx, + a.text, + 1014, + ay, + a.textColor, + a.boldColor, + 6, + a.font + ); + if (!b) { + a.frame++; + i++; + } + } + } + if (b) { + if (b.frame > hidetime / 2 && b.frame <= hidetime) { + b.frame++; + core.setAlpha(ctx, 1 - (hidetime - b.frame) / hidetime); + by += ((numb * (hidetime - b.frame)) / hidetime) * 3; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + b.text, + 1014, + by, + b.textColor, + b.boldColor, + 6, + b.font + ); + + core.stopSound(sod); + } + const lisenb = + b.sound && core.sounds[b.sound] && core.musicStatus.soundStatus; + if (b.frame && lisenb) { + sod = core.playSound(sound); + } + if (b.frame > hidetime && b.frame < hidetime + b.time) { + b.frame++; + ctx.globalAlpha = 1; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + b.text, + 1014, + by, + b.textColor, + b.boldColor, + 6, + b.font + ); + } + + if (b.frame == hidetime + b.time) { + ctx.globalAlpha = 1; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + b.text, + 1014, + by, + b.textColor, + b.boldColor, + 6, + b.font + ); + if (a) a.frame++; + if (b) b.frame++; + if (c) c.frame++; + i++; + } + } + if (c) { + if ( + c.frame > hidetime + c.time && + c.frame < (hidetime * 3) / 2 + c.time + ) { + c.frame++; + core.setAlpha( + ctx, + 1 - (c.frame - hidetime - c.time) / hidetime + ); + cy -= ((numc * (c.frame - hidetime - c.time)) / hidetime) * 3; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + c.text, + 1014, + cy, + c.textColor, + c.boldColor, + 6, + c.font + ); + } + if (c.frame === (hidetime * 3) / 2 + c.time) { + core.setAlpha( + ctx, + 1 - (c.frame - hidetime - c.time) / hidetime + ); + cy = + 624 - ((numc * (c.frame - hidetime - c.time)) / hidetime) * 3; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + c.text, + 1014, + cy, + c.textColor, + c.boldColor, + 6, + c.font + ); + if (!b) { + c.frame++; + i++; + } + } + } + if (d) { + if ( + d.frame > (hidetime * 3) / 2 + d.time && + d.frame < hidetime * 2 + d.time + ) { + d.frame++; + core.setAlpha( + ctx, + 1 - (d.frame - hidetime - d.time) / hidetime + ); + dy -= ((numd * (d.frame - hidetime - d.time)) / hidetime) * 3; + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + d.text, + 1014, + dy, + d.textColor, + d.boldColor, + 6, + d.font + ); + } + if (d.frame == hidetime * 2 + d.time && !c) { + core.unregisterAnimationFrame("overlist"); + core.clearMap(ctx) + core.clearMap(ctx1) + + over.style.display = "none"; + core.stopSound(sod); + core.doAction(); + return; + } + } + } + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) + ctx1.restore(); + } + }); + }; + + this.changebg = function (img1, memory1, img2, memory2, time, style) { + let frame = 0; + img1 = core.material.images.images?.[img1]; + img2 = core.material.images.images?.[img2]; + over.style.display = "block"; + let start = 0; + switch (style) { + case "引入": + core.registerAnimationFrame("bgin", true, (timestamp) => { + + if (start === 0) start = timestamp; + let frame = Math.floor((timestamp - start) / (1000 / 60)) + core.clearMap(ctx); + + ctx.globalAlpha = frame / time; + if (img2) { + //绘制背景 + if (memory2) ctx.filter = "sepia(50%)"; + core.drawImage(ctx, img2, 0, 0, 676 * 3, 1248); + ctx.filter = "none"; + } else { + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 1248); + } + + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) + ctx1.restore(); + if (frame > time) { + core.unregisterAnimationFrame("bgin"); + + core.doAction(); + } + + + }); + + break; + case "引出": + core.registerAnimationFrame("bgout", true, (timestamp) => { + if (start === 0) start = timestamp; + let frame = Math.floor((timestamp - start) / (1000 / 60)) + core.clearMap(ctx); + + ctx.globalAlpha = 1 - frame / time; + if (img1) { + //绘制背景 + if (memory1) ctx.filter = "sepia(50%)"; + core.drawImage(ctx, img1, 0, 0, 676 * 3, 1248); + ctx.filter = "none"; + } else { + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 1248); + } + + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) + ctx1.restore(); + if (frame > time) { + core.unregisterAnimationFrame("bgout"); + over.style.display = "none"; + core.doAction(); + } + + }); + + break; + case "场景切换": + core.registerAnimationFrame("changebg", true, (timestamp) => { + if (start === 0) start = timestamp; + let frame = Math.floor((timestamp - start) / (1000 / 60)) + core.clearMap(ctx); + + ctx.globalAlpha = 1; + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 1248); + ctx.globalAlpha = 1 - frame / time; + if (img1) { + //绘制背景 + if (memory1) ctx.filter = "sepia(50%)"; + core.drawImage(ctx, img1, 0, 0, 676 * 3, 1248); + ctx.filter = "none"; + } else { + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 1248); + } + ctx.globalAlpha = frame / time; + if (img2) { + //绘制背景 + if (memory2) ctx.filter = "sepia(50%)"; + core.drawImage(ctx, img2, 0, 0, 676 * 3, 1248); + ctx.filter = "none"; + } else { + ctx.fillStyle = "#000000" + core.fillRect(ctx, 0, 0, 676 * 3, 1248); + } + + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) + ctx1.restore(); + if (frame > time) { + core.unregisterAnimationFrame("changebg"); + + core.doAction(); + } + + }); + + break; + + } + }; + this.drawbackground = function (image, memory) { + + + over.style.display = "block"; + + //绘制背景 + if (memory) ctx.filter = "sepia(70%)"; + core.drawImage(ctx, image, 0, 0, 2028, 1248); + ctx.filter = "none"; + if (core.domStyle.isVertical) { + ctx1.canvas.width = 416 * 3; + ctx1.canvas.height = 676 * 3; + ctx1.save(); //保存设置 + ctx1.translate(416 * 3, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 676 * 3; + ctx1.canvas.height = 416 * 3; + } + core.clearMap(ctx1) + ctx1.drawImage(temp, 0, 0, 676 * 3, 416 * 3) + ctx1.restore(); + + } + this.clearbackground = function () { + + over.style.display = "none"; + core.doAction(); + } +}, "回合制boss战": function () { - // 在此增加新插件 - const boss = document.createElement("canvas"); //boss战画布设置 - boss.style.position = "absolute"; - boss.style.zIndex = 300; - boss.style.display = "none"; - boss.id = "boss"; - main.dom.gameGroup.insertAdjacentElement("afterend", boss); - boss.style.top = "50%"; - boss.style.left = "50%"; - boss.style.transform = "translate(-50%,-50%)"; - const ctx = boss.getContext("2d"); - main.dom.boss = boss; - boss.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.boss.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - class boss1 { - constructor() { - this.bg = ""; - } - cavans() { - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; + // 在此增加新插件 + const boss = document.createElement("canvas"); //boss战画布设置 + boss.style.position = "absolute"; + boss.style.zIndex = 310; + boss.style.display = "none"; + boss.id = "boss"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss); + boss.style.top = "50%"; + boss.style.left = "50%"; + boss.style.transform = "translate(-50%,-50%)"; + const ctx = boss.getContext("2d"); + main.dom.boss = boss; + const boss1 = document.createElement("canvas"); //boss战画布设置 + boss1.style.position = "absolute"; + boss1.style.zIndex = 300; + boss1.style.display = "none"; + boss1.id = "boss1"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss1); + boss1.style.top = "50%"; + boss1.style.left = "50%"; + boss1.style.transform = "translate(-50%,-50%)"; + const ctx1 = boss1.getContext("2d"); + main.dom.boss1 = boss1; + const boss2 = document.createElement("canvas"); //boss战画布设置 + boss2.style.position = "absolute"; + boss2.style.zIndex = 301; + boss2.style.display = "none"; + boss2.id = "boss2"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss2); + boss2.style.top = "50%"; + boss2.style.left = "50%"; + boss2.style.transform = "translate(-50%,-50%)"; + main.dom.boss2 = boss2; + const ctx2 = boss2.getContext("2d"); + const boss3 = document.createElement("canvas"); //boss战画布设置 + boss3.style.position = "absolute"; + boss3.style.zIndex = 302; + boss3.style.display = "none"; + boss3.id = "boss3"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss3); + boss3.style.top = "50%"; + boss3.style.left = "50%"; + boss3.style.transform = "translate(-50%,-50%)"; + main.dom.boss3 = boss3; + const ctx3 = boss3.getContext("2d"); + const boss4 = document.createElement("canvas"); //boss战画布设置 + boss4.style.position = "absolute"; + boss4.style.zIndex = 303; + boss4.style.display = "none"; + boss4.id = "boss4"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss4); + boss4.style.top = "50%"; + boss4.style.left = "50%"; + boss4.style.transform = "translate(-50%,-50%)"; + const ctx4 = boss4.getContext("2d"); + main.dom.boss4 = boss4; + const boss5 = document.createElement("canvas"); //boss战画布设置 + boss5.style.position = "absolute"; + boss5.style.zIndex = 304; + boss5.style.display = "none"; + boss5.id = "boss5"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss5); + boss5.style.top = "50%"; + boss5.style.left = "50%"; + boss5.style.transform = "translate(-50%,-50%)"; + const ctx5 = boss5.getContext("2d"); + main.dom.boss5 = boss5; - core.setTextAlign(ctx, "center"); - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; + const boss6 = document.createElement("canvas"); //boss战画布设置 + boss6.style.position = "absolute"; + boss6.style.zIndex = 305; + boss6.style.display = "none"; + boss6.id = "boss6"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss6); + boss6.style.top = "50%"; + boss6.style.left = "50%"; + boss6.style.transform = "translate(-50%,-50%)"; + const ctx6 = boss6.getContext("2d"); + main.dom.boss6 = boss6; + const boss7 = document.createElement("canvas"); //boss战画布设置 + boss7.style.position = "absolute"; + boss7.style.zIndex = 306; + boss7.style.display = "none"; + boss7.id = "boss7"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss7); + boss7.style.top = "50%"; + boss7.style.left = "50%"; + boss7.style.transform = "translate(-50%,-50%)"; + const ctx7 = boss7.getContext("2d"); + main.dom.boss7 = boss7; + const boss8 = document.createElement("canvas"); //boss战画布设置 + boss8.style.position = "absolute"; + boss8.style.zIndex = 307; + boss8.style.display = "none"; + boss8.id = "boss8"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss8); + boss8.style.top = "50%"; + boss8.style.left = "50%"; + boss8.style.transform = "translate(-50%,-50%)"; + const ctx8 = boss8.getContext("2d"); + main.dom.boss8 = boss8; + const { imagelighter } = core.plugin.utils; + const { Animation, linear, bezier, circle, hyper, trigo, power, inverseTrigo, shake, sleep } = core.plugin.animate - core.setTextAlign(ctx, "center"); - } - } - start() {} - onclick(px, py) {} - } - core.ui.boss = new boss1(); - }, + function animateFarme(name, animate, centerX, centerY, index) { + var a = core.getContextByName(name); + if (!a) return; + var frame = animate.frames[index % animate.frame]; + + core.playSound((animate.se || {})[index % animate.frame + 1], (animate.pitch || {})[index % animate.frame + 1]); + var ratio = animate.ratio * 6; + if (core.domStyle.isVertical) { + a.canvas.width = 1248; + a.canvas.height = 2028; + a.save(); //保存设置 + a.translate(1248, 0); //重新定位右上角为基准 + a.rotate(Math.PI / 2); //旋转90度 + } else { + a.canvas.width = 2028; + a.canvas.height = 1248; + } + frame.forEach(function (t) { + var image = animate.images[t.index]; + if (!image) return; + + var realWidth = image.width * ratio * t.zoom / 100; + var realHeight = image.height * ratio * t.zoom / 100; + core.setAlpha(a, t.opacity / 255); + + var cx = centerX + t.x * 6, + cy = centerY + t.y * 6; + + var ix = cx - realWidth / 2, + iy = cy - realHeight / 2; + + var mirror = t.mirror ? 'x' : null; + var angle = t.angle ? -t.angle * Math.PI / 180 : null; + core.drawImage(a, image, ix, iy, realWidth, realHeight, null, null, null, null, angle, mirror); + + core.setAlpha(a, 1); + a.restore() + }) + } + let ani = [] + + function drawanimate(timestamp) { + let frametime = timestamp - core.ui.boss.time + core.ui.boss.time = timestamp; + if (!ani || ani.length == 0) return; + + core.clearMap(ctx6); + // 更新帧 + for (var i = 0; i < ani.length; i++) { + var obj = ani[i]; + if (obj.start === 0) obj.start = core.ui.boss.time + obj.index = Math.floor((core.ui.boss.time - obj.start) / (1000 / 60)) + + if (obj.index >= obj.animate.frames.length) { + + (function (callback) { + setTimeout(function () { + if (callback) callback(); + }); + })(obj.callback); + } + } + ani = ani.filter(function (obj) { + return obj.index < obj.animate.frames.length; + }); + + ani.forEach(function (obj) { + + animateFarme(ctx6, obj.animate, obj.centerX, obj.centerY, obj.index); + + }); + } + + + function getClick() { + return new Promise((resolve) => { + function handleBossClick(e) { + try { + e.preventDefault(); + if (!core.isPlaying()) return false; + + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + + let x, y; + if (core.domStyle.isVertical) { + x = py * 3; + y = 1248 - px * 3; + } else { + x = px * 3; + y = py * 3; + } + core.ui.boss.click(x, y); + + if ( + x > 1050 && + x < 1450 && + y > 250 && + y < 390 && + !core.ui.boss.show && + core.ui.boss.hasEnemy() + ) { + // 移除事件监听器 + boss.removeEventListener("click", handleBossClick); + resolve("普通攻击"); //有小怪时点击普通攻击 + return; // 退出函数 + } + if ( + x > 850 && + x < 1250 && + y > 250 && + y < 390 && + !core.ui.boss.show && + !core.ui.boss.hasEnemy() + ) { + // 移除事件监听器 + boss.removeEventListener("click", handleBossClick); + resolve("普通攻击"); //无小怪时点击普通攻击 + return; // 退出函数 + } + } catch (ee) { + main.log(ee); + } + } + boss.addEventListener("click", handleBossClick); + }); + } + + class Boss { + constructor() { + //绘制需要的变量 + this.enemyfarme = 0; + this.bg = "bg_3512.webp"; + this.heroImage = "tati_310101.webp"; + this.hero = { + id: "hero", + name: "凯伊姆", + hp: 1000, + atk: 150, + def: 100, + spell: 100, + speed: 10, + mdef: 10, + }; + this.boss = { + name: "菲奥奈", + id: "angel", + image: "tati_050143.webp", + hp: 1000, + atk: 200, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }; + this.onchoose = false + this.enemy = []; + this.enemy = [{ + name: "小蝙蝠", + id: "bat", + image: "tati_020125a.webp", + hp: 1000, + atk: 100, + def: 20, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "红蝙蝠", + id: "redBat", + image: "tati_050301.webp", + hp: 1000, + atk: 100, + def: 120, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "大蝙蝠", + id: "bigBat", + image: "tati_120101.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "绿色史莱姆", + id: "greenSlime", + image: "tati_340115.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "红色史莱姆", + id: "redSlime", + image: "tati_430101.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "黑色史莱姆", + id: "blackSlime", + image: "tati_440101.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + ]; + this.selection = "boss"; + this.herobuff = [ + { id: "sword1", count: 1 }, + { id: "fly", count: 30 }, + ]; + this.bossbuff = [ + { id: "fly", count: 2 }, + { id: "book", count: 12, hp: 100 }, + ]; + this.enemybuff = [ + [], + [], + [], + [], + [], + [] + ]; + this.skills = { + //技能列表,便于调用(可通过this.skills[name]调用) + 菲奥奈: ["普通攻击", "重斩"], + }; + this.skillShow = { + //技能说明 + 普通攻击: "常规攻击形式,伤害为自身攻击-对手防御", + }; + + this.turn = 0; + this.playingAnimate = new Set(); + this.playerTurn = false; + this.show = false; + this.time = 0 + } + buffshow(a) { + //buff说明(均未实装,之后改为实际需要的buff) + let text = ""; + switch (a.id) { + case "sword1": + text = `\r[rgb(30,66,30)]剑气:\r造成伤害提升\r[red]${ + 10 * a.count + }%\r`; + break; + case "fly": + text = `羽翼守护:接下来\r[gold]${a.count}回合\r不受速度差值影响`; + break; + case "book": + text = `恢复之书:接下来\r[#000033]${a.count}回合\r,每回合行动时回复\r[green]${a.hp}\r点生命`; + break; + } + return text; + } + async shake(hero) { + const animate = new Animation() + const fn = () => { + if (hero) { + const img = imagelighter( + core.material.images.images[this.heroImage] + ); + core.clearMap(ctx2); + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + + core.drawImage(ctx2, img, animate.x, 168, 750, 1080); + ctx2.restore(); + } else { + core.clearMap(ctx3); + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + if (this.selection === "boss" || this.selection === "") { + const img = imagelighter( + core.material.images.images[this.boss.image] + ); + core.drawImage(ctx3, img, 1400 + animate.x, 168, 750, 1080); + } else { + const img = imagelighter( + core.material.images.images[ + this.enemy[this.selection].image + ] + ); + core.drawImage(ctx3, img, 1400 + animate.x, 168, 750, 1080); + } + + ctx3.restore(); + } + } + animate.ticker.add(fn) + animate.getTime = () => Date.now() / 100 + animate.mode(shake(30, linear()), true).time(5).shake(1, 0) + await animate.all(); + animate.ticker.destroy() + this.drawhero(); + this.drawboss(); + } + + popDamage(damage, onhero) { + + let color = "#FFFFFF"; + if (typeof damage === "number") { + color = damage < 0 ? "#22FF44" : "lightcoral"; + } + let posx = onhero ? 300 : 1800; + let start = 0 + const speed = 9; + return new Promise((resolve) => { + core.registerAnimationFrame("popDamageonboss", true, (temptime) => { + + if (start === 0) start = temptime + + let farme = Math.floor((temptime - start) / (1000 / 60)) + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + core.clearMap(ctx); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + damage, + posx, + 800 - speed * farme, + color, + "#000000", + 6, + "bold 72px Arial" + ); + + ctx.restore(); + if (farme > 30) { + core.unregisterAnimationFrame("popDamageonboss"); + + core.clearMap(ctx); + resolve(); + } + + }); + }); + } + async skill(sk, a, b) { + //a为发起方属性,sk为技能名 + let damage = 0; + switch ( + sk //所有技能效果及动画写在这里 + ) { + case "普通攻击": + damage = Math.max(a.atk - b.def, 0); //基础伤害 + if (a.id === 'hero') damage = Math.floor((damage * a.speed) / b.speed); //勇者攻击时伤害根据速度比值伤害加成 + b.hp -= damage; //承受伤害 + if (b.id === "hero") + core.status.hero.statistics.battleDamage += damage; //数据统计记录伤害 + if (damage === 0) damage = "抵抗"; + + switch ( + a.id //根据id选取不同的特效 + ) { + case "hero": + this.popDamage(damage, false); + if (damage > 0 && typeof damage !== "string") this.shake(false); + await this.playanimate("jianji2", 1750, 770); //播放动画jianji2 + break; + case "angel": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("sword", 300, 770); //播放动画sword + + break; + case "bat": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("sword", 300, 770); //播放动画sword + + break; + case "redBat": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("hand", 300, 770); //播放动画hand + break; + case "bigBat": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("jianji", 300, 770); //播放动画jianji + break; + case "greenSlime": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("thunder", 300, 770); //播放动画thunder + break; + case "redSlime": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("yongchang", 300, 770); //播放动画yongchang + break; + case "blackSlime": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("zone", 300, 770); //播放动画zone + break; + } + break; //下面写其余技能 + } + await sleep(500); //等待1000ms + } + + click(px, py) { + //点击效果 + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + if (main.replayChecking || core.isReplaying()) return; + const enemyStatusBox = makeBox([50, 50], [1900, 200]), + heroStatusBox = makeBox([600, 920], [900, 300]), + bossBox = makeBox([800, 300], [100, 150]), + enemyBox = makeBox([700, 500], [300, 300]), + imageBox = makeBox([1500, 250], [550, 1000]); + if (this.show) { + //清除展示画面 + this.show = !this.show; + core.clearMap(ctx8); + } else { + if ( + inRect(pos, enemyStatusBox) && + this.selection !== "" && + this.selection !== "boss" && + this.hasEnemy() + ) { + //绘制怪物详情 + this.show = !this.show; + this.moreShow(this.selection); + } else if ( + inRect(pos, enemyStatusBox) && + (!this.hasEnemy() || this.selection === "boss") + ) { + //绘制boss详情 + this.show = !this.show; + this.moreShow("boss"); + } else if (inRect(pos, heroStatusBox)) { + //绘制勇士详情 + this.show = !this.show; + this.moreShow("hero"); + } else if (inRect(pos, bossBox) && this.hasEnemy()) { + //切换selection为boss + this.selection = "boss"; + this.update(); + } else if (inRect(pos, enemyBox) && this.hasEnemy()) { + //切换selection为enemy + const symbol = + Math.floor((px - 700) / 100) + Math.floor((py - 500) / 150) * 3; + + if (this.enemy[symbol] && this.enemy[symbol].hp > 0) { + this.selection = symbol; + this.update(); + } + } + } + } + drawchoose() { + boss7.style.display = "block"; + if (core.domStyle.isVertical) { + ctx7.canvas.width = 1248; + ctx7.canvas.height = 2028; + ctx7.save(); //保存设置 + ctx7.translate(1248, 0); //重新定位右上角为基准 + ctx7.rotate(Math.PI / 2); //旋转90度 + } else { + ctx7.canvas.width = 2028; + ctx7.canvas.height = 1248; + } + + core.clearMap(ctx7); + if (this.hasEnemy()) { + core.drawWindowSkin( + "winskin.webp", + ctx7, + 1050, + 250, + 400, + 660, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx7, + "普通攻击", + 1120, + 350, + "#FFFFFF", + "#000000", + 6, + "bold 64px Verdana" + ); + core.drawLine(ctx7, 1070, 390, 1430, 390, "#FFFFFF", 6); + } else { + core.drawWindowSkin( + "winskin.webp", + ctx7, + 850, + 250, + 400, + 660, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx7, + "普通攻击", + 920, + 350, + "#FFFFFF", + "#000000", + 6, + "bold 64px Verdana" + ); + core.drawLine(ctx7, 850, 390, 1250, 390, "#FFFFFF", 6); + } + ctx7.restore(); + } + moreShow(select) { + if (core.domStyle.isVertical) { + ctx8.canvas.width = 1248; + ctx8.canvas.height = 2028; + ctx8.save(); //保存设置 + ctx8.translate(1248, 0); //重新定位右上角为基准 + ctx8.rotate(Math.PI / 2); //旋转90度 + } else { + ctx8.canvas.width = 2028; + ctx8.canvas.height = 1248; + } + core.clearMap(ctx8); + core.fillRect(ctx8, 100, 100, 1800, 1000, "rgba(0,0,0,0.7)"); + core.drawWindowSkin( + "winskin.webp", + ctx8, + 100, + 100, + 1800, + 1000, + null, + null, + null, + 3 + ); + let posy = 200; + switch (select) { + case "hero": + //勇士技能/buff + core.fillBoldText1( + ctx8, + this.hero.name, + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + if (this.herobuff.length === 0) { + core.fillBoldText1( + ctx8, + "当前无特殊状态", + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + } else { + this.herobuff.forEach((v) => { + core.drawTextContent(ctx8, this.buffshow(v), { + left: 200, + top: posy, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: 0, + font: "Verdana", + maxWidth: 1600, + }); + posy += 100; + }); + } + posy += 50; + core.setTextAlign(ctx8, "center") + core.fillBoldText1( + ctx8, + "主角所造成的伤害将提升主角速度与怪物敌人速度值之比", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + "技能说明", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + "普通攻击:" + this.skillShow["普通攻击"], + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + break; + case "boss": + core.fillBoldText1( + ctx8, + this.boss.name, + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + //boss技能/buff + if (this.bossbuff.length === 0) { + core.fillBoldText1( + ctx8, + "当前无特殊状态", + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + } else { + this.bossbuff.forEach((v) => { + core.drawTextContent(ctx8, this.buffshow(v), { + left: 200, + top: posy, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: 0, + font: "Verdana", + maxWidth: 1600, + }); + posy += 100; + }); + } + posy += 50; + core.fillBoldText1( + ctx8, + "当前技能", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + this.boss.skill[this.boss.index] + + this.skillShow[this.boss.skill[this.boss.index]], + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + break; + default: + const enemy = this.enemy[select]; + const enemybuff = this.enemybuff[select]; + core.fillBoldText1( + ctx8, + enemy.name, + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + if (enemybuff.length === 0) { + core.fillBoldText1( + ctx8, + "当前无特殊状态", + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + } else { + enemybuff.forEach((v) => { + core.drawTextContent(ctx8, this.buffshow(v), { + left: 200, + top: posy, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: 0, + font: "Verdana", + maxWidth: 1600, + }); + posy += 100; + }); + } + posy += 50; + core.fillBoldText1( + ctx8, + "当前技能", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + enemy.skill[enemy.index] + + this.skillShow[enemy.skill[enemy.index]], + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + break; + } + ctx8.restore(); + } + hasEnemy() { + let enemy = false; + this.enemy.forEach((v) => { + if (v.hp > 0) enemy = true; + }); + return enemy; + } + async bossStart() { + boss6.style.display = "block"; + + this.time = 0 + core.registerAnimationFrame("animate-boss", true, drawanimate) + boss.style.display = "block"; + this.selection = "boss"; + this.playerturn = false; + this.show = false; + this.turn = 0; + + core.lockControl(); + await this.blackBg(); + this.moveboss(); + await this.movehero(); + await this.moveStatus(); + this.update(); + this.fight(); + } + async bossEnd() { + hero.hp = this.hero.hp; + this.selection = "boss"; + await this.close(); + core.unregisterAnimationFrame("animate-boss") + core.unlockControl(); + core.updateStatusBar(); + if (hero.hp <= 0) { + hero.hp = 0; + core.events.lose("BOSS战失败"); + } + } + async fight() { + await this.drawturn(); + this.selection = "boss" + this.update(); + const fightList = []; + fightList.push(["hero", this.hero.speed]); + if (this.boss.hp > 0) fightList.push(["boss", this.boss.speed]); + this.enemy.forEach((v, i) => { + if (v.id && v.hp > 0) fightList.push([i, v.speed]); + }); + fightList.sort((a, b) => b[1] - a[1]); + let damage; + for (const v of fightList) { + switch (v[0]) { + case "hero": + this.onchoose = true + this.drawchoose(); + const skill = await getClick(); + this.onchoose = false + core.clearMap(ctx7) + let select = this.boss; + if (this.selection !== "" && this.selection !== "boss") + select = this.enemy[this.selection]; + this.skill(skill, this.hero, select); + + break; + case "boss": + if (this.boss.hp > 0) { + this.selection = "boss"; + this.update(); + await sleep(500); //等待500ms + //这里写boss技能的效果 + this.skill( + this.boss.skill[this.boss.index], + this.boss, + this.hero + ); + + this.boss.index++; + if (this.boss.index >= this.boss.skill.length) + this.boss.index = 0; + } + break; + default: + const enemy = this.enemy[v[0]]; + if (enemy.hp > 0) { + this.selection = v[0]; + this.update(); + await sleep(500); //等待500ms + this.skill(enemy.skill[enemy.index], enemy, this.hero); + enemy.index++; + if (enemy.index >= enemy.skill.length) enemy.index = 0; + } + break; + } + await sleep(1000); + this.selection = ""; + this.update(); + } + let end = true; + if (this.boss.hp > 0) end = false; + this.enemy.forEach((v) => { + if (v.hp > 0) end = false; + }); + + if (this.hero.hp <= 0) end = true; + if (end) { + this.bossEnd(); + } else { + this.fight(); + } + } + async drawturn() { + const animate = new Animation(); + boss8.style.display = "block"; + this.turn++ + const fn = () => { + core.clearMap(ctx); + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + core.fillRect( + ctx, + 0, + 624 - animate.y, + 2028, + animate.y * 2, + "rgba(0,0,0,0.7)" + ); + + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "回合 " + this.turn, + animate.x - 300, + 644, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(96, true) + ); + ctx.restore() + } + animate.ticker.add(fn) + + animate.mode(hyper('sin', 'out')).time(1000).move(1314, 200) + await animate.all() + await sleep(500) + animate.mode(hyper('sin', 'in')).time(1000).move(2800, 0) + await animate.all() + core.clearMap(ctx); + animate.ticker.destroy() + + } + + drawenemy() { + let block, + time = 0; + + boss5.style.display = "block"; + core.registerAnimationFrame("enemyanimate", true, (temptime) => { + + if (temptime - time > 1000 / 60) { + time = temptime; + this.enemyfarme += 1; + let animate = Math.floor(this.enemyfarme / 10), + posx = 700, + posy = 500; + core.clearMap(ctx5); + if (core.domStyle.isVertical) { + ctx5.canvas.width = 1248; + ctx5.canvas.height = 2028; + ctx5.save(); //保存设置 + ctx5.translate(1248, 0); //重新定位右上角为基准 + ctx5.rotate(Math.PI / 2); //旋转90度 + } else { + ctx5.canvas.width = 2028; + ctx5.canvas.height = 1248; + } + + if (this.hasEnemy()) { + core.drawWindowSkin( + "winskin.webp", + ctx5, + 650, + 250, + 400, + 660, + null, + null, + null, + 3 + ); + if (this.selection === "boss") + core.strokeRect(ctx5, 800, 300, 100, 150, "yellow", 6); + const bossBlock = core.getBlockInfo(this.boss.id); + core.drawImage( + ctx5, + bossBlock.image, + 32 * (animate % 4), + bossBlock.posY * 48, + 32, + 48, + 800, + 300, + 96, + 144 + ); + core.drawImage( + ctx5, + "hero.webp", + 32 * (animate % 4), + 144, + 32, + 48, + 800, + 750, + 96, + 144 + ); + for (let i = 0; i < this.enemy.length; i++) { + if (this.enemy[i].id && this.enemy[i].hp > 0) { + block = core.getBlockInfo(this.enemy[i].id); + } else { + posx += 100; + if (i === 2) { + posx = 700; + posy += 150; + } + continue; + } + + if (block.cls === "enemys") { + core.drawImage( + ctx5, + block.image, + 32 * (animate % 2), + block.posY * 32, + 32, + 32, + posx, + posy, + 96, + 96 + ); + if (this.selection === i) + core.strokeRect(ctx5, posx, posy, 100, 100, "yellow", 6); + } else { + core.drawImage( + ctx5, + block.image, + 32 * (animate % 4), + block.posY * 48, + 32, + 48, + posx, + posy, + 96, + 144 + ); + if (this.selection === i) + core.strokeRect(ctx5, posx, posy, 100, 150, "yellow", 6); + } + + posx += 100; + if (i === 2) { + posx = 700; + posy += 150; + } + } + } + + ctx5.restore(); + } + }); + } + drawhero() { + core.clearMap(ctx2); + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + core.drawImage(ctx2, this.heroImage, 0, 168, 750, 1080); + ctx2.restore(); + } + async movehero() { + const animate = new Animation(); + boss2.style.display = "block"; + const fn = () => { + core.clearMap(ctx2); + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + core.drawImage(ctx2, this.heroImage, animate.x - 200, 168, 750, 1080); + ctx2.restore(); + } + animate.ticker.add(fn) + + animate.mode(hyper('sin', 'out')).time(1000).move(200, 0) + await animate.all() + + core.clearMap(ctx2); + animate.ticker.destroy() + this.drawhero() + + } + update() { + core.drawImage(ctx1, this.bg, 0, 0, 2028, 1248); + this.drawboss(); + this.drawhero(); + this.drawStatus(); + let dodraw = false; + for (let i = 0; i < this.enemy.length; i++) { + if (this.enemy[i].id && this.enemy[i].hp > 0) { + dodraw = true; + } + } + if (dodraw === true) this.drawenemy(); + if (this.onchoose) this.drawchoose() + } + async playanimate(name, x, y, callback) { + return new Promise(res => { + name = core.getMappedName(name); + + // 正在播放录像:不显示动画 + if (core.isReplaying() || !core.material.animates[name] || x == null || y == null) { + if (callback) callback(); + return Promise.resolve(-1); + } + + // 开始绘制 + var animate = core.material.animates[name], + centerX = x, + centerY = y + + animate.se = animate.se || {}; + if (typeof animate.se == 'string') animate.se = { 1: animate.se }; + + var id = setTimeout(null); + ani.push({ + "name": name, + "id": id, + "animate": animate, + "centerX": centerX, + "centerY": centerY, + "start": 0, + "index": 0, + "callback": () => { + if (callback) callback() + res() + } + }); + + }) + + + } + + drawboss() { + core.clearMap(ctx3); + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + if (this.selection === "boss" || this.selection === "") { + core.drawImage(ctx3, this.boss.image, 1400, 168, 750, 1080); + } else { + core.drawImage( + ctx3, + this.enemy[this.selection].image, + 1400, + 168, + 750, + 1080 + ); + } + + ctx3.restore(); + } + async moveboss() { + const animate = new Animation(); + boss3.style.display = "block"; + const fn = () => { + core.clearMap(ctx3); + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + core.drawImage(ctx3, this.boss.image, 1600 - animate.x, 168, 750, 1080); + + ctx3.restore(); + } + animate.ticker.add(fn) + + animate.mode(hyper('sin', 'out')).time(1000).move(200, 0) + await animate.all() + + core.clearMap(ctx3); + animate.ticker.destroy() + this.drawboss() + + } + drawStatus() { + core.clearMap(ctx4); + if (core.domStyle.isVertical) { + ctx4.canvas.width = 1248; + ctx4.canvas.height = 2028; + ctx4.save(); //保存设置 + ctx4.translate(1248, 0); //重新定位右上角为基准 + ctx4.rotate(Math.PI / 2); //旋转90度 + } else { + ctx4.canvas.width = 2028; + ctx4.canvas.height = 1248; + } + core.drawWindowSkin( + "winskin.webp", + ctx4, + 600, + 920, + 900, + 300, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + hero.name, + 630, + 1000, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 880, + 1000, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.hero.hp, + 630, + 1070, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.hero.atk, + 630, + 1120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.hero.def, + 630, + 1170, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法强 " + this.hero.spell, + 1080, + 1070, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.hero.mdef + "%", + 1080, + 1120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.hero.speed, + 1080, + 1170, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 980; + this.herobuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 950, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 1000, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + + if (this.selection === "boss" || !this.hasEnemy()) { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + 50, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.boss.name, + 100, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "当前技能", + 1400, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + const bosstext = this.boss.skill[this.boss.index]; + core.fillBoldText1( + ctx4, + bosstext, + 1600, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.boss.hp, + 100, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.boss.atk, + 500, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.boss.def, + 900, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.boss.mdef + "%", + 1300, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.boss.speed, + 1700, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.bossbuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 80, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 130, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } else if (this.selection === "") {} else { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + 50, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.enemy[this.selection].name, + 100, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "当前技能", + 1400, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + const enemytext = + this.enemy[this.selection].skill[this.enemy[this.selection].index]; + core.fillBoldText1( + ctx4, + enemytext, + 1600, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.enemy[this.selection].hp, + 100, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.enemy[this.selection].atk, + 500, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.enemy[this.selection].def, + 900, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.enemy[this.selection].mdef + "%", + 1300, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.enemy[this.selection].speed, + 1700, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.enemybuff[this.selection].forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 80, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 130, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } + ctx4.restore(); + } + async moveStatus() { + const animate = new Animation(); + boss4.style.display = "block"; + const fn = () => { + core.clearMap(ctx4); + if (core.domStyle.isVertical) { + ctx4.canvas.width = 1248; + ctx4.canvas.height = 2028; + ctx4.save(); //保存设置 + ctx4.translate(1248, 0); //重新定位右上角为基准 + ctx4.rotate(Math.PI / 2); //旋转90度 + } else { + ctx4.canvas.width = 2028; + ctx4.canvas.height = 1248; + } + core.drawWindowSkin( + "winskin.webp", + ctx4, + 600, + 1320 - animate.y, + 900, + 300, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + hero.name, + 630, + 1400 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 880, + 1400 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.hero.hp, + 630, + 1470 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.hero.atk, + 630, + 1520 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.hero.def, + 630, + 1570 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法强 " + this.hero.spell, + 1080, + 1470 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.hero.mdef + "%", + 1080, + 1520 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.hero.speed, + 1080, + 1570 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 980; + this.herobuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 1350 - animate.y, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 1400 - animate.y, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + if (this.selection === "boss") { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + -150 + animate.y / 2, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.boss.name, + 100, + -80 + animate.y / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + animate.y / 2 - 80, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.boss.hp, + 100, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.boss.atk, + 500, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.boss.def, + 900, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.boss.mdef + "%", + 1300, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.boss.speed, + 1700, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.bossbuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, animate.y / 2 - 120, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + animate.y / 2 - 70, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } else if (this.selection === "") {} else { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + animate.y / 2 - 150, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.enemy[this.selection].name, + 100, + animate.y / 2 - 80, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + animate.y / 2 - 80, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.enemy[this.selection].hp, + 100, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.enemy[this.selection].atk, + 500, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.enemy[this.selection].def, + 900, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.enemy[this.selection].mdef + "%", + 1300, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.enemy[this.selection].speed, + 1700, + animate.y / 2 + 20, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.enemybuff[this.selection].forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, animate.y / 2 - 120, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + animate.y / 2 - 70, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } + ctx4.restore(); + } + animate.ticker.add(fn) + + animate.mode(hyper('sin', 'out')).time(1000).move(0, 400) + await animate.all() + + core.clearMap(ctx3); + animate.ticker.destroy() + this.drawStatus(); + + } + close() { + let globalAlpha = 0, + time = 0; + return new Promise((resolve) => { + core.registerAnimationFrame("closeblack", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx); + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + + ctx.globalAlpha = globalAlpha; + + core.fillRect(ctx, 0, 0, 2028, 1248); + globalAlpha += 1 / 30; + ctx.restore(); + if (globalAlpha > 1) { + time = 0; + globalAlpha = 1; + core.unregisterAnimationFrame("closeblack"); + core.unregisterAnimationFrame("enemyanimate"); + boss1.style.display = "none"; + boss2.style.display = "none"; + boss3.style.display = "none"; + boss4.style.display = "none"; + boss5.style.display = "none"; + boss6.style.display = "none"; + boss7.style.display = "none"; + boss8.style.display = "none"; + + core.registerAnimationFrame("closeblack2", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx); + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + ctx.globalAlpha = globalAlpha; + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); + ctx.restore(); + globalAlpha -= 1 / 30; + if (globalAlpha < 0) { + core.unregisterAnimationFrame("closeblack2"); + + boss.style.display = "none"; + + resolve(); + } + } + }); + } + } + }); + }); + } + + blackBg() { + let globalAlpha = 0, + time = 0, + img = core.material.images.images[this.bg]; + boss1.style.display = "block"; + return new Promise((resolve) => { + core.registerAnimationFrame("bossblack", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx1); + if (core.domStyle.isVertical) { + ctx1.canvas.width = 1248; + ctx1.canvas.height = 2028; + ctx1.save(); //保存设置 + ctx1.translate(1248, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 2028; + ctx1.canvas.height = 1248; + } + + ctx1.globalAlpha = globalAlpha; + + core.fillRect(ctx1, 0, 0, 2028, 1248); + globalAlpha += 1 / 30; + ctx1.restore(); + if (globalAlpha > 1) { + time = 0; + globalAlpha = 0; + core.unregisterAnimationFrame("bossblack"); + core.registerAnimationFrame("bossBg", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx1); + if (core.domStyle.isVertical) { + ctx1.canvas.width = 1248; + ctx1.canvas.height = 2028; + ctx1.save(); //保存设置 + ctx1.translate(1248, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 2028; + ctx1.canvas.height = 1248; + } + + ctx1.globalAlpha = 1; + core.fillRect(ctx1, 0, 0, 2028, 1248); + ctx1.globalAlpha = globalAlpha; + if (img) ctx1.drawImage(img, 0, 0, 2028, 1248); + ctx1.restore(); + globalAlpha += 1 / 30; + if (globalAlpha > 1) { + core.unregisterAnimationFrame("bossBg"); + resolve(); + } + } + }); + } + } + }); + }); + } + } + core.ui.boss = new Boss(); +}, "剧情视频引用": function () { // 在此增加新插件 let a; @@ -16070,7 +19498,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.doAction(); clearTimeout(a); core.playBgm(bgm); - core.resumeBgm(); }, 2000); //这里设置定时器,定义长按500毫秒触发长按事件,时间可以自己改,个人感觉500毫秒非常合适 return false; } @@ -16243,1063 +19670,1286 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "帧动画/图片叠拼": function () { + // 在此增加新插件 + this.animationDrawable = function ( + allFarme, + color, + globalAlpha, + imageList, + soundList + ) { + if (!core.isPlaying()) { + return core.doAction(); + } + const over = main.dom.over; + const ctx = over.getContext("2d"); + over.style.display = "block"; + + + let now = 0; + let start = 0 + core.registerAnimationFrame( + + "animationDrawable", + true, + function (timestamp) { + + let frametime = timestamp - now + now = timestamp; + if (!imageList || imageList.length == 0) return; + if (start === 0) start = now + now = timestamp; + let farme = Math.floor((now - start) / (1000 / 60)) + if (farme > allFarme) { + core.unregisterAnimationFrame("animationDrawable"); + core.doAction(); + return + } + if (core.domStyle.isVertical) { + over.width = 1248; + over.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + over.width = 2028; + over.height = 1248; + } + + core.clearMap(ctx) + ctx.globalAlpha = (globalAlpha ?? 100) / 100; + core.fillRect(ctx, 0, 0, 2028, 1248, color); + + imageList.forEach(function (one) { + if ( + farme >= (one.beforefarme ?? 0) && + farme <= (one.afterfarme ?? allFarme) + ) { + const img = core.material.images.images?.[one.image]; + if (img) { + const gla = one.globalAlpha ?? 100; + const agla = one.aglobalAlpha ?? gla, + beforefarme = one.beforefarme ?? 0; + const afterfarme = one.afterfarme ?? allFarme; + + ctx.globalAlpha = + (gla + + ((agla - gla) * (farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; + + const cx = + (one.cx ?? 0) + + (((one.acx ?? 0) - (one.cx ?? 0)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (one.cy ?? 0) + + (((one.acy ?? 0) - (one.cy ?? 0)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (one.cw ?? img.width) + + (((one.acw ?? img.width) - (one.cw ?? img.width)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (one.ch ?? img.height) + + (((one.acw ?? img.height) - (one.cw ?? img.height)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (one.x ?? 0) + + (((one.ax ?? 0) - (one.x ?? 0)) * (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (one.y ?? 0) + + (((one.ay ?? 0) - (one.y ?? 0)) * (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (one.w ?? 2028) + + (((one.aw ?? 2028) - (one.w ?? 2028)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (one.h ?? 1248) + + (((one.ah ?? 1248) - (one.h ?? 1248)) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1), + angle = + (one.angle ?? 0) * Math.PI / 180 + + (((one.aangle ?? 0) * Math.PI / 180 - (one.angle ?? 0) * Math.PI / 180) * + (farme - beforefarme)) / + (afterfarme - beforefarme || 1); + core.drawImage(ctx, img, cx, cy, cw, ch, x, y, w, h, angle); + } + } + }); + soundList.forEach(function (one) { + const lisen = + one.sound && + core.sounds[one.sound] && + core.musicStatus.soundStatus; + if (farme >= one.startfarme && lisen && !one.start) { + one.start = true + if (one.stopbefore) core.stopSound(); + core.playSound(one.sound); + } + }); + ctx.globalAlpha = 1; + ctx.restore(); + + + + } + ); + }; +}, + "musicMode": function () { // 在此增加新插件 - this.animationDrawable = function ( - allFarme, - color, - globalAlpha, - imageList, - soundList - ) { - if (!core.isPlaying()) { - return core.doAction(); + const music = document.createElement("canvas"); + music.style.position = "absolute"; + music.style.zIndex = 300; + music.style.display = "none"; + music.id = "music"; + main.dom.gameGroup.insertAdjacentElement("afterend", music); + music.style.top = "50%"; + music.style.left = "50%"; + music.style.transform = "translate(-50%,-50%)"; + const ctx = music.getContext("2d"); + main.dom.music = music; + + const audio = core.plugin.audioSystem.bgmController; + + let page = 0; //初始页面 + + let isvolume = false; + + function shuffle(arr) { + let n = arr.length, + random; + while (n) { + random = (Math.random() * n--) >>> 0; + [arr[n], arr[random]] = [arr[random], arr[n]]; } - const over = main.dom.over; - const ctx = over.getContext("2d"); - over.style.display = "block"; + return arr; + } + music.addEventListener("mousedown", function (e) { + e.stopPropagation(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.music.mousedown(px * 3, py * 3); + }); + music.addEventListener("mousemove", function (e) { + e.stopPropagation(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.music.mousemove(px * 3, py * 3); + }); + music.addEventListener("mouseup", function (e) { + e.stopPropagation(); - let farme = 0; - let now = 0; - core.registerAnimationFrame( - "animationDrawable", - true, - function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - if (core.domStyle.isVertical) { - over.width = 1248; - over.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 + isvolume = false; + }); + music.addEventListener("mouseleave", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + music.addEventListener("touchstart", function (e) { + e.preventDefault(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.touches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); + core.ui.music.mousedown(px * 3, py * 3); + }); + music.addEventListener("touchmove", function (e) { + e.stopPropagation(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.touches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); + core.ui.music.mousemove(px * 3, py * 3); + }); + music.addEventListener("touchend", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + music.addEventListener("touchcancel", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + + class musicclass { + constructor() { + this.musics = ["theme.mp3"]; + //music列表 + //需全塔属性注册并保存在bgms文件夹,每个数组为显示的一页内容 + this.musicMx = [ + [ + "Crawler.opus", + "Blood_Stain.opus", + "Blind_Alley.opus", + "Halbmond.opus", + ], + ["theme.mp3", "op.opus", "Asphodelus_Ceui.opus", "ed.opus"], + ]; + //音乐别名(将在播放器内显示的音乐名,music列表内的都要有对应歌名) + this.musicname = { + "Asphodelus_Ceui.opus": "Asphodelus (Full.ver)", + "Blind_Alley.opus": "Blind Alley", + "Crawler.opus": "Crawler", + "op.opus": "Asphodelus", + "theme.mp3": "One of Episodes", + "ed.opus": "親愛なる世界へ", + "Blood_Stain.opus": "Blood Stain", + "Halbmond.opus": "Halbmond", + }; + this.selection = [0, 0]; + this.stop = false; + this.type = "xunhuan"; + this.randomList = []; + this.random = 0; + } + + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + music.width = 1248; + music.height = 2028; + } else { + music.width = 2028; + music.height = 1248; + } + } + + mousedown(px, py) { + //鼠标按下时 + + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const backbox = makeBox([15, 35], [210, 90]); + if (inRect(pos, backbox)) { + //离开按钮是一致的,其余的记区分横竖屏 + music.style.display = "none"; + core.clearMap(ctx); + + core.unregisterAnimationFrame("music"); + core.restart(); + + return; + } + if (core.domStyle.isVertical) { + //竖屏 + + const pageupbox = makeBox([100, 1230], [200, 100]); + const pagedownbox = makeBox([950, 1230], [200, 100]); + const musicbox = makeBox( + [100, 200], + [1048, this.musicMx[page].length * 100] + ); + const beforebox = makeBox([120, 1620], [100, 100]); + const afterbox = makeBox([780, 1620], [100, 100]); + const playbox = makeBox([420, 1580], [200, 200]); + const typebox = makeBox([1040, 1600], [120, 120]); + + const volumebox = makeBox([250, 1940], [1050, 20]); + if (inRect(pos, pageupbox)) { + if (page !== 0) page -= 1; + return; + } + if (inRect(pos, pagedownbox)) { + if (page !== this.musicMx.length - 1) page += 1; + return; + } + if (inRect(pos, playbox)) { + if (this.stop) { + this.stop = !this.stop; + + core.resumeBgm(); } else { - over.width = 2028; - over.height = 1248; + this.stop = !this.stop; + core.pauseBgm(); } + return; + } + if (inRect(pos, beforebox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); - ctx.globalAlpha = (globalAlpha ?? 100) / 100; - core.fillRect(ctx, 0, 0, 2028, 1248, color); + page = this.selection[0]; - imageList.forEach(function (one) { - if ( - farme >= (one.beforefarme ?? 0) && - farme <= (one.afterfarme ?? allFarme) - ) { - const img = core.material.images.images?.[one.image]; - if (img) { - const gla = one.globalAlpha ?? 100; - const agla = one.aglobalAlpha ?? gla, - beforefarme = one.beforefarme ?? 0; - const afterfarme = one.afterfarme ?? allFarme; - - ctx.globalAlpha = - (gla + - ((agla - gla) * (farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; - - const cx = - (one.cx ?? 0) + - (((one.acx ?? 0) - (one.cx ?? 0)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (one.cy ?? 0) + - (((one.acy ?? 0) - (one.cy ?? 0)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (one.cw ?? img.width) + - (((one.acw ?? img.width) - (one.cw ?? img.width)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (one.ch ?? img.height) + - (((one.acw ?? img.height) - (one.cw ?? img.height)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (one.x ?? 0) + - (((one.ax ?? 0) - (one.x ?? 0)) * (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (one.y ?? 0) + - (((one.ay ?? 0) - (one.y ?? 0)) * (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (one.w ?? 2028) + - (((one.aw ?? 2028) - (one.w ?? 2028)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (one.h ?? 1248) + - (((one.aw ?? 1248) - (one.w ?? 1248)) * - (farme - beforefarme)) / - (afterfarme - beforefarme || 1); - ctx.drawImage(img, cx, cy, cw, ch, x, y, w, h); + break; + case "xunhuan": + for (;;) { + if (this.selection[1] === 0) { + if (this.selection[0] === 0) { + this.selection[0] = this.musicMx.length - 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } else { + this.selection[0] -= 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } + } else { + this.selection[1] -= 1; + } + this.random = this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; } - } - }); - soundList.forEach(function (one) { - const lisen = - one.sound && - core.material.sounds[one.sound] && - core.musicStatus.soundStatus; - if (farme == one.startfarme && lisen) { - if (one.stopbefore) core.stopSound(); - core.playSound(one.sound); - } - }); - farme++; - ctx.globalAlpha = 1; - ctx.restore(); + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); - if (farme > allFarme) { - core.unregisterAnimationFrame("animationDrawable"); - over.style.display = "none"; - core.doAction(); + break; + case "suiji": + for (;;) { + if (this.random > 0) { + this.random -= 1; + } else { + this.random = this.randomList.length - 1; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + this.randomList[this.random] + ); + + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, afterbox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + break; + case "xunhuan": + for (;;) { + if ( + this.selection[1] === + this.musicMx[this.selection[0]].length - 1 + ) { + if (this.selection[0] === this.musicMx.length - 1) { + this.selection[0] = 0; + this.selection[1] = 0; + } else { + this.selection[0] += 1; + this.selection[1] = 0; + } + } else { + this.selection[1] += 1; + } + this.random = this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random < this.randomList.length - 1) { + this.random += 1; + } else { + this.random = 0; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + this.randomList[this.random] + ); + + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, typebox)) { + switch (this.type) { + case "danqu": + this.type = "xunhuan"; + break; + case "xunhuan": + this.type = "suiji"; + break; + case "suiji": + this.type = "danqu"; + break; + } + return; + } + if (inRect(pos, musicbox)) { + const index = Math.floor((py - 200) / 100); + if (page !== this.selection[0] || index !== this.selection[1]) { + if ( + this.musics.includes(this.musicMx[page][index]) || + page !== this.musicMx.length - 1 + ) { + this.selection[0] = page; + + this.selection[1] = index; + this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + this.stop = false; + } + } else { + if (this.stop) { + this.stop = !this.stop; + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + } + return; + } + + if (inRect(pos, volumebox)) { + const time = Math.min(Math.max((px - 250) / 800, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + isvolume = true; + } + } else { + //横屏 + const pageupbox = makeBox([1050, 1100], [200, 100]); + const pagedownbox = makeBox([1550, 1100], [200, 100]); + const musicbox = makeBox( + [900, 100], + [1000, this.musicMx[page].length * 100] + ); + const beforebox = makeBox([60, 620], [100, 100]); + const afterbox = makeBox([450, 620], [100, 100]); + const playbox = makeBox([200, 570], [200, 200]); + const typebox = makeBox([620, 600], [120, 120]); + + const volumebox = makeBox([100, 990], [600, 20]); + if (inRect(pos, pageupbox)) { + if (page !== 0) page -= 1; + return; + } + if (inRect(pos, pagedownbox)) { + if (page !== this.musicMx.length - 1) page += 1; + return; + } + if (inRect(pos, playbox)) { + if (this.stop) { + this.stop = !this.stop; + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + return; + } + if (inRect(pos, beforebox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + + break; + case "xunhuan": + for (;;) { + if (this.selection[1] === 0) { + if (this.selection[0] === 0) { + this.selection[0] = this.musicMx.length - 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } else { + this.selection[0] -= 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } + } else { + this.selection[1] -= 1; + } + this.random = this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random > 0) { + this.random -= 1; + } else { + this.random = this.randomList.length - 1; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + this.randomList[this.random] + ); + + page = this.selection[0]; + + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, afterbox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + break; + case "xunhuan": + for (;;) { + if ( + this.selection[1] === + this.musicMx[this.selection[0]].length - 1 + ) { + if (this.selection[0] === this.musicMx.length - 1) { + this.selection[0] = 0; + this.selection[1] = 0; + } else { + this.selection[0] += 1; + this.selection[1] = 0; + } + } else { + this.selection[1] += 1; + } + this.randomList.findIndex( + (v) => + v === this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random < this.randomList.length - 1) { + this.random += 1; + } else { + this.random = 0; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + main.core.ui.music.randomList[main.core.ui.music.random] + ); + + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, typebox)) { + switch (this.type) { + case "danqu": + this.type = "xunhuan"; + break; + case "xunhuan": + this.type = "suiji"; + break; + case "suiji": + this.type = "danqu"; + break; + } + return; + } + if (inRect(pos, musicbox)) { + const index = Math.floor((py - 100) / 100); + if (page !== this.selection[0] || index !== this.selection[1]) { + if ( + this.musics.includes(this.musicMx[page][index]) || + page !== this.musicMx.length - 1 + ) { + this.selection[0] = page; + this.selection[1] = index; + this.randomList.indexOf( + (v) => + v === this.musicMx[this.selection[0]][this.selection[1]] + ); + + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + this.stop = false; + } + } else { + if (this.stop) { + this.stop = !this.stop; + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + } + return; + } + + if (inRect(pos, volumebox)) { + const time = Math.min(Math.max((px - 100) / 600, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + isvolume = true; + } + } + } + mousemove(px, py) { + if (isvolume) { + if (core.domStyle.isVertical) { + const time = Math.min(Math.max((px - 250) / 800, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + } else { + const time = Math.min(Math.max((px - 100) / 600, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + } + } + } + + drawUI() { + //绘制页面 + core.clearMap(music); + const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 + const bg = core.material.images.images["bg_5043.webp"]; //竖屏背景 + if (core.domStyle.isVertical) { + //竖屏 + + core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 + ctx.globalAlpha = 0.3; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(100, 200); + ctx.lineTo(1148, 200); + + ctx.stroke(); + let posy = 300; + const indexList = this.musicMx[page]; + core.setTextAlign(ctx, "left"); + for (let i = 0; i < indexList.length; i++) { + const text = this.musicname[indexList[i]]; + if ( + this.musics.includes(this.musicMx[page][i]) || + page !== this.musicMx.length - 1 + ) { + core.fillBoldText1( + ctx, + text, + 150, + posy - 30, + page === this.selection[0] && i === this.selection[1] + ? "#FFFFFF" + : "#444444", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(100, posy); + ctx.lineTo(1148, posy); + ctx.stroke(); + } + posy += 100; + } + ctx.beginPath(); + ctx.moveTo(100, 1210); + ctx.lineTo(1148, 1210); + ctx.moveTo(100, 1200); + ctx.lineTo(1148, 1200); + ctx.stroke(); + + core.fillBoldText1( + ctx, + "上一页", + 100, + 1300, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.musicMx.length, + 580, + 1300, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 950, + 1300, + page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 3; + + core.fillBoldText( + ctx, + "|", + 100, + 1697, + "#FFFFFF", + 6, + core.ui._buildFont(96, true) + ); + core.fillBoldText( + ctx, + "◀", + 115, + 1700, + "#FFFFFF", + 6, + core.ui._buildFont(96, true) + ); + + ctx.beginPath(); + ctx.arc(505, 1670, 80, 0, 3 * Math.PI); + ctx.stroke(); + core.fillText( + ctx, + "|", + 835, + 1697, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + core.fillText( + ctx, + "▶", + 785, + 1700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + + if (this.stop) { + core.fillText( + ctx, + "▶", + 473, + 1700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } else { + core.fillText( + ctx, + "||", + 453, + 1700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } + + const img = core.material.images.images[this.type + ".webp"]; + if (img) ctx.drawImage(img, 1000, 1555, 200, 200); + core.setTextAlign(ctx, "center"); + ctx.font = "bold 52px Verdana"; + ctx.fillText("当前歌曲", 625, 1397); + ctx.fillText( + this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], + 625, + 1507 + ); + + ctx.fillStyle = "#ffffff"; + ctx.font = "bold 48px Verdana"; + ctx.fillText("音量", 150, 1970); + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(250, 1950); + ctx.lineTo(1050, 1950); + ctx.stroke(); + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 9; + ctx.fillStyle = "rgba(255,255,255,0.5)"; + + ctx.beginPath(); + ctx.moveTo(250, 1950); + ctx.lineTo(800 * audio.getVolume() + 250, 1950); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(800 * audio.getVolume() + 250, 1950, 10, 0, 2 * Math.PI); + ctx.fill(); + core.fillBoldText1( + ctx, + Math.floor(100 * audio.getVolume()), + 1120, + 1970, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(56, true) + ); + } else { + //横屏 + + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + core.setTextAlign(ctx, "center"); + + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(800, 100); + ctx.lineTo(800, 1148); + ctx.moveTo(900, 100); + ctx.lineTo(1900, 100); + ctx.stroke(); + let posy = 200; + const indexList = this.musicMx[page]; + core.setTextAlign(ctx, "left"); + for (let i = 0; i < indexList.length; i++) { + const text = this.musicname[indexList[i]]; + if ( + this.musics.includes(this.musicMx[page][i]) || + page !== this.musicMx.length - 1 + ) { + core.fillBoldText1( + ctx, + text, + 950, + posy - 30, + page === this.selection[0] && i === this.selection[1] + ? "#FFFFFF" + : "#444444", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(900, posy); + ctx.lineTo(1900, posy); + ctx.stroke(); + } + posy += 100; + } + core.fillBoldText1( + ctx, + "上一页", + 1050, + 1200 - 30, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.musicMx.length, + 1350, + 1200 - 30, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1550, + 1200 - 30, + page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 3; + + core.fillText( + ctx, + "|", + 55, + 697, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + core.fillText( + ctx, + "◀", + 70, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + + ctx.beginPath(); + ctx.arc(295, 670, 80, 0, 2 * Math.PI); + ctx.stroke(); + if (this.stop) { + core.fillText( + ctx, + "▶", + 265, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } else { + core.fillText( + ctx, + "||", + 245, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } + core.fillText( + ctx, + "|", + 495, + 697, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + core.fillText( + ctx, + "▶", + 450, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + + ctx.font = "bold 48px Verdana"; + ctx.fillText("音量", 350, 900); + ctx.beginPath(); + ctx.moveTo(100, 1000); + ctx.lineTo(700, 1000); + ctx.stroke(); + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 9; + ctx.fillStyle = "rgba(255,255,255,0.5)"; + + ctx.beginPath(); + ctx.moveTo(100, 1000); + ctx.lineTo(600 * audio.getVolume() + 100, 1000); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(600 * audio.getVolume() + 100, 1000, 10, 0, 2 * Math.PI); + ctx.fill(); + core.fillBoldText1( + ctx, + Math.floor(100 * audio.getVolume()), + 720, + 1010, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(56, true) + ); + const img = core.material.images.images[this.type + ".webp"]; + if (img) ctx.drawImage(img, 580, 560, 200, 200); + core.setTextAlign(ctx, "center"); + ctx.font = "bold 48px Verdana"; + ctx.fillText("当前歌曲", 400, 297); + ctx.fillText( + this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], + 400, + 397 + ); + } + } + } + core.ui.music = new musicclass(); + main.dom.musicMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + core.ui.music.musics = core.getLocalStorage("musics"); + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + const arr = main.core.ui.music.musicMx.flat(Infinity); + main.core.ui.music.randomList = shuffle(arr); + main.core.ui.music.random = main.core.ui.music.randomList.indexOf( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ] + ); + page = 0; + music.style.display = "block"; + let time = 0; + core.registerAnimationFrame("music", null, (temptime) => { + if (temptime > time + 1000 / 60) { + time = temptime; + main.core.ui.music.update(); + const duration = + core.plugin.audioSystem.bgmController.player.getRoute( + "bgms." + + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ] + ).duration; + + const currentTime = + core.plugin.audioSystem.bgmController.player.getRoute( + "bgms." + + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ] + ).currentTime; + if (currentTime && duration && duration - currentTime < 0.05) { + if (core.domStyle.isVertical) { + core.ui.music.mousedown(830, 1770); + } else { + core.ui.music.mousedown(475, 765); } } } - ); + }); + }; + loader.prototype.loadOneMusic = function (name) { + /* var music = new Audio(); + music.preload = "none"; + if (main.bgmRemote) + music.src = main.bgmRemoteRoot + core.firstData.name + "/" + name; + else music.src = "project/bgms/" + name; + music.loop = "loop"; + core.material.bgms[name] = music;*/ }; }, - "musicMode": function () { - // 在此增加新插件 - const music = document.createElement("canvas"); - music.style.position = "absolute"; - music.style.zIndex = 300; - music.style.display = "none"; - music.id = "music"; - main.dom.gameGroup.insertAdjacentElement("afterend", music); - music.style.top = "50%"; - music.style.left = "50%"; - music.style.transform = "translate(-50%,-50%)"; - const ctx = music.getContext("2d"); - main.dom.music = music; - - const audio = core.plugin.audioSystem.bgmController; - - let page = 0; //初始页面 - - let isvolume = false; - - function shuffle(arr) { - let n = arr.length, - random; - while (n) { - random = (Math.random() * n--) >>> 0; - [arr[n], arr[random]] = [arr[random], arr[n]]; - } - return arr; - } - music.addEventListener("mousedown", function (e) { - e.stopPropagation(); - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.music.mousedown(px * 3, py * 3); - }); - music.addEventListener("mousemove", function (e) { - e.stopPropagation(); - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.music.mousemove(px * 3, py * 3); - }); - music.addEventListener("mouseup", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - music.addEventListener("mouseleave", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - music.addEventListener("touchstart", function (e) { - e.preventDefault(); - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.touches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); - core.ui.music.mousedown(px * 3, py * 3); - }); - music.addEventListener("touchmove", function (e) { - e.stopPropagation(); - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.touches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); - core.ui.music.mousemove(px * 3, py * 3); - }); - music.addEventListener("touchend", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - music.addEventListener("touchcancel", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - - class musicclass { - constructor() { - //music列表 - //需全塔属性注册并保存在bgms文件夹,每个数组为显示的一页内容 - this.musicMx = [ - ["Asphodelus_Ceui.opus", "Blind_Alley.opus"], - ["Crawler.opus", "op.opus", "theme.opus"], - ]; - //音乐别名(将在播放器内显示的音乐名,music列表内的都要有对应歌名) - this.musicname = { - "Asphodelus_Ceui.opus": "Asphodelus", - "Blind_Alley.opus": "Blind", - "Crawler.opus": "Crawler", - "op.opus": "op", - "theme.opus": "theme", - }; - this.selection = [0, 0]; - this.stop = false; - this.type = "xunhuan"; - this.randomList = []; - this.random = 0; - } - - //更新 - update() { - this.background(); - this.drawUI(); - } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - music.width = 1248; - music.height = 2028; - } else { - music.width = 2028; - music.height = 1248; - } - } - mousedown(px, py) { - //鼠标按下时 - - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [ - [sx, sy], - [dx, dy] - ]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const backbox = makeBox([15, 35], [210, 90]); - if (inRect(pos, backbox)) { - //离开按钮是一致的,其余的记区分横竖屏 - music.style.display = "none"; - core.clearMap(ctx); - - core.unregisterAnimationFrame("music"); - core.restart(); - - return; - } - if (core.domStyle.isVertical) { - //竖屏 - - const pageupbox = makeBox([100, 1230], [200, 100]); - const pagedownbox = makeBox([950, 1230], [200, 100]); - const musicbox = makeBox( - [100, 200], - [1048, this.musicMx[page].length * 100] - ); - const beforebox = makeBox([120, 1620], [100, 100]); - const afterbox = makeBox([780, 1620], [100, 100]); - const playbox = makeBox([420, 1580], [200, 200]); - const typebox = makeBox([1040, 1600], [120, 120]); - - const volumebox = makeBox([250, 1940], [1050, 20]); - if (inRect(pos, pageupbox)) { - if (page !== 0) page -= 1; - return; - } - if (inRect(pos, pagedownbox)) { - if (page !== this.musicMx.length - 1) page += 1; - return; - } - if (inRect(pos, playbox)) { - if (this.stop) { - this.stop = !this.stop; - - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - return; - } - if (inRect(pos, beforebox)) { - this.stop = false; - switch (this.type) { - case "danqu": - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - page = this.selection[0]; - - break; - case "xunhuan": - if (this.selection[1] === 0) { - if (this.selection[0] === 0) { - this.selection[0] = this.musicMx.length - 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } else { - this.selection[0] -= 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } - } else { - this.selection[1] -= 1; - } - this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - case "suiji": - if (this.random > 0) { - this.random -= 1; - } else { - this.random = this.randomList.length - 1; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - this.randomList[this.random] - ); - - page = this.selection[0]; - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - } - return; - } - if (inRect(pos, afterbox)) { - this.stop = false; - switch (this.type) { - case "danqu": - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - page = this.selection[0]; - break; - case "xunhuan": - if ( - this.selection[1] === - this.musicMx[this.selection[0]].length - 1 - ) { - if (this.selection[0] === this.musicMx.length - 1) { - this.selection[0] = 0; - this.selection[1] = 0; - } else { - this.selection[0] += 1; - this.selection[1] = 0; - } - } else { - this.selection[1] += 1; - } - this.random = this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - case "suiji": - if (this.random < this.randomList.length - 1) { - this.random += 1; - } else { - this.random = 0; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - this.randomList[this.random] - ); - - page = this.selection[0]; - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - } - return; - } - if (inRect(pos, typebox)) { - switch (this.type) { - case "danqu": - this.type = "xunhuan"; - break; - case "xunhuan": - this.type = "suiji"; - break; - case "suiji": - this.type = "danqu"; - break; - } - return; - } - if (inRect(pos, musicbox)) { - const index = Math.floor((py - 200) / 100); - if (page !== this.selection[0] || index !== this.selection[1]) { - this.selection[0] = page; - this.selection[1] = index; - this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - this.stop = false; - } else { - if (this.stop) { - this.stop = !this.stop; - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - } - return; - } - - if (inRect(pos, volumebox)) { - const time = Math.min(Math.max((px - 250) / 800, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - isvolume = true; - } - } else { - //横屏 - const pageupbox = makeBox([1050, 1100], [200, 100]); - const pagedownbox = makeBox([1550, 1100], [200, 100]); - const musicbox = makeBox( - [900, 100], - [1000, this.musicMx[page].length * 100] - ); - const beforebox = makeBox([60, 620], [100, 100]); - const afterbox = makeBox([450, 620], [100, 100]); - const playbox = makeBox([200, 570], [200, 200]); - const typebox = makeBox([620, 600], [120, 120]); - - const volumebox = makeBox([100, 990], [600, 20]); - if (inRect(pos, pageupbox)) { - if (page !== 0) page -= 1; - return; - } - if (inRect(pos, pagedownbox)) { - if (page !== this.musicMx.length - 1) page += 1; - return; - } - if (inRect(pos, playbox)) { - if (this.stop) { - this.stop = !this.stop; - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - return; - } - if (inRect(pos, beforebox)) { - this.stop = false; - switch (this.type) { - case "danqu": - if (!this.stop) - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - page = this.selection[0]; - - break; - case "xunhuan": - if (this.selection[1] === 0) { - if (this.selection[0] === 0) { - this.selection[0] = this.musicMx.length - 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } else { - this.selection[0] -= 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } - } else { - this.selection[1] -= 1; - } - this.random = this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - - if (!this.stop) - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - case "suiji": - if (this.random > 0) { - this.random -= 1; - } else { - this.random = this.randomList.length - 1; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - this.randomList[this.random] - ); - - page = this.selection[0]; - - if (!this.stop) - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - } - return; - } - if (inRect(pos, afterbox)) { - this.stop = false; - switch (this.type) { - case "danqu": - if (!this.stop) - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - page = this.selection[0]; - break; - case "xunhuan": - if ( - this.selection[1] === - this.musicMx[this.selection[0]].length - 1 - ) { - if (this.selection[0] === this.musicMx.length - 1) { - this.selection[0] = 0; - this.selection[1] = 0; - } else { - this.selection[0] += 1; - this.selection[1] = 0; - } - } else { - this.selection[1] += 1; - } - this.randomList.findIndex( - (v) => - v === this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - - if (!this.stop) - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - case "suiji": - if (this.random < this.randomList.length - 1) { - this.random += 1; - } else { - this.random = 0; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - main.core.ui.music.randomList[main.core.ui.music.random] - ); - - page = this.selection[0]; - if (!this.stop) - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - break; - } - return; - } - if (inRect(pos, typebox)) { - switch (this.type) { - case "danqu": - this.type = "xunhuan"; - break; - case "xunhuan": - this.type = "suiji"; - break; - case "suiji": - this.type = "danqu"; - break; - } - return; - } - if (inRect(pos, musicbox)) { - const index = Math.floor((py - 100) / 100); - if (page !== this.selection[0] || index !== this.selection[1]) { - this.selection[0] = page; - this.selection[1] = index; - this.randomList.indexOf( - (v) => v === this.musicMx[this.selection[0]][this.selection[1]] - ); - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - this.stop = false; - } else { - if (this.stop) { - this.stop = !this.stop; - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - } - return; - } - - if (inRect(pos, volumebox)) { - const time = Math.min(Math.max((px - 100) / 600, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - isvolume = true; - } - } - } - mousemove(px, py) { - if (isvolume) { - if (core.domStyle.isVertical) { - const time = Math.min(Math.max((px - 250) / 800, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - } else { - const time = Math.min(Math.max((px - 100) / 600, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - } - } - } - - drawUI() { - //绘制页面 - core.clearMap(music); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //竖屏背景 - if (core.domStyle.isVertical) { - //竖屏 - - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.3; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 - - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(100, 200); - ctx.lineTo(1148, 200); - - ctx.stroke(); - let posy = 300; - const indexList = this.musicMx[page]; - core.setTextAlign(ctx, "left"); - for (let i = 0; i < indexList.length; i++) { - const text = this.musicname[indexList[i]]; - core.fillBoldText1( - ctx, - text, - 150, - posy - 30, - page === this.selection[0] && i === this.selection[1] ? - "#FFFFFF" : - "#444444", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(100, posy); - ctx.lineTo(1148, posy); - ctx.stroke(); - posy += 100; - } - ctx.beginPath(); - ctx.moveTo(100, 1210); - ctx.lineTo(1148, 1210); - ctx.moveTo(100, 1200); - ctx.lineTo(1148, 1200); - ctx.stroke(); - - core.fillBoldText1( - ctx, - "上一页", - 100, - 1300, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - core.fillBoldText1( - ctx, - page + 1 + "/" + this.musicMx.length, - 580, - 1300, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 950, - 1300, - page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 3; - - ctx.fillStyle = "#ffffff"; - ctx.font = "bold 96px Verdana"; - ctx.fillText("|", 100, 1697); - ctx.fillText("◀", 115, 1700); - ctx.beginPath(); - ctx.arc(505, 1670, 80, 0, 3 * Math.PI); - ctx.stroke(); - ctx.fillText("|", 835, 1697); - ctx.fillText("▶", 785, 1700); - if (this.stop) { - ctx.fillText("▶", 473, 1697); - } else { - ctx.fillText("||", 453, 1694); - } - - const img = core.material.images.images[this.type + ".webp"]; - if (img) ctx.drawImage(img, 1000, 1555, 200, 200); - core.setTextAlign(ctx, "center"); - ctx.font = "bold 52px Verdana"; - ctx.fillText("当前歌曲", 625, 1397); - ctx.fillText( - this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], - 625, - 1507 - ); - - ctx.fillStyle = "#ffffff"; - ctx.font = "bold 48px Verdana"; - ctx.fillText("音量", 150, 1970); - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(250, 1950); - ctx.lineTo(1050, 1950); - ctx.stroke(); - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 9; - ctx.fillStyle = "rgba(255,255,255,0.5)"; - - ctx.beginPath(); - ctx.moveTo(250, 1950); - ctx.lineTo(800 * audio.getVolume() + 250, 1950); - ctx.stroke(); - ctx.beginPath(); - ctx.arc(800 * audio.getVolume() + 250, 1950, 10, 0, 2 * Math.PI); - ctx.fill(); - core.fillBoldText1( - ctx, - Math.floor(100 * audio.getVolume()), - 1120, - 1970, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(56, true) - ); - } else { - //横屏 - - core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 - core.setTextAlign(ctx, "center"); - - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(800, 100); - ctx.lineTo(800, 1148); - ctx.moveTo(900, 100); - ctx.lineTo(1900, 100); - ctx.stroke(); - let posy = 200; - const indexList = this.musicMx[page]; - core.setTextAlign(ctx, "left"); - for (let i = 0; i < indexList.length; i++) { - const text = this.musicname[indexList[i]]; - core.fillBoldText1( - ctx, - text, - 950, - posy - 30, - page === this.selection[0] && i === this.selection[1] ? - "#FFFFFF" : - "#444444", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(900, posy); - ctx.lineTo(1900, posy); - ctx.stroke(); - posy += 100; - } - core.fillBoldText1( - ctx, - "上一页", - 1050, - 1200 - 30, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - core.fillBoldText1( - ctx, - page + 1 + "/" + this.musicMx.length, - 1350, - 1200 - 30, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1550, - 1200 - 30, - page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 3; - - ctx.fillStyle = "#ffffff"; - ctx.font = "bold 96px Verdana"; - ctx.fillText("|", 60, 697); - ctx.fillText("◀", 70, 700); - ctx.beginPath(); - ctx.arc(295, 670, 80, 0, 2 * Math.PI); - ctx.stroke(); - if (this.stop) { - ctx.fillText("▶", 245, 697); - } else { - ctx.fillText("||", 245, 694); - } - - ctx.fillText("|", 490, 697); - ctx.fillText("▶", 450, 700); - ctx.font = "bold 48px Verdana"; - ctx.fillText("音量", 350, 900); - ctx.beginPath(); - ctx.moveTo(100, 1000); - ctx.lineTo(700, 1000); - ctx.stroke(); - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 9; - ctx.fillStyle = "rgba(255,255,255,0.5)"; - - ctx.beginPath(); - ctx.moveTo(100, 1000); - ctx.lineTo(600 * audio.getVolume() + 100, 1000); - ctx.stroke(); - ctx.beginPath(); - ctx.arc(600 * audio.getVolume() + 100, 1000, 10, 0, 2 * Math.PI); - ctx.fill(); - core.fillBoldText1( - ctx, - Math.floor(100 * audio.getVolume()), - 720, - 1010, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(56, true) - ); - const img = core.material.images.images[this.type + ".webp"]; - if (img) ctx.drawImage(img, 580, 560, 200, 200); - core.setTextAlign(ctx, "center"); - ctx.font = "bold 48px Verdana"; - ctx.fillText("当前歌曲", 400, 297); - ctx.fillText( - this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], - 400, - 397 - ); - } - } - } - core.ui.music = new musicclass(); - main.dom.musicMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - - const arr = main.core.ui.music.musicMx.flat(Infinity); - main.core.ui.music.randomList = shuffle(arr); - main.core.ui.music.random = main.core.ui.music.randomList.indexOf( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - page = 0; - music.style.display = "block"; - let time = 0; - core.registerAnimationFrame("music", null, (temptime) => { - if (temptime > time + 1000 / 60) { - time = temptime; - main.core.ui.music.update(); - const duration = - core.plugin.audioSystem.bgmController.player.getRoute( - "bgms." + - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ).duration; - - const currentTime = - core.plugin.audioSystem.bgmController.player.getRoute( - "bgms." + - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ).currentTime; - if (currentTime && duration && duration - currentTime < 0.05) { - if (core.domStyle.isVertical) { - core.ui.music.mousedown(830, 1770); - } else { - core.ui.music.mousedown(475, 765); - } - } - } - }); - }; -}, "横屏切换": function () { // 在此增加新插件 this.triggerFullscreen = async function (full) { @@ -17369,200 +21019,5219 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }); }; }, - "帧动画特效(游戏界面)": function () { + "intro&loop": function () { // 在此增加新插件 - const animate2 = document.createElement("canvas"); //画布设置 - animate2.style.zIndex = 71; - animate2.id = "animate2"; - animate2.classList.add("gameCanvas", "anti-aliasing"); - animate2.style.display = "block"; - animate2.width = 416; - animate2.height = 416; - animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; - animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; - main.dom.animate2 = animate2; - const anctx = animate2.getContext("2d"); + this.introAndLoop = function (intro, time, loop) { + core.playBgm(intro); + setTimeout(() => { + core.playBgm(loop); + }, time * 1000); + }; + }, + "开局选项悬停": function () { + // 在此增加新插件 + main.dom.playGame.addEventListener("mouseenter", () => { + core.dom.playGame.style.backgroundColor = "#808080"; + }); + main.dom.playGame.addEventListener("mouseleave", () => { + core.dom.playGame.style.backgroundColor = "transparent"; + }); + main.dom.playGame.addEventListener("touchmove", () => { + core.dom.playGame.style.backgroundColor = "#808080"; + }); + main.dom.playGame.addEventListener("touchend", () => { + core.dom.playGame.style.backgroundColor = "transparent"; + }); + main.dom.playGame.addEventListener("touchcancel", () => { + core.dom.playGame.style.backgroundColor = "transparent"; + }); - main.dom.gameDraw.appendChild(animate2); + main.dom.loadGame.addEventListener("mouseenter", () => { + core.dom.loadGame.style.backgroundColor = "#808080"; + }); + main.dom.loadGame.addEventListener("mouseleave", () => { + core.dom.loadGame.style.backgroundColor = "transparent"; + }); + main.dom.loadGame.addEventListener("touchmove", () => { + core.dom.loadGame.style.backgroundColor = "#808080"; + }); + main.dom.loadGame.addEventListener("touchend", () => { + core.dom.loadGame.style.backgroundColor = "transparent"; + }); + main.dom.loadGame.addEventListener("touchcancel", () => { + core.dom.loadGame.style.backgroundColor = "transparent"; + }); - core.plugin.playing = new Set(); + main.dom.CGMode.addEventListener("mouseenter", () => { + core.dom.CGMode.style.backgroundColor = "#808080"; + }); + main.dom.CGMode.addEventListener("mouseleave", () => { + core.dom.CGMode.style.backgroundColor = "transparent"; + }); + main.dom.CGMode.addEventListener("touchmove", () => { + core.dom.CGMode.style.backgroundColor = "#808080"; + }); + main.dom.CGMode.addEventListener("touchend", () => { + core.dom.CGMode.style.backgroundColor = "transparent"; + }); + main.dom.CGMode.addEventListener("touchcancel", () => { + core.dom.CGMode.style.backgroundColor = "transparent"; + }); - this.setanimate = function ( - name, - px, - py, - width, - height, - allFarme, - imageList, - soundList + main.dom.musicMode.addEventListener("mouseenter", () => { + core.dom.musicMode.style.backgroundColor = "#808080"; + }); + main.dom.musicMode.addEventListener("mouseleave", () => { + core.dom.musicMode.style.backgroundColor = "transparent"; + }); + main.dom.musicMode.addEventListener("touchmove", () => { + core.dom.musicMode.style.backgroundColor = "#808080"; + }); + main.dom.musicMode.addEventListener("touchend", () => { + core.dom.musicMode.style.backgroundColor = "transparent"; + }); + main.dom.musicMode.addEventListener("touchcancel", () => { + core.dom.musicMode.style.backgroundColor = "transparent"; + }); + + main.dom.replayGame.addEventListener("mouseenter", () => { + core.dom.replayGame.style.backgroundColor = "#808080"; + }); + main.dom.replayGame.addEventListener("mouseleave", () => { + core.dom.replayGame.style.backgroundColor = "transparent"; + }); + main.dom.replayGame.addEventListener("touchmove", () => { + core.dom.replayGame.style.backgroundColor = "#808080"; + }); + main.dom.replayGame.addEventListener("touchend", () => { + core.dom.replayGame.style.backgroundColor = "transparent"; + }); + main.dom.replayGame.addEventListener("touchcancel", () => { + core.dom.replayGame.style.backgroundColor = "transparent"; + }); +}, + "天气叠加": function () { + //使用方法:使用core.setWeather(天气,等级)来增加天气,使用core.setWeather()来清空天气 + // 天气叠加功能 + + ////// 更改天气效果 ////// + control.prototype.setWeather = function (type, level) { + // 非雨雪 + if (type == null) { + Object.keys(core.control.weathers).forEach(function (one) { + core.deleteCanvas("weather" + one); + }); + core.animateFrame.weather.type = []; + core.animateFrame.weather.nodes = {}; + core.animateFrame.weather.level = {}; + core.animateFrame.weather.time = {}; + return; + } + if (!core.animateFrame.weather.level || level == null) + core.animateFrame.weather.level = {}; + if (!core.animateFrame.weather.type) core.animateFrame.weather.type = []; + level = core.clamp(parseInt(level) || 5, 1, 10); + // 当前天气:则忽略 + if ( + core.animateFrame.weather.type.includes(type) && + level == core.animateFrame.weather.level[type] + ) + return; + if (core.animateFrame.weather.nodes[type]) return; + // 计算当前的宽高 + core.createCanvas( + "weather" + type, + 0, + 0, + core.__PIXELS__, + core.__PIXELS__, + 80 + ); + core.animateFrame.weather.type.push(type); + core.animateFrame.weather.level[type] = level; + this._setWeather_createNodes(type, level); + }; + control.prototype._setWeather_createNodes = function (type, level) { + var number = + level * + parseInt( + (20 * core.bigmap.width * core.bigmap.height) / + (core.__SIZE__ * core.__SIZE__) + ); + if (!core.animateFrame.weather.nodes[type]) + core.animateFrame.weather.nodes[type] = []; + switch (type) { + case "rain": + for (var a = 0; a < number; a++) { + core.animateFrame.weather.nodes.rain.push({ + x: Math.random() * core.bigmap.width * 32, + y: Math.random() * core.bigmap.height * 32, + l: Math.random() * 2.5, + xs: -4 + Math.random() * 4 + 2, + ys: Math.random() * 10 + 10, + }); + } + break; + case "snow": + for (var a = 0; a < number; a++) { + core.animateFrame.weather.nodes.snow.push({ + x: Math.random() * core.bigmap.width * 32, + y: Math.random() * core.bigmap.height * 32, + r: Math.random() * 5 + 1, + d: Math.random() * Math.min(level, 200), + }); + } + break; + case "fog": + if (core.animateFrame.weather.fog) { + core.animateFrame.weather.nodes[type] = [{ + level: number, + x: 0, + y: -core.__PIXELS__ / 2, + dx: -Math.random() * 1.5, + dy: Math.random(), + delta: 0.001, + }, ]; + } + break; + case "cloud": + if (core.animateFrame.weather.cloud) { + core.animateFrame.weather.nodes[type] = [{ + level: number, + x: 0, + y: -core.__PIXELS__ / 2, + dx: -Math.random() * 1.5, + dy: Math.random(), + delta: 0.001, + }, ]; + } + break; + case "sun": + if (core.animateFrame.weather.sun) { + // 直接绘制 + core.clearMap("weather" + type); + + core.drawImage( + "weather" + type, + core.animateFrame.weather.sun, + 0, + 0, + core.animateFrame.weather.sun.width, + core.animateFrame.weather.sun.height, + 0, + 0, + core.__PIXELS__, + core.__PIXELS__ + ); + core.setAlpha("weather" + type, level / 10); + core.animateFrame.weather.nodes.sun = [{ level: level, opacity: level / 10, delta: 0.01 }] + } + break; + } + }; + core.registerAnimationFrame("weather", true, function (timestamp) { + var weather = core.animateFrame.weather; + if (!weather.type) return; + weather.type.forEach(function (one) { + if ( + timestamp - weather.time[one] <= 30 || + !core.dymCanvas["weather" + one] + ) + return; + core.control["_animationFrame_weather_" + one](); + weather.time[one] = timestamp; + }); + }); + // 晴 + control.prototype._animationFrame_weather_sun = function () { + + var node = core.animateFrame.weather.nodes.sun[0] + var opacity = node.opacity + node.delta; + + if (opacity > node.level / 11 + 0.3 || opacity < node.level / 11 - 0.3) + node.delta = -node.delta; + node.opacity = opacity; + core.setOpacity("weathersun", core.clamp(opacity, 0, 1)); + + }; + // 雨 + control.prototype._animationFrame_weather_rain = function () { + var ctx = core.dymCanvas.weatherrain, + ox = core.bigmap.offsetX, + oy = core.bigmap.offsetY; + core.clearMap("weatherrain"); + ctx.strokeStyle = "rgba(174,194,224,0.8)"; + ctx.lineWidth = 1; + ctx.lineCap = "round"; + core.animateFrame.weather.nodes.rain.forEach(function (p) { + ctx.beginPath(); + ctx.moveTo(p.x - ox, p.y - oy); + ctx.lineTo(p.x + p.l * p.xs - ox, p.y + p.l * p.ys - oy); + ctx.stroke(); + p.x += p.xs; + p.y += p.ys; + if (p.x > core.bigmap.width * 32 || p.y > core.bigmap.height * 32) { + p.x = Math.random() * core.bigmap.width * 32; + p.y = -10; + } + }); + ctx.fill(); + }; + // 雪 + control.prototype._animationFrame_weather_snow = function () { + var ctx = core.dymCanvas.weathersnow, + ox = core.bigmap.offsetX, + oy = core.bigmap.offsetY; + core.clearMap("weathersnow"); + ctx.fillStyle = "rgba(255, 255, 255, 0.8)"; + ctx.beginPath(); + if (!core.animateFrame.weather.data) core.animateFrame.weather.data = {}; + core.animateFrame.weather.data.snow = + core.animateFrame.weather.data.snow || 0; + core.animateFrame.weather.data.snow += 0.01; + var angle = core.animateFrame.weather.data.snow; + core.animateFrame.weather.nodes.snow.forEach(function (p) { + ctx.moveTo(p.x - ox, p.y - oy); + ctx.arc(p.x - ox, p.y - oy, p.r, 0, Math.PI * 2, true); + // update + p.x += Math.sin(angle) * core.animateFrame.weather.level.snow; + p.y += Math.cos(angle + p.d) + 1 + p.r / 2; + if ( + p.x > core.bigmap.width * 32 + 5 || + p.x < -5 || + p.y > core.bigmap.height * 32 + ) { + if (Math.random() > 1 / 3) { + p.x = Math.random() * core.bigmap.width * 32; + p.y = -10; + } else { + if (Math.sin(angle) > 0) p.x = -5; + else p.x = core.bigmap.width * 32 + 5; + p.y = Math.random() * core.bigmap.height * 32; + } + } + }); + ctx.fill(); + }; + // 图片天气 + control.prototype.__animateFrame_weather_image = function (image, type) { + if (!image) return; + var node = core.animateFrame.weather.nodes[type][0]; + core.setAlpha("weather" + type, node.level / 500); + var wind = 1.5; + var width = image.width, + height = image.height; + node.x += node.dx * wind; + node.y += (2 * node.dy - 1) * wind; + if (node.x + 3 * width <= core.__PIXELS__) { + node.x += 4 * width; + while (node.x > 0) node.x -= width; + } + node.dy += node.delta; + if (node.dy >= 1) { + node.delta = -0.001; + } else if (node.dy <= 0) { + node.delta = 0.001; + } + if (node.y + 3 * height <= core.__PIXELS__) { + node.y += 4 * height; + while (node.y > 0) node.y -= height; + } else if (node.y >= 0) { + node.y -= height; + } + for (var i = 0; i < 3; ++i) { + for (var j = 0; j < 3; ++j) { + if ( + node.x + (i + 1) * width <= 0 || + node.x + i * width >= core.__PIXELS__ || + node.y + (j + 1) * height <= 0 || + node.y + j * height >= core.__PIXELS__ + ) + continue; + core.drawImage( + "weather" + type, + image, + node.x + i * width, + node.y + j * height + ); + } + } + core.setAlpha("weather" + type, 1); + }; + // 雾 + control.prototype._animationFrame_weather_fog = function () { + core.clearMap("weatherfog"); + this.__animateFrame_weather_image(core.animateFrame.weather.fog, "fog"); + }; + // 云 + control.prototype._animationFrame_weather_cloud = function () { + core.clearMap("weathercloud"); + this.__animateFrame_weather_image( + core.animateFrame.weather.cloud, + "cloud" + ); + } + +}, + "回合战斗动画": function () { + // 在此增加新插件 + const animateAttack = document.createElement("canvas"); //画布设置 + animateAttack.style.zIndex = 80; + animateAttack.id = "animateAttack"; + animateAttack.classList.add("gameCanvas", "anti-aliasing"); + animateAttack.style.display = "block"; + animateAttack.width = 416; + animateAttack.height = 416; + animateAttack.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animateAttack.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animateAttack = animateAttack; + const ctx = animateAttack.getContext("2d"); + const changeY = -30 + let easy = false; + const { imagelighter } = core.plugin.utils; + main.dom.gameDraw.appendChild(animateAttack); + const { lcm, gcd } = core.plugin.utils; + const animate2 = document.createElement("canvas"); //画布设置 + animate2.style.zIndex = 91; + animate2.id = "animate2"; + animate2.classList.add("gameCanvas", "anti-aliasing"); + animate2.style.display = "block"; + animate2.width = 416; + animate2.height = 416; + animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animate2 = animate2; + const anctx = animate2.getContext("2d"); + + main.dom.gameDraw.appendChild(animate2); + let a = [] + + function drawAnimate(name, centerX, centerY) { + name = core.getMappedName(name); + + // 正在播放录像:不显示动画 + if (core.isReplaying() || !core.material.animates[name] || centerX == null || centerY == null) { + return -1; + } + + // 开始绘制 + var animate = core.material.animates[name]; + animate.se = animate.se || {}; + if (typeof animate.se == 'string') animate.se = { 1: animate.se }; + + var id = setTimeout(null); + a.push({ + "name": name, + "id": id, + "animate": animate, + "centerX": centerX, + "centerY": centerY, + "start": 0, + "pause": false, + "pausetime": 0, + "index": 0, + }); + + return id; + } + + function animationFrame(callback1) { + let time = 0 + core.registerAnimationFrame("animate2", true, function (timestamp) { + let frametime = timestamp - time + time = timestamp; + if ( + !a || + a.length == 0 + ) + return; + core.clearMap(anctx); + // 更新帧 + + for (var i = 0; i < a.length; i++) { + var obj = a[i]; + if (obj.start === 0) obj.start = time + obj.index = Math.floor((time - obj.start) / (1000 / 60)) + if (obj.index >= obj.animate.frames.length) { + (function (callback) { + setTimeout(function () { + if (callback) callback(); + }); + })(obj.callback); + } + } + a = a.filter(function (obj) { + return obj.index < obj.animate.frames.length; + }); + + if (a.length === 0) { + core.clearMap(anctx); + core.unregisterAnimationFrame("animate2") + callback1() + } + a.forEach(function (obj) { + if (obj.hero) { + core.maps._drawAnimateFrame( + anctx, + obj.animate, + core.status.heroCenter.px, + core.status.heroCenter.py, + obj.index + ); + } else { + core.maps._drawAnimateFrame( + anctx, + obj.animate, + obj.centerX, + obj.centerY, + obj.index + ); + } + }); + core.animateFrame.animateTime = timestamp; + }); + } + + function animateonAttack(name, onenemy, callback) { + if (onenemy) { + drawAnimate(name, 290, 180 + changeY); + } else { + drawAnimate(name, 130, 180 + changeY); + } + } + + this.attackAnimate = function ( + enemyId, + heroInfo, + enemyInfo, + equipInfo, + oneTurn, + heroDiffList, + enemyDiffList, + heroanimateList, + enemyanimateList + ) { + //参数分别为怪物id、真实属性,战斗信息,特殊装备(如火焰风衣)属性特殊装备属性为以元组{equipId,oneDamage,speed,now:0}构成的数组(列出每个需要计算的特殊装备,没有则为空数组或不填) + core.lockControl(); + core.clearMap(ctx); + core.status.event.id = "attackAnimate"; + let turn = 0; + enemyInfo.id = enemyId; + enemyInfo.cls = core.getClsFromId(enemyId); + enemyInfo.name = core.material.enemys[enemyId].name; + let max = heroInfo.speed + if (enemyInfo.speed > max) max = enemyInfo.speed + equipInfo.forEach(v => { if (v.speed > max) max = v.speed }) + let i = 1 + while (oneTurn * i / max < 15) { + i++ + } + if (heroInfo.onAttack) heroInfo.now *= i + if (enemyInfo.onAttack) enemyInfo.now *= i + equipInfo.forEach(v => { if (v.onAttack) v.now *= i }) + oneTurn *= i + let time = 0, + farme = 0; + return new Promise((res) => { + core.plugin.battle_onclick = function (x, y, px, py) { + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const easybox = makeBox([90, 232 + changeY], [80, 22]), + easyspeedbox = makeBox([290, 232 + changeY], [40, 22]), + uneasybox = makeBox([265, 330 + changeY], [65, 20]), + uneasyspeedbox = makeBox([290, 350 + changeY], [40, 20]), + uneasyClosebox = makeBox([265, 370 + changeY], [65, 20]), + easyClosebox = makeBox([290, 255 + changeY], [40, 20]); + if (inRect(pos, easybox) && easy) { + easy = false; + } else if (inRect(pos, uneasybox) && !easy) { + easy = true; + } else if ( + (inRect(pos, easyspeedbox) && easy) || + (inRect(pos, uneasyspeedbox) && !easy) + ) { + flags.qukly = !flags.qukly + + } else if ((inRect(pos, easyClosebox) && easy) || + (inRect(pos, uneasyClosebox) && !easy) + ) { + core.status.event.id = ""; + core.unregisterAnimationFrame("attackAnimate"); + core.clearMap(ctx); + core.closePanel(); + res(); + } + }; + async function drawAttackAnimate( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + heroDiffList, + enemyDiffList, + heroanimateList, + enemyanimateList + ) { + core.lockControl(); + core.status.event.id = "battle"; + + let attack = false; + if (heroInfo.isAttack) attack = true; + if (enemyInfo.isAttack) attack = true; + equipInfo.forEach(function (v) { + if (v.isAttack) attack = true; + }); + let onAttack = false; + if (heroInfo.onAttack) onAttack = true; + if (enemyInfo.onAttack) onAttack = true; + equipInfo.forEach(function (v) { + if (v.onAttack) onAttack = true; + }); + core.clearMap(ctx); + let animate = Math.floor(farme / 15); + + if (flags.qukly) { + while (true) { + let goattack = false + equipInfo.forEach(v => { + if (v.now >= oneTurn) goattack = true + + }); + if (enemyInfo.now >= oneTurn) goattack = true + if (heroInfo.now >= oneTurn) goattack = true + + if (goattack) break; + enemyInfo.now += enemyInfo.speed + heroInfo.now += heroInfo.speed + equipInfo.forEach(function (v) { + v.now += v.speed + + }); + + } + } + if (easy) { + core.fillRect(ctx, 64, 52, 288, 212, "rgba(0,0,0,0.5)"); + core.strokeRect(ctx, 64, 52, 288, 212, "rgba(255,255,255,0.5)", 4); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + hero.name, + 127, + 148 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, "hp", 70, 210 + changeY, 16, 16); + core.fillBoldText( + ctx, + "生命 " + core.formatBigNumber(heroInfo.hp, true), + 90, + 225 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + + core.fillBoldText( + ctx, + "详细模式", + 90, + 250 + changeY, + "#FFFF60", + "#000000", + "bold 18px Verdana" + ); + + core.strokeRect(ctx, 112, 159 + changeY, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && heroDiffList[turn].hp < 0 ? + imagelighter(core.material.images.images["hero.webp"]) : + attack && heroDiffList[turn].hp > 0 ? + imagelighter( + core.material.images.images["hero.webp"], + "rgba(0, 255, 0, 0.5)" + ) : + core.material.images.images["hero.webp"]; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + 0, + 32, + 48, + 112, + 159 + changeY, + 32, + 48 + ); + + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + enemyInfo.name, + 289, + 148 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + + core.setTextAlign(ctx, "right"); + if (enemyInfo.cls === "enemys") { + core.strokeRect(ctx, 272, 175 + changeY, 32, 32, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 2), + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + 272, + 175 + changeY, + 32, + 32 + ); + } else { + core.strokeRect(ctx, 272, 159 + changeY, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + 272, + 159 + changeY, + 32, + 48 + ); + } + core.drawIcon(ctx, "hp", 330, 210 + changeY, 16, 16); + + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + " 生命", + 330, + 225 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + core.fillBoldText( + ctx, + flags.qukly ? "正常" : "极速", + 330, + 250 + changeY, + "#FFFF60", + "#000000", + "bold 18px Verdana" + ); + core.fillBoldText( + ctx, + "跳过", + 330, + 273 + changeY, + "#FFFF60", + "#000000", + "bold 18px Verdana" + ); + core.fillBoldText( + ctx, + "V", + 219, + 183 + changeY, + "#FFFFFF", + "#000000", + "bold 48px pala" + ); + core.fillBoldText( + ctx, + "s", + 231, + 183 + changeY, + "#FFFFFF", + "#000000", + "bold 36px pala" + ); + + if (!attack && !onAttack && !flags.qukly) enemyInfo.now += enemyInfo.speed; + let enemynow = Math.min(100 + (enemyInfo.now / oneTurn) * 215, 315); + ctx.fillStyle = "#FFFFFF"; + ctx.beginPath(); + ctx.moveTo(enemynow, 120 + changeY); + ctx.lineTo(enemynow + 5, 110 + changeY); + ctx.lineTo(enemynow - 5, 110 + changeY); + ctx.closePath(); + ctx.fill(); + core.drawIcon(ctx, 'T397', enemynow - 16, 84 + changeY, 32, 32) + + core.drawLine(ctx, 100, 125 + changeY, 315, 125 + changeY, "#FFFFFF", 5); + equipInfo.forEach(function (v) { + if (!attack && !onAttack) v.now += v.speed; + let vnow = Math.min(100 + (v.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(vnow, 120 + changeY); + ctx.lineTo(vnow + 5, 110 + changeY); + ctx.lineTo(vnow - 5, 110 + changeY); + ctx.closePath(); + + ctx.fill(); + + core.drawIcon(ctx, v.id, vnow - 16, 84 + changeY, 32, 32); + }); + if (!attack && !onAttack && !flags.qukly) heroInfo.now += hero.speed; + let heronow = Math.min(100 + (heroInfo.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(heronow, 120); + ctx.lineTo(heronow + 5, 110); + ctx.lineTo(heronow - 5, 110); + ctx.closePath(); + + ctx.fill(); + core.drawIcon(ctx, 'T399', heronow - 16 - 4, 84 - 4 + changeY, 40, 40) + + } else { + core.fillRect(ctx, 64, 52, 288, 320, "rgba(0,0,0,0.5)"); + core.strokeRect(ctx, 64, 52, 288, 320, "rgba(255,255,255,0.5)", 4); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + hero.name, + 127, + 148 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, "hp", 70, 210 + changeY, 16, 16); + core.drawIcon(ctx, "atk", 70, 230 + changeY, 16, 16); + core.drawIcon(ctx, "def", 70, 250 + changeY, 16, 16); + core.drawIcon(ctx, "I374", 70, 270 + changeY, 16, 16); + core.drawIcon(ctx, "I375", 70, 290 + changeY, 16, 16); + core.drawIcon(ctx, "mdef", 70, 310 + changeY, 16, 16); + core.drawIcon(ctx, "amulet", 70, 330 + changeY, 16, 16); + core.drawIcon(ctx, "jumpShoes", 70, 350 + changeY, 16, 16); + core.fillBoldText( + ctx, + "生命 " + core.formatBigNumber(heroInfo.hp, true), + 90, + 225 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + + core.fillBoldText( + ctx, + "攻击 " + core.formatBigNumber(heroInfo.atk), + 90, + 245 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "防御 " + core.formatBigNumber(heroInfo.def), + 90, + 265 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "法强 " + core.formatBigNumber(heroInfo.spell), + 90, + 285 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "法攻 " + core.formatBigNumber(heroInfo.matk), + 90, + 305 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "护盾 " + core.formatBigNumber(heroInfo.mhp), + 90, + 325 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "法抗 " + heroInfo.mdef + "%", + 90, + 345 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "速度 " + core.formatBigNumber(heroInfo.speed), + 90, + 365 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + + core.strokeRect(ctx, 112, 159 + changeY, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && heroDiffList[turn].hp < 0 ? + imagelighter(core.material.images.images["hero.webp"]) : + attack && heroDiffList[turn].hp > 0 ? + imagelighter( + core.material.images.images["hero.webp"], + "rgba(0, 255, 0, 0.5)" + ) : + core.material.images.images["hero.webp"]; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + 0, + 32, + 48, + 112, + 159 + changeY, + 32, + 48 + ); + + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + enemyInfo.name, + 289, + 148 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + + core.setTextAlign(ctx, "right"); + if (enemyInfo.cls === "enemys") { + core.strokeRect(ctx, 272, 175 + changeY, 32, 32, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 2), + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + 272, + 175 + changeY, + 32, + 32 + ); + } else { + core.strokeRect(ctx, 272, 159 + changeY, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + 272, + 159 + changeY, + 32, + 48 + ); + } + core.drawIcon(ctx, "hp", 330, 210 + changeY, 16, 16); + core.drawIcon(ctx, "atk", 330, 230 + changeY, 16, 16); + core.drawIcon(ctx, "def", 330, 250 + changeY, 16, 16); + core.drawIcon(ctx, "I374", 330, 270 + changeY, 16, 16); + core.drawIcon(ctx, "amulet", 330, 290 + changeY, 16, 16); + core.drawIcon(ctx, "jumpShoes", 330, 310 + changeY, 16, 16); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + " 生命", + 330, + 225 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.atk) + " 攻击", + 330, + 245 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.def) + " 防御", + 330, + 265 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + (enemyInfo.spell ?? 0) + " 法强", + 330, + 285 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + (enemyInfo.mdef ?? 0) * 100 + "% 法抗", + 330, + 305 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.speed) + " 速度", + 330, + 325 + changeY, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "简易模式", + 330, + 345 + changeY, + "#FFFF60", + "#000000", + "bold 16px Verdana" + ); + core.fillBoldText( + ctx, + flags.qukly ? "正常" : "极速", + 330, + 365 + changeY, + "#FFFF60", + "#000000", + "bold 16px Verdana" + ); + core.fillBoldText( + ctx, + "跳过", + 330, + 385 + changeY, + "#FFFF60", + "#000000", + "bold 16px Verdana" + ); + core.fillBoldText( + ctx, + "V", + 219, + 183 + changeY, + "#FFFFFF", + "#000000", + "bold 48px pala" + ); + core.fillBoldText( + ctx, + "s", + 231, + 183 + changeY, + "#FFFFFF", + "#000000", + "bold 36px pala" + ); + + if (!attack && !onAttack & !flags.qukly) enemyInfo.now += enemyInfo.speed; + let enemynow = Math.min(100 + (enemyInfo.now / oneTurn) * 215, 315); + ctx.fillStyle = "#FFFFFF"; + ctx.beginPath(); + ctx.moveTo(enemynow, 120 + changeY); + ctx.lineTo(enemynow + 5, 110 + changeY); + ctx.lineTo(enemynow - 5, 110 + changeY); + ctx.closePath(); + ctx.fill(); + core.drawIcon(ctx, 'T397', enemynow - 16, 84 + changeY, 32, 32) + + core.drawLine(ctx, 100, 125 + changeY, 315, 125 + changeY, "#FFFFFF", 5); + equipInfo.forEach(function (v) { + if (!attack && !onAttack) v.now += v.speed; + let vnow = Math.min(100 + (v.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(vnow, 120 + changeY); + ctx.lineTo(vnow + 5, 110 + changeY); + ctx.lineTo(vnow - 5, 110 + changeY); + ctx.closePath(); + + ctx.fill(); + + core.drawIcon(ctx, v.id, vnow - 16, 84 + changeY, 32, 32); + }); + if (!attack && !onAttack && !flags.qukly) heroInfo.now += hero.speed; + let heronow = Math.min(100 + (heroInfo.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(heronow, 120 + changeY); + ctx.lineTo(heronow + 5, 110 + changeY); + ctx.lineTo(heronow - 5, 110 + changeY); + ctx.closePath(); + + ctx.fill(); + core.drawIcon(ctx, 'T399', heronow - 16 - 4, 84 - 4 + changeY, 40, 40) + } + let nowattacking = false; + if (heroInfo.now >= oneTurn && !heroInfo.isAttack) { + heroInfo.onAttack = false; + heroInfo.isAttack = true; + nowattacking = true; + } + if (enemyInfo.now >= oneTurn && !enemyInfo.isAttack) { + enemyInfo.onAttack = false; + enemyInfo.isAttack = true; + nowattacking = true; + } + const equipanimate = []; + equipInfo.forEach((v) => { + if (v.now >= oneTurn && !v.isAttack) { + v.isAttack = true; + v.onAttack = false; + nowattacking = true; + equipanimate.push(v); + } + }); + if (!attack && nowattacking) { + let herodamage = enemyDiffList[turn].hp; + if (herodamage > 0) herodamage = "+" + herodamage; + let text = herodamage === 0 ? "抵抗" : herodamage; + + Dove.MorePerform.ShowDamagePop.PopDamage( + ctx, // 默认画布名称 + 270, // 英雄位置 x + 160 + changeY, // 英雄位置 y + text, // 伤害值 + 18, // 默认字体大小 + "Arial", //默认字体 + typeof text === "string" && text.startsWith("+") ? + "#22FF44" : + typeof text === "string" ? + "#FFFFFF" : + null, // 默认颜色 + text === "抵抗" ? "#000000" : null, // 默认描边颜色 + 0, // 默认水平速度 + -1, // 默认垂直速度 + 0, // 默认重力 + 90 // 默认显示时长(帧数) + ); + for (const v in enemyDiffList[turn]) { + enemyInfo[v] += enemyDiffList[turn][v]; + } + enemyanimateList[turn].forEach((v) => animateonAttack(v, true)); + let enemydamage = heroDiffList[turn].hp; + if (enemydamage > 0) enemydamage = "+" + enemydamage; + text = enemydamage === 0 ? "抵抗" : enemydamage; + Dove.MorePerform.ShowDamagePop.PopDamage( + ctx, // 默认画布名称 + 110, // 英雄位置 x + 160 + changeY, // 英雄位置 y + text, // 伤害值 + 18, // 默认字体大小 + "Arial", //默认字体 + typeof text === "string" && text.startsWith("+") ? + "#22FF44" : + typeof text === "string" ? + "#FFFFFF" : + null, // 默认颜色 + text === "抵抗" ? "#000000" : null, // 默认描边颜色 + 0, // 默认水平速度 + -1, // 默认垂直速度 + 0, // 默认重力 + 90 // 默认显示时长(帧数) + ); + for (const v in heroDiffList[turn]) { + heroInfo[v] += heroDiffList[turn][v]; + } + heroanimateList[turn].forEach((v) => animateonAttack(v, false)); + + if (enemyDiffList[turn] < 0) enemyInfo.inAttack = true; + if (heroDiffList[turn] < 0) heroInfo.inAttack = true; + if (heroInfo.hp < 0) heroInfo.hp = 0; + if (enemyInfo.hp < 0) enemyInfo.hp = 0; + await Promise.all([ + + await new Promise((resolve) => animationFrame(resolve)), + new Promise((resolve) => { + if (heroInfo.isAttack) { + heroInfo.now = 0; + heroInfo.isAttack = false; + } + resolve(); + }), + new Promise((resolve) => { + if (enemyInfo.isAttack) { + enemyInfo.now = 0; + enemyInfo.isAttack = false; + } + resolve(); + }), + new Promise((resolve) => { + if (equipanimate.length > 0) { + equipanimate.forEach((v) => { + v.now = 0; + v.isAttack = false; + }); + } + resolve(); + }), + new Promise((resolve) => { + turn++; + resolve(); + }), + ]); + + if (heroInfo.hp <= 0 || enemyInfo.hp <= 0) { + core.status.event.id = ""; + core.unregisterAnimationFrame("attackAnimate"); + core.clearMap(ctx); + core.closePanel(); + res(); + } + } + } + + core.registerAnimationFrame("attackAnimate", true, (temptime) => { + if (!time) time = temptime + farme = Math.floor((temptime - time) / (1000 / 60)) + time = temptime; + drawAttackAnimate( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + heroDiffList, + enemyDiffList, + heroanimateList, + enemyanimateList + ); + + + }); + }); + }; +}, + "剧情内容": function () { + // 每项为一个数组,第一项是名字,第二项是对话内容,第三项为音频文件名(没有则不需要第三项) + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + this.chapter000 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」", "aiy010000010.opus"], //小动物01 + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」", "aiy010000020.opus"], //小动物02 + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」", "aiy010000030.opus"], //小动物03 + ] + this.chapter001 = [ + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ] + this.chapter002 = [ + ["年轻人", "「放开我!」", "aiy710000010.opus"], //龙套1-01 + ["年轻人", "「我只是在帮那个女人而已!」", "aiy710000020.opus"], //龙套1-02 + ["年轻人", "「你们没听到吗!?」", "aiy710000030.opus"], //龙套1-03 + ["年轻人", "「她是被受骗才会被卖到娼馆来的」", "aiy710000040.opus"], //龙套1-04 + [ + "年轻人", + "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」", + "aiy710000050.opus", + ], //龙套1-05 + ["年轻人", "「给我说些什么啊」", "aiy710000060.opus"], //龙套1-06 + ["凯伊姆", "「这些话等到了娼馆再说吧」", "aiy310000010.opus"], //男主01 + ["凯伊姆", "「我来抓你,只是受雇于人而已」", "aiy310000020.opus"], //男主02 + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」", "aiy350000010.opus"], //金锁高官01 + ["奥兹", "「委托已经完成了吗?」", "aiy350000020.opus"], //金锁高官02 + ["凯伊姆", "「啊啊,是这家伙没错吧」", "aiy310000030.opus"], //男主03 + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」", "aiy350000030.opus"], //金锁高官03 + ["凯伊姆", "「是么」", "aiy310000040.opus"], //男主04 + ["年轻人", "「你,你们要对我做什么」", "aiy710000070.opus"], //龙套1-07 + ["奥兹", "「······」", "aiy350000040.opus"], //金锁高官04 + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」", "aiy350000050.opus"], //金锁高官05 + ["奥兹", "「都怪我们这边的年轻人太没用」", "aiy350000060.opus"], //金锁高官06 + ["凯伊姆", "「客套话就免了」", "aiy310000050.opus"], //男主05 + ["奥兹", "「这还真是失礼了」", "aiy350000070.opus"], //金锁高官07 + ["奥兹", "「喂,来个人」", "aiy350000080.opus"], //金锁高官08 + ["光头男人", "「是」", "aiy820000010.opus"], //龙套2-01 + ["奥兹", "「凯伊姆先生做完工作回来了」", "aiy350000090.opus"], //金锁高官09 + ["光头男人", "「是,是,那个······」", "aiy820000020.opus"], //龙套2-02 + ["奥兹", "「我是要你拿些酒来,这个蠢材!」", "aiy350000100.opus"], //金锁高官10 + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」", "aiy310000060.opus"], //男主06 + ["凯伊姆", "「我接下来要去《菲诺列塔》」", "aiy310000070.opus"], //男主07 + ["奥兹", "「喔唷」", "aiy350000110.opus"], //金锁高官11 + [ + "奥兹", + "「既然如此,我就不留您在这里喝难饮的劣质酒了」", + "aiy350000120.opus", + ], //金锁高官12 + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」", "aiy310000080.opus"], //男主08 + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」", "aiy350000130.opus"], //金锁高官13 + ["凯伊姆", "「无妨」", "aiy310000090.opus"], //男主09 + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」", "aiy310000100.opus"], //男主10 + [ + "奥兹", + "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」", + "aiy350000140.opus", + ], //金锁高官14 + [ + "奥兹", + "「正好,趁此机会凯伊姆先生也来享受一番如何?」", + "aiy350000150.opus", + ], //金锁高官15 + ["年轻人", "「你,你们这些家伙,要对她做什么!?」", "aiy710000080.opus"], //龙套1-08 + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」", "aiy710000090.opus"], //龙套1-09 + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + [ + "年轻人", + "「你们以为做出这种事······卫兵会坐视不理吗······」", + "aiy710000100.opus", + ], //龙套1-10 + ["奥兹", "「啊啊,不会坐视不理的」", "aiy350000160.opus"], //金锁高官16 + [ + "奥兹", + "「应该会拿出你的钱包,和我们商量如何瓜分吧」", + "aiy350000170.opus", + ], //金锁高官17 + ["年轻人", "「那,那种事······」", "aiy710000110.opus"], //龙套1-11 + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」", "aiy350000180.opus"], //金锁高官18 + ["", "男人点了点头。"], + [ + "奥兹", + "「为了被骗的女人而来到牢狱,真是个规矩人啊」", + "aiy350000190.opus", + ], //金锁高官19 + ["奥兹", "「······前提是,被骗的人不是你」", "aiy350000200.opus"], //金锁高官20 + ["年轻人", "「你说······我被骗了?」", "aiy710000120.opus"], //龙套1-12 + ["年轻人", "「那,那是怎么回事!?」", "aiy710000130.opus"], //龙套1-13 + ["奥兹", "「不用急,今天晚上会好好告诉你的」", "aiy350000210.opus"], //金锁高官21 + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」", "aiy310000110.opus"], //男主11 + ["奥兹", "「好的,下次再麻烦您」", "aiy350000220.opus"], //金锁高官22 + ["奥兹", "「之后吉克先生会将谢礼交给您的」", "aiy350000230.opus"], //金锁高官23 + ["凯伊姆", "「啊啊」", "aiy310000120.opus"], //男主12 + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」", "aiy310000130.opus"], //男主13 + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」", "aiy310000140.opus"], //男主14 + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」", "aiy020000005.opus"], //医生00.5 + ["艾莉斯", "「正好,我还想要去找你呢」", "aiy020000010.opus"], //医生01 + [ + "艾莉斯", + "「没想到凯伊姆会主动出现······这是命运吗?」", + "aiy020000020.opus", + ], //医生02 + ["凯伊姆", "「显然不是吧」", "aiy310000150.opus"], //男主15 + ["艾莉斯", "「啊,是么」", "aiy020000030.opus"], //医生03 + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」", "aiy020000040.opus"], //医生04 + ["艾莉斯", "「如果想要的话就给你吧?」", "aiy020000050.opus"], //医生05 + ["凯伊姆", "「用不着」", "aiy310000160.opus"], //男主16 + ["艾莉斯", "「阿拉,可惜」", "aiy020000060.opus"], //医生06 + ["凯伊姆", "「那么,找我有什么事」", "aiy310000170.opus"], //男主17 + ["艾莉斯", "「梅尔特的钱好像被偷了」", "aiy020000070.opus"], //医生07 + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」", "aiy310000180.opus"], //男主18 + ["艾莉斯", "「不要对我说啊」", "aiy020000080.opus"], //医生08 + [ + "凯伊姆", + "「那家伙,该不会说要让我去抓那个小偷吧?」", + "aiy310000190.opus", + ], //男主19 + ["艾莉斯", "「就是这样」", "aiy020000090.opus"], //医生09 + ["凯伊姆", "「笨蛋吗」", "aiy310000200.opus"], //男主20 + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」", "aiy310000210.opus"], //男主21 + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」", "aiy020000100.opus"], //医生10 + ["凯伊姆", "「你说什么?」", "aiy310000220.opus"], //男主22 + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」", "aiy020000110.opus"], //医生11 + ["凯伊姆", "「知道了,我去找」", "aiy310000230.opus"], //男主23 + ["凯伊姆", "「小偷的特征呢」", "aiy310000240.opus"], //男主24 + ["艾莉斯", "「男孩子」", "aiy020000120.opus"], //医生12 + ["艾莉斯", "「······而且,背后有翅膀」", "aiy020000130.opus"], //医生13 + [ + "艾莉斯", + "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」", + "aiy020000140.opus", + ], //医生14 + ["凯伊姆", "「羽化病吗」", "aiy310000250.opus"], //男主25 + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + "aiy020000150.opus", + ], //医生15 + ["凯伊姆", "「注意到他逃窜的方向了吗?」", "aiy310000260.opus"], //男主26 + ["艾莉斯", "「广场那边」", "aiy020000160.opus"], //医生16 + [ + "艾莉斯", + "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」", + "aiy020000170.opus", + ], //医生17 + ["凯伊姆", "「偏偏还是广场吗」", "aiy310000280.opus"], //男主28 + ["艾莉斯", "「今天是觐见圣女大人的日子」", "aiy020000180.opus"], //医生18 + ["凯伊姆", "「我知道」", "aiy310000290.opus"], //男主29 + ["凯伊姆", "「尽量找找看就好」", "aiy310000300.opus"], //男主30 + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」", "aiy860000010.ogg"], + [ + "不蚀金锁成员", + "「您已经和艾莉斯大夫见过面了吗?」", + "aiy860000020.ogg", + ], + ["凯伊姆", "「啊啊,所以才会追过来的」", "aiy310000310.ogg"], //男主31 + ["凯伊姆", "「看到小偷了吗?」", "aiy310000320.ogg"], //男主32 + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + "aiy860000030.ogg", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + "aiy860000040.ogg", + ], + ["不蚀金锁成员", "「我已经准备撤退了」", "aiy860000050.ogg"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」", "aiy860000060.ogg"], + ["凯伊姆", "「啊啊」", "aiy310000330.ogg"], //男主33 + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」", "aiy310000340.ogg"], //男主34 + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」", "aiy440000010.ogg"], //神官01 + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + "aiy440000020.ogg", + ], //神官02 + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + "aiy440000030.ogg", + ], //神官03 + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + "aiy440000040.ogg", + ], //神官04 + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + "aiy440000050.ogg", + ], //神官05 + [ + "神官", + "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」", + "aiy440000060.ogg", + ], //神官06 + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」", "aiy030000010.ogg"], //圣女01 + ["圣女", "「与我一起,向神虔诚地祈祷吧」", "aiy030000020.ogg"], //圣女02 + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」", "aiy310000350.ogg"], //男主35 + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」", "aiy510000010.ogg"], + ["围观的女人", "「羽,羽化病人!?」", "aiy510000020.ogg"], + ["围观的中年人", "「喂,谁去叫下羽狩」", "aiy720000010.ogg"], + [ + "惊慌的观众", + "「你这家伙不要靠近我,要是传染了可怎么办」", + "aiy730000010.ogg", + ], + ["粗鲁的观众", "「你这小鬼赶快滚开」", "aiy740000010.ogg"], + ["凯伊姆", "「接下来」", "aiy310000360.ogg"], //男主36 + ["圣女", "「发生什么事了?看上去似乎很嘈杂」", "aiy030000030.ogg"], //圣女03 + [ + "随从", + "「似乎是某个人逃跑了······具体的我也不是很清楚」", + "aiy130000010.ogg", + ], //侍从01 + [ + "神官", + "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」", + "aiy440000070.ogg", + ], //神官07 + [ + "圣女", + "「不用在意我,比起那个,我更关心究竟发生了什么事」", + "aiy030000050.ogg", + ], //圣女05 + ["神官", "「对不起,我真的不知道」", "aiy440000080.ogg"], //神官08 + ["圣女", "「······是吗」", "aiy030000060.ogg"], //圣女06 + ["男", "「恕我僭越,请准许我说明情况」", "aiy320000010.ogg"], //男主他哥01 + ["男", "「在来觐见的人群中出现了《羽化病》的患者」", "aiy320000020.ogg"], //男主他哥02 + ["男", "「围观的人群因而产生了骚动」", "aiy320000030.ogg"], //男主他哥03 + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + "aiy320000040.ogg", + ], //男主他哥04 + ["圣女", "「羽化病······」", "aiy030000070.ogg"], //圣女07 + ["男", "「怎么了?」", "aiy320000050.ogg"], //男主他哥05 + ["圣女", "「没什么」", "aiy030000080.ogg"], //圣女08 + ["圣女", "「辛苦了,你的名字是?」", "aiy030000090.ogg"], //圣女09 + [ + "男", + "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」", + "aiy320000060.ogg", + ], //男主他哥06 + [ + "神官", + "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」", + "aiy440000090.ogg", + ], //神官09 + ["神官", "「阁下是在工作上相当出色的人呢」", "aiy440000100.ogg"], //神官10 + ["鲁基乌斯", "「不敢当」", "aiy320000070.ogg"], //男主他哥07 + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + "aiy320000080.ogg", + ], //男主他哥08 + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + "aiy030000100.ogg", + ], //圣女10 + ["鲁基乌斯", "「属下不胜惶恐」", "aiy320000090.ogg"], //男主他哥09 + [ + "鲁基乌斯", + "「接下来属下还要回到工作岗位上,在这里就先告退了」", + "aiy320000100.ogg", + ], //男主他哥10 + ["圣女", "「鲁基乌斯先生」", "aiy030000110.ogg"], //圣女11 + ["鲁基乌斯", "「属下在」", "aiy320000110.ogg"], //男主他哥11 + ["圣女", "「你是怎样看待羽狩的工作的呢?」", "aiy030000120.ogg"], //圣女12 + ["神官", "「圣,圣女大人」", "aiy440000110.ogg"], //神官11 + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + "aiy320000120.ogg", + ], //男主他哥12 + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」", "aiy440000120.ogg"], //神官12 + ["圣女", "「是吗。辛苦你了」", "aiy030000130.ogg"], //圣女13 + ["随从", "「圣女大人······」", "aiy130000020.ogg"], //侍从02 + ["鲁基乌斯", "「······」", "aiy320000135.ogg"], //男主他哥13 + ["鲁基乌斯", "「那么,属下就回岗位去了」", "aiy320000140.ogg"], //男主他哥14 + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」", "aiy310000370.ogg"], //男主37 + ["羽化病患少年", "「稀!?」", "aiy750000010.ogg"], + ["凯伊姆", "「逃到贫民区是个不错的想法」", "aiy310000380.ogg"], //男主38 + ["羽化病患少年", "「你,你是,羽狩吗?」", "aiy750000020.ogg"], + ["凯伊姆", "「不是」", "aiy310000390.ogg"], //男主39 + [ + "羽化病患少年", + "「什,什么啊······混蛋,不要吓我啊」", + "aiy750000030.ogg", + ], + ["凯伊姆", "「我对令你受惊这件事致以歉意」", "aiy310000400.ogg"], //男主40 + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」", "aiy310000410.ogg"], //男主41 + ["羽化病患少年", "「钱?你在说什么」", "aiy750000040.ogg"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」", "aiy310000420.ogg"], //男主42 + ["羽化病患少年", "「哎?」", "aiy750000050.ogg"], + ["羽化病患少年", "「呃呀」", "aiy750000060.ogg"], + ["羽化病患少年", "「你······你这混蛋」", "aiy750000070.ogg"], + ["凯伊姆", "「······」", "aiy310000430.ogg"], //男主43 + ["凯伊姆", "「把偷的钱交出来」", "aiy310000440.ogg"], //男主44 + ["羽化病患少年", "「我不知道你在······咕」", "aiy750000080.ogg"], + [ + "羽化病患少年", + "「你,你说是我偷的······有什么证据吗」", + "aiy750000090.ogg", + ], + ["凯伊姆", "「你还挺倔的啊」", "aiy310000450.ogg"], //男主45 + ["凯伊姆", "「不过,给我听好了」", "aiy310000460.ogg"], //男主46 + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」", "aiy310000470.ogg"], //男主47 + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」", "aiy310000480.ogg"], //男主48 + ["羽化病患少年", "「吉克?」", "aiy750000100.ogg"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」", "aiy310000490.ogg"], //男主49 + ["羽化病患少年", "「哎?哎?怎么会······」", "aiy750000110.ogg"], + ["凯伊姆", "「再问你一遍,钱在哪里?」", "aiy310000510.ogg"], //男主51 + ["羽化病患少年", "「是,是,是,在我的怀里」", "aiy750000120.ogg"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」", "aiy310000520.ogg"], //男主52 + ["羽化病患少年", "「是,是的」", "aiy7500000130.ogg"], + [ + "羽化病患少年", + "「那,那个,您是《不蚀金锁》的人吗?」", + "aiy750000140.ogg", + ], + ["凯伊姆", "「算是吧」", "aiy310000530.ogg"], //男主53 + [ + "羽化病患少年", + "「我什么都可以做,请您一定要帮帮我」", + "aiy750000150.ogg", + ], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」", "aiy310000540.ogg"], //男主54 + [ + "羽化病患少年", + "「我什么······什么,都会做的······」", + "aiy750000160.ogg", + ], + ["羽化病患少年", "「我一直都是生活在下层的」", "aiy750000170.ogg"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + "aiy750000180.ogg", + ], + [ + "羽化病患少年", + "「被寄宿工作的店赶了出来,只得流落到牢狱这里」", + "aiy750000190.ogg", + ], + [ + "羽化病患少年", + "「因为独自实在是饿的不行了,所以才会偷这些钱的」", + "aiy750000200.ogg", + ], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + "aiy750000210.ogg", + ], + ["凯伊姆", "「谁知道」", "aiy310000550.ogg"], //男主55 + [ + "羽化病患少年", + "「呜······呜呜······接下来,要对我做什么?」", + "aiy750000220.ogg", + ], + ["凯伊姆", "「我要把你带到组织那里」", "aiy310000560.ogg"], //男主56 + ["羽化病患少年", "「怎,怎么这样」", "aiy750000230.ogg"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」", "aiy310000570.ogg"], //男主57 + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」", "aiy310000580.ogg"], //男主58 + ["羽化病患少年", "「那么,是要放我逃走吗?」", "aiy750000240.ogg"], + ["凯伊姆", "「我要让你学到教训」", "aiy310000590.ogg"], //男主59 + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」", "aiy310000600.ogg"], //男主60 + ["凯伊姆", "「你的运气不错」", "aiy310000610.ogg"], //男主61 + ["羽化病患少年", "「唔······啊,是的······」", "aiy750000250.ogg"], + ["凯伊姆", "「滚」", "aiy310000620.ogg"], //男主62 + ["羽化病患少年", "「非常感谢」", "aiy750000260.ogg"], + ["羽化病患少年", "「唔啊!?」", "aiy750000270.ogg"], + ["男", "「到这里就结束了,羽化病人」", "aiy430000010.ogg"], //兰格01 + ["男", "「确认他的翅膀」", "aiy430000020.ogg"], //兰格02 + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的指挥者", "「那边的那个人」", "aiy430000030.ogg"], //兰格03 + ["凯伊姆", "「······有什么事?」", "aiy310000630.ogg"], //男主63 + ["羽狩的指挥者", "「可以稍微让我问几句话吗」", "aiy430000040.ogg"], //兰格04 + ["凯伊姆", "「······」", "aiy310000640.ogg"], //男主64 + ["凯伊姆", "「啊啊,无妨」", "aiy310000650.ogg"], //男主65 + ["羽狩的指挥者", "「感谢您的合作」", "aiy430000050.ogg"], //兰格05 + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」", "aiy430000060.ogg"], //兰格06 + ["羽化病患少年", "「不要······请原谅,我······」", "aiy750000280.ogg"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + "aiy430000070.ogg", + ], //兰格07 + ["羽化病患少年", "「可是,可是」", "aiy750000290.ogg"], + ["羽狩的副队长", "「没关系的」", "aiy430000080.ogg"], //兰格08 + ["羽化病患少年", "「······哥,哥哥」", "aiy750000300.ogg"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」", "aiy430000090.ogg"], //兰格09 + ["凯伊姆", "「只是路人而已」", "aiy310000660.ogg"], //男主66 + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」", "aiy310000670.ogg"], //男主67 + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + "aiy430000100.ogg", + ], //兰格10 + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」", "aiy430000110.ogg"], //兰格11 + ["凯伊姆", "「我表示同情」", "aiy310000680.ogg"], //男主68 + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」", "aiy310000690.ogg"], //男主69 + ["羽狩的副队长", "「嘛,不要这么慌张」", "aiy430000120.ogg"], //兰格12 + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」", "aiy430000130.ogg"], //兰格13 + ["羽化病患少年", "「没,没有」", "aiy750000310.ogg"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + "aiy430000140.ogg", + ], //兰格14 + ["羽化病患少年", "「······」", "aiy750000320.ogg"], + [ + "羽化病患少年", + "「那个人,是《不蚀金锁》的组织成员······」", + "aiy750000330.ogg", + ], + [ + "羽化病患少年", + "「突然说让我拿出钱来,我刚一拒绝他就打我」", + "aiy750000340.ogg", + ], + ["羽狩的副队长", "「原来如此······」", "aiy430000150.ogg"], //兰格15 + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + "aiy430000160.ogg", + ], //兰格16 + ["凯伊姆", "「当然不是」", "aiy310000700.ogg"], //男主70 + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」", "aiy310000710.ogg"], //男主71 + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」", "aiy430000170.ogg"], //兰格17 + ["凯伊姆", "「啊啊」", "aiy310000720.ogg"], //男主72 + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + "aiy310000730.ogg", + ], //男主73 + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」", "aiy430000180.ogg"], //兰格18 + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + "aiy430000190.ogg", + ], //兰格19 + ["凯伊姆", "「真是辛苦啊」", "aiy310000740.ogg"], //男主74 + ["羽狩的副队长", "「说的是啊」", "aiy430000200.ogg"], //兰格20 + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」", "aiy430000210.ogg"], //兰格21 + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + "aiy430000220.ogg", + ], //兰格22 + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + "aiy430000230.ogg", + ], //兰格23 + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」", "aiy430000240.ogg"], //兰格24 + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」", "aiy310000750.ogg"], //男主75 + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + "aiy310000760.ogg", + ], //男主76 + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」", "aiy430000250.ogg"], //兰格25 + ["凯伊姆", "「······」", "aiy310000770.ogg"], //男主77 + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」", "aiy050000010.ogg"], //菲奥奈01 + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」", "aiy430000260.ogg"], //兰格26 + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + "aiy050000020.ogg", + ], //菲奥奈02 + ["兰格副队长", "「我并没有打算去恫吓他······」", "aiy430000270.ogg"], //兰格27 + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」", "aiy050000030.ogg"], //菲奥奈03 + ["羽狩的队长", "「我会去探望他的」", "aiy050000040.ogg"], //菲奥奈04 + ["兰格副队长", "「那个是······」", "aiy430000280.ogg"], //兰格28 + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」", "aiy050000050.ogg"], //菲奥奈05 + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」", "aiy050000060.ogg"], //菲奥奈06 + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」", "aiy050000070.ogg"], //菲奥奈07 + ["兰格副队长", "「我会铭记在心」", "aiy430000290.ogg"], //兰格29 + ["羽狩的队长", "「这位先生,我的部下失礼了」", "aiy050000080.ogg"], //菲奥奈08 + ["凯伊姆", "「只要不对我再来一次就好」", "aiy310000780.ogg"], //男主78 + ["羽狩的队长", "「请稍等」", "aiy050000090.ogg"], //菲奥奈09 + ["凯伊姆", "「有什么事?」", "aiy310000790.ogg"], //男主79 + ["羽狩的队长", "「我想确认一件事」", "aiy050000100.ogg"], //菲奥奈10 + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」", "aiy050000110.ogg"], //菲奥奈11 + ["凯伊姆", "「真的」", "aiy310000800.ogg"], //男主80 + ["凯伊姆", "「如果我说是的话,你有什么打算?」", "aiy310000810.ogg"], //男主81 + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」", "aiy050000120.ogg"], //菲奥奈12 + ["凯伊姆", "「······这样啊」", "aiy310000820.ogg"], //男主82 + ["凯伊姆", "「如果能有收获就好了啊」", "aiy310000830.ogg"], //男主83 + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」", "aiy120000020.ogg"], //老板娘01,文件序号是以2开始,后续全部加1 + ["梅尔特", "「辛苦了」", "aiy120000030.ogg"], //老板娘02 + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」", "aiy120000040.ogg"], //老板娘03 + ["凯伊姆", "「没什么,比想象中完成的更容易」", "aiy310000840.ogg"], //男主84 + ["梅尔特", "「那就好」", "aiy120000050.ogg"], //老板娘04 + ["梅尔特", "「这是我的一点谢意」", "aiy120000060.ogg"], //老板娘05 + ["凯伊姆", "「味道有些变化啊」", "aiy310000850.ogg"], //男主85 + ["梅尔特", "「啊,被发现了?」", "aiy120000070.ogg"], //老板娘06 + ["梅尔特", "「最近,没能到手什么好的原料呢」", "aiy120000080.ogg"], //老板娘07 + ["凯伊姆", "「去拜托吉克如何?」", "aiy310000860.ogg"], //男主86 + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + "aiy120000090.ogg" + ], //老板娘08 + ["凯伊姆", "「那希望你也不要来麻烦我」", "aiy310000870.ogg"], //男主87 + ["梅尔特", "「那 是 两 码 事」", "aiy120000100.ogg"], //老板娘09 + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」", "aiy120000110.ogg"], //老板娘10 + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆以外的其他人都说不出口」", + "aiy120000120.ogg" + ], //老板娘11 + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」", "aiy310000880.ogg"], //男主88 + ["梅尔特", "「这是面子问题啊,面子问题」", "aiy120000130.ogg"], //老板娘12 + ["凯伊姆", "「嘛,算了」", "aiy310000890.ogg"], //男主89 + ["凯伊姆", "「这样就好了吧?」", "aiy310000900.ogg"], //男主90 + ["梅尔特", "「这是钱包呢」", "aiy120000140.ogg"], //老板娘13 + ["梅尔特", "「嗯,东西没少」", "aiy120000150.ogg"], //老板娘14 + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」", "aiy120000160.ogg"], //老板娘15 + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」", "aiy120000170.ogg"], //老板娘16 + ["凯伊姆", "「在那边不是来钱更快吗?」", "aiy310000910.ogg"], //男主91 + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」", "aiy120000180.ogg"], //老板娘17 + ["凯伊姆", "「这是客套话而已」", "aiy310000920.ogg"], //男主92 + ["梅尔特", "「欺负人」", "aiy120000190.ogg"], //老板娘18 + ["梅尔特", "「总而言之,今天帮大忙了」", "aiy120000200.ogg"], //老板娘19 + ["梅尔特", "「谢礼嘛······」", "aiy120000210.ogg"], //老板娘20 + ["凯伊姆", "「就记在账单上吧」", "aiy310000930.ogg"], //男主93 + ["梅尔特", "「了解—盛谢惠顾了哦?」", "aiy120000220.ogg"], //老板娘21 + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」", "aiy340000010.ogg"], //吉克01 + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。", "aiy340000020.ogg"], //吉克02 + ["凯伊姆", "「不用介意」", "aiy310000940.ogg"], //男主94 + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」", "aiy310000950.ogg"], //男主95 + ["吉克", "「嗯?已经不在这个世上了」。", "aiy340000030.ogg"], //吉克03 + ["吉克", "「有什么想要知道的事吗?」", "aiy340000040.ogg"], //吉克04 + ["凯伊姆", "「不,没什么」", "aiy310000960.ogg"], //男主96 + ["吉克", "「那个无聊的家伙,完全没有趣味呢」", "aiy340000050.ogg"], //吉克05 + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」", "aiy340000060.ogg"], //吉克06 + ["凯伊姆", "「真是灾难啊」", "aiy310000970.ogg"], //男主97 + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」", "aiy340000070.ogg"], //吉克07 + ["凯伊姆", "「消息真灵通」", "aiy310000980.ogg"], //男主98 + ["吉克", "「梅尔特也注意点」", "aiy340000080.ogg"], //吉克08 + ["吉克", "「你丢钱已经不是一回两回了」", "aiy340000090.ogg"], //吉克09 + ["梅尔特", "「好的—我会注意的。」", "aiy120000230.ogg"], //老板娘22 + ["梅尔特", "「吉克还是平常的点单吧」", "aiy120000240.ogg"], //老板娘23 + ["梅尔特", "「凯伊姆要再来一杯吗?」", "aiy120000250.ogg"], //老板娘24 + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」", "aiy340000100.ogg"], //吉克10 + ["凯伊姆", "「下次有什么事再告诉我」", "aiy310000990.ogg"], //男主99 + ["梅尔特", "「来,久等了」", "aiy120000260.ogg"], //老板娘25 + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」", "aiy310001000.ogg"], //男主100 + ["吉克", "「让我猜猜看」", "aiy340000110.ogg"], //吉克11 + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」", "aiy340000120.ogg"], //吉克12 + ["梅尔特", "「可惜—」", "aiy120000270.ogg"], //老板娘26 + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」", "aiy120000280.ogg"], //老板娘27 + ["凯伊姆", "「完全把你当成新进的女佣了么」", "aiy310001010.ogg"], //男主101 + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」", "aiy120000290.ogg"], //老板娘28 + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」", "aiy120000300.ogg"], //老板娘29 + ["凯伊姆&吉克", "「你傻啊」", "aiy310001027.ogg"], //男主102.7,吉克13.5 + ["梅尔特", "「异口同声呢,不亏是兄弟」", "aiy120000310.ogg"], //老板娘30 + ["凯伊姆", "「别用这种称呼,怪恶心的」", "aiy310001030.ogg"], //男主103 + ["吉克", "「说得没错」", "aiy340000140.ogg"], //吉克14 + ["吉克", "「······说起来······」", "aiy340000150.ogg"], //吉克15 + ["梅尔特", "「怎么了?」", "aiy120000320.ogg"], //老板娘31 + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」", "aiy340000160.ogg"], //吉克16 + ["凯伊姆", "「你也说这么无聊的话题」", "aiy310001040.ogg"], //男主104 + ["吉克", "「不,这是很重要的事情」", "aiy340000170.ogg"], //吉克17 + ["吉克", "「梅尔特,事实是怎么样的?」", "aiy340000180.ogg"], //吉克18 + ["梅尔特", "「啊~是怎么样的呢~」", "aiy120000330.ogg"], //老板娘32 + ["梅尔特", "「我忘记了」", "aiy120000340.ogg"], //老板娘33 + ["吉克", "「骗人」", "aiy340000190.ogg"], //吉克19 + ["梅尔特", "「我说真的」", "aiy120000350.ogg"], //老板娘34 + ["梅尔特", "「嘛,如果想起来了的话,就算是卸载艺术上我也会公诸于众的」", "aiy120000360.ogg"], //老板娘35 + ["吉克", "「喔唷」", "aiy340000200.ogg"], //吉克20 + ["吉克", "「那么,我就不能比你先死了啊」", "aiy340000210.ogg"], //吉克21 + ["梅尔特", "「蒙你费心」", "aiy120000370.ogg"], //老板娘36 + ["梅尔特", "「顺带一提,有传言说吃过我们这里的料理后可以长生不老哦?」", "aiy120000380.ogg"], //老板娘37 + ["吉克", "「好,来两份炖菜,记得加腊肠」", "aiy340000220.ogg"], //吉克22 + ["梅尔特", "「多谢惠顾」", "aiy120000390.ogg"], //老板娘38 + ["", "微微一笑后,梅尔特去厨房传达点单。"], + ["凯伊姆", "「吉克······」", "aiy310001050.ogg"], //男主105 + ["吉克", "「啊,不好了」", "aiy340000230.ogg"], //吉克23 + ["凯伊姆", "「话题扯远了」", "aiy310001060.ogg"], //男主106 + ["梅尔特", "「什么话题来着?」", "aiy120000400.ogg"], //老板娘39 + ["凯伊姆", "「关于为什么你的钱会被偷这件事」", "aiy310001070.ogg"], //男主107 + ["凯伊姆", "「丢钱的时候以你来说,应该不会全无察觉吧?」", "aiy310001080.ogg"], //男主108 + ["梅尔特", "「算是吧,被偷的时候确实也想过要抓住他」", "aiy120000410.ogg"], //老板娘40 + ["梅尔特", "「但是,我注意到了那个孩子背后的鼓起呢」", "aiy120000420.ogg"], //老板娘41 + ["凯伊姆", "「所以就不由自主地放他逃跑了?」", "aiy310001090.ogg"], //男主109 + ["吉克", "「就算你想羽化病人施恩,也不会得到任何回报哦」", "aiy340000240.ogg"], //吉克24 + ["梅尔特", "「我知道」", "aiy120000430.ogg"], //老板娘42 + ["梅尔特", "「正因为知道,所以之后才会拜托凯伊姆去将钱取回的」", "aiy120000440.ogg"], //老板娘43 + ["梅尔特", "「可是,呢······」", "aiy120000450.ogg"], //老板娘44 + ["梅尔特", "「果然还是很矛盾呢」", "aiy120000460.ogg"], //老板娘45 + ["梅尔特", "「明明是自己放他逃跑的,之后又拜托别人去抓他」", "aiy120000470.ogg"], //老板娘46 + ["梅尔特", "「但是,在那一刹那······应该说是,突然露出了真心吧」", "aiy120000480.ogg"], //老板娘47 + ["梅尔特", "「真的,只是自我满足而已」", "aiy120000490.ogg"], //老板娘48 + ["凯伊姆", "「对于那个孩子来说不是很幸运么」", "aiy310001100.ogg"], //男主110 + ["凯伊姆", "「在被《不蚀金锁》抓到之前,就被羽狩保护了」", "aiy310001110.ogg"], //男主111 + ["凯伊姆", "「现在应该已经躺在治愈院的床上了」", "aiy310001120.ogg"], //男主112 + ["吉克", "「如果被我们抓到的话,嘛,至少也会断掉一根胳膊吧」", "aiy340000250.ogg"], //吉克25 + ["凯伊姆", "「比起失去胳膊,这不是个很好地结局吗」", "aiy310001130.ogg"], //男主113 + ["吉克", "「多亏梅尔特的一念之善,那个小子的胳膊被救下来了」", "aiy340000260.ogg"], //吉克26 + ["吉克", "「对我来说,不能去管教他稍微有点可惜就是了」", "aiy340000270.ogg"], //吉克27 + ["凯伊姆", "「我姑且是给了他两三拳」", "aiy310001140.ogg"], //男主114 + ["吉克", "「你这不是很善解人意么」", "aiy340000280.ogg"], //吉克28 + ["梅尔特", "「没有帮他的忙啊」", "aiy120000500.ogg"], //老板娘49 + ["凯伊姆", "「你给我用常识考虑考虑」", "aiy310001150.ogg"], //男主115 + ["梅尔特", "「本来,就算羽化病人不被羽狩带走而导致羽化病扩散,在牢狱里死亡的理由也要多少就有多少」", "aiy120000510.ogg"], //老板娘50 + ["梅尔特", "「没事到如今多一个病人,也不会有什么改变的吧」", "aiy120000520.ogg"], //老板娘51 + ["梅尔特", "「那么,那么些羽化病人为什么就不能和我们一起开心地生活呢」", "aiy120000530.ogg"], //老板娘52 + ["吉克", "「像梅尔特这样思考的人少之又少」", "aiy340000290.ogg"], //吉克29 + ["凯伊姆", "「就算早晚都会死去,为了今日的苟活而努力拼搏也是人之常情」", "aiy310001160.ogg"], //男主116 + ["梅尔特", "「我知道」", "aiy120000540.ogg"], //老板娘53 + ["梅尔特", "「别介意,我刚才只是顺口说说」", "aiy120000550.ogg"], //老板娘54 + ["", "喀啷喀啷"], + ["梅尔特", "「辛苦了,艾莉斯」", "aiy120000560.ogg"], //老板娘55 + ["艾莉斯", "「嗯」", "aiy020000190.ogg"], //医生19 + ["", "用不可爱的声音随口回应后,艾莉斯理所当然般地在我左边的座位坐下"], + ["", "梅尔特什么都没有问,就开始准备起茶来"], + ["梅尔特", "「多亏你去帮忙叫凯伊姆了呢」", "aiy120000570.ogg"], //老板娘56 + ["艾莉斯", "「不客气」", "aiy020000200.ogg"], //医生20 + ["艾莉斯", "「我从店里出去以后不久就看到他了,这是我们被命运之绳紧紧相连的证明呢」", "aiy020000210.ogg"], //医生21 + ["凯伊姆", "「那还真是糟糕」", "aiy310001170.ogg"], //男主117 + ["艾莉斯", "「用不着这么害羞的」", "aiy020000220.ogg"], //医生22 + ["凯伊姆", "「用茶堵上你的嘴吧」", "aiy310001180.ogg"], //男主118 + ["艾莉斯", "「好」", "aiy020000230.ogg"], //医生23 + ["梅尔特", "「司空见惯的风景呢」", "aiy120000580.ogg"], //老板娘57 + ["凯伊姆", "「你在那之后去做什么了?」", "aiy310001190.ogg"], //男主119 + ["艾莉斯", "「去莉莉乌姆照顾患病的女孩子了」", "aiy020000240.ogg"], //医生24 + ["艾莉斯", "「好像是毒品上瘾,费了很大劲才止住她的胡闹」", "aiy020000250.ogg"], //医生25 + ["艾莉斯", "「希望你能好好管理下自己店里的娼妇呢」", "aiy020000260.ogg"], //医生26 + ["吉克", "「抱歉啊」", "aiy340000300.ogg"], //吉克30 + ["吉克", "「为表歉意,就让我来给艾莉斯诊疗一下吧」", "aiy340000310.ogg"], //吉克31 + ["艾莉斯", "「去死吧」", "aiy020000270.ogg"], //医生27 + ["梅尔特", "「是什么药?」", "aiy120000590.ogg"], //老板娘58 + ["吉克", "「是最近上市的一种药」", "aiy340000320.ogg"], //吉克32 + ["吉克", "「虽然中毒的可能性很低,但只要中毒便会一发而不可收拾」", "aiy340000330.ogg"], //吉克33 + ["艾莉斯", "「知道了」", "aiy020000280.ogg"], //医生28 + ["吉克", "「虽然我也许没有时间去管教她,不过我还是会注意的」", "aiy340000340.ogg"], //吉克34 + ["艾莉斯", "「毒药的主人是吉克吗?」", "aiy020000290.ogg"], //医生29 + ["吉克", "「《不蚀金锁》不卖药,这是从先代定下的规矩」", "aiy340000350.ogg"], //吉克35 + ["艾莉斯", "「抱歉,开玩笑的」", "aiy020000300.ogg"], //医生30 + ["吉克", "「关于药的出处,这边也会调查的」", "aiy340000360.ogg"], //吉克36 + ["吉克", "「如果有什么传闻的话记得告诉我」", "aiy340000370.ogg"], //吉克37 + ["艾莉斯", "「知道了」", "aiy020000310.ogg"], //医生31 + ["艾莉斯", "「麻药中毒的人真麻烦呢,又不能完全治好」", "aiy020000320.ogg"], //医生32 + ["艾莉斯", "「既然要悄悄的打,那就也悄悄地去死不就好了」", "aiy020000330.ogg"], //医生33 + ["", "喀啷喀啷"], + ["奥兹", "「吉克大人,抱歉打扰你开心的时光」", "aiy350000240.ogg"], //金锁高官24 + ["吉克", "「怎么了」", "aiy340000380.ogg"], //吉克38 + ["奥兹", "「请将耳朵凑过来」", "aiy350000250.ogg"], //金锁高官25 + ["吉克", "「······知道了」", "aiy340000390.ogg"], //吉克39 + ["吉克", "「凯伊姆,一会到娼馆来一趟」", "aiy340000400.ogg"], //吉克40 + ["凯伊姆", "「啊啊」", "aiy310001200.ogg"], //男主120 + ["吉克", "「噢,我都给忘了」", "aiy340000410.ogg"], //吉克41 + ["吉克", "「让这里的大家都开心一下」", "aiy340000420.ogg"], //吉克42 + ["梅尔特", "「收到」", "aiy120000600.ogg"], //老板娘59 + ["吉克", "「我走了」", "aiy340000430.ogg"], //吉克43 + ["奥兹", "「好」", "aiy350000260.ogg"], //金锁高官26 + ["", "梆梆"], + ["梅尔特", "「大家静静,有个好消息」", "aiy120000610.ogg"], //老板娘60 + ["梅尔特", "「今天有个『大人物』要请客哦」", "aiy120000620.ogg"], //老板娘61 + ["艾莉斯", "「吉克还是一如既往的大方」", "aiy020000340.ogg"], //医生34 + ["梅尔特", "「果然,头目就应该像这样呢」", "aiy120000630.ogg"], //老板娘62 + ["凯伊姆", "「他的做法是继承先代的」", "aiy310001210.ogg"], //男主121 + ["梅尔特", "「又来了又来了」", "aiy120000640.ogg"], //老板娘63 + ["梅尔特", "「他想要赶上先代还早了十年呢」", "aiy120000650.ogg"], //老板娘64 + ["凯伊姆", "「有些太严厉了吧」", "aiy310001220.ogg"], //男主122 + ["艾莉斯", "「说起来,吉克有什么事」", "aiy020000350.ogg"], //医生35 + ["梅尔特", "「既然要叫上凯伊姆,再怎么说也不是什么小事吧?」", "aiy120000670.ogg"], //老板娘66 + ["凯伊姆", "「说的也是」", "aiy310001230.ogg"], //男主123 + ["艾莉斯", "「我期待看到你光荣负伤的样子」", "aiy020000360.ogg"], //医生36 + ["凯伊姆", "「不要为人的不幸祈求啊」", "aiy310001240.ogg"], //男主124 + ["梅尔特", "「来,喝完这杯就去加油工作吧」", "aiy120000680.ogg"], //老板娘67 + ["凯伊姆", "「啊啊」", "aiy310001250.ogg"], //男主125 + ["凯伊姆", "「我走了」", "aiy310001260.ogg"], //男主126 + ["艾莉斯", "「加油(受伤)吧」", "aiy020000370.ogg"], //医生37 + ["梅尔特", "「一路走好」", "aiy120000690.ogg"], //老板娘68 + ]; + this.chapter05 = [ + ["", "今晚的娼馆街比平常来得更加热闹"], + ["", "视线中可以看到很多生客。"], + ["莉莎", "「呀——!」", "aiy150000010.ogg"], //三小只C01 + ["莉莎", "「呐,凯伊姆凯伊姆凯伊姆」", "aiy150000020.ogg"], //三小只C02 + ["莉莎", "「我难道没有魅力吗?」", "aiy150000030.ogg"], //三小只C03 + ["凯伊姆", "「突然之间怎么了」", "aiy310001270.ogg"], //男主127 + ["莉莎", "「因为因为因为,明明这么热闹,却只有我没有接到客人」", "aiy150000040.ogg"], //三小只C04 + ["莉莎", "「亏我还对他们说,我会用超绝的技巧让他们舒服得如同化作夜明的流星般呢」", "aiy150000050.ogg"], //三小只C05 + ["凯伊姆", "「那个台词太糟糕了」", "aiy310001280.ogg"], //男主128 + ["莉莎", "「哎—什么啊,这可是我昨天花了一晚上考虑出来的呢」", "aiy150000060.ogg"], //三小只C06 + ["凯伊姆", "「去睡觉,不要用你那空空如也的脑袋去考虑这种无聊事」", "aiy310001290.ogg"], //男主129 + ["莉莎", "「好过分!?」", "aiy150000070.ogg"], //三小只C07 + ["凯伊姆", "「你看看周围,今天有很多新客人吧?」", "aiy310001300.ogg"], //男主130 + ["莉莎", "「嗯~~」", "aiy150000080.ogg"], //三小只C08 + ["莉莎", "「啊,你这么一说还真是」", "aiy150000090.ogg"], //三小只C09 + ["凯伊姆", "「他们心里都很紧张,不可能会被你这种强拉的手法钓上钩吧」", "aiy310001310.ogg"], //男主131 + ["莉莎", "「这样啊,是不想欲仙欲死吗?」", "aiy150000100.ogg"], //三小只C10 + ["凯伊姆", "「不,没有男人不会希望那样的」", "aiy310001320.ogg"], //男主132 + ["凯伊姆", "「不过,强来是不行的。去让他们被温柔地包容着化作流星吧」", "aiy310001330.ogg"], //男主133 + ["莉莎", "「原—来如此」", "aiy150000110.ogg"], //三小只C11 + ["莉莎", "「凯伊姆肯定很有娼妇的才能哦」", "aiy150000120.ogg"], //三小只C12 + ["凯伊姆", "「没有」", "aiy310001340.ogg"], //男主134 + ["凯伊姆", "「好了,你赶紧去赚钱吧」", "aiy310001350.ogg"], //男主135 + ["莉莎", "「收到—」", "aiy150000130.ogg"], //三小只C13 + ["", "莉莎精神满满地回答后,就啪嗒啪嗒地跑开了。"], + ["莉莎", "「呐—那边的大哥哥,和我一起化作星光吧—」", "aiy150000140.ogg"], //三小只C14 + ["", "这家伙"], + ["", "非要用这么麻烦的说法么。"], + ["", "咚"], + ["莉莎", "「呀」", "aiy150000150.ogg"], //三小只C15 + ["大胡子醉汉", "「好疼」", "aiy800000010.ogg"], + ["", "突然,莉莎与一个男人相撞。"], + ["", "虽然男人可以摆出派头,但从那虚浮的脚步可以看出他相当的醉意。"], + ["莉莎", "「好疼疼,对不起」", "aiy150000160.ogg"], //三小只C16 + ["大胡子醉汉", "「这不是道歉就能了事的事吧,大姐—」", "aiy800000020.ogg"], + ["大胡子醉汉", "「哟,穿得相当清凉啊,喂」", "aiy800000030.ogg"], + ["大肚子的醉汉", "「喂—怎么了?」", "aiy810000010.ogg"], + ["大胡子醉汉", "「这位小姐特意往我身上撞呢」", "aiy800000040.ogg"], + ["大肚子的醉汉", "「喂喂喂喂,你是要做什么」", "aiy810000020.ogg"], + ["莉莎", "「呜哎—所以我都说对不起了啊」", "aiy150000170.ogg"], //三小只C17 + ["莉莎", "「对,对了。作为冲撞的补偿,我会给您提供很好的服务的,怎么样?」", "aiy150000180.ogg"], //三小只C18 + ["大胡子醉汉", "「是免费的吧?」", "aiy800000050.ogg"], + ["莉莎", "「那个······这,这姑且也是工作······免费就太」", "aiy150000190.ogg"], //三小只C19 + ["大肚子的醉汉", "「真是的,娼妇就是这种人。钱,钱,钱,完全没有做人的诚意」", "aiy810000030.ogg"], + ["大胡子醉汉", "「好—你这家伙。我给你钱,你现在就在这里给我服务」", "aiy800000060.ogg"], + ["莉莎", "「这,这该怎么说呢,稍微有些过了吧,在这里做很害羞的」", "aiy150000200.ogg"], //三小只C20 + ["大胡子醉汉", "「你除了晃腰以外还有用得着脑子的地方吗?别说这种像个人说的话啊」", "aiy800000070.ogg"], + ["大肚子的醉汉", "「啊啊?这些钱不够吗?」", "aiy810000040.ogg"], + ["大胡子醉汉", "「来,赶快把脚张开让我O,你们最喜欢这种事了吧?」", "aiy800000080.ogg"], + ["莉莎", "「是,是认真的吗······这些人」", "aiy150000210.ogg"], //三小只C21 + ["大肚子的醉汉", "「赶快做」", "aiy810000050.ogg"], + ["莉莎", "「呃······」", "aiy150000220.ogg"], //三小只C22 + ["凯伊姆", "「喂」", "aiy310001360.ogg"], //男主136 + ["大肚子的醉汉", "「啊?」", "aiy810000060.ogg"], + ["凯伊姆", "「即便是娼妇,也有不能出售的东西」", "aiy310001370.ogg"], //男主137 + ["", "喀"], + ["", "我一拳击中男人被酒精染红的脸,"], + ["大胡子醉汉", "「咦」", "aiy800000090.ogg"], + ["", "嘎"], + ["", "再一拳击中另一个人的腹部。"], + ["大肚子的醉汉", "「咕······」", "aiy810000070.ogg"], + ["大胡子醉汉", "「唔······」", "aiy800000100.ogg"], + ["", "两人像两只毛虫般躺在地上蠕动着挣扎"], + ["", "一时半会应该起不来了吧"], + ["莉莎", "「凯伊姆先生,太迟了太迟了太迟了」", "aiy150000230.ogg"], //三小只C23 + ["凯伊姆", "「都是你闯出的祸吧」", "aiy310001380.ogg"], //男主138 + ["莉莎", "「话是,那么说,可是」", "aiy150000240.ogg"], //三小只C24 + ["凯伊姆", "「赶快回莉莉乌姆去」", "aiy310001390.ogg"], //男主139 + ["莉莎", "「唔,嗯。谢了,凯伊姆。再见」", "aiy150000250.ogg"], //三小只C25 + ["", "久留无用"], + ]; + this.chapter06 = [ + ["", "漂浮的紫烟与甜美香醇的空气。"], + + + ]; +}, + "动画及周期装备映射": function () { + // 在此增加新插件 + this.equip = { + //所有回合中的装备及速度 + sword1: { id: "jianji", speed: 10 }, + }; + this.heroanimate = { + //勇士武器对应的动画(key为主手武器ID,value为帧动画名) + sword1: "jianji2", + }; + this.enemyanimate = { + //怪物对应的动画(key为怪物ID,value为帧动画名) + bat: "jianji2", + }; + this.equipanimate = { + //勇士周期性装备对应的动画(key为装备Id,value为帧动画名) + shield0: "jianji2", + }; +}, + "勇士法抗乘算叠加": function () { + // 在此增加新插件 + items.prototype.compareEquipment = function ( + compareEquipId, + beComparedEquipId ) { - const data = { - px: px, - py: py, - width: width, - height: height, - allFarme: allFarme, - imageList: imageList, - soundList: soundList, - }; - core.setFlag("animate_" + name, data); - }; - this.deleteanimate = function (name) { - core.setFlag("animate_" + name); - }; - let thistime = 0; - this.playanimate = function (name, x, y, hero, scalex, scaley) { - const data = { - name: name, - x: x, - y: y, - hero: hero, - scalex: scalex, - scaley: scaley, - farme: 0, - }; + var result = { value: {}, percentage: {} }; + var first = core.material.items[compareEquipId], + second = core.material.items[beComparedEquipId]; + for (var one in result) { + for (var name in core.status.hero) { + if (name === "mdef" && one === "percentage") { + var ans = 1; + if (first?.equip?.[one]?.[name]) + ans *= 1 - (first.equip[one][name] || 0) / 100; - core.plugin.playing.add(data); - }; - core.registerAnimationFrame("animateonmap", true, function (timestamp) { - if (timestamp - thistime > 1000 / 60) { - thistime = timestamp; - core.clearMap(anctx); - core.plugin.playing.forEach((one) => { - const data = flags["animate_" + one.name]; - if (!data) { - core.plugin.playing.delete(one); + if (second?.equip?.[one]?.[name]) + ans /= 1 - (second.equip[one][name] || 0) / 100; + + if (ans != 1) result[one][name] = ans; + } else if (name === "mdef" && one === "value") { + var ans = 0; + if (first) ans -= ((first.equip || {})[one] || {})[name] || 0; + if (second) ans += ((second.equip || {})[one] || {})[name] || 0; + if (ans != 0) result[one][name] = ans; } else { - data.imageList.forEach(function (image) { - if ( - one.farme >= (image.beforefarme ?? 0) && - one.farme <= (image.afterfarme ?? data.allFarme) - ) { - const img = core.material.images.images?.[image.image]; - if (img) { - const gla = image.globalAlpha ?? 100; - const agla = image.aglobalAlpha ?? gla, - beforefarme = image.beforefarme ?? 0; - const afterfarme = image.afterfarme ?? data.allFarme; - - anctx.globalAlpha = - (gla + - ((agla - gla) * (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; - - const cx = - (image.cx ?? 0) + - (((image.acx ?? 0) - (image.cx ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (image.cy ?? 0) + - (((image.acy ?? 0) - (image.cy ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (image.cw ?? img.width) + - (((image.acw ?? img.width) - (image.cw ?? img.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (image.ch ?? img.height) + - (((image.acw ?? img.height) - (image.cw ?? img.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (image.x ?? 0) + - (((image.ax ?? 0) - (image.x ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (image.y ?? 0) + - (((image.ay ?? 0) - (image.y ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (image.w ?? one.width) + - (((image.aw ?? one.width) - (image.w ?? one.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (image.h ?? one.height) + - (((image.aw ?? one.height) - (image.w ?? one.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - angle = - (Math.PI * - ((image.image.angle ?? 0) + - (((image.aangle ?? 0) - (image.image.angle ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1))) / - 180; - - if (one.hero) { - let sx, sy; - if (core.status.heroMoving < 0) { - sx = 0; - sy = 0; - } else { - sx = - core.utils.scan[core.status.hero.loc.direction].x * - 4 * - core.status.heroMoving; - sy = - core.utils.scan[core.status.hero.loc.direction].y * - 4 * - core.status.heroMoving; - } - const herox = core.status.hero.loc.x * 32 + 16 + sx; - const heroy = core.status.hero.loc.y * 32 + 16 + sy; - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - herox + (x - data.px) * one.scalex, - heroy + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } else { - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - one.x + (x - data.px) * one.scalex, - one.y + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } - } - } - }); - data.soundList.forEach(function (sound) { - const lisen = - sound.sound && - core.material.sounds[sound.sound] && - core.musicStatus.soundStatus; - if (one.farme == sound.startfarme && lisen) { - if (sound.stopbefore) core.stopSound(); - core.playSound(sound.sound); - } - }); - one.farme++; - if (one.farme > data.allFarme) core.plugin.playing.delete(one); + if (typeof core.status.hero[name] == "number") { + var ans = 0; + if (first) ans += ((first.equip || {})[one] || {})[name] || 0; + if (second) ans -= ((second.equip || {})[one] || {})[name] || 0; + if (ans != 0) result[one][name] = ans; + } } - }); + } } - }); - } + return result; + }; + let a = 1; + items.prototype._loadEquipEffect = function (equipId, unloadEquipId) { + // 比较能力值 + var result = core.compareEquipment(equipId, unloadEquipId); + + for (var name in result.percentage) { + if (name === "mdef") { + a *= result.percentage[name]; + core.setBuff(name, 1 - a); + } else { + core.addBuff(name, result.percentage[name] / 100); + } + } + for (var name in result.value) + core.status.hero[name] += result.value[name]; + }; + }, + "攻速临界": function () { + // 在此增加新插件 + //临界表 + core.ui._drawBookDetail_turnAndCriticals = function (enemy, floorId, texts) { + // 临界表 + var criticals = core.enemys.nextCriticals(enemy.id, 8, enemy.x, enemy.y, floorId).map(function (v) { + return core.formatBigNumber(v[0]) + ":" + core.formatBigNumber(v[1]); + }); + while (criticals[0] == '0:0') criticals.shift(); + texts.push("\r[#FF6A6A]\\d攻击临界表:\\d\r[]" + JSON.stringify(criticals)); + var criticals_spell = core.nextCriticals_spell(enemy.id, 8, enemy.x, enemy.y, floorId).map(function (v) { + return core.formatBigNumber(v[0]) + ":" + core.formatBigNumber(v[1]); + }); + while (criticals_spell[0] == '0:0') criticals_spell.shift(); + texts.push("\r[#FF6A6A]\\d法强临界表:\\d\r[]" + JSON.stringify(criticals_spell)); + var criticals_speed = core.nextCriticals_speed(enemy.id, 8, enemy.x, enemy.y, floorId).map(function (v) { + return core.formatBigNumber(v[0]) + ":" + core.formatBigNumber(v[1]); + }); + while (criticals_speed[0] == '0:0') criticals_speed.shift(); + texts.push("\r[#FF6A6A]\\d速度临界表:\\d\r[]" + JSON.stringify(criticals_speed)); + + } + //攻速临界计算 + core.nextCriticals_speed = function (enemy, number, x, y, floorId) { + if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; + number = number || 1; + + var info = core.getDamageInfo(enemy, null, x, y, floorId); + if (info == null) { // 如果未破防... + return [ + ['?', '?'] + ]; + } + + if (typeof info == 'number') { + return [ + [0, 0] + ]; + } + return core.enemys._nextSpeedCriticals_useBinarySearch(enemy, info, number, x, y, floorId); + } + enemys.prototype._nextSpeedCriticals_useBinarySearch = function (enemy, info, number, x, y, floorId) { + var mon_hp = info.mon_hp, + hero_speed = core.status.hero.speed, + mon_def = info.mon_def, + pre = info.damage; + var list = []; + var start_speed = hero_speed; + + var calNext = function (currSpeed, maxSpeed) { + var start = Math.floor(currSpeed), + end = Math.floor(maxSpeed); + if (start > end) return null; + + while (start < end) { + var mid = Math.floor((start + end) / 2); + if (mid - start > end - mid) mid--; + var nextInfo = core.enemys.getDamageInfo(enemy, { "speed": mid }, x, y, floorId); + if (nextInfo == null || (typeof nextInfo == 'number')) return null; + if (pre > nextInfo.damage) end = mid; + else start = mid + 1; + } + var nextInfo = core.enemys.getDamageInfo(enemy, { "speed": start }, x, y, floorId); + return nextInfo == null || (typeof nextInfo == 'number') || nextInfo.damage >= pre ? null : [start, nextInfo.damage]; + } + var currSpeed = start_speed; + while (true) { + var next = calNext(currSpeed + 1, Number.MAX_SAFE_INTEGER, pre); + if (next == null) break; + currSpeed = next[0]; + pre = next[1]; + list.push([currSpeed - hero_speed, info.damage - pre]); + if (pre <= 0 && !core.flags.enableNegativeDamage) break; + if (list.length >= number) break; + } + if (list.length == 0) list.push([0, 0]); + return list; + } + //法强临界计算 + core.nextCriticals_spell = function (enemy, number, x, y, floorId) { + if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; + number = number || 1; + + var info = core.getDamageInfo(enemy, null, x, y, floorId); + if (info == null) { // 如果未破防... + return [ + ['?', '?'] + ]; + } + + if (typeof info == 'number') { + return [ + [0, 0] + ]; + } + return core.enemys._nextSpellCriticals_useBinarySearch(enemy, info, number, x, y, floorId); + } + enemys.prototype._nextSpellCriticals_useBinarySearch = function (enemy, info, number, x, y, floorId) { + var mon_hp = info.mon_hp, + hero_spell = core.status.hero.spell, + mon_def = info.mon_def, + turn = info.mon_turn, + pre = info.damage; + var list = []; + var start_spell = hero_spell; + + var calNext = function (currSpell, maxSpell) { + var start = Math.floor(currSpell), + end = Math.floor(maxSpell); + if (start > end) return null; + + while (start < end) { + var mid = Math.floor((start + end) / 2); + if (mid - start > end - mid) mid--; + var nextInfo = core.enemys.getDamageInfo(enemy, { "spell": mid }, x, y, floorId); + if (nextInfo == null || (typeof nextInfo == 'number')) return null; + if (turn > nextInfo.mon_turn) end = mid; + else start = mid + 1; + } + var nextInfo = core.enemys.getDamageInfo(enemy, { "spell": start }, x, y, floorId); + return nextInfo == null || (typeof nextInfo == 'number') || nextInfo.mon_turn >= turn ? null : [start, nextInfo.damage]; + } + var currSpell = start_spell; + while (true) { + var next = calNext(currSpell + 1, Number.MAX_SAFE_INTEGER, pre, turn); + if (next == null) break; + currSpell = next[0]; + pre = next[1]; + list.push([currSpell - hero_spell, info.damage - pre]); + if (pre <= 0 && !core.flags.enableNegativeDamage) break; + if (list.length >= number) break; + } + if (list.length == 0) list.push([0, 0]); + return list; + } +}, + "手册(临时)": function () { + // 在此增加新插件 + ui.prototype._drawBook_drawContent = function (index, enemy, top, left) { + var width = core._PX_ - left; // 9 : 8 : 8 划分三列 + this._drawBook_drawRow1(index, enemy, top, left, width, top + 20); + this._drawBook_drawRow4(index, enemy, top, left, width, top + 38); + this._drawBook_drawRow2(index, enemy, top, left, width, top + 56); + this._drawBook_drawRow3(index, enemy, top, left, width, top + 74); + this._drawBook_drawRow5(index, enemy, top, left, width, top + 90); + } + + ui.prototype._drawBook_drawRow4 = function (index, enemy, top, left, width, position) { + // 绘制第一行 + core.setTextAlign('ui', 'left'); + var b13 = this._buildFont(13, true), + f13 = this._buildFont(13, false); + var col1 = left, + col2 = left + width * 9 / 25, + col3 = left + width * 17 / 25; + core.fillText('ui', core.getStatusLabel('speed'), col1, position, '#DDDDDD', f13); + core.fillText('ui', core.formatBigNumber(enemy.speed || 0), col1 + 30, position, null, b13); + core.fillText('ui', core.getStatusLabel('spell'), col2, position, null, f13); + core.fillText('ui', core.formatBigNumber(enemy.spell || 0), col2 + 30, position, null, b13); + core.fillText('ui', core.getStatusLabel('mdef'), col3, position, null, f13); + core.fillText('ui', core.formatBigNumber(enemy.mdef || 0) + "%", col3 + 30, position, null, b13); + } + ui.prototype._drawBook_drawRow5 = function (index, enemy, top, left, width, position) { + // 绘制第一行 + core.setTextAlign('ui', 'left'); + var b13 = this._buildFont(13, true), + f13 = this._buildFont(13, false); + var col1 = left, + col2 = left + width * 13 / 25; + core.fillText('ui', '速度临界', col1 - 120, position, '#DDDDDD', f13); + core.fillText('ui', `[${core.formatBigNumber(enemy.criticalSpeed?.[0] || 0)},${core.formatBigNumber(enemy.criticalSpeed?.[1] || 0)}]`, col1 - 60, position, null, b13); + + core.fillText('ui', "勇士出手次数", col1, position, '#DDDDDD', f13); + core.fillText('ui', core.getDamageInfo(enemy, null) ? core.getDamageInfo(enemy, null).hero_turn : '???', col1 + 80, position, null, b13); + core.fillText('ui', "怪物出手次数", col2, position, null, f13); + core.fillText('ui', core.getDamageInfo(enemy, null) ? core.getDamageInfo(enemy, null).mon_turn : '???', col2 + 80, position, null, b13); + + } + ui.prototype._drawBook_pageinfo = function () { + var per_page = 4; + var padding_top = 12; // 距离顶端像素 + var per_height = (core._PY_ - 32 - padding_top) / per_page; + return { per_page: per_page, padding_top: padding_top, per_height: per_height }; + } +}, + "新怪物手册": function () { + // 在此增加新插件 + const book = document.createElement("canvas"); //创建怪物手册画布 + book.style.position = "absolute"; + book.style.zIndex = 400; + book.style.display = "none"; + book.id = "book"; + main.dom.gameGroup.insertAdjacentElement("afterend", book); + book.style.top = "50%"; + book.style.left = "50%"; + book.style.transform = "translate(-50%,-50%)"; + const ctx = book.getContext("2d"); + main.dom.book = book + + book.onclick = function (e) { //画布点击监听 + try { + e.preventDefault(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + + let x, y; + if (core.domStyle.isVertical) { //对竖屏进行坐标转换 + x = py * 3; + y = 1248 - px * 3; + } else { + x = px * 3; + y = py * 3; + } + bookclick(x, y) + } catch (ee) { + main.log(ee); + } + } + + function bookclick(x, y) { //点击画布(x,y)触发的效果 + const makeBox = ([x, y], [w, h]) => { //创建点击检测区域 + return [ + [x, y], + [x + w, y + h], + ]; + }; + const pos = [x, y]; //创建点击坐标pos + const inRect = ([x, y], [ //检测点击坐标是否在检测区域中 + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + /** + * 使用范例 + *const backbox = makeBox([15, 35], [210, 90]); + *if(inRect(pos,backbox)){} + */ + } + this.drawBook = function (floorId = core.status.floorId) { + if (core.domStyle.isVertical) { //对竖屏进行绘制坐标变换,只需要考虑横屏绘制,竖屏将自适应转置 + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + //在这里写绘制内容,只写横屏就行 + + ctx.restore(); //恢复变换前的坐标,否则将连续转置 + } +}, + "存读档": function () { + // 在此增加新插件 + const saveLoad = document.createElement("canvas"); //创建存读档画布 + saveLoad.style.position = "absolute"; + saveLoad.style.zIndex = 390; + saveLoad.style.display = "none"; + saveLoad.id = "saveLoad"; + main.dom.gameGroup.insertAdjacentElement("afterend", saveLoad); + saveLoad.style.top = "50%"; + saveLoad.style.left = "50%"; + saveLoad.style.transform = "translate(-50%,-50%)"; + const ctx = saveLoad.getContext("2d"); + main.dom.saveLoad = saveLoad + let cg = false + let choose = false + //////存读档界面更新 + class SL { + constructor() { + this.index = 0; + this.refresh = false; + this.page = 0; + this.max_page = 1000 + this.id = "" + + } + update() { + core.clearMap(ctx) + core.ui._drawSLPanel_draw(this.page, this.max_page) + } + setIndex(index = this.index, refresh = this.refresh) { + this.index = index + core.saves.saveIndex = index + this.refresh = refresh + } + setPage(page = this.page) { + this.page = page + } + setOffset(offset = this.offset) { + this.offset = offset + } + setMax_page(max_page = this.max_page) { + this.max_page = max_page + } + setId(id) { + this.id = id + } + } + core.saveLoad = new SL() + saveLoad.onclick = function (e) { //画布点击监听 + try { + e.preventDefault(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + + let x, y; + if (core.domStyle.isVertical) { //对竖屏进行坐标转换 + x = py * 3; + y = 1248 - px * 3; + } else { + x = px * 3; + y = py * 3; + } + saveLoadclick(x, y) + } catch (ee) { + main.log(ee); + } + } + ////// 删除某个存档 + control.prototype.removeSave = function (index, callback) { + if (index == 0 || index == "autoSave") { + index = "autoSave"; + core.removeLocalForage(index, function () { + core.saves.autosave.data = null; + core.saves.autosave.updated = false; + if (callback) callback(); + }); + return; + } + core.removeLocalForage( + "save" + index, + function () { + core.saves.favorite = core.saves.favorite.filter(function (i) { + return core.hasSave(i); + }); + delete core.saves.favoriteName[index]; + core.setLocalStorage("_slText" + index) + core.control._updateFavoriteSaves(); + if (callback) callback(); + }, + function () { + core.playSound("操作失败"); + core.drawTip("无法删除存档!"); + if (callback) callback(); + } + ); + }; + control.prototype._doSL_save = function (id) { + if (id == "autoSave") { + core.playSound("操作失败"); + return core.drawTip("不能覆盖自动存档!"); + } + // 在事件中的存档 + if (core.status.event.interval != null) + core.setFlag("__events__", core.status.event.interval); + var data = core.saveData(); + if (core.isReplaying() && core.status.replay.toReplay.length > 0) { + data.__toReplay__ = core.encodeRoute(core.status.replay.toReplay); + } + core.setLocalStorage("_slText" + id) + core.setLocalForage( + "save" + id, + data, + function () { + core.saves.saveIndex = id; + core.setLocalStorage("saveIndex", core.saves.saveIndex); + // 恢复事件 + if (!core.events.recoverEvents(core.status.event.interval)) + core.ui.closePanel(); + core.playSound("存档"); + core.drawTip("存档成功!"); + }, + function (err) { + console.error(err); + alert("存档失败,错误信息:\n" + err); + } + ); + core.removeFlag("__events__"); + return; + }; + + function saveLoadclick(x, y) { //点击画布(x,y)触发的效果 + const makeBox = ([x, y], [w, h]) => { //创建点击检测区域 + return [ + [x, y], + [x + w, y + h], + ]; + }; + const pos = [x, y]; //创建点击坐标pos + const inRect = ([x, y], [ //检测点击坐标是否在检测区域中 + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + let page = core.status.event.data.page, + offset = core.status.event.data.offset; + let index = page * 10 + offset; + + const upbox = makeBox([675, 370], [100, 100]); + const upupbox = makeBox([675, 260], [100, 110]); + const upupupbox = makeBox([675, 150], [100, 120]); + const downbox = makeBox([675, 660], [100, 100]); + const downdownbox = makeBox([675, 760], [100, 110]); + const downdowndownbox = makeBox([675, 870], [100, 120]); + const addbox = makeBox([650, 1010], [150, 100]); + const modebox = makeBox([30, 124], [270, 1000]); + const save0box = makeBox([300, 100], [350, 124]); + const savebox = makeBox([300, 224], [350, 800]); + const save9box = makeBox([300, 1024], [350, 124]); + const backbox = makeBox([1750, 1150], [200, 100]); + const savenamebox = makeBox([800, 970], [250, 70]); + const classnamebox = makeBox([800, 1070], [250, 70]); + const savetextbox = makeBox([1050, 982], [640, 150]); + const cgbox = makeBox([1200, 1150], [300, 100]) + const changebox = makeBox([1700, 970], [200, 70]) + const deletebox = makeBox([1700, 1070], [200, 70]) + const gobox = makeBox([800, 100], [1050, 870]) + const favbox = makeBox([900, 300], [500, 110]) + const class1box = makeBox([900, 410], [500, 110]) + const class2box = makeBox([900, 520], [500, 110]) + const class3box = makeBox([900, 630], [500, 110]) + const class4box = makeBox([900, 740], [500, 110]) + const class5box = makeBox([1400, 300], [500, 110]) + const class6box = makeBox([1400, 410], [500, 110]) + const class7box = makeBox([1400, 520], [500, 110]) + const class8box = makeBox([1400, 630], [500, 110]) + const changebackbox = makeBox([1700, 740], [130, 110]) + + if (inRect(pos, upbox)) { + choose = false + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page - 1) + offset); + return; + } + if (inRect(pos, upupbox)) { + choose = false + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page - 10) + offset); + return; + } + if (inRect(pos, upupupbox)) { + choose = false + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page - 100) + offset); + return; + } + if (inRect(pos, downbox)) { + choose = false + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page + 1) + offset); + return; + } + if (inRect(pos, downdownbox)) { + choose = false + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page + 10) + offset); + return; + } + if (inRect(pos, downdowndownbox)) { + choose = false + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page + 100) + offset); + return; + } + if (inRect(pos, backbox)) { + choose = false + if (core.events.recoverEvents(core.status.event.interval)) + return; + core.ui.closePanel(); + delete core.status.tempRoute; + if (!core.isPlaying()) + core.showStartAnimate(true); + return; + } + if (inRect(pos, gobox) && !choose) { + if (offset == 0) + core.doSL("autoSave", core.status.event.id); + else { + var id = 9 * page + offset; + if (core.status.event.data.mode == 'fav') id = core.saves.favorite[id - 1]; + if (core.status.event.data.mode !== 'fav' && core.status.event.data.mode !== 'all') id = core.saves[core.status.event.data.mode][id - 1]; + core.doSL(id, core.status.event.id); + } + return; + } + if (inRect(pos, addbox) && core.status.event.data.mode === "all" && core.getLocalStorage("save_page", 0) !== 8000) { + core.playSound('确定'); + core.setLocalStorage("save_page", core.getLocalStorage("save_page", 0) + 1000) + core.ui._drawSLPanel(10 * page + offset, true); + return; + } + if (inRect(pos, modebox)) { + choose = false + let mode = Math.floor((y - 124) / 100) - 1 + if (mode < 0 && core.status.event.data.mode !== "all") { + core.status.event.data.mode = "all" + page = parseInt((core.saves.saveIndex - 1) / 9); + offset = core.saves.saveIndex - 9 * page; + core.ui._drawSLPanel(0, true); + return; + } + if (mode === 0 && core.status.event.data.mode !== "fav") { + core.status.event.data.mode = "fav" + core.ui._drawSLPanel(0, true); + return; + } + if (mode > 0 && core.status.event.data.mode !== `class_${mode}`) { + core.status.event.data.mode = `class_${mode}` + core.ui._drawSLPanel(0, true); + return; + } + return; + } + + if (inRect(pos, save0box)) { + choose = false + core.saveLoad.setId("autoSave") + if (offset === 0) { + core.doSL("autoSave", core.status.event.id) + return + } + core.ui._drawSLPanel(10 * page) + return; + } + if (inRect(pos, savebox)) { + choose = false + let a = Math.ceil((y - 224) / 100) + let real_id = 9 * page + a + if (real_id == index) { + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[a - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][a - 1] + } + core.saveLoad.setId(real_id) + core.doSL(real_id, core.status.event.id) + return + } else { + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[a - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][a - 1] + } + core.saveLoad.setId(real_id) + } + core.ui._drawSLPanel(10 * page + a) + return; + } + if (inRect(pos, save9box)) { + choose = false + let real_id = 9 * page + 9 + if (real_id == index) { + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + 8] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + 8] + } + core.saveLoad.setId(real_id) + core.doSL(real_id, core.status.event.id) + return + } else { + real_id = core.saves.favorite[9 * page + 8] + + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + 8] + } + core.saveLoad.setId(real_id) + + } + core.ui._drawSLPanel(10 * page + 9) + return; + } + if (inRect(pos, changebox)) { + choose = !choose + core.ui._drawSLPanel(index) + return; + } + if (inRect(pos, deletebox)) { + choose = false + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + core.removeSave(real_id, function () { + core.ui._drawSLPanel(index, true); + }); + return; + } + if (inRect(pos, cgbox)) { + choose = false + cg = !cg + core.ui._drawSLPanel(10 * page + offset, true) + return; + } + if (inRect(pos, savenamebox) && offset !== 0) { + choose = false + + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + + + core.myprompt("请输入想要显示的存档名(长度不超过5字符)", null, function (value) { + if (value && value.length <= 5) { + core.saves.favoriteName[real_id] = value; + core.control._updateFavoriteSaves(); + core.ui._drawSLPanel(10 * page + offset); + } else if (value) { + alert("无效的输入!"); + } else if (value === "") { + delete core.saves.favoriteName[real_id]; + core.control._updateFavoriteSaves(); + core.ui._drawSLPanel(10 * page + offset); + } + }); + + return; + } + if (inRect(pos, savetextbox) && offset !== 0) { + choose = false + + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + + + core.myprompt("请输入存档笔记(长度不超过60字符)", null, function (value) { + if (value && value.length <= 60) { + core.setLocalStorage("_slText" + real_id, value) + core.ui._drawSLPanel(10 * page + offset); + } else if (value) { + alert("无效的输入!"); + } else if (value === "") { + core.setLocalStorage("_slText" + real_id) + core.ui._drawSLPanel(10 * page + offset); + } + }); + + return; + } + if (inRect(pos, classnamebox) && core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + choose = false + + core.myprompt("请输入想要显示的存档分类(长度不超过5字符)", null, function (value) { + if (value && value.length <= 5) { + core.setLocalStorage("slClass_" + core.status.event.data.mode[6], value) + core.ui._drawSLPanel(10 * page + offset); + } else if (value) { + alert("无效的输入!"); + } else if (value === "") { + core.setLocalStorage("slClass_" + core.status.event.data.mode[6]) + core.ui._drawSLPanel(10 * page + offset); + } + }); + + return; + } + if (choose) { + if (inRect(pos, changebackbox)) { + choose = false + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, favbox)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + + let v = core.saves.favorite.indexOf(real_id) + if (v >= 0) { // 已经处于收藏状态:取消收藏 + core.saves.favorite.splice(v, 1); + if (core.status.event.data.mode === "fav") choose = false + } else if (core.hasSave(real_id)) { // 存在存档则进行收藏 + + core.saves.favorite.push(real_id); + + core.saves.favorite = core.saves.favorite.sort(function (a, b) { return a - b; }); // 保证有序 + + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class1box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_1.indexOf(real_id) + if (v >= 0) { + core.saves.class_1.splice(v, 1); + if (core.status.event.data.mode === "class_1") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_1.push(real_id); + core.saves.class_1 = core.saves.class_1.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class2box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_2.indexOf(real_id) + if (v >= 0) { + core.saves.class_2.splice(v, 1); + if (core.status.event.data.mode === "class_2") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_2.push(real_id); + core.saves.class_2 = core.saves.class_2.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class3box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_3.indexOf(real_id) + if (v >= 0) { + core.saves.class_3.splice(v, 1); + if (core.status.event.data.mode === "class_3") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_3.push(real_id); + core.saves.class_3 = core.saves.class_3.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class4box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_4.indexOf(real_id) + if (v >= 0) { + core.saves.class_4.splice(v, 1); + if (core.status.event.data.mode === "class_4") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_4.push(real_id); + core.saves.class_4 = core.saves.class_4.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class5box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_5.indexOf(real_id) + if (v >= 0) { + core.saves.class_5.splice(v, 1); + if (core.status.event.data.mode === "class_5") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_5.push(real_id); + core.saves.class_5 = core.saves.class_5.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class6box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_6.indexOf(real_id) + if (v >= 0) { + core.saves.class_6.splice(v, 1); + if (core.status.event.data.mode === "class_6") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_6.push(real_id); + core.saves.class_6 = core.saves.class_6.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class7box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_7.indexOf(real_id) + if (v >= 0) { + core.saves.class_7.splice(v, 1); + if (core.status.event.data.mode === "class_7") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_7.push(real_id); + core.saves.class_7 = core.saves.class_7.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + if (inRect(pos, class8box)) { + let real_id = 9 * page + offset + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[9 * page + offset - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][9 * page + offset - 1] + } + let v = core.saves.class_8.indexOf(real_id) + if (v >= 0) { + core.saves.class_8.splice(v, 1); + if (core.status.event.data.mode === "class_8") choose = false + } else if (core.hasSave(real_id)) { + core.saves.class_8.push(real_id); + core.saves.class_8 = core.saves.class_8.sort(function (a, b) { return a - b; }); // 保证有序 + } + core.control._updateFavoriteSaves() + core.ui._drawSLPanel(index); + return + } + } + } + ///// 读取收藏信息 + control.prototype._loadFavoriteSaves = function () { + core.saves.favorite = core.getLocalStorage("favorite", []); + // --- 移除不存在的收藏 + core.saves.favorite = core.saves.favorite.filter(function (i) { + return core.hasSave(i); + }); + core.saves.favoriteName = core.getLocalStorage("favoriteName", {}); + }; + + + ///// 读取分类信息 + control.prototype._loadClassSaves = function () { + for (let i = 1; i < 9; i++) { + core.saves["class_" + i] = core.getLocalStorage("class_" + i, []) + core.saves["class_" + i] = core.saves["class_" + i].filter(function (i) { + return core.hasSave(i); + }) + } + + }; + + control.prototype._updateFavoriteSaves = function () { + core.setLocalStorage("favorite", core.saves.favorite); + for (let i = 1; i < 9; i++) { + core.setLocalStorage("class_" + i, core.saves["class_" + i]) + } + core.setLocalStorage("favoriteName", core.saves.favoriteName); + }; + ////// 绘制存档/读档界面 ////// + ui.prototype._drawSLPanel = function (index, refresh) { + core.control._updateFavoriteSaves() + core.control._loadClassSaves(); + core.control._loadFavoriteSaves(); + + if (index == null) index = 1; + if (index < 0) index = 0; + + var page = parseInt(index / 10), + offset = index % 10; + var max_page = (main.savePages + core.getLocalStorage("save_page", 0)) || 30; + if (core.status.event.data && core.status.event.data.mode == 'fav') + max_page = Math.ceil((core.saves.favorite || []).length / 9); + if (page >= max_page) page = max_page - 1; + if (core.status.event.data && core.status.event.data.mode == 'fav' && page == max_page - 1) { + offset = Math.min(offset, (core.saves.favorite || []).length - 9 * page); + } + if (core.status.event.data && (core.status.event.data.mode !== 'fav' && core.status.event.data.mode !== 'all')) + max_page = Math.ceil((core.saves[core.status.event.data.mode] || []).length / 9); + if (page >= max_page) page = max_page - 1; + if (core.status.event.data && (core.status.event.data.mode !== 'fav' && core.status.event.data.mode !== 'all') && page == max_page - 1) { + offset = Math.min(offset, (core.saves[core.status.event.data.mode] || []).length - 9 * page); + } + + var last_page = -1; + var mode = 'all'; + if (core.status.event.data) { + last_page = core.status.event.data.page; + mode = core.status.event.data.mode; + } + core.saveLoad.setIndex(index, refresh) + core.saveLoad.setPage(page) + core.saveLoad.setOffset(offset) + core.saveLoad.setMax_page(max_page) + core.status.event.data = { 'page': page, 'offset': offset, 'mode': mode }; + core.status.event.ui = core.status.event.ui || []; + saveLoad.style.display = "block" + if (refresh || page != last_page) { + core.status.event.ui = []; + this._drawSLPanel_loadSave(page, function () { + core.ui._drawSLPanel_draw(page, max_page); + }); + } else this._drawSLPanel_draw(page, max_page); + } + + ui.prototype._drawSLPanel_draw = function (page, max_page) { + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } + // --- 绘制背景 + this._drawSLPanel_drawBackground(); + + // --- 绘制文字 + core.setTextAlign(ctx, 'center'); + + var bottom = 1248 - 39; + core.fillBoldText1( + ctx, + "返回游戏", + 1850, + bottom, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + + if (core.status.event.selection) + core.setFillStyle(ctx, '#FF6A6A'); + ctx.strokeStyle = "#DDDDDD"; + ctx.fillStyle = "#BBBB44" + ctx.lineWidth = 6 + ctx.beginPath(); + + ctx.moveTo(300, 124) + ctx.lineTo(60, 124) + ctx.arcTo(30, 124, 30, 224, 30) + ctx.lineTo(30, 194) + ctx.arcTo(30, 224, 300, 224, 30) + ctx.lineTo(300, 224) + ctx.stroke() + if (core.status.event.data.mode === "all") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 224) + ctx.lineTo(60, 224) + ctx.arcTo(30, 224, 30, 324, 30) + ctx.lineTo(30, 294) + ctx.arcTo(30, 324, 300, 324, 30) + ctx.lineTo(300, 324) + ctx.stroke() + if (core.status.event.data.mode === "fav") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 324) + ctx.lineTo(60, 324) + ctx.arcTo(30, 324, 30, 424, 30) + ctx.lineTo(30, 394) + ctx.arcTo(30, 424, 300, 424, 30) + ctx.lineTo(300, 424) + ctx.stroke() + if (core.status.event.data.mode === "class_1") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 424) + ctx.lineTo(60, 424) + ctx.arcTo(30, 424, 30, 524, 30) + ctx.lineTo(30, 494) + ctx.arcTo(30, 524, 300, 524, 30) + ctx.lineTo(300, 524) + ctx.stroke() + if (core.status.event.data.mode === "class_2") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 524) + ctx.lineTo(60, 524) + ctx.arcTo(30, 524, 30, 624, 30) + ctx.lineTo(30, 594) + ctx.arcTo(30, 624, 300, 624, 30) + ctx.lineTo(300, 624) + ctx.stroke() + if (core.status.event.data.mode === "class_3") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 624) + ctx.lineTo(60, 624) + ctx.arcTo(30, 624, 30, 724, 30) + ctx.lineTo(30, 694) + ctx.arcTo(30, 724, 300, 724, 30) + ctx.lineTo(300, 724) + ctx.stroke() + if (core.status.event.data.mode === "class_4") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 724) + ctx.lineTo(60, 724) + ctx.arcTo(30, 724, 30, 824, 30) + ctx.lineTo(30, 794) + ctx.arcTo(30, 824, 300, 824, 30) + ctx.lineTo(300, 824) + ctx.stroke() + if (core.status.event.data.mode === "class_5") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 824) + ctx.lineTo(60, 824) + ctx.arcTo(30, 824, 30, 924, 30) + ctx.lineTo(30, 894) + ctx.arcTo(30, 924, 300, 924, 30) + ctx.lineTo(300, 924) + ctx.stroke() + if (core.status.event.data.mode === "class_6") ctx.fill() + ctx.beginPath(); + + ctx.moveTo(300, 924) + ctx.lineTo(60, 924) + ctx.arcTo(30, 924, 30, 1024, 30) + ctx.lineTo(30, 994) + ctx.arcTo(30, 1024, 300, 1024, 30) + ctx.lineTo(300, 1024) + ctx.stroke() + if (core.status.event.data.mode === "class_7") ctx.fill() + ctx.beginPath() + ctx.moveTo(300, 1024) + ctx.lineTo(60, 1024) + ctx.arcTo(30, 1024, 30, 1124, 30) + ctx.lineTo(30, 1094) + ctx.arcTo(30, 1124, 300, 1124, 30) + ctx.lineTo(300, 1124) + ctx.stroke() + if (core.status.event.data.mode === "class_8") ctx.fill() + core.fillBoldText1( + ctx, + '全部', + 170, + 190, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + '收藏★', + 170, + 290, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_1", "默认分类1"), + 170, + 390, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_2", "默认分类2"), + 170, + 490, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_3", "默认分类3"), + 170, + 590, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_4", "默认分类4"), + 170, + 690, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_5", "默认分类5"), + 170, + 790, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_6", "默认分类6"), + 170, + 890, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_7", "默认分类7"), + 170, + 990, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.getLocalStorage("slClass_8", "默认分类8"), + 170, + 1090, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.strokeRoundRect(ctx, 300, 100, 1648, 1048, 30, "#DDDDDD") + // --- 绘制记录 + this._drawSLPanel_drawRecords(); + ctx.restore(); + + + } + + + ui.prototype._drawSLPanel_drawBackground = function () { + + const bg = core.material.images.images["eve_011101.webp"]; //背景 + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + + } + + ui.prototype._drawSLPanel_loadSave = function (page, callback) { + var ids = [0]; + for (var i = 1; i <= 10; ++i) { + var id = 10 * page + i; + if (core.status.event.data.mode == 'fav') + id = core.saves.favorite[id - 1]; // 因为favorite第一个不是自动存档 所以要偏移1 + if (core.status.event.data.mode !== 'fav' && core.status.event.data.mode !== "all") + id = core.saves[core.status.event.data.mode][id - 1] + ids.push(id); + } + core.getSaves(ids, function (data) { + for (var i = 1; i < ids.length; ++i) + core.status.event.ui[i] = data[i]; + core.status.event.ui[0] = data[0] == null ? null : data[0][core.saves.autosave.now - 1]; + callback(); + }); + } + + // 在以x为中心轴 y为顶坐标 的位置绘制一条宽为size的记录 cho表示是否被选中 选中会加粗 highlight表示高亮标题 ✐ + ui.prototype._drawSLPanel_drawRecord = function (page, offset) { + var data = core.status.event.ui[offset] + var id = 9 * page + offset + core.drawWindowSkin( + "winskin.webp", + ctx, 1032, + 252, + 660, + 660, + null, + null, + null, + 3 + ); + if (data && data.floorId) { + core.setTextAlign('ui', "center"); + var map = core.maps.loadMap(data.maps, data.floorId); + core.extractBlocksForUI(map, data.hero.flags); + + core.drawThumbnail(data.floorId, map.blocks, { + heroLoc: data.hero.loc, + heroIcon: data.hero.image, + flags: data.hero.flags, + ctx: ctx, + x: 1050, + y: 270, + size: 1.5, + centerX: data.hero.loc.x, + centerY: data.hero.loc.y, + noHD: true + }); + if (core.isPlaying() && core.getFlag("hard") != data.hero.flags.hard) { + core.fillRect(ctx, 1050, 270, 624, 624, [0, 0, 0, 0.4]); + core.fillText(ctx, data.hard, 1362, 620, data.hero.flags.__hardColor__ || 'white', this._buildFont(180, true)); + } + core.drawIcon(ctx, "hp", 800, 260, 96, 96); + core.drawIcon(ctx, "atk", 800, 370, 96, 96); + core.drawIcon(ctx, "def", 800, 470, 96, 96); + core.drawIcon(ctx, "I374", 800, 580, 96, 96); + core.drawIcon(ctx, "jumpShoes", 800, 690, 96, 96); + core.drawIcon(ctx, "money", 800, 810, 96, 96); + core.setTextAlign(ctx, 'left'); + core.fillBoldText1( + ctx, + core.formatBigNumber(data.hero.hp, true), + 900, + 320, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.formatBigNumber(data.hero.atk, true), + 900, + 430, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.formatBigNumber(data.hero.def, true), + 900, + 540, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.formatBigNumber(data.hero.spell, true), + 900, + 650, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.formatBigNumber(data.hero.speed, true), + 900, + 760, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + core.formatBigNumber(data.hero.money, true), + 900, + 880, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.setTextAlign(ctx, 'center'); + core.fillBoldText1( + ctx, + core.floors[data.floorId].title, + 1350, + 150, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + `[${core.floors[data.floorId].areas}]`, + 1350, + 220, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.drawWindowSkin( + "winskin.webp", + ctx, 1700, + 260, + 96, + 96, + null, + null, + null, + 1 + ); + core.drawWindowSkin( + "winskin.webp", + ctx, 1700, + 400, + 96, + 96, + null, + null, + null, + 1 + ); + core.drawWindowSkin( + "winskin.webp", + ctx, 1700, + 540, + 96, + 96, + null, + null, + null, + 1 + ); + core.drawWindowSkin( + "winskin.webp", + ctx, 1700, + 680, + 96, + 96, + null, + null, + null, + 1 + ); + core.drawWindowSkin( + "winskin.webp", + ctx, 1700, + 810, + 96, + 96, + null, + null, + null, + 1 + ); + if (data.hero.equipment[0]) core.drawIcon(ctx, data.hero.equipment[0], 1700, 260, 96, 96) + else core.fillBoldText1( + ctx, + "无", + 1750, + 320, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + + if (data.hero.equipment[1]) core.drawIcon(ctx, data.hero.equipment[1], 1700, 400, 96, 96) + else core.fillBoldText1( + ctx, + "无", + 1750, + 460, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + + if (data.hero.equipment[2]) core.drawIcon(ctx, data.hero.equipment[2], 1700, 540, 96, 96) + else core.fillBoldText1( + ctx, + "无", + 1750, + 600, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + + if (data.hero.equipment[3]) core.drawIcon(ctx, data.hero.equipment[3], 1700, 680, 96, 96) + else core.fillBoldText1( + ctx, + "无", + 1750, + 740, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + if (data.hero.equipment[3]) core.drawIcon(ctx, data.hero.equipment[3], 1700, 810, 96, 96) + else core.fillBoldText1( + ctx, + "无", + 1750, + 870, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.drawIcon(ctx, "yellowKey", 1800, 260, 96, 96) + core.drawIcon(ctx, "blueKey", 1800, 420, 96, 96) + core.drawIcon(ctx, "redKey", 1800, 580, 96, 96) + core.drawIcon(ctx, "greenKey", 1800, 740, 96, 96) + core.fillBoldText1( + ctx, + data.hero.items.tools.yellowKey ?? 0, + 1850, + 390, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + data.hero.items.tools.blueKey ?? 0, + 1850, + 550, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + data.hero.items.tools.redKey ?? 0, + 1850, + 710, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + data.hero.items.tools.greenKey ?? 0, + 1850, + 870, + '#DDDDDD', + "#000000", + 6, + this._buildFont(45, true) + ); + core.fillBoldText1( + ctx, + `存档时间${core.formatDate(new Date(data.time))}`, + 1350, 960, data.hero.flags.debug ? '#FF6A6A' : '#FFFFFF', + "#000000", + 6, + this._buildFont(45, true) + ); + if (offset !== 0) core.fillBoldText1( + ctx, + "修改存档名", + 920, 1020, '#FFFFFF', + "#000000", + 6, + this._buildFont(45, true) + ); + if (offset !== 0) core.fillBoldText1( + ctx, + "存档分类", + 1800, 1020, '#FFFFFF', + "#000000", + 6, + this._buildFont(45, true) + ); + if (offset !== 0) core.fillBoldText1( + ctx, + "删除存档", + 1800, 1120, '#FFFFFF', + "#000000", + 6, + this._buildFont(45, true) + ); + + if (core.status.event.data.mode !== "all" && core.status.event.data.mode !== "fav") core.fillBoldText1( + ctx, + "修改分类名", + 920, 1120, '#FFFFFF', + "#000000", + 6, + this._buildFont(45, true) + ); + if (data.hero.flags._cgText) { + core.fillBoldText1( + ctx, + cg ? "剧情CG模式" : "缩略图模式", + 1350, 1220, '#FFFFFF', + "#000000", + 6, + this._buildFont(45, true) + ); + if (!cg) { + core.drawWindowSkin( + "winskin.webp", + ctx, 805, + 252, + 1140, + 660, + null, + null, + null, + 3 + ); + core.drawImage(ctx, data.cg.image, 823, 270, 1104, 624) + let s = 0.5 + data.cg.bodyList.forEach((v) => { + //绘制立绘 + const body = core.material.images.images?.[v.name]; + if (v.filter) ctx.filter = "brightness(50%)"; + + if (body) { + if (!v.w && !v.h && !v.scale) v.scale = 1.7; + + if (!v.w && !v.h) { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + 823 + v.px * s, + 894 - body.height * v.scale * s, + body.width * v.scale * s, + body.height * v.scale * s + ); + } else { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + 823 + v.px * s, + 894 - (v.h ?? body.height) * s, + v.w ?? body.width * s, + v.h ?? body.height * s + ); + } + } + ctx.filter = "none"; + }); + core.fillRect(ctx, 823, 694, 1104, 200, "rgba(0,0,0,0.3)") + const head = core.material.images.images?.[data.cg.head.name]; + if (head) { + //绘制头像 + ctx.drawImage( + head, + 0, + 0, + head.width, + head.height, + 823 + data.cg.head.px * s, + 894 - head.height * 2.2 * s, + head.width * 2.2 * s, + head.height * 2.2 * s + ); + + + } + core.setTextAlign(ctx, "left") + if (data.cg.name) core.fillBoldText1( + ctx, + `【${data.cg.name}】`, + 1143, 720, '#FFFFFF', + "#000000", + 2, + this._buildFont(30, true) + ); + if (data.cg.text) core.drawTextContent(ctx, data.cg.text, { + left: 1143, + top: 750, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 30, + time: 0, + font: "Verdana", + maxWidth: 800, + }); + } + } + if (offset !== 0) core.drawWindowSkin( + "winskin.webp", + ctx, 1050, + 982, + 640, + 150, + null, + null, + null, + 1 + ); + let real_id = id + if (core.status.event.data.mode === "fav") { + real_id = core.saves.favorite[id - 1] + } + if (core.status.event.data.mode !== "fav" && core.status.event.data.mode !== "all") { + real_id = core.saves[core.status.event.data.mode][id - 1] + } + if (offset !== 0) core.drawTextContent(ctx, core.getLocalStorage("_slText" + real_id, "点击填写存档笔记"), { + left: 1070, + top: 1000, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 30, + time: 0, + font: "HATTEN", + maxWidth: 620, + }); + if (choose) { + core.drawWindowSkin( + "winskin.webp", + ctx, 805, + 252, + 1140, + 660, + null, + null, + null, + 3 + ); + core.fillRect(ctx, 823, 270, 1104, 624, "#000000") + + core.setTextAlign(ctx, 'left') + core.fillBoldText1( + ctx, + `${core.saves.favorite.indexOf(real_id)>=0?"☑":"□"}收藏★`, + 920, 370, core.saves.favorite.indexOf(real_id) >= 0 ? '#FFFF44' : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_1.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_1", "默认分类1")}`, + 920, 480, core.saves.class_1.indexOf(real_id) >= 0 ? '#FFFF44' : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_2.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_2", "默认分类2")}`, + 920, 590, core.saves.class_2.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_3.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_3", "默认分类3")}`, + 920, 700, core.saves.class_3.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_4.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_4", "默认分类4")}`, + 920, 810, core.saves.class_4.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_5.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_5", "默认分类5")}`, + 1400, 370, core.saves.class_5.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_6.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_6", "默认分类6")}`, + 1400, 480, core.saves.class_6.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_7.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_7", "默认分类7")}`, + 1400, 590, core.saves.class_7.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + `${core.saves.class_8.indexOf(real_id)>=0?"☑":"□"}${core.getLocalStorage("slClass_8", "默认分类8")}`, + 1400, 700, core.saves.class_8.indexOf(real_id) >= 0 ? "#FFFF44" : '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + core.fillBoldText1( + ctx, + "返回", + 1700, 810, '#FFFFFF', + "#000000", + 6, + this._buildFont(60, true) + ); + + } + ctx.lineWidth = 6 + core.setTextAlign(ctx, "center") + } else { + + core.fillRect(ctx, 1050, 270, 624, 624, '#333333'); + core.fillText(ctx, '无存档', 1362, 620, "#444444", this._buildFont(180, true)); + } + } + + ui.prototype._drawSLPanel_drawRecords = function (n) { + var page = core.status.event.data.page; + var offset = core.status.event.data.offset; + var name = core.status.event.id == 'save' ? "存档" : core.status.event.id == 'load' ? "读档" : "回放"; + core.drawLine(ctx, 650, 100, 650, 1148) + core.drawLine(ctx, 800, 100, 800, 1148) + let liney = 0 + core.fillText( + ctx, + "自动存档", + 470, + 190, + offset === 0 ? '#DDDD44' : core.status.event.ui[0] ? "#FFFFFF" : "#BBBBBB", + this._buildFont(45, true) + ); + core.setStrokeStyle(ctx, "#DDDDDD") + core.drawLine(ctx, 300, 224, 650, 224) + core.fillText( + ctx, + "▲", + 725, + 240, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▲", + 725, + 220, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▲", + 725, + 200, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▲", + 725, + 320, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▲", + 725, + 340, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▲", + 725, + 440, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + page + 1, + 725, + 540, + "#DDDD44", + this._buildFont(45, true) + ); + core.fillText( + ctx, + "/", + 725, + 590, + "#DDDDDD", + this._buildFont(45, true) + ); + core.fillText( + ctx, + core.saveLoad.max_page, + 725, + 640, + "#DDDDDD", + this._buildFont(45, true) + ); + core.fillText( + ctx, + "▼", + 725, + 740, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▼", + 725, + 820, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▼", + 725, + 840, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▼", + 725, + 940, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▼", + 725, + 960, + "#DDDDDD", + this._buildFont(60, true) + ); + core.fillText( + ctx, + "▼", + 725, + 980, + "#DDDDDD", + this._buildFont(60, true) + ); + if (core.status.event.data.mode === 'all' && core.getLocalStorage("save_page", 0) !== 8000) core.fillText( + ctx, + "扩容", + 725, + 1090, + "#DDDDDD", + this._buildFont(60, true) + ); + + this._drawSLPanel_drawRecord(page, offset) + for (var i = 1; i < (n || 10); i++) { + var data = core.status.event.ui[i]; + var id = 9 * page + i; + var highLight = (core.status.event.data.mode !== 'fav' && core.saves.favorite.indexOf(id) >= 0) || core.status.event.data.mode == 'fav'; + var title = (highLight ? '★ ' : '☆ ') + (core.saves.favoriteName[id] || (name + id)); + if (i != 0 && core.status.event.data.mode !== 'all') { + if (!data) break; + var real_id = core.saves.favorite[id - 1]; + for (let a = 1; a < 9; a++) { + if (core.status.event.data.mode === ("class_" + a)) + real_id = core.saves["class_" + a][id - 1] + } + title = (core.saves.favoriteName[real_id] || (name + real_id)); + + } + if (data && data.__toReplay__) title = '[R]' + title; + liney += 100 + core.fillText( + ctx, + title, + 470, + 190 + liney, + offset === i ? '#DDDD44' : data ? "#FFFFFF" : "#BBBBBB", + this._buildFont(45, true) + ); + core.setStrokeStyle(ctx, "#DDDDDD") + if (i != 9) core.drawLine(ctx, 300, 224 + liney, 650, 224 + liney) + + } + }; + ////// 点击保存按钮时的打开操作 ////// + events.prototype.save = function (fromUserAction) { + if (core.isReplaying()) return; + if (core.hasFlag("__forbidSave__")) { + core.playSound("操作失败"); + core.drawTip("当前禁止存档"); + return; + } + if ( + core.status.event.id == "save" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + if (!this._checkStatus("save", fromUserAction)) return; + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 9), + offset = saveIndex - 9 * page; + core.playSound("打开界面"); + core.ui._drawSLPanel(10 * page + offset); + }; + + ////// 点击读取按钮时的打开操作 ////// + events.prototype.load = function (fromUserAction) { + if (core.isReplaying()) return; + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 9), + offset = saveIndex - 9 * page; + // 游戏开始前读档 + if (!core.isPlaying()) { + core.dom.startPanel.style.display = "none"; + core.clearStatus(); + core.clearMap("all"); + core.status.event = { id: "load", data: null }; + core.status.lockControl = true; + core.playSound("打开界面"); + core.ui._drawSLPanel(10 * page + offset); + return; + } + if ( + core.status.event.id == "load" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + if (!this._checkStatus("load", fromUserAction)) return; + core.playSound("打开界面"); + core.ui._drawSLPanel(10 * page + offset); + }; + ////// 回放时存档 ////// + control.prototype._replay_SL = function () { + if (!core.isPlaying() || !core.isReplaying()) return; + if (!core.status.replay.pausing) { + core.playSound("操作失败"); + return core.drawTip("请先暂停录像"); + } + if (core.isMoving() || core.status.replay.animate || core.status.event.id) { + core.playSound("操作失败"); + return core.drawTip("请等待当前事件的处理结束"); + } + if (core.hasFlag("__forbidSave__")) { + core.playSound("操作失败"); + return core.drawTip("当前禁止存档"); + } + this._replay_hideProgress(); + + core.lockControl(); + core.status.event.id = "save"; + var saveIndex = core.saves.saveIndex; + var page = parseInt((saveIndex - 1) / 9), + offset = saveIndex - 9 * page; + + core.ui._drawSLPanel(10 * page + offset); + }; + + + + ////// 存读档界面时,按下某个键的操作 ////// + actions.prototype._keyDownSL = function (keycode) { + + var page = core.status.event.data.page, + offset = core.status.event.data.offset; + var index = page * 10 + offset; + + if (keycode == 37) { // left + core.playSound('光标移动'); + + core.ui._drawSLPanel(10 * (page - 1) + offset); + return; + } + if (keycode == 38) { // up + core.playSound('光标移动'); + if (offset > 1) { + core.ui._drawSLPanel(10 * page + offset - 1); + } else { + core.ui._drawSLPanel(10 * (page - 1) + 9); + } + return; + } + if (keycode == 39) { // right + core.playSound('光标移动'); + + core.ui._drawSLPanel(10 * (page + 1) + offset); + + return; + } + if (keycode == 40) { // down + core.playSound('光标移动'); + if (offset < 9) { + core.ui._drawSLPanel(10 * page + offset + 1); + } else { + core.ui._drawSLPanel(10 * (page + 1)); + } + return; + } + if (keycode == 33) { // PAGEUP + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page - 10) + offset); + return; + } + if (keycode == 34) { // PAGEDOWN + core.playSound('光标移动'); + core.ui._drawSLPanel(10 * (page + 10) + offset); + return; + } + } + + ////// 存读档界面时,放开某个键的操作 ////// + actions.prototype._keyUpSL = function (keycode) { + var page = core.status.event.data.page, + offset = core.status.event.data.offset; + var index = page * 10 + offset; + + if (keycode == 27 || keycode == 88 || (core.status.event.id == 'save' && keycode == 83) || (core.status.event.id == 'load' && keycode == 68)) { //退出 + saveLoadclick(1800, 1200); + return; + } + if (keycode >= 48 && keycode <= 57) { + if (keycode == 48) keycode = 58; + core.ui._drawSLPanel((keycode - 49) * 1000 + 1); + return; + } + if (keycode == 13 || keycode == 32 || keycode == 67) { + if (offset == 0) + core.doSL("autoSave", core.status.event.id); + else { + var id = 9 * page + offset; + if (core.status.event.data.mode == 'fav') id = core.saves.favorite[id - 1]; + if (core.status.event.data.mode !== 'fav' && core.status.event.data.mode !== 'all') id = core.saves[core.status.event.data.mode][id - 1]; + core.doSL(id, core.status.event.id); + } + return; + } + if (keycode == 69) { //e + switch (core.status.event.data.mode) { + case "all": + core.status.event.data.mode = 'fav' + break; + case "fav": + core.status.event.data.mode = 'class_1' + break; + case "class_1": + core.status.event.data.mode = 'class_2' + break; + case "class_2": + core.status.event.data.mode = 'class_3' + break; + case "class_3": + core.status.event.data.mode = 'class_4' + break; + case "class_4": + core.status.event.data.mode = 'class_5' + break; + case "class_5": + core.status.event.data.mode = 'class_6' + break; + case "class_6": + core.status.event.data.mode = 'class_7' + break; + case "class_7": + core.status.event.data.mode = 'class_8' + break; + case "class_8": + core.status.event.data.mode = 'all' + break; + } + + core.ui._drawSLPanel(0) + } + if (keycode == 46) { + if (offset == 0) { + core.playSound('操作失败'); + core.drawTip("无法删除自动存档!"); + } else { + var id = 9 * page + offset; + if (core.status.event.data.mode == 'fav') id = core.saves.favorite[id - 1]; + if (core.status.event.data.mode !== 'fav' && core.status.event.data.mode !== 'all') id = core.saves[core.status.event.data.mode][id - 1]; + core.removeSave(id, function () { + core.ui._drawSLPanel(index, true); + }); + } + } + + } +}, + "scrollingText": function () { + // 本插件用于绘制在线留言 + // 说明:https://h5mota.com/bbs/thread/?tid=1017 + // 目前使用core.http代替帖子中提到的axios + ////// 绘制提示同时播放成功音效 ////// + ui.prototype.drawSuccessTip = function (text, id, frame) { + this.drawTip(text, id, frame); + core.playSound('gem.mp3'); + } + core.plugin.aniMap = new Map() + ////// 绘制提示同时播放错误音效 ////// + ui.prototype.drawFailTip = function (text, id, frame) { + this.drawTip(text, id, frame); + core.playSound('error.mp3'); + } + /** 塔的英文名 */ + const towerName = core.firstData.name; + + let [W, H] = [core.__SIZE__, core.__SIZE__]; + let [WIDTH, HEIGHT] = [core.__PIXELS__, core.__PIXELS__]; + + //#region 弹幕的收发 + this.getComment = function () { + if (core.isReplaying()) return; + let form = new FormData(); + form.append('type', 1); + form.append('towername', towerName); + utils.prototype.http( + 'POST', + 'https://h5mota.com/backend/tower/barrage.php', + form, + function (res) { + try { + res = JSON.parse(res); + console.log(res); + core.drawTip('接收成功!') + core.playSound('item.mp3'); + let commentCollection = {}; + const commentList = res?.list; + const isEmpty = /^\s*$/; + for (let i = 0, l = commentList.length; i <= l - 1; i++) { + if (isEmpty.test(commentList[i]?.comment)) continue; + const commentTagsList = commentList[i].tags.split(','); + const [cFloorId, cX, cY] = commentTagsList; + if (0 <= cX && cX <= W - 1 && 0 <= cY && cY <= H - 1 && core.floorIds.includes(cFloorId)) { + if (!commentCollection.hasOwnProperty(cFloorId)) { commentCollection[cFloorId] = {}; } + const str = cX + ',' + cY; + if (!commentCollection[cFloorId].hasOwnProperty(str)) { commentCollection[cFloorId][str] = []; } + commentCollection[cFloorId][str].push(commentList[i]?.comment); + } + } + core.setFlag('commentCollection', commentCollection); + } catch (err) { + core.drawFailTip('接收失败!' + err.message); + } + }, + function (err) { + err = JSON.parse(err); + console.error(err); + core.drawFailTip('接收失败' + err?.message); + }, + null, null, null, 1000 + ); + } + + this.postComment = function (comment, tags) { + if (core.isReplaying()) return; + const isEmpty = /^\s*$/; + if (isEmpty.test(comment)) { + core.drawFailTip('您输入的消息为空,请重发!'); + return; + } + let form = new FormData(); + form.append('type', 2); + form.append('towername', towerName); + form.append('comment', comment); + form.append('tags', tags); + form.append('userid', 2324); + form.append('password', '77c8fd5ff49c370342e4472ebdda5903'); + utils.prototype.http( + 'POST', + 'https://h5mota.com/backend/tower/barrage.php', + form, + function (res) { + try { + res = JSON.parse(res); + console.log(res); + if (res?.code === 0) { + core.drawTip('提交成功!') + } else { + core.drawTip('提交失败!' + res?.message); + } + } catch (err) { + core.drawFailTip('提交失败!' + err.message); + } + }, + function (err) { + err = JSON.parse(err); + console.error(err); + core.drawFailTip('提交失败!' + err?.message); + }, + null, null, null, 1000 + ); + } + //#endregion + + /** 若变量comment为真,在每层切换时在地上有弹幕的地方显示相应图标。 */ + this.drawCommentSign = function () { + if (!core.hasFlag('comment') || core.isReplaying()) return; + let commentCollection = core.getFlag('commentCollection', {}), + floorId = core.status.floorId; + core.createCanvas('sign', 0, 0, WIDTH, HEIGHT, 61); + core.setOpacity('sign', 0.6); + if (commentCollection.hasOwnProperty(floorId)) { + for (let pos in commentCollection[floorId]) { + const l = commentCollection[floorId][pos].length; + for (let i = 0; i <= l - 1; i++) { + const [x, y] = pos.split(','); + core.drawIcon('sign', 'postman', 32 * x, 32 * y); + break; + } + } + } + } + + /** 立即清除楼层的弹幕图标。关闭弹幕相关设置时调用。 */ + this.clearCommentSign = function () { + core.deleteCanvas('sign'); + } + + /** 默认一次显示的弹幕数 */ + const showNum = 5; + + // 每走一步或瞬移,调用该函数,若目标点有弹幕,显示之 + this.showComment = function (x, y) { + if (!core.getFlag('comment') || core.isReplaying()) return; + const commentCollection = core.getFlag('commentCollection', {}); + const floorId = core.status.floorId, + str = x + ',' + y; + if (commentCollection.hasOwnProperty(floorId) && + commentCollection[floorId].hasOwnProperty(str)) { + let commentArr = commentCollection[floorId][str].concat(); + const commentArrPicked = pickComment(commentArr, showNum); + drawComment(commentArrPicked); + } + } + + /** 返回从commentArr中挑选showNum个comment组成的数组*/ + function pickComment(commentArr, showNum) { + let showList = []; + if (commentArr.length <= showNum) { + showList = commentArr; + } else { + for (let i = 0; i <= showNum - 1; i++) { + const l = commentArr.length, + n = core.plugin.dice(l - 1); + showList.push(commentArr[n]); + commentArr.splice(n, 1); + } + } + return showList; + } + + function drawComment(commentArr) { + const l = commentArr.length; + let yList = generateCommentYList(20, HEIGHT - 20, showNum); + if (l < showNum) yList = getRandomElements(yList, l); + for (let i = 0; i <= l - 1; i++) { + drawCommentStr(commentArr[i], WIDTH + 20 * Math.random(), + yList[i], Math.random() * 0.1 + 0.1); + } + } + + /** 生成count个随机数,范围从min到max,作为弹幕的y坐标*/ + function generateCommentYList(min, max, count) { + let yList = Array(count).fill(0); + const distance = (max - min) / (count + 1); + for (let i = 0; i < count; i++) { + yList[i] = min + distance * (i + 1) + (Math.random() - 0.5) * (distance / 2); + } + return yList; + } + + function getRandomElements(arr, count) { + let result = [...arr]; + let len = result.length; + count = Math.min(len, count); + + for (let i = len - 1; i > len - 1 - count; i--) { + let j = Math.floor(Math.random() * (i + 1)); + [result[i], result[j]] = [result[j], result[i]]; + } + + return result.slice(len - count); + } + + //#region 弹幕绘制部分 + const { Animation, linear, Ticker } = core.plugin.animate ?? {}; + const ctxName = 'scrollingText'; + + if (Ticker) { + const ticker = new Ticker(); + ticker.add(() => { + if (core.isReplaying()) return; + core.createCanvas(ctxName, 0, 0, core.__PIXELS__, core.__PIXELS__, 136); //每帧重绘该画布 + }); + } + + /** + * 绘制弹幕 + * @example + * drawCommentStr('OK', 450, 200, 0.1); + * @param {string} content 弹幕的内容 + * @param {number} x 弹幕的初始x坐标 + * @param {number} y 弹幕的初始y坐标 + * @param {number} vx 弹幕的横向滚动速度 + */ + function drawCommentStr(content, x, y, vx) { + if (core.isReplaying() || !Animation) return; + const ani = new Animation(); + core.plugin.aniMap.set(ani, (ani) => ani.ticker.destroy()); + ani.ticker.add(() => { + core.fillText(ctxName, content, x + ani.x, y, 'white', '16px Verdana'); + }) + // 弹幕的最大长度5600,再长属于异常数据 + const aim = 600 + Math.min(core.calWidth(ctxName, content, '16px Verdana'), 5000); + ani.mode(linear()) + .time(aim / vx) + .absolute() + .move(-aim, 0) + ani.all().then(() => { + ani.ticker.destroy(); + }); + } + //#endregion + +}, + "动画": function () { + // 在此增加新插件 + const { Transition, linear, bezier, circle, hyper, trigo, power, inverseTrigo, shake, sleep } = core.plugin.animate; + //////移动动画////// + const tran = new Transition(); + maps.prototype.moveAnimate = function (id, px, py, relative, time, style) { + if (!id) return + core.status.animateObjs.forEach(v => { + if (v.id === id) { + if (v.hero) return + if (!style) tran.mode(linear()) + else if (style === "in") { + tran.mode(trigo('sin', "in")) + } else if (style === "out") { + tran.mode(trigo('sin', "out")) + } else if (style === "in-out") { + tran.mode(trigo('sin', "in-out")) + } else if (style === "center") { + tran.mode(trigo('sin', "center")) + } + if (relative) { tran.relative() } else { tran.absolute() } + tran.time(time) + tran.value[v.id + v.name + "x"] = px + tran.value[v.id + v.name + "y"] = py + + } + }) + } + + control.prototype._animationFrame_animate = function (timestamp) { + let frametime = timestamp - core.animateFrame.animateTime + core.animateFrame.animateTime = timestamp; + if (!core.status.animateObjs || core.status.animateObjs.length == 0) return; + + core.clearMap('animate'); + // 更新帧 + for (var i = 0; i < core.status.animateObjs.length; i++) { + var obj = core.status.animateObjs[i]; + if (obj.pause) obj.pausetime += frametime + if (obj.start === 0) obj.start = core.animateFrame.animateTime + obj.index = Math.floor((core.animateFrame.animateTime - obj.start - obj.pausetime) / (1000 / 60)) + if (obj.reverse) obj.index = obj.animate.frames.length - obj.index + if ((!obj.reverse && obj.index >= obj.animate.frames.length) || (obj.reverse && obj.index <= 0)) { + if (obj.loop) { + if (obj.reverse) { + obj.index = obj.animate.frames.length + obj.start = core.animateFrame.animateTime + obj.pausetime = 0 + } else { + obj.start = core.animateFrame.animateTime + obj.index = 0 + obj.pausetime = 0 + } + } else + (function (callback) { + setTimeout(function () { + if (callback) callback(); + }); + })(obj.callback); + } + } + core.status.animateObjs = core.status.animateObjs.filter(function (obj) { + return (!obj.reverse && obj.index < obj.animate.frames.length) || (obj.reverse && obj.index > 0); + }); + let sx, sy; + if (core.status.heroMoving < 0) { + sx = 0; + sy = 0; + } else { + sx = + core.utils.scan[core.status.hero.loc.direction].x * + 4 * + core.status.heroMoving; + sy = + core.utils.scan[core.status.hero.loc.direction].y * + 4 * + core.status.heroMoving; + } + const herox = core.status.hero.loc.x * 32 + 16 + sx; + const heroy = core.status.hero.loc.y * 32 + 32 + sy - core.material.icons.hero.height / 2; + + core.status.animateObjs.forEach(function (obj) { + if (obj.hero) { + + core.maps._drawAnimateFrame('animate', obj.animate, herox, heroy, obj.index); + } else { + + core.maps._drawAnimateFrame('animate', obj.animate, tran.value[obj.id + obj.name + "x"], tran.value[obj.id + obj.name + "y"], obj.index); + } + }); + } + core.registerAnimationFrame("animate", true, core.control._animationFrame_animate); + + ////// 绘制动画 ////// + maps.prototype.drawAnimate = function (name, x, y, alignWindow, callback) { + name = core.getMappedName(name); + + // 正在播放录像:不显示动画 + if (core.isReplaying() || !core.material.animates[name] || x == null || y == null) { + if (callback) callback(); + return -1; + } + + // 开始绘制 + var animate = core.material.animates[name], + centerX = 32 * x + 16, + centerY = 32 * y + 16; + if (alignWindow) { + centerX += core.bigmap.offsetX; + centerY += core.bigmap.offsetY; + } + animate.se = animate.se || {}; + if (typeof animate.se == 'string') animate.se = { 1: animate.se }; + tran.mode(linear()).time(1).absolute() + tran.value[id + name + "x"] = centerX + tran.value[id + name + "y"] = centerY + var id = setTimeout(null); + core.status.animateObjs.push({ + "name": name, + "id": id, + "animate": animate, + "centerX": centerX, + "centerY": centerY, + "start": 0, + "pause": false, + "pausetime": 0, + "index": 0, + "callback": callback + }); + + return id; + } + + ////// 绘制反转动画 ////// + maps.prototype.drawResizeAnimate = function (name, id, centerX, centerY, hero, reverse, loop, callback) { + name = core.getMappedName(name); + + // 正在播放录像:不显示动画 + if (core.isReplaying() || !core.material.animates[name]) { + if (callback) callback(); + return -1; + } + + // 开始绘制 + var animate = core.material.animates[name], + centerX = core.calValue(centerX) + centerY = core.calValue(centerY) + + animate.se = animate.se || {}; + if (typeof animate.se == 'string') animate.se = { 1: animate.se }; + + var id = id || setTimeout(null); + tran.mode(linear()).time(1).absolute() + if (!hero) tran.value[id + name + "x"] = centerX + if (!hero) tran.value[id + name + "y"] = centerY + if (hero) core.status.animateObjs.push({ + "name": name, + "id": id, + "animate": animate, + "hero": true, + "reverse": reverse, + "start": 0, + "pause": false, + "loop": loop, + "pausetime": 0, + "index": 0, + "callback": callback + }) + else core.status.animateObjs.push({ + "name": name, + "id": id, + "animate": animate, + "centerX": centerX, + "centerY": centerY, + "reverse": reverse, + "start": 0, + "pause": false, + "loop": loop, + "pausetime": 0, + "index": 0, + "callback": callback + }); + + return id; + } + events.prototype._action_animateResize = function (data, x, y, prefix) { + core.events.__action_doAsyncFunc(data.async, core.maps.drawResizeAnimate, data.name, data.id, data.centerX, data.centerY, data.hero, data.reverse, data.loop); + }; + ////// 绘制一个跟随勇士的动画 ////// + maps.prototype.drawHeroAnimate = function (name, callback) { + name = core.getMappedName(name); + + // 正在播放录像或动画不存在:不显示动画 + if (core.isReplaying() || !core.material.animates[name]) { + if (callback) callback(); + return -1; + } + + // 开始绘制 + var animate = core.material.animates[name]; + animate.se = animate.se || {}; + if (typeof animate.se == 'string') animate.se = { 1: animate.se }; + + var id = setTimeout(null); + core.status.animateObjs.push({ + "name": name, + "id": id, + "animate": animate, + "hero": true, + "start": 0, + "pause": false, + "pausetime": 0, + "index": 0, + "callback": callback + }); + + return id; + } + + ////// 获得当前正在播放的所有(指定)动画的id列表 ////// + maps.prototype.getPlayingAnimates = function (name) { + return (core.status.animateObjs || []).filter(function (one) { + return name == null || one.name == name; + }).map(function (one) { return one.id }); + } + + + ////// 绘制动画的某一帧 ////// + maps.prototype._drawAnimateFrame = function (name, animate, centerX, centerY, index) { + var ctx = core.getContextByName(name); + if (!ctx) return; + var frame = animate.frames[index % animate.frame]; + core.playSound((animate.se || {})[index % animate.frame + 1], (animate.pitch || {})[index % animate.frame + 1]); + var ratio = animate.ratio; + frame.forEach(function (t) { + var image = animate.images[t.index]; + if (!image) return; + + var realWidth = image.width * ratio * t.zoom / 100; + var realHeight = image.height * ratio * t.zoom / 100; + core.setAlpha(ctx, t.opacity / 255); + + var cx = centerX + t.x, + cy = centerY + t.y; + + var ix = cx - realWidth / 2 - core.bigmap.offsetX, + iy = cy - realHeight / 2 - core.bigmap.offsetY; + + var mirror = t.mirror ? 'x' : null; + var angle = t.angle ? -t.angle * Math.PI / 180 : null; + core.drawImage(ctx, image, ix, iy, realWidth, realHeight, null, null, null, null, angle, mirror); + + core.setAlpha(ctx, 1); + }) + } + ////// 暂停动画 ////// + maps.prototype.pauseAnimate = function (id) { + for (var i = 0; i < core.status.animateObjs.length; i++) { + var obj = core.status.animateObjs[i]; + if (id == null || obj.id == id) { + obj.pause = true + + } + } + + } + ////// 继续动画 ////// + maps.prototype.remuseAnimate = function (id) { + for (var i = 0; i < core.status.animateObjs.length; i++) { + var obj = core.status.animateObjs[i]; + if (id == null || obj.id == id) { + obj.pause = false + } + + } + + } + ////// 停止动画 ////// + maps.prototype.stopAnimate = function (id, doCallback) { + for (var i = 0; i < core.status.animateObjs.length; i++) { + var obj = core.status.animateObjs[i]; + if (id == null || obj.id == id) { + if (doCallback) { + (function (callback) { + setTimeout(function () { + if (callback) callback(); + }); + })(obj.callback); + } + } + } + core.status.animateObjs = core.status.animateObjs.filter(function (x) { return id != null && x.id != id }); + if (core.status.animateObjs.length == 0) + core.clearMap('animate'); + } +}, + "帧动画(游戏画面)": function () { + // 在此增加新插件 + // 在此增加新插件 + const animate3 = document.createElement("canvas"); //画布设置 + animate3.style.zIndex = 71; + animate3.id = "animate3"; + animate3.classList.add("gameCanvas", "anti-aliasing"); + animate3.style.display = "block"; + animate3.width = 416; + animate3.height = 416; + animate3.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animate3.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animate3 = animate3; + const anctx = animate3.getContext("2d"); + + main.dom.gameDraw.appendChild(animate3); + + core.plugin.playing = new Set(); + const { Transition, linear, bezier, circle, hyper, trigo, power, inverseTrigo, shake, sleep } = core.plugin.animate; + const tran = new Transition(); + this.animatemove = function (id, px, py, relative, time, style) { + if (!id) return + core.plugin.playing.forEach(v => { + if (v.id === id) { + if (v.hero) return + if (!style) tran.mode(linear()) + else if (style === "in") { + tran.mode(trigo('sin', "in")) + } else if (style === "out") { + tran.mode(trigo('sin', "out")) + } else if (style === "in-out") { + tran.mode(trigo('sin', "in-out")) + } else if (style === "center") { + tran.mode(trigo('sin', "center")) + } + if (relative) { tran.relative() } else { tran.absolute() } + tran.time(time) + tran.value[v.id + v.name + "x"] = px + tran.value[v.id + v.name + "y"] = py + + } + }) + } + this.setanimate = function ( + name, + px, + py, + width, + height, + allFarme, + imageList, + soundList + ) { + const data = { + px: px, + py: py, + width: width, + height: height, + allFarme: allFarme, + imageList: imageList, + soundList: soundList, + }; + core.setFlag("animate_" + name, data); + }; + this.deleteanimate = function (name) { + core.setFlag("animate_" + name); + }; + let thistime = 0; + this.playanimate = function (name, id, x, y, hero, scalex, scaley, loop, reverse) { + if (!id) id = setTimeout(null) + tran.mode(linear()).time(1).absolute() + if (!hero) tran.value[id + name + "x"] = x + if (!hero) tran.value[id + name + "y"] = y + + const data = { + id: id, + name: name, + x: x, + y: y, + hero: hero, + scalex: scalex, + scaley: scaley, + start: 0, + pause: false, + loop: loop, + reverse: reverse, + pausetime: 0, + farme: 0, + }; + + core.plugin.playing.add(data); + return id + }; + this.animateloop = function (id, loop) { + core.plugin.playing.forEach(v => { + if (!id || v.id === id) v.loop = loop + }) + } + this.animatereverse = function (id, reverse) { + core.plugin.playing.forEach(v => { + if (!id || v.id === id) { + const data = flags["animate_" + v.name] + if (reverse && !v.reverse) v.start -= (data.allFarme - v.farme * 2) * (1000 / 60) + if (!reverse && v.reverse) v.start -= (v.farme * 2 - data.allFarme) * (1000 / 60) + v.reverse = reverse + } + }) + } + this.animatepause = function (id, pause) { + core.plugin.playing.forEach(v => { + if (!id || v.id === id) v.pause = pause + }) + } + this.animateclear = function (id) { + core.plugin.playing.forEach(v => { + if (!id || v.id === id) core.plugin.playing.delete(v) + }) + } + core.registerAnimationFrame("animateonmap", true, function (timestamp) { + let frametime = timestamp - thistime + thistime = timestamp; + + + core.clearMap(anctx); + core.plugin.playing.forEach((one) => { + const data = flags["animate_" + one.name]; + if (!data) { + core.plugin.playing.delete(one); + } else { + if (one.start === 0) one.start = thistime + if (one.pause) one.pausetime += frametime + one.farme = Math.floor((thistime - one.start - one.pausetime) / (1000 / 60)) + + if (one.reverse) one.farme = data.allFarme - one.farme + if ((!one.reverse && one.farme > data.allFarme) || (one.reverse && one.farme < 0)) { + if (one.loop) { + if (one.reverse) { + one.farme = data.allFarme + one.start = thistime + one.pausetime = 0 + } else { + one.start = thistime + one.farme = 0 + one.pausetime = 0 + } + } + } + if ((!one.reverse && one.farme > data.allFarme) || (one.reverse && one.farme < 0)) { + delete tran.value[one.id + one.name + "x"] + delete tran.value[one.id + one.name + "y"] + core.plugin.playing.delete(one) + + return + } + + data.imageList.forEach(function (image) { + if ( + one.farme >= (image.beforefarme ?? 0) && + one.farme <= (image.afterfarme ?? data.allFarme) + ) { + + const img = core.material.images.images?.[image.image]; + if (img) { + const gla = image.globalAlpha ?? 100; + const agla = image.aglobalAlpha ?? gla, + beforefarme = image.beforefarme ?? 0; + const afterfarme = image.afterfarme ?? data.allFarme; + + anctx.globalAlpha = + (gla + + ((agla - gla) * (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; + + const cx = + (image.cx ?? 0) + + (((image.acx ?? 0) - (image.cx ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (image.cy ?? 0) + + (((image.acy ?? 0) - (image.cy ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (image.cw ?? img.width) + + (((image.acw ?? img.width) - (image.cw ?? img.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (image.ch ?? img.height) + + (((image.acw ?? img.height) - (image.cw ?? img.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (image.x ?? 0) + + (((image.ax ?? 0) - (image.x ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (image.y ?? 0) + + (((image.ay ?? 0) - (image.y ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (image.w ?? img.width) + + (((image.aw ?? img.width) - (image.w ?? img.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (image.h ?? img.height) + + (((image.aw ?? img.height) - (image.w ?? img.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + angle = + (Math.PI * + ((image.angle ?? 0) + + (((image.aangle ?? 0) - (image.angle ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1))) / + 180; + + if (one.hero) { + let sx, sy; + if (core.status.heroMoving < 0) { + sx = 0; + sy = 0; + } else { + sx = + core.utils.scan[core.status.hero.loc.direction].x * + 4 * + core.status.heroMoving; + sy = + core.utils.scan[core.status.hero.loc.direction].y * + 4 * + core.status.heroMoving; + } + const herox = core.status.hero.loc.x * 32 + 16 + sx; + const heroy = core.status.hero.loc.y * 32 + 16 + sy; + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + herox + (x - data.px) * one.scalex, + heroy + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + + + } else { + + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + tran.value[one.id + one.name + "x"] + (x - data.px) * one.scalex, + tran.value[one.id + one.name + "y"] + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } + } + } + }); + data.soundList.forEach(function (sound) { + const lisen = + sound.sound && + core.material.sounds[sound.sound] && + core.musicStatus.soundStatus; + if (one.farme == sound.startfarme && lisen) { + if (sound.stopbefore) core.stopSound(); + core.playSound(sound.sound); + } + }); + + } + }); + + }); +} } \ No newline at end of file diff --git a/project/sounds/aiy020000190.ogg b/project/sounds/aiy020000190.ogg new file mode 100644 index 0000000..8212ba6 Binary files /dev/null and b/project/sounds/aiy020000190.ogg differ diff --git a/project/sounds/aiy020000200.ogg b/project/sounds/aiy020000200.ogg new file mode 100644 index 0000000..8f710f0 Binary files /dev/null and b/project/sounds/aiy020000200.ogg differ diff --git a/project/sounds/aiy020000210.ogg b/project/sounds/aiy020000210.ogg new file mode 100644 index 0000000..e4f719f Binary files /dev/null and b/project/sounds/aiy020000210.ogg differ diff --git a/project/sounds/aiy020000220.ogg b/project/sounds/aiy020000220.ogg new file mode 100644 index 0000000..cf59706 Binary files /dev/null and b/project/sounds/aiy020000220.ogg differ diff --git a/project/sounds/aiy020000230.ogg b/project/sounds/aiy020000230.ogg new file mode 100644 index 0000000..c7469e0 Binary files /dev/null and b/project/sounds/aiy020000230.ogg differ diff --git a/project/sounds/aiy020000240.ogg b/project/sounds/aiy020000240.ogg new file mode 100644 index 0000000..dc062c2 Binary files /dev/null and b/project/sounds/aiy020000240.ogg differ diff --git a/project/sounds/aiy020000250.ogg b/project/sounds/aiy020000250.ogg new file mode 100644 index 0000000..19608c4 Binary files /dev/null and b/project/sounds/aiy020000250.ogg differ diff --git a/project/sounds/aiy020000260.ogg b/project/sounds/aiy020000260.ogg new file mode 100644 index 0000000..fc86122 Binary files /dev/null and b/project/sounds/aiy020000260.ogg differ diff --git a/project/sounds/aiy020000270.ogg b/project/sounds/aiy020000270.ogg new file mode 100644 index 0000000..8a9e875 Binary files /dev/null and b/project/sounds/aiy020000270.ogg differ diff --git a/project/sounds/aiy020000280.ogg b/project/sounds/aiy020000280.ogg new file mode 100644 index 0000000..804c47b Binary files /dev/null and b/project/sounds/aiy020000280.ogg differ diff --git a/project/sounds/aiy020000290.ogg b/project/sounds/aiy020000290.ogg new file mode 100644 index 0000000..46e1502 Binary files /dev/null and b/project/sounds/aiy020000290.ogg differ diff --git a/project/sounds/aiy020000300.ogg b/project/sounds/aiy020000300.ogg new file mode 100644 index 0000000..d5445c7 Binary files /dev/null and b/project/sounds/aiy020000300.ogg differ diff --git a/project/sounds/aiy020000310.ogg b/project/sounds/aiy020000310.ogg new file mode 100644 index 0000000..e197805 Binary files /dev/null and b/project/sounds/aiy020000310.ogg differ diff --git a/project/sounds/aiy020000320.ogg b/project/sounds/aiy020000320.ogg new file mode 100644 index 0000000..eadca46 Binary files /dev/null and b/project/sounds/aiy020000320.ogg differ diff --git a/project/sounds/aiy020000330.ogg b/project/sounds/aiy020000330.ogg new file mode 100644 index 0000000..24af673 Binary files /dev/null and b/project/sounds/aiy020000330.ogg differ diff --git a/project/sounds/aiy020000340.ogg b/project/sounds/aiy020000340.ogg new file mode 100644 index 0000000..34d7e41 Binary files /dev/null and b/project/sounds/aiy020000340.ogg differ diff --git a/project/sounds/aiy020000350.ogg b/project/sounds/aiy020000350.ogg new file mode 100644 index 0000000..25d0572 Binary files /dev/null and b/project/sounds/aiy020000350.ogg differ diff --git a/project/sounds/aiy020000360.ogg b/project/sounds/aiy020000360.ogg new file mode 100644 index 0000000..e46bc3e Binary files /dev/null and b/project/sounds/aiy020000360.ogg differ diff --git a/project/sounds/aiy020000370.ogg b/project/sounds/aiy020000370.ogg new file mode 100644 index 0000000..f929ecb Binary files /dev/null and b/project/sounds/aiy020000370.ogg differ diff --git a/project/sounds/aiy030000010.ogg b/project/sounds/aiy030000010.ogg new file mode 100644 index 0000000..9b9d46d Binary files /dev/null and b/project/sounds/aiy030000010.ogg differ diff --git a/project/sounds/aiy030000020.ogg b/project/sounds/aiy030000020.ogg new file mode 100644 index 0000000..a0f4ebb Binary files /dev/null and b/project/sounds/aiy030000020.ogg differ diff --git a/project/sounds/aiy030000030.ogg b/project/sounds/aiy030000030.ogg new file mode 100644 index 0000000..14a2ca8 Binary files /dev/null and b/project/sounds/aiy030000030.ogg differ diff --git a/project/sounds/aiy030000050.ogg b/project/sounds/aiy030000050.ogg new file mode 100644 index 0000000..9bc3077 Binary files /dev/null and b/project/sounds/aiy030000050.ogg differ diff --git a/project/sounds/aiy030000060.ogg b/project/sounds/aiy030000060.ogg new file mode 100644 index 0000000..ff055c2 Binary files /dev/null and b/project/sounds/aiy030000060.ogg differ diff --git a/project/sounds/aiy030000070.ogg b/project/sounds/aiy030000070.ogg new file mode 100644 index 0000000..2e7dcba Binary files /dev/null and b/project/sounds/aiy030000070.ogg differ diff --git a/project/sounds/aiy030000080.ogg b/project/sounds/aiy030000080.ogg new file mode 100644 index 0000000..efc3d38 Binary files /dev/null and b/project/sounds/aiy030000080.ogg differ diff --git a/project/sounds/aiy030000090.ogg b/project/sounds/aiy030000090.ogg new file mode 100644 index 0000000..8f9fb91 Binary files /dev/null and b/project/sounds/aiy030000090.ogg differ diff --git a/project/sounds/aiy030000100.ogg b/project/sounds/aiy030000100.ogg new file mode 100644 index 0000000..0dbf5bc Binary files /dev/null and b/project/sounds/aiy030000100.ogg differ diff --git a/project/sounds/aiy030000110.ogg b/project/sounds/aiy030000110.ogg new file mode 100644 index 0000000..f722e49 Binary files /dev/null and b/project/sounds/aiy030000110.ogg differ diff --git a/project/sounds/aiy030000120.ogg b/project/sounds/aiy030000120.ogg new file mode 100644 index 0000000..53ac3bf Binary files /dev/null and b/project/sounds/aiy030000120.ogg differ diff --git a/project/sounds/aiy030000130.ogg b/project/sounds/aiy030000130.ogg new file mode 100644 index 0000000..aa157af Binary files /dev/null and b/project/sounds/aiy030000130.ogg differ diff --git a/project/sounds/aiy050000010.ogg b/project/sounds/aiy050000010.ogg new file mode 100644 index 0000000..6a9a4a2 Binary files /dev/null and b/project/sounds/aiy050000010.ogg differ diff --git a/project/sounds/aiy050000020.ogg b/project/sounds/aiy050000020.ogg new file mode 100644 index 0000000..9b9cdf8 Binary files /dev/null and b/project/sounds/aiy050000020.ogg differ diff --git a/project/sounds/aiy050000030.ogg b/project/sounds/aiy050000030.ogg new file mode 100644 index 0000000..d328ca8 Binary files /dev/null and b/project/sounds/aiy050000030.ogg differ diff --git a/project/sounds/aiy050000040.ogg b/project/sounds/aiy050000040.ogg new file mode 100644 index 0000000..cc11d60 Binary files /dev/null and b/project/sounds/aiy050000040.ogg differ diff --git a/project/sounds/aiy050000050.ogg b/project/sounds/aiy050000050.ogg new file mode 100644 index 0000000..590349f Binary files /dev/null and b/project/sounds/aiy050000050.ogg differ diff --git a/project/sounds/aiy050000060.ogg b/project/sounds/aiy050000060.ogg new file mode 100644 index 0000000..a77d3ba Binary files /dev/null and b/project/sounds/aiy050000060.ogg differ diff --git a/project/sounds/aiy050000070.ogg b/project/sounds/aiy050000070.ogg new file mode 100644 index 0000000..9213193 Binary files /dev/null and b/project/sounds/aiy050000070.ogg differ diff --git a/project/sounds/aiy050000080.ogg b/project/sounds/aiy050000080.ogg new file mode 100644 index 0000000..29a2c70 Binary files /dev/null and b/project/sounds/aiy050000080.ogg differ diff --git a/project/sounds/aiy050000090.ogg b/project/sounds/aiy050000090.ogg new file mode 100644 index 0000000..b0e5931 Binary files /dev/null and b/project/sounds/aiy050000090.ogg differ diff --git a/project/sounds/aiy050000100.ogg b/project/sounds/aiy050000100.ogg new file mode 100644 index 0000000..59e7ebc Binary files /dev/null and b/project/sounds/aiy050000100.ogg differ diff --git a/project/sounds/aiy050000110.ogg b/project/sounds/aiy050000110.ogg new file mode 100644 index 0000000..e198a48 Binary files /dev/null and b/project/sounds/aiy050000110.ogg differ diff --git a/project/sounds/aiy050000120.ogg b/project/sounds/aiy050000120.ogg new file mode 100644 index 0000000..ac4bf72 Binary files /dev/null and b/project/sounds/aiy050000120.ogg differ diff --git a/project/sounds/aiy120000020.ogg b/project/sounds/aiy120000020.ogg new file mode 100644 index 0000000..10d2ae0 Binary files /dev/null and b/project/sounds/aiy120000020.ogg differ diff --git a/project/sounds/aiy120000030.ogg b/project/sounds/aiy120000030.ogg new file mode 100644 index 0000000..2a0dc02 Binary files /dev/null and b/project/sounds/aiy120000030.ogg differ diff --git a/project/sounds/aiy120000040.ogg b/project/sounds/aiy120000040.ogg new file mode 100644 index 0000000..f9f0f66 Binary files /dev/null and b/project/sounds/aiy120000040.ogg differ diff --git a/project/sounds/aiy120000050.ogg b/project/sounds/aiy120000050.ogg new file mode 100644 index 0000000..0cb03e6 Binary files /dev/null and b/project/sounds/aiy120000050.ogg differ diff --git a/project/sounds/aiy120000060.ogg b/project/sounds/aiy120000060.ogg new file mode 100644 index 0000000..bdf482e Binary files /dev/null and b/project/sounds/aiy120000060.ogg differ diff --git a/project/sounds/aiy120000070.ogg b/project/sounds/aiy120000070.ogg new file mode 100644 index 0000000..c8822ac Binary files /dev/null and b/project/sounds/aiy120000070.ogg differ diff --git a/project/sounds/aiy120000080.ogg b/project/sounds/aiy120000080.ogg new file mode 100644 index 0000000..3cd1ff4 Binary files /dev/null and b/project/sounds/aiy120000080.ogg differ diff --git a/project/sounds/aiy120000090.ogg b/project/sounds/aiy120000090.ogg new file mode 100644 index 0000000..306c3d4 Binary files /dev/null and b/project/sounds/aiy120000090.ogg differ diff --git a/project/sounds/aiy120000100.ogg b/project/sounds/aiy120000100.ogg new file mode 100644 index 0000000..d6597f6 Binary files /dev/null and b/project/sounds/aiy120000100.ogg differ diff --git a/project/sounds/aiy120000110.ogg b/project/sounds/aiy120000110.ogg new file mode 100644 index 0000000..a322097 Binary files /dev/null and b/project/sounds/aiy120000110.ogg differ diff --git a/project/sounds/aiy120000120.ogg b/project/sounds/aiy120000120.ogg new file mode 100644 index 0000000..acb82fb Binary files /dev/null and b/project/sounds/aiy120000120.ogg differ diff --git a/project/sounds/aiy120000130.ogg b/project/sounds/aiy120000130.ogg new file mode 100644 index 0000000..8f231aa Binary files /dev/null and b/project/sounds/aiy120000130.ogg differ diff --git a/project/sounds/aiy120000140.ogg b/project/sounds/aiy120000140.ogg new file mode 100644 index 0000000..d3bbbb2 Binary files /dev/null and b/project/sounds/aiy120000140.ogg differ diff --git a/project/sounds/aiy120000150.ogg b/project/sounds/aiy120000150.ogg new file mode 100644 index 0000000..47f6a04 Binary files /dev/null and b/project/sounds/aiy120000150.ogg differ diff --git a/project/sounds/aiy120000160.ogg b/project/sounds/aiy120000160.ogg new file mode 100644 index 0000000..214c63b Binary files /dev/null and b/project/sounds/aiy120000160.ogg differ diff --git a/project/sounds/aiy120000170.ogg b/project/sounds/aiy120000170.ogg new file mode 100644 index 0000000..35d2f1b Binary files /dev/null and b/project/sounds/aiy120000170.ogg differ diff --git a/project/sounds/aiy120000180.ogg b/project/sounds/aiy120000180.ogg new file mode 100644 index 0000000..3417af8 Binary files /dev/null and b/project/sounds/aiy120000180.ogg differ diff --git a/project/sounds/aiy120000190.ogg b/project/sounds/aiy120000190.ogg new file mode 100644 index 0000000..37a6a52 Binary files /dev/null and b/project/sounds/aiy120000190.ogg differ diff --git a/project/sounds/aiy120000200.ogg b/project/sounds/aiy120000200.ogg new file mode 100644 index 0000000..18eefb3 Binary files /dev/null and b/project/sounds/aiy120000200.ogg differ diff --git a/project/sounds/aiy120000210.ogg b/project/sounds/aiy120000210.ogg new file mode 100644 index 0000000..67784d0 Binary files /dev/null and b/project/sounds/aiy120000210.ogg differ diff --git a/project/sounds/aiy120000220.ogg b/project/sounds/aiy120000220.ogg new file mode 100644 index 0000000..1e9d440 Binary files /dev/null and b/project/sounds/aiy120000220.ogg differ diff --git a/project/sounds/aiy120000230.ogg b/project/sounds/aiy120000230.ogg new file mode 100644 index 0000000..dc4d494 Binary files /dev/null and b/project/sounds/aiy120000230.ogg differ diff --git a/project/sounds/aiy120000240.ogg b/project/sounds/aiy120000240.ogg new file mode 100644 index 0000000..88a9404 Binary files /dev/null and b/project/sounds/aiy120000240.ogg differ diff --git a/project/sounds/aiy120000250.ogg b/project/sounds/aiy120000250.ogg new file mode 100644 index 0000000..44e9970 Binary files /dev/null and b/project/sounds/aiy120000250.ogg differ diff --git a/project/sounds/aiy120000260.ogg b/project/sounds/aiy120000260.ogg new file mode 100644 index 0000000..c93d37b Binary files /dev/null and b/project/sounds/aiy120000260.ogg differ diff --git a/project/sounds/aiy120000270.ogg b/project/sounds/aiy120000270.ogg new file mode 100644 index 0000000..97235e0 Binary files /dev/null and b/project/sounds/aiy120000270.ogg differ diff --git a/project/sounds/aiy120000280.ogg b/project/sounds/aiy120000280.ogg new file mode 100644 index 0000000..7153660 Binary files /dev/null and b/project/sounds/aiy120000280.ogg differ diff --git a/project/sounds/aiy120000290.ogg b/project/sounds/aiy120000290.ogg new file mode 100644 index 0000000..8c4db5b Binary files /dev/null and b/project/sounds/aiy120000290.ogg differ diff --git a/project/sounds/aiy120000300.ogg b/project/sounds/aiy120000300.ogg new file mode 100644 index 0000000..875d1f7 Binary files /dev/null and b/project/sounds/aiy120000300.ogg differ diff --git a/project/sounds/aiy120000310.ogg b/project/sounds/aiy120000310.ogg new file mode 100644 index 0000000..8720a02 Binary files /dev/null and b/project/sounds/aiy120000310.ogg differ diff --git a/project/sounds/aiy120000320.ogg b/project/sounds/aiy120000320.ogg new file mode 100644 index 0000000..c86806b Binary files /dev/null and b/project/sounds/aiy120000320.ogg differ diff --git a/project/sounds/aiy120000330.ogg b/project/sounds/aiy120000330.ogg new file mode 100644 index 0000000..0f21adc Binary files /dev/null and b/project/sounds/aiy120000330.ogg differ diff --git a/project/sounds/aiy120000340.ogg b/project/sounds/aiy120000340.ogg new file mode 100644 index 0000000..a055a78 Binary files /dev/null and b/project/sounds/aiy120000340.ogg differ diff --git a/project/sounds/aiy120000350.ogg b/project/sounds/aiy120000350.ogg new file mode 100644 index 0000000..0711a4f Binary files /dev/null and b/project/sounds/aiy120000350.ogg differ diff --git a/project/sounds/aiy120000360.ogg b/project/sounds/aiy120000360.ogg new file mode 100644 index 0000000..358c450 Binary files /dev/null and b/project/sounds/aiy120000360.ogg differ diff --git a/project/sounds/aiy120000370.ogg b/project/sounds/aiy120000370.ogg new file mode 100644 index 0000000..6381050 Binary files /dev/null and b/project/sounds/aiy120000370.ogg differ diff --git a/project/sounds/aiy120000380.ogg b/project/sounds/aiy120000380.ogg new file mode 100644 index 0000000..b80c4f0 Binary files /dev/null and b/project/sounds/aiy120000380.ogg differ diff --git a/project/sounds/aiy120000390.ogg b/project/sounds/aiy120000390.ogg new file mode 100644 index 0000000..c608bba Binary files /dev/null and b/project/sounds/aiy120000390.ogg differ diff --git a/project/sounds/aiy120000400.ogg b/project/sounds/aiy120000400.ogg new file mode 100644 index 0000000..656ae27 Binary files /dev/null and b/project/sounds/aiy120000400.ogg differ diff --git a/project/sounds/aiy120000410.ogg b/project/sounds/aiy120000410.ogg new file mode 100644 index 0000000..5f04e20 Binary files /dev/null and b/project/sounds/aiy120000410.ogg differ diff --git a/project/sounds/aiy120000420.ogg b/project/sounds/aiy120000420.ogg new file mode 100644 index 0000000..86e91fa Binary files /dev/null and b/project/sounds/aiy120000420.ogg differ diff --git a/project/sounds/aiy120000430.ogg b/project/sounds/aiy120000430.ogg new file mode 100644 index 0000000..957e986 Binary files /dev/null and b/project/sounds/aiy120000430.ogg differ diff --git a/project/sounds/aiy120000440.ogg b/project/sounds/aiy120000440.ogg new file mode 100644 index 0000000..45231db Binary files /dev/null and b/project/sounds/aiy120000440.ogg differ diff --git a/project/sounds/aiy120000450.ogg b/project/sounds/aiy120000450.ogg new file mode 100644 index 0000000..ad04858 Binary files /dev/null and b/project/sounds/aiy120000450.ogg differ diff --git a/project/sounds/aiy120000460.ogg b/project/sounds/aiy120000460.ogg new file mode 100644 index 0000000..d35ded8 Binary files /dev/null and b/project/sounds/aiy120000460.ogg differ diff --git a/project/sounds/aiy120000470.ogg b/project/sounds/aiy120000470.ogg new file mode 100644 index 0000000..546a039 Binary files /dev/null and b/project/sounds/aiy120000470.ogg differ diff --git a/project/sounds/aiy120000480.ogg b/project/sounds/aiy120000480.ogg new file mode 100644 index 0000000..65f673a Binary files /dev/null and b/project/sounds/aiy120000480.ogg differ diff --git a/project/sounds/aiy120000490.ogg b/project/sounds/aiy120000490.ogg new file mode 100644 index 0000000..36a5df2 Binary files /dev/null and b/project/sounds/aiy120000490.ogg differ diff --git a/project/sounds/aiy120000500.ogg b/project/sounds/aiy120000500.ogg new file mode 100644 index 0000000..db40172 Binary files /dev/null and b/project/sounds/aiy120000500.ogg differ diff --git a/project/sounds/aiy120000510.ogg b/project/sounds/aiy120000510.ogg new file mode 100644 index 0000000..0da2bbd Binary files /dev/null and b/project/sounds/aiy120000510.ogg differ diff --git a/project/sounds/aiy120000520.ogg b/project/sounds/aiy120000520.ogg new file mode 100644 index 0000000..30618ea Binary files /dev/null and b/project/sounds/aiy120000520.ogg differ diff --git a/project/sounds/aiy120000530.ogg b/project/sounds/aiy120000530.ogg new file mode 100644 index 0000000..63424e5 Binary files /dev/null and b/project/sounds/aiy120000530.ogg differ diff --git a/project/sounds/aiy120000540.ogg b/project/sounds/aiy120000540.ogg new file mode 100644 index 0000000..a491c40 Binary files /dev/null and b/project/sounds/aiy120000540.ogg differ diff --git a/project/sounds/aiy120000550.ogg b/project/sounds/aiy120000550.ogg new file mode 100644 index 0000000..1adb571 Binary files /dev/null and b/project/sounds/aiy120000550.ogg differ diff --git a/project/sounds/aiy120000560.ogg b/project/sounds/aiy120000560.ogg new file mode 100644 index 0000000..eafe149 Binary files /dev/null and b/project/sounds/aiy120000560.ogg differ diff --git a/project/sounds/aiy120000570.ogg b/project/sounds/aiy120000570.ogg new file mode 100644 index 0000000..f25d9d2 Binary files /dev/null and b/project/sounds/aiy120000570.ogg differ diff --git a/project/sounds/aiy120000580.ogg b/project/sounds/aiy120000580.ogg new file mode 100644 index 0000000..503d4e0 Binary files /dev/null and b/project/sounds/aiy120000580.ogg differ diff --git a/project/sounds/aiy120000590.ogg b/project/sounds/aiy120000590.ogg new file mode 100644 index 0000000..0fa071e Binary files /dev/null and b/project/sounds/aiy120000590.ogg differ diff --git a/project/sounds/aiy120000600.ogg b/project/sounds/aiy120000600.ogg new file mode 100644 index 0000000..6d22156 Binary files /dev/null and b/project/sounds/aiy120000600.ogg differ diff --git a/project/sounds/aiy120000610.ogg b/project/sounds/aiy120000610.ogg new file mode 100644 index 0000000..95b2a7d Binary files /dev/null and b/project/sounds/aiy120000610.ogg differ diff --git a/project/sounds/aiy120000620.ogg b/project/sounds/aiy120000620.ogg new file mode 100644 index 0000000..f03cf8f Binary files /dev/null and b/project/sounds/aiy120000620.ogg differ diff --git a/project/sounds/aiy120000630.ogg b/project/sounds/aiy120000630.ogg new file mode 100644 index 0000000..5420074 Binary files /dev/null and b/project/sounds/aiy120000630.ogg differ diff --git a/project/sounds/aiy120000640.ogg b/project/sounds/aiy120000640.ogg new file mode 100644 index 0000000..a204879 Binary files /dev/null and b/project/sounds/aiy120000640.ogg differ diff --git a/project/sounds/aiy120000650.ogg b/project/sounds/aiy120000650.ogg new file mode 100644 index 0000000..257b817 Binary files /dev/null and b/project/sounds/aiy120000650.ogg differ diff --git a/project/sounds/aiy120000670.ogg b/project/sounds/aiy120000670.ogg new file mode 100644 index 0000000..b603efe Binary files /dev/null and b/project/sounds/aiy120000670.ogg differ diff --git a/project/sounds/aiy120000680.ogg b/project/sounds/aiy120000680.ogg new file mode 100644 index 0000000..32f2bdd Binary files /dev/null and b/project/sounds/aiy120000680.ogg differ diff --git a/project/sounds/aiy120000690.ogg b/project/sounds/aiy120000690.ogg new file mode 100644 index 0000000..89a831c Binary files /dev/null and b/project/sounds/aiy120000690.ogg differ diff --git a/project/sounds/aiy130000010.ogg b/project/sounds/aiy130000010.ogg new file mode 100644 index 0000000..fe0e4e2 Binary files /dev/null and b/project/sounds/aiy130000010.ogg differ diff --git a/project/sounds/aiy130000020.ogg b/project/sounds/aiy130000020.ogg new file mode 100644 index 0000000..6e13850 Binary files /dev/null and b/project/sounds/aiy130000020.ogg differ diff --git a/project/sounds/aiy150000010.ogg b/project/sounds/aiy150000010.ogg new file mode 100644 index 0000000..0659452 Binary files /dev/null and b/project/sounds/aiy150000010.ogg differ diff --git a/project/sounds/aiy150000020.ogg b/project/sounds/aiy150000020.ogg new file mode 100644 index 0000000..798a9fc Binary files /dev/null and b/project/sounds/aiy150000020.ogg differ diff --git a/project/sounds/aiy150000030.ogg b/project/sounds/aiy150000030.ogg new file mode 100644 index 0000000..9022052 Binary files /dev/null and b/project/sounds/aiy150000030.ogg differ diff --git a/project/sounds/aiy150000040.ogg b/project/sounds/aiy150000040.ogg new file mode 100644 index 0000000..c6e6233 Binary files /dev/null and b/project/sounds/aiy150000040.ogg differ diff --git a/project/sounds/aiy150000050.ogg b/project/sounds/aiy150000050.ogg new file mode 100644 index 0000000..8764aee Binary files /dev/null and b/project/sounds/aiy150000050.ogg differ diff --git a/project/sounds/aiy150000060.ogg b/project/sounds/aiy150000060.ogg new file mode 100644 index 0000000..e305004 Binary files /dev/null and b/project/sounds/aiy150000060.ogg differ diff --git a/project/sounds/aiy150000070.ogg b/project/sounds/aiy150000070.ogg new file mode 100644 index 0000000..e2d173a Binary files /dev/null and b/project/sounds/aiy150000070.ogg differ diff --git a/project/sounds/aiy150000080.ogg b/project/sounds/aiy150000080.ogg new file mode 100644 index 0000000..8bed0cf Binary files /dev/null and b/project/sounds/aiy150000080.ogg differ diff --git a/project/sounds/aiy150000090.ogg b/project/sounds/aiy150000090.ogg new file mode 100644 index 0000000..8c35672 Binary files /dev/null and b/project/sounds/aiy150000090.ogg differ diff --git a/project/sounds/aiy150000100.ogg b/project/sounds/aiy150000100.ogg new file mode 100644 index 0000000..0fda997 Binary files /dev/null and b/project/sounds/aiy150000100.ogg differ diff --git a/project/sounds/aiy150000110.ogg b/project/sounds/aiy150000110.ogg new file mode 100644 index 0000000..2e7da86 Binary files /dev/null and b/project/sounds/aiy150000110.ogg differ diff --git a/project/sounds/aiy150000120.ogg b/project/sounds/aiy150000120.ogg new file mode 100644 index 0000000..1e6adc7 Binary files /dev/null and b/project/sounds/aiy150000120.ogg differ diff --git a/project/sounds/aiy150000130.ogg b/project/sounds/aiy150000130.ogg new file mode 100644 index 0000000..bdbefb9 Binary files /dev/null and b/project/sounds/aiy150000130.ogg differ diff --git a/project/sounds/aiy150000140.ogg b/project/sounds/aiy150000140.ogg new file mode 100644 index 0000000..5ec6eda Binary files /dev/null and b/project/sounds/aiy150000140.ogg differ diff --git a/project/sounds/aiy150000150.ogg b/project/sounds/aiy150000150.ogg new file mode 100644 index 0000000..28fad01 Binary files /dev/null and b/project/sounds/aiy150000150.ogg differ diff --git a/project/sounds/aiy150000160.ogg b/project/sounds/aiy150000160.ogg new file mode 100644 index 0000000..54bb342 Binary files /dev/null and b/project/sounds/aiy150000160.ogg differ diff --git a/project/sounds/aiy150000170.ogg b/project/sounds/aiy150000170.ogg new file mode 100644 index 0000000..44543c4 Binary files /dev/null and b/project/sounds/aiy150000170.ogg differ diff --git a/project/sounds/aiy150000180.ogg b/project/sounds/aiy150000180.ogg new file mode 100644 index 0000000..16682cc Binary files /dev/null and b/project/sounds/aiy150000180.ogg differ diff --git a/project/sounds/aiy150000190.ogg b/project/sounds/aiy150000190.ogg new file mode 100644 index 0000000..74b719a Binary files /dev/null and b/project/sounds/aiy150000190.ogg differ diff --git a/project/sounds/aiy150000200.ogg b/project/sounds/aiy150000200.ogg new file mode 100644 index 0000000..c6c73df Binary files /dev/null and b/project/sounds/aiy150000200.ogg differ diff --git a/project/sounds/aiy150000210.ogg b/project/sounds/aiy150000210.ogg new file mode 100644 index 0000000..bb1182b Binary files /dev/null and b/project/sounds/aiy150000210.ogg differ diff --git a/project/sounds/aiy150000220.ogg b/project/sounds/aiy150000220.ogg new file mode 100644 index 0000000..3babde5 Binary files /dev/null and b/project/sounds/aiy150000220.ogg differ diff --git a/project/sounds/aiy150000230.ogg b/project/sounds/aiy150000230.ogg new file mode 100644 index 0000000..a51169e Binary files /dev/null and b/project/sounds/aiy150000230.ogg differ diff --git a/project/sounds/aiy150000240.ogg b/project/sounds/aiy150000240.ogg new file mode 100644 index 0000000..6ff7544 Binary files /dev/null and b/project/sounds/aiy150000240.ogg differ diff --git a/project/sounds/aiy150000250.ogg b/project/sounds/aiy150000250.ogg new file mode 100644 index 0000000..1b3acf8 Binary files /dev/null and b/project/sounds/aiy150000250.ogg differ diff --git a/project/sounds/aiy310000310.ogg b/project/sounds/aiy310000310.ogg new file mode 100644 index 0000000..7d1eda9 Binary files /dev/null and b/project/sounds/aiy310000310.ogg differ diff --git a/project/sounds/aiy310000320.ogg b/project/sounds/aiy310000320.ogg new file mode 100644 index 0000000..2793e41 Binary files /dev/null and b/project/sounds/aiy310000320.ogg differ diff --git a/project/sounds/aiy310000330.ogg b/project/sounds/aiy310000330.ogg new file mode 100644 index 0000000..f3806c3 Binary files /dev/null and b/project/sounds/aiy310000330.ogg differ diff --git a/project/sounds/aiy310000340.ogg b/project/sounds/aiy310000340.ogg new file mode 100644 index 0000000..a640644 Binary files /dev/null and b/project/sounds/aiy310000340.ogg differ diff --git a/project/sounds/aiy310000350.ogg b/project/sounds/aiy310000350.ogg new file mode 100644 index 0000000..ea5352e Binary files /dev/null and b/project/sounds/aiy310000350.ogg differ diff --git a/project/sounds/aiy310000360.ogg b/project/sounds/aiy310000360.ogg new file mode 100644 index 0000000..5eefa11 Binary files /dev/null and b/project/sounds/aiy310000360.ogg differ diff --git a/project/sounds/aiy310000370.ogg b/project/sounds/aiy310000370.ogg new file mode 100644 index 0000000..91a7a46 Binary files /dev/null and b/project/sounds/aiy310000370.ogg differ diff --git a/project/sounds/aiy310000380.ogg b/project/sounds/aiy310000380.ogg new file mode 100644 index 0000000..7ba0311 Binary files /dev/null and b/project/sounds/aiy310000380.ogg differ diff --git a/project/sounds/aiy310000390.ogg b/project/sounds/aiy310000390.ogg new file mode 100644 index 0000000..3c877e9 Binary files /dev/null and b/project/sounds/aiy310000390.ogg differ diff --git a/project/sounds/aiy310000400.ogg b/project/sounds/aiy310000400.ogg new file mode 100644 index 0000000..df3e50c Binary files /dev/null and b/project/sounds/aiy310000400.ogg differ diff --git a/project/sounds/aiy310000410.ogg b/project/sounds/aiy310000410.ogg new file mode 100644 index 0000000..69ad557 Binary files /dev/null and b/project/sounds/aiy310000410.ogg differ diff --git a/project/sounds/aiy310000420.ogg b/project/sounds/aiy310000420.ogg new file mode 100644 index 0000000..1a50529 Binary files /dev/null and b/project/sounds/aiy310000420.ogg differ diff --git a/project/sounds/aiy310000430.ogg b/project/sounds/aiy310000430.ogg new file mode 100644 index 0000000..980b7af Binary files /dev/null and b/project/sounds/aiy310000430.ogg differ diff --git a/project/sounds/aiy310000440.ogg b/project/sounds/aiy310000440.ogg new file mode 100644 index 0000000..68e063a Binary files /dev/null and b/project/sounds/aiy310000440.ogg differ diff --git a/project/sounds/aiy310000450.ogg b/project/sounds/aiy310000450.ogg new file mode 100644 index 0000000..991e23c Binary files /dev/null and b/project/sounds/aiy310000450.ogg differ diff --git a/project/sounds/aiy310000460.ogg b/project/sounds/aiy310000460.ogg new file mode 100644 index 0000000..7208098 Binary files /dev/null and b/project/sounds/aiy310000460.ogg differ diff --git a/project/sounds/aiy310000470.ogg b/project/sounds/aiy310000470.ogg new file mode 100644 index 0000000..fe71d8f Binary files /dev/null and b/project/sounds/aiy310000470.ogg differ diff --git a/project/sounds/aiy310000480.ogg b/project/sounds/aiy310000480.ogg new file mode 100644 index 0000000..11bc4fe Binary files /dev/null and b/project/sounds/aiy310000480.ogg differ diff --git a/project/sounds/aiy310000490.ogg b/project/sounds/aiy310000490.ogg new file mode 100644 index 0000000..4a8c1a5 Binary files /dev/null and b/project/sounds/aiy310000490.ogg differ diff --git a/project/sounds/aiy310000510.ogg b/project/sounds/aiy310000510.ogg new file mode 100644 index 0000000..5f98abb Binary files /dev/null and b/project/sounds/aiy310000510.ogg differ diff --git a/project/sounds/aiy310000520.ogg b/project/sounds/aiy310000520.ogg new file mode 100644 index 0000000..5dbe058 Binary files /dev/null and b/project/sounds/aiy310000520.ogg differ diff --git a/project/sounds/aiy310000530.ogg b/project/sounds/aiy310000530.ogg new file mode 100644 index 0000000..317a75e Binary files /dev/null and b/project/sounds/aiy310000530.ogg differ diff --git a/project/sounds/aiy310000540.ogg b/project/sounds/aiy310000540.ogg new file mode 100644 index 0000000..ebdceab Binary files /dev/null and b/project/sounds/aiy310000540.ogg differ diff --git a/project/sounds/aiy310000550.ogg b/project/sounds/aiy310000550.ogg new file mode 100644 index 0000000..735881c Binary files /dev/null and b/project/sounds/aiy310000550.ogg differ diff --git a/project/sounds/aiy310000560.ogg b/project/sounds/aiy310000560.ogg new file mode 100644 index 0000000..a631836 Binary files /dev/null and b/project/sounds/aiy310000560.ogg differ diff --git a/project/sounds/aiy310000570.ogg b/project/sounds/aiy310000570.ogg new file mode 100644 index 0000000..cd365e2 Binary files /dev/null and b/project/sounds/aiy310000570.ogg differ diff --git a/project/sounds/aiy310000580.ogg b/project/sounds/aiy310000580.ogg new file mode 100644 index 0000000..1ff4d98 Binary files /dev/null and b/project/sounds/aiy310000580.ogg differ diff --git a/project/sounds/aiy310000590.ogg b/project/sounds/aiy310000590.ogg new file mode 100644 index 0000000..d6d161a Binary files /dev/null and b/project/sounds/aiy310000590.ogg differ diff --git a/project/sounds/aiy310000600.ogg b/project/sounds/aiy310000600.ogg new file mode 100644 index 0000000..3afd47d Binary files /dev/null and b/project/sounds/aiy310000600.ogg differ diff --git a/project/sounds/aiy310000610.ogg b/project/sounds/aiy310000610.ogg new file mode 100644 index 0000000..fdcb28b Binary files /dev/null and b/project/sounds/aiy310000610.ogg differ diff --git a/project/sounds/aiy310000620.ogg b/project/sounds/aiy310000620.ogg new file mode 100644 index 0000000..b9d5791 Binary files /dev/null and b/project/sounds/aiy310000620.ogg differ diff --git a/project/sounds/aiy310000630.ogg b/project/sounds/aiy310000630.ogg new file mode 100644 index 0000000..b564e34 Binary files /dev/null and b/project/sounds/aiy310000630.ogg differ diff --git a/project/sounds/aiy310000640.ogg b/project/sounds/aiy310000640.ogg new file mode 100644 index 0000000..d976e60 Binary files /dev/null and b/project/sounds/aiy310000640.ogg differ diff --git a/project/sounds/aiy310000650.ogg b/project/sounds/aiy310000650.ogg new file mode 100644 index 0000000..ea7b117 Binary files /dev/null and b/project/sounds/aiy310000650.ogg differ diff --git a/project/sounds/aiy310000660.ogg b/project/sounds/aiy310000660.ogg new file mode 100644 index 0000000..95f02d0 Binary files /dev/null and b/project/sounds/aiy310000660.ogg differ diff --git a/project/sounds/aiy310000670.ogg b/project/sounds/aiy310000670.ogg new file mode 100644 index 0000000..17df42a Binary files /dev/null and b/project/sounds/aiy310000670.ogg differ diff --git a/project/sounds/aiy310000680.ogg b/project/sounds/aiy310000680.ogg new file mode 100644 index 0000000..032a9b8 Binary files /dev/null and b/project/sounds/aiy310000680.ogg differ diff --git a/project/sounds/aiy310000690.ogg b/project/sounds/aiy310000690.ogg new file mode 100644 index 0000000..9d99453 Binary files /dev/null and b/project/sounds/aiy310000690.ogg differ diff --git a/project/sounds/aiy310000700.ogg b/project/sounds/aiy310000700.ogg new file mode 100644 index 0000000..7cefbff Binary files /dev/null and b/project/sounds/aiy310000700.ogg differ diff --git a/project/sounds/aiy310000710.ogg b/project/sounds/aiy310000710.ogg new file mode 100644 index 0000000..dc5eb5a Binary files /dev/null and b/project/sounds/aiy310000710.ogg differ diff --git a/project/sounds/aiy310000720.ogg b/project/sounds/aiy310000720.ogg new file mode 100644 index 0000000..fd37fd3 Binary files /dev/null and b/project/sounds/aiy310000720.ogg differ diff --git a/project/sounds/aiy310000730.ogg b/project/sounds/aiy310000730.ogg new file mode 100644 index 0000000..94a4631 Binary files /dev/null and b/project/sounds/aiy310000730.ogg differ diff --git a/project/sounds/aiy310000740.ogg b/project/sounds/aiy310000740.ogg new file mode 100644 index 0000000..db5f537 Binary files /dev/null and b/project/sounds/aiy310000740.ogg differ diff --git a/project/sounds/aiy310000750.ogg b/project/sounds/aiy310000750.ogg new file mode 100644 index 0000000..90573c8 Binary files /dev/null and b/project/sounds/aiy310000750.ogg differ diff --git a/project/sounds/aiy310000760.ogg b/project/sounds/aiy310000760.ogg new file mode 100644 index 0000000..43f2522 Binary files /dev/null and b/project/sounds/aiy310000760.ogg differ diff --git a/project/sounds/aiy310000770.ogg b/project/sounds/aiy310000770.ogg new file mode 100644 index 0000000..fccf1f1 Binary files /dev/null and b/project/sounds/aiy310000770.ogg differ diff --git a/project/sounds/aiy310000780.ogg b/project/sounds/aiy310000780.ogg new file mode 100644 index 0000000..d1d04ee Binary files /dev/null and b/project/sounds/aiy310000780.ogg differ diff --git a/project/sounds/aiy310000790.ogg b/project/sounds/aiy310000790.ogg new file mode 100644 index 0000000..2cfa70b Binary files /dev/null and b/project/sounds/aiy310000790.ogg differ diff --git a/project/sounds/aiy310000800.ogg b/project/sounds/aiy310000800.ogg new file mode 100644 index 0000000..4400a66 Binary files /dev/null and b/project/sounds/aiy310000800.ogg differ diff --git a/project/sounds/aiy310000810.ogg b/project/sounds/aiy310000810.ogg new file mode 100644 index 0000000..4066404 Binary files /dev/null and b/project/sounds/aiy310000810.ogg differ diff --git a/project/sounds/aiy310000820.ogg b/project/sounds/aiy310000820.ogg new file mode 100644 index 0000000..29c5807 Binary files /dev/null and b/project/sounds/aiy310000820.ogg differ diff --git a/project/sounds/aiy310000830.ogg b/project/sounds/aiy310000830.ogg new file mode 100644 index 0000000..84770ef Binary files /dev/null and b/project/sounds/aiy310000830.ogg differ diff --git a/project/sounds/aiy310000840.ogg b/project/sounds/aiy310000840.ogg new file mode 100644 index 0000000..5b44741 Binary files /dev/null and b/project/sounds/aiy310000840.ogg differ diff --git a/project/sounds/aiy310000850.ogg b/project/sounds/aiy310000850.ogg new file mode 100644 index 0000000..0900773 Binary files /dev/null and b/project/sounds/aiy310000850.ogg differ diff --git a/project/sounds/aiy310000860.ogg b/project/sounds/aiy310000860.ogg new file mode 100644 index 0000000..e31d562 Binary files /dev/null and b/project/sounds/aiy310000860.ogg differ diff --git a/project/sounds/aiy310000870.ogg b/project/sounds/aiy310000870.ogg new file mode 100644 index 0000000..5c9f936 Binary files /dev/null and b/project/sounds/aiy310000870.ogg differ diff --git a/project/sounds/aiy310000880.ogg b/project/sounds/aiy310000880.ogg new file mode 100644 index 0000000..0938bb7 Binary files /dev/null and b/project/sounds/aiy310000880.ogg differ diff --git a/project/sounds/aiy310000890.ogg b/project/sounds/aiy310000890.ogg new file mode 100644 index 0000000..89e43c5 Binary files /dev/null and b/project/sounds/aiy310000890.ogg differ diff --git a/project/sounds/aiy310000900.ogg b/project/sounds/aiy310000900.ogg new file mode 100644 index 0000000..e809e52 Binary files /dev/null and b/project/sounds/aiy310000900.ogg differ diff --git a/project/sounds/aiy310000910.ogg b/project/sounds/aiy310000910.ogg new file mode 100644 index 0000000..ffb6b5b Binary files /dev/null and b/project/sounds/aiy310000910.ogg differ diff --git a/project/sounds/aiy310000920.ogg b/project/sounds/aiy310000920.ogg new file mode 100644 index 0000000..f470e54 Binary files /dev/null and b/project/sounds/aiy310000920.ogg differ diff --git a/project/sounds/aiy310000930.ogg b/project/sounds/aiy310000930.ogg new file mode 100644 index 0000000..494d15f Binary files /dev/null and b/project/sounds/aiy310000930.ogg differ diff --git a/project/sounds/aiy310000940.ogg b/project/sounds/aiy310000940.ogg new file mode 100644 index 0000000..de36a9d Binary files /dev/null and b/project/sounds/aiy310000940.ogg differ diff --git a/project/sounds/aiy310000950.ogg b/project/sounds/aiy310000950.ogg new file mode 100644 index 0000000..9abfea9 Binary files /dev/null and b/project/sounds/aiy310000950.ogg differ diff --git a/project/sounds/aiy310000960.ogg b/project/sounds/aiy310000960.ogg new file mode 100644 index 0000000..394ddcb Binary files /dev/null and b/project/sounds/aiy310000960.ogg differ diff --git a/project/sounds/aiy310000970.ogg b/project/sounds/aiy310000970.ogg new file mode 100644 index 0000000..aefe802 Binary files /dev/null and b/project/sounds/aiy310000970.ogg differ diff --git a/project/sounds/aiy310000980.ogg b/project/sounds/aiy310000980.ogg new file mode 100644 index 0000000..9c7ea85 Binary files /dev/null and b/project/sounds/aiy310000980.ogg differ diff --git a/project/sounds/aiy310000990.ogg b/project/sounds/aiy310000990.ogg new file mode 100644 index 0000000..5808076 Binary files /dev/null and b/project/sounds/aiy310000990.ogg differ diff --git a/project/sounds/aiy310001000.ogg b/project/sounds/aiy310001000.ogg new file mode 100644 index 0000000..2dba8fb Binary files /dev/null and b/project/sounds/aiy310001000.ogg differ diff --git a/project/sounds/aiy310001010.ogg b/project/sounds/aiy310001010.ogg new file mode 100644 index 0000000..a647a12 Binary files /dev/null and b/project/sounds/aiy310001010.ogg differ diff --git a/project/sounds/aiy310001027.ogg b/project/sounds/aiy310001027.ogg new file mode 100644 index 0000000..9d31c17 Binary files /dev/null and b/project/sounds/aiy310001027.ogg differ diff --git a/project/sounds/aiy310001030.ogg b/project/sounds/aiy310001030.ogg new file mode 100644 index 0000000..c0f363e Binary files /dev/null and b/project/sounds/aiy310001030.ogg differ diff --git a/project/sounds/aiy310001040.ogg b/project/sounds/aiy310001040.ogg new file mode 100644 index 0000000..2d36a51 Binary files /dev/null and b/project/sounds/aiy310001040.ogg differ diff --git a/project/sounds/aiy310001050.ogg b/project/sounds/aiy310001050.ogg new file mode 100644 index 0000000..7b3d406 Binary files /dev/null and b/project/sounds/aiy310001050.ogg differ diff --git a/project/sounds/aiy310001060.ogg b/project/sounds/aiy310001060.ogg new file mode 100644 index 0000000..5a7c2c1 Binary files /dev/null and b/project/sounds/aiy310001060.ogg differ diff --git a/project/sounds/aiy310001070.ogg b/project/sounds/aiy310001070.ogg new file mode 100644 index 0000000..4ecc17a Binary files /dev/null and b/project/sounds/aiy310001070.ogg differ diff --git a/project/sounds/aiy310001080.ogg b/project/sounds/aiy310001080.ogg new file mode 100644 index 0000000..d97e943 Binary files /dev/null and b/project/sounds/aiy310001080.ogg differ diff --git a/project/sounds/aiy310001090.ogg b/project/sounds/aiy310001090.ogg new file mode 100644 index 0000000..dc60205 Binary files /dev/null and b/project/sounds/aiy310001090.ogg differ diff --git a/project/sounds/aiy310001100.ogg b/project/sounds/aiy310001100.ogg new file mode 100644 index 0000000..13d7d7d Binary files /dev/null and b/project/sounds/aiy310001100.ogg differ diff --git a/project/sounds/aiy310001110.ogg b/project/sounds/aiy310001110.ogg new file mode 100644 index 0000000..040c120 Binary files /dev/null and b/project/sounds/aiy310001110.ogg differ diff --git a/project/sounds/aiy310001120.ogg b/project/sounds/aiy310001120.ogg new file mode 100644 index 0000000..458e4f7 Binary files /dev/null and b/project/sounds/aiy310001120.ogg differ diff --git a/project/sounds/aiy310001130.ogg b/project/sounds/aiy310001130.ogg new file mode 100644 index 0000000..7daea21 Binary files /dev/null and b/project/sounds/aiy310001130.ogg differ diff --git a/project/sounds/aiy310001140.ogg b/project/sounds/aiy310001140.ogg new file mode 100644 index 0000000..7d54e19 Binary files /dev/null and b/project/sounds/aiy310001140.ogg differ diff --git a/project/sounds/aiy310001150.ogg b/project/sounds/aiy310001150.ogg new file mode 100644 index 0000000..b06bdc9 Binary files /dev/null and b/project/sounds/aiy310001150.ogg differ diff --git a/project/sounds/aiy310001160.ogg b/project/sounds/aiy310001160.ogg new file mode 100644 index 0000000..3ec510b Binary files /dev/null and b/project/sounds/aiy310001160.ogg differ diff --git a/project/sounds/aiy310001170.ogg b/project/sounds/aiy310001170.ogg new file mode 100644 index 0000000..d96b1e2 Binary files /dev/null and b/project/sounds/aiy310001170.ogg differ diff --git a/project/sounds/aiy310001180.ogg b/project/sounds/aiy310001180.ogg new file mode 100644 index 0000000..88cffb2 Binary files /dev/null and b/project/sounds/aiy310001180.ogg differ diff --git a/project/sounds/aiy310001190.ogg b/project/sounds/aiy310001190.ogg new file mode 100644 index 0000000..e35c481 Binary files /dev/null and b/project/sounds/aiy310001190.ogg differ diff --git a/project/sounds/aiy310001200.ogg b/project/sounds/aiy310001200.ogg new file mode 100644 index 0000000..9c30d38 Binary files /dev/null and b/project/sounds/aiy310001200.ogg differ diff --git a/project/sounds/aiy310001210.ogg b/project/sounds/aiy310001210.ogg new file mode 100644 index 0000000..cfe51c7 Binary files /dev/null and b/project/sounds/aiy310001210.ogg differ diff --git a/project/sounds/aiy310001220.ogg b/project/sounds/aiy310001220.ogg new file mode 100644 index 0000000..e7d5e61 Binary files /dev/null and b/project/sounds/aiy310001220.ogg differ diff --git a/project/sounds/aiy310001230.ogg b/project/sounds/aiy310001230.ogg new file mode 100644 index 0000000..4aa7064 Binary files /dev/null and b/project/sounds/aiy310001230.ogg differ diff --git a/project/sounds/aiy310001240.ogg b/project/sounds/aiy310001240.ogg new file mode 100644 index 0000000..9342811 Binary files /dev/null and b/project/sounds/aiy310001240.ogg differ diff --git a/project/sounds/aiy310001250.ogg b/project/sounds/aiy310001250.ogg new file mode 100644 index 0000000..15a6960 Binary files /dev/null and b/project/sounds/aiy310001250.ogg differ diff --git a/project/sounds/aiy310001260.ogg b/project/sounds/aiy310001260.ogg new file mode 100644 index 0000000..dab5516 Binary files /dev/null and b/project/sounds/aiy310001260.ogg differ diff --git a/project/sounds/aiy310001270.ogg b/project/sounds/aiy310001270.ogg new file mode 100644 index 0000000..d531b49 Binary files /dev/null and b/project/sounds/aiy310001270.ogg differ diff --git a/project/sounds/aiy310001280.ogg b/project/sounds/aiy310001280.ogg new file mode 100644 index 0000000..2e749a4 Binary files /dev/null and b/project/sounds/aiy310001280.ogg differ diff --git a/project/sounds/aiy310001290.ogg b/project/sounds/aiy310001290.ogg new file mode 100644 index 0000000..c2e81a6 Binary files /dev/null and b/project/sounds/aiy310001290.ogg differ diff --git a/project/sounds/aiy310001300.ogg b/project/sounds/aiy310001300.ogg new file mode 100644 index 0000000..904940f Binary files /dev/null and b/project/sounds/aiy310001300.ogg differ diff --git a/project/sounds/aiy310001310.ogg b/project/sounds/aiy310001310.ogg new file mode 100644 index 0000000..a7f25b0 Binary files /dev/null and b/project/sounds/aiy310001310.ogg differ diff --git a/project/sounds/aiy310001320.ogg b/project/sounds/aiy310001320.ogg new file mode 100644 index 0000000..1b06256 Binary files /dev/null and b/project/sounds/aiy310001320.ogg differ diff --git a/project/sounds/aiy310001330.ogg b/project/sounds/aiy310001330.ogg new file mode 100644 index 0000000..8525810 Binary files /dev/null and b/project/sounds/aiy310001330.ogg differ diff --git a/project/sounds/aiy310001340.ogg b/project/sounds/aiy310001340.ogg new file mode 100644 index 0000000..44b81fe Binary files /dev/null and b/project/sounds/aiy310001340.ogg differ diff --git a/project/sounds/aiy310001350.ogg b/project/sounds/aiy310001350.ogg new file mode 100644 index 0000000..2291f96 Binary files /dev/null and b/project/sounds/aiy310001350.ogg differ diff --git a/project/sounds/aiy310001360.ogg b/project/sounds/aiy310001360.ogg new file mode 100644 index 0000000..2114e7b Binary files /dev/null and b/project/sounds/aiy310001360.ogg differ diff --git a/project/sounds/aiy310001370.ogg b/project/sounds/aiy310001370.ogg new file mode 100644 index 0000000..d7df9be Binary files /dev/null and b/project/sounds/aiy310001370.ogg differ diff --git a/project/sounds/aiy310001380.ogg b/project/sounds/aiy310001380.ogg new file mode 100644 index 0000000..fac86f0 Binary files /dev/null and b/project/sounds/aiy310001380.ogg differ diff --git a/project/sounds/aiy310001390.ogg b/project/sounds/aiy310001390.ogg new file mode 100644 index 0000000..e543b6f Binary files /dev/null and b/project/sounds/aiy310001390.ogg differ diff --git a/project/sounds/aiy320000010.ogg b/project/sounds/aiy320000010.ogg new file mode 100644 index 0000000..54d6db5 Binary files /dev/null and b/project/sounds/aiy320000010.ogg differ diff --git a/project/sounds/aiy320000020.ogg b/project/sounds/aiy320000020.ogg new file mode 100644 index 0000000..d98d94e Binary files /dev/null and b/project/sounds/aiy320000020.ogg differ diff --git a/project/sounds/aiy320000030.ogg b/project/sounds/aiy320000030.ogg new file mode 100644 index 0000000..574f903 Binary files /dev/null and b/project/sounds/aiy320000030.ogg differ diff --git a/project/sounds/aiy320000040.ogg b/project/sounds/aiy320000040.ogg new file mode 100644 index 0000000..613c27f Binary files /dev/null and b/project/sounds/aiy320000040.ogg differ diff --git a/project/sounds/aiy320000050.ogg b/project/sounds/aiy320000050.ogg new file mode 100644 index 0000000..b35ca98 Binary files /dev/null and b/project/sounds/aiy320000050.ogg differ diff --git a/project/sounds/aiy320000060.ogg b/project/sounds/aiy320000060.ogg new file mode 100644 index 0000000..0365def Binary files /dev/null and b/project/sounds/aiy320000060.ogg differ diff --git a/project/sounds/aiy320000070.ogg b/project/sounds/aiy320000070.ogg new file mode 100644 index 0000000..52e3d11 Binary files /dev/null and b/project/sounds/aiy320000070.ogg differ diff --git a/project/sounds/aiy320000080.ogg b/project/sounds/aiy320000080.ogg new file mode 100644 index 0000000..9a2afef Binary files /dev/null and b/project/sounds/aiy320000080.ogg differ diff --git a/project/sounds/aiy320000090.ogg b/project/sounds/aiy320000090.ogg new file mode 100644 index 0000000..608f2e1 Binary files /dev/null and b/project/sounds/aiy320000090.ogg differ diff --git a/project/sounds/aiy320000100.ogg b/project/sounds/aiy320000100.ogg new file mode 100644 index 0000000..b97a61c Binary files /dev/null and b/project/sounds/aiy320000100.ogg differ diff --git a/project/sounds/aiy320000110.ogg b/project/sounds/aiy320000110.ogg new file mode 100644 index 0000000..f15348f Binary files /dev/null and b/project/sounds/aiy320000110.ogg differ diff --git a/project/sounds/aiy320000120.ogg b/project/sounds/aiy320000120.ogg new file mode 100644 index 0000000..3adda1d Binary files /dev/null and b/project/sounds/aiy320000120.ogg differ diff --git a/project/sounds/aiy320000135.ogg b/project/sounds/aiy320000135.ogg new file mode 100644 index 0000000..79ed386 Binary files /dev/null and b/project/sounds/aiy320000135.ogg differ diff --git a/project/sounds/aiy320000140.ogg b/project/sounds/aiy320000140.ogg new file mode 100644 index 0000000..0b7add2 Binary files /dev/null and b/project/sounds/aiy320000140.ogg differ diff --git a/project/sounds/aiy340000010.ogg b/project/sounds/aiy340000010.ogg new file mode 100644 index 0000000..1687505 Binary files /dev/null and b/project/sounds/aiy340000010.ogg differ diff --git a/project/sounds/aiy340000020.ogg b/project/sounds/aiy340000020.ogg new file mode 100644 index 0000000..f05a1e8 Binary files /dev/null and b/project/sounds/aiy340000020.ogg differ diff --git a/project/sounds/aiy340000030.ogg b/project/sounds/aiy340000030.ogg new file mode 100644 index 0000000..915b664 Binary files /dev/null and b/project/sounds/aiy340000030.ogg differ diff --git a/project/sounds/aiy340000040.ogg b/project/sounds/aiy340000040.ogg new file mode 100644 index 0000000..72259c5 Binary files /dev/null and b/project/sounds/aiy340000040.ogg differ diff --git a/project/sounds/aiy340000050.ogg b/project/sounds/aiy340000050.ogg new file mode 100644 index 0000000..ca136d2 Binary files /dev/null and b/project/sounds/aiy340000050.ogg differ diff --git a/project/sounds/aiy340000060.ogg b/project/sounds/aiy340000060.ogg new file mode 100644 index 0000000..8bcb94b Binary files /dev/null and b/project/sounds/aiy340000060.ogg differ diff --git a/project/sounds/aiy340000070.ogg b/project/sounds/aiy340000070.ogg new file mode 100644 index 0000000..364be3b Binary files /dev/null and b/project/sounds/aiy340000070.ogg differ diff --git a/project/sounds/aiy340000080.ogg b/project/sounds/aiy340000080.ogg new file mode 100644 index 0000000..6e6f1da Binary files /dev/null and b/project/sounds/aiy340000080.ogg differ diff --git a/project/sounds/aiy340000090.ogg b/project/sounds/aiy340000090.ogg new file mode 100644 index 0000000..1da2a78 Binary files /dev/null and b/project/sounds/aiy340000090.ogg differ diff --git a/project/sounds/aiy340000100.ogg b/project/sounds/aiy340000100.ogg new file mode 100644 index 0000000..718db86 Binary files /dev/null and b/project/sounds/aiy340000100.ogg differ diff --git a/project/sounds/aiy340000110.ogg b/project/sounds/aiy340000110.ogg new file mode 100644 index 0000000..46d5be6 Binary files /dev/null and b/project/sounds/aiy340000110.ogg differ diff --git a/project/sounds/aiy340000120.ogg b/project/sounds/aiy340000120.ogg new file mode 100644 index 0000000..f1003c3 Binary files /dev/null and b/project/sounds/aiy340000120.ogg differ diff --git a/project/sounds/aiy340000140.ogg b/project/sounds/aiy340000140.ogg new file mode 100644 index 0000000..7a475e9 Binary files /dev/null and b/project/sounds/aiy340000140.ogg differ diff --git a/project/sounds/aiy340000150.ogg b/project/sounds/aiy340000150.ogg new file mode 100644 index 0000000..01b5107 Binary files /dev/null and b/project/sounds/aiy340000150.ogg differ diff --git a/project/sounds/aiy340000160.ogg b/project/sounds/aiy340000160.ogg new file mode 100644 index 0000000..710abca Binary files /dev/null and b/project/sounds/aiy340000160.ogg differ diff --git a/project/sounds/aiy340000170.ogg b/project/sounds/aiy340000170.ogg new file mode 100644 index 0000000..7fc073b Binary files /dev/null and b/project/sounds/aiy340000170.ogg differ diff --git a/project/sounds/aiy340000180.ogg b/project/sounds/aiy340000180.ogg new file mode 100644 index 0000000..575d8b4 Binary files /dev/null and b/project/sounds/aiy340000180.ogg differ diff --git a/project/sounds/aiy340000190.ogg b/project/sounds/aiy340000190.ogg new file mode 100644 index 0000000..155b411 Binary files /dev/null and b/project/sounds/aiy340000190.ogg differ diff --git a/project/sounds/aiy340000200.ogg b/project/sounds/aiy340000200.ogg new file mode 100644 index 0000000..bf6dc4a Binary files /dev/null and b/project/sounds/aiy340000200.ogg differ diff --git a/project/sounds/aiy340000210.ogg b/project/sounds/aiy340000210.ogg new file mode 100644 index 0000000..3b4e1b1 Binary files /dev/null and b/project/sounds/aiy340000210.ogg differ diff --git a/project/sounds/aiy340000220.ogg b/project/sounds/aiy340000220.ogg new file mode 100644 index 0000000..1b46e59 Binary files /dev/null and b/project/sounds/aiy340000220.ogg differ diff --git a/project/sounds/aiy340000230.ogg b/project/sounds/aiy340000230.ogg new file mode 100644 index 0000000..a2462c7 Binary files /dev/null and b/project/sounds/aiy340000230.ogg differ diff --git a/project/sounds/aiy340000240.ogg b/project/sounds/aiy340000240.ogg new file mode 100644 index 0000000..91690e5 Binary files /dev/null and b/project/sounds/aiy340000240.ogg differ diff --git a/project/sounds/aiy340000250.ogg b/project/sounds/aiy340000250.ogg new file mode 100644 index 0000000..321f997 Binary files /dev/null and b/project/sounds/aiy340000250.ogg differ diff --git a/project/sounds/aiy340000260.ogg b/project/sounds/aiy340000260.ogg new file mode 100644 index 0000000..137c284 Binary files /dev/null and b/project/sounds/aiy340000260.ogg differ diff --git a/project/sounds/aiy340000270.ogg b/project/sounds/aiy340000270.ogg new file mode 100644 index 0000000..b94bbb4 Binary files /dev/null and b/project/sounds/aiy340000270.ogg differ diff --git a/project/sounds/aiy340000280.ogg b/project/sounds/aiy340000280.ogg new file mode 100644 index 0000000..e685598 Binary files /dev/null and b/project/sounds/aiy340000280.ogg differ diff --git a/project/sounds/aiy340000290.ogg b/project/sounds/aiy340000290.ogg new file mode 100644 index 0000000..6965511 Binary files /dev/null and b/project/sounds/aiy340000290.ogg differ diff --git a/project/sounds/aiy340000300.ogg b/project/sounds/aiy340000300.ogg new file mode 100644 index 0000000..f0c9ccd Binary files /dev/null and b/project/sounds/aiy340000300.ogg differ diff --git a/project/sounds/aiy340000310.ogg b/project/sounds/aiy340000310.ogg new file mode 100644 index 0000000..886e7ba Binary files /dev/null and b/project/sounds/aiy340000310.ogg differ diff --git a/project/sounds/aiy340000320.ogg b/project/sounds/aiy340000320.ogg new file mode 100644 index 0000000..c7b1ab1 Binary files /dev/null and b/project/sounds/aiy340000320.ogg differ diff --git a/project/sounds/aiy340000330.ogg b/project/sounds/aiy340000330.ogg new file mode 100644 index 0000000..b07b430 Binary files /dev/null and b/project/sounds/aiy340000330.ogg differ diff --git a/project/sounds/aiy340000340.ogg b/project/sounds/aiy340000340.ogg new file mode 100644 index 0000000..07fab33 Binary files /dev/null and b/project/sounds/aiy340000340.ogg differ diff --git a/project/sounds/aiy340000350.ogg b/project/sounds/aiy340000350.ogg new file mode 100644 index 0000000..4fff4de Binary files /dev/null and b/project/sounds/aiy340000350.ogg differ diff --git a/project/sounds/aiy340000360.ogg b/project/sounds/aiy340000360.ogg new file mode 100644 index 0000000..1d9fa8f Binary files /dev/null and b/project/sounds/aiy340000360.ogg differ diff --git a/project/sounds/aiy340000370.ogg b/project/sounds/aiy340000370.ogg new file mode 100644 index 0000000..a0e6e1e Binary files /dev/null and b/project/sounds/aiy340000370.ogg differ diff --git a/project/sounds/aiy340000380.ogg b/project/sounds/aiy340000380.ogg new file mode 100644 index 0000000..0f4b917 Binary files /dev/null and b/project/sounds/aiy340000380.ogg differ diff --git a/project/sounds/aiy340000390.ogg b/project/sounds/aiy340000390.ogg new file mode 100644 index 0000000..021d193 Binary files /dev/null and b/project/sounds/aiy340000390.ogg differ diff --git a/project/sounds/aiy340000400.ogg b/project/sounds/aiy340000400.ogg new file mode 100644 index 0000000..3f217a7 Binary files /dev/null and b/project/sounds/aiy340000400.ogg differ diff --git a/project/sounds/aiy340000410.ogg b/project/sounds/aiy340000410.ogg new file mode 100644 index 0000000..95f46c9 Binary files /dev/null and b/project/sounds/aiy340000410.ogg differ diff --git a/project/sounds/aiy340000420.ogg b/project/sounds/aiy340000420.ogg new file mode 100644 index 0000000..7ed6067 Binary files /dev/null and b/project/sounds/aiy340000420.ogg differ diff --git a/project/sounds/aiy340000430.ogg b/project/sounds/aiy340000430.ogg new file mode 100644 index 0000000..cfc1202 Binary files /dev/null and b/project/sounds/aiy340000430.ogg differ diff --git a/project/sounds/aiy350000240.ogg b/project/sounds/aiy350000240.ogg new file mode 100644 index 0000000..e549bdd Binary files /dev/null and b/project/sounds/aiy350000240.ogg differ diff --git a/project/sounds/aiy350000250.ogg b/project/sounds/aiy350000250.ogg new file mode 100644 index 0000000..3994c71 Binary files /dev/null and b/project/sounds/aiy350000250.ogg differ diff --git a/project/sounds/aiy350000260.ogg b/project/sounds/aiy350000260.ogg new file mode 100644 index 0000000..f8e3492 Binary files /dev/null and b/project/sounds/aiy350000260.ogg differ diff --git a/project/sounds/aiy430000010.ogg b/project/sounds/aiy430000010.ogg new file mode 100644 index 0000000..356ddcd Binary files /dev/null and b/project/sounds/aiy430000010.ogg differ diff --git a/project/sounds/aiy430000020.ogg b/project/sounds/aiy430000020.ogg new file mode 100644 index 0000000..9efe052 Binary files /dev/null and b/project/sounds/aiy430000020.ogg differ diff --git a/project/sounds/aiy430000030.ogg b/project/sounds/aiy430000030.ogg new file mode 100644 index 0000000..c67ff9b Binary files /dev/null and b/project/sounds/aiy430000030.ogg differ diff --git a/project/sounds/aiy430000040.ogg b/project/sounds/aiy430000040.ogg new file mode 100644 index 0000000..b05463e Binary files /dev/null and b/project/sounds/aiy430000040.ogg differ diff --git a/project/sounds/aiy430000050.ogg b/project/sounds/aiy430000050.ogg new file mode 100644 index 0000000..5374b90 Binary files /dev/null and b/project/sounds/aiy430000050.ogg differ diff --git a/project/sounds/aiy430000060.ogg b/project/sounds/aiy430000060.ogg new file mode 100644 index 0000000..6b44c40 Binary files /dev/null and b/project/sounds/aiy430000060.ogg differ diff --git a/project/sounds/aiy430000070.ogg b/project/sounds/aiy430000070.ogg new file mode 100644 index 0000000..68fbcc8 Binary files /dev/null and b/project/sounds/aiy430000070.ogg differ diff --git a/project/sounds/aiy430000080.ogg b/project/sounds/aiy430000080.ogg new file mode 100644 index 0000000..f3ab8e1 Binary files /dev/null and b/project/sounds/aiy430000080.ogg differ diff --git a/project/sounds/aiy430000090.ogg b/project/sounds/aiy430000090.ogg new file mode 100644 index 0000000..a0487d9 Binary files /dev/null and b/project/sounds/aiy430000090.ogg differ diff --git a/project/sounds/aiy430000100.ogg b/project/sounds/aiy430000100.ogg new file mode 100644 index 0000000..3b111ed Binary files /dev/null and b/project/sounds/aiy430000100.ogg differ diff --git a/project/sounds/aiy430000110.ogg b/project/sounds/aiy430000110.ogg new file mode 100644 index 0000000..472e8ea Binary files /dev/null and b/project/sounds/aiy430000110.ogg differ diff --git a/project/sounds/aiy430000120.ogg b/project/sounds/aiy430000120.ogg new file mode 100644 index 0000000..16e11b0 Binary files /dev/null and b/project/sounds/aiy430000120.ogg differ diff --git a/project/sounds/aiy430000130.ogg b/project/sounds/aiy430000130.ogg new file mode 100644 index 0000000..87aaa6e Binary files /dev/null and b/project/sounds/aiy430000130.ogg differ diff --git a/project/sounds/aiy430000140.ogg b/project/sounds/aiy430000140.ogg new file mode 100644 index 0000000..460a7de Binary files /dev/null and b/project/sounds/aiy430000140.ogg differ diff --git a/project/sounds/aiy430000150.ogg b/project/sounds/aiy430000150.ogg new file mode 100644 index 0000000..a33a5bd Binary files /dev/null and b/project/sounds/aiy430000150.ogg differ diff --git a/project/sounds/aiy430000160.ogg b/project/sounds/aiy430000160.ogg new file mode 100644 index 0000000..24971e2 Binary files /dev/null and b/project/sounds/aiy430000160.ogg differ diff --git a/project/sounds/aiy430000170.ogg b/project/sounds/aiy430000170.ogg new file mode 100644 index 0000000..a76c57b Binary files /dev/null and b/project/sounds/aiy430000170.ogg differ diff --git a/project/sounds/aiy430000180.ogg b/project/sounds/aiy430000180.ogg new file mode 100644 index 0000000..aaf40ca Binary files /dev/null and b/project/sounds/aiy430000180.ogg differ diff --git a/project/sounds/aiy430000190.ogg b/project/sounds/aiy430000190.ogg new file mode 100644 index 0000000..81ef542 Binary files /dev/null and b/project/sounds/aiy430000190.ogg differ diff --git a/project/sounds/aiy430000200.ogg b/project/sounds/aiy430000200.ogg new file mode 100644 index 0000000..57f8c8d Binary files /dev/null and b/project/sounds/aiy430000200.ogg differ diff --git a/project/sounds/aiy430000210.ogg b/project/sounds/aiy430000210.ogg new file mode 100644 index 0000000..6a02c00 Binary files /dev/null and b/project/sounds/aiy430000210.ogg differ diff --git a/project/sounds/aiy430000220.ogg b/project/sounds/aiy430000220.ogg new file mode 100644 index 0000000..cc0e4be Binary files /dev/null and b/project/sounds/aiy430000220.ogg differ diff --git a/project/sounds/aiy430000230.ogg b/project/sounds/aiy430000230.ogg new file mode 100644 index 0000000..a8ef1f3 Binary files /dev/null and b/project/sounds/aiy430000230.ogg differ diff --git a/project/sounds/aiy430000240.ogg b/project/sounds/aiy430000240.ogg new file mode 100644 index 0000000..6236846 Binary files /dev/null and b/project/sounds/aiy430000240.ogg differ diff --git a/project/sounds/aiy430000250.ogg b/project/sounds/aiy430000250.ogg new file mode 100644 index 0000000..806ecfb Binary files /dev/null and b/project/sounds/aiy430000250.ogg differ diff --git a/project/sounds/aiy430000260.ogg b/project/sounds/aiy430000260.ogg new file mode 100644 index 0000000..8872913 Binary files /dev/null and b/project/sounds/aiy430000260.ogg differ diff --git a/project/sounds/aiy430000270.ogg b/project/sounds/aiy430000270.ogg new file mode 100644 index 0000000..2d61e3e Binary files /dev/null and b/project/sounds/aiy430000270.ogg differ diff --git a/project/sounds/aiy430000280.ogg b/project/sounds/aiy430000280.ogg new file mode 100644 index 0000000..142bcbe Binary files /dev/null and b/project/sounds/aiy430000280.ogg differ diff --git a/project/sounds/aiy430000290.ogg b/project/sounds/aiy430000290.ogg new file mode 100644 index 0000000..808500c Binary files /dev/null and b/project/sounds/aiy430000290.ogg differ diff --git a/project/sounds/aiy440000010.ogg b/project/sounds/aiy440000010.ogg new file mode 100644 index 0000000..a8dad86 Binary files /dev/null and b/project/sounds/aiy440000010.ogg differ diff --git a/project/sounds/aiy440000020.ogg b/project/sounds/aiy440000020.ogg new file mode 100644 index 0000000..c9a14fd Binary files /dev/null and b/project/sounds/aiy440000020.ogg differ diff --git a/project/sounds/aiy440000030.ogg b/project/sounds/aiy440000030.ogg new file mode 100644 index 0000000..fe311cc Binary files /dev/null and b/project/sounds/aiy440000030.ogg differ diff --git a/project/sounds/aiy440000040.ogg b/project/sounds/aiy440000040.ogg new file mode 100644 index 0000000..2b98283 Binary files /dev/null and b/project/sounds/aiy440000040.ogg differ diff --git a/project/sounds/aiy440000050.ogg b/project/sounds/aiy440000050.ogg new file mode 100644 index 0000000..65e8f38 Binary files /dev/null and b/project/sounds/aiy440000050.ogg differ diff --git a/project/sounds/aiy440000060.ogg b/project/sounds/aiy440000060.ogg new file mode 100644 index 0000000..7911ca1 Binary files /dev/null and b/project/sounds/aiy440000060.ogg differ diff --git a/project/sounds/aiy440000070.ogg b/project/sounds/aiy440000070.ogg new file mode 100644 index 0000000..79ceecd Binary files /dev/null and b/project/sounds/aiy440000070.ogg differ diff --git a/project/sounds/aiy440000080.ogg b/project/sounds/aiy440000080.ogg new file mode 100644 index 0000000..d165741 Binary files /dev/null and b/project/sounds/aiy440000080.ogg differ diff --git a/project/sounds/aiy440000090.ogg b/project/sounds/aiy440000090.ogg new file mode 100644 index 0000000..816a91f Binary files /dev/null and b/project/sounds/aiy440000090.ogg differ diff --git a/project/sounds/aiy440000100.ogg b/project/sounds/aiy440000100.ogg new file mode 100644 index 0000000..e0cbe17 Binary files /dev/null and b/project/sounds/aiy440000100.ogg differ diff --git a/project/sounds/aiy440000110.ogg b/project/sounds/aiy440000110.ogg new file mode 100644 index 0000000..475cf95 Binary files /dev/null and b/project/sounds/aiy440000110.ogg differ diff --git a/project/sounds/aiy440000120.ogg b/project/sounds/aiy440000120.ogg new file mode 100644 index 0000000..ebdc162 Binary files /dev/null and b/project/sounds/aiy440000120.ogg differ diff --git a/project/sounds/aiy510000010.ogg b/project/sounds/aiy510000010.ogg new file mode 100644 index 0000000..5ab3fc0 Binary files /dev/null and b/project/sounds/aiy510000010.ogg differ diff --git a/project/sounds/aiy510000020.ogg b/project/sounds/aiy510000020.ogg new file mode 100644 index 0000000..57f77d7 Binary files /dev/null and b/project/sounds/aiy510000020.ogg differ diff --git a/project/sounds/aiy720000010.ogg b/project/sounds/aiy720000010.ogg new file mode 100644 index 0000000..5ae9b67 Binary files /dev/null and b/project/sounds/aiy720000010.ogg differ diff --git a/project/sounds/aiy730000010.ogg b/project/sounds/aiy730000010.ogg new file mode 100644 index 0000000..ab0d410 Binary files /dev/null and b/project/sounds/aiy730000010.ogg differ diff --git a/project/sounds/aiy740000010.ogg b/project/sounds/aiy740000010.ogg new file mode 100644 index 0000000..b5b010f Binary files /dev/null and b/project/sounds/aiy740000010.ogg differ diff --git a/project/sounds/aiy750000010.ogg b/project/sounds/aiy750000010.ogg new file mode 100644 index 0000000..0b8ceb4 Binary files /dev/null and b/project/sounds/aiy750000010.ogg differ diff --git a/project/sounds/aiy750000020.ogg b/project/sounds/aiy750000020.ogg new file mode 100644 index 0000000..f260c12 Binary files /dev/null and b/project/sounds/aiy750000020.ogg differ diff --git a/project/sounds/aiy750000030.ogg b/project/sounds/aiy750000030.ogg new file mode 100644 index 0000000..93faa55 Binary files /dev/null and b/project/sounds/aiy750000030.ogg differ diff --git a/project/sounds/aiy750000040.ogg b/project/sounds/aiy750000040.ogg new file mode 100644 index 0000000..7592d4b Binary files /dev/null and b/project/sounds/aiy750000040.ogg differ diff --git a/project/sounds/aiy750000050.ogg b/project/sounds/aiy750000050.ogg new file mode 100644 index 0000000..bf95779 Binary files /dev/null and b/project/sounds/aiy750000050.ogg differ diff --git a/project/sounds/aiy750000060.ogg b/project/sounds/aiy750000060.ogg new file mode 100644 index 0000000..b0f81b8 Binary files /dev/null and b/project/sounds/aiy750000060.ogg differ diff --git a/project/sounds/aiy750000070.ogg b/project/sounds/aiy750000070.ogg new file mode 100644 index 0000000..d2edb4d Binary files /dev/null and b/project/sounds/aiy750000070.ogg differ diff --git a/project/sounds/aiy750000080.ogg b/project/sounds/aiy750000080.ogg new file mode 100644 index 0000000..a0ffff8 Binary files /dev/null and b/project/sounds/aiy750000080.ogg differ diff --git a/project/sounds/aiy750000090.ogg b/project/sounds/aiy750000090.ogg new file mode 100644 index 0000000..aefcdb3 Binary files /dev/null and b/project/sounds/aiy750000090.ogg differ diff --git a/project/sounds/aiy750000100.ogg b/project/sounds/aiy750000100.ogg new file mode 100644 index 0000000..4057d0c Binary files /dev/null and b/project/sounds/aiy750000100.ogg differ diff --git a/project/sounds/aiy750000110.ogg b/project/sounds/aiy750000110.ogg new file mode 100644 index 0000000..e76d3be Binary files /dev/null and b/project/sounds/aiy750000110.ogg differ diff --git a/project/sounds/aiy750000120.ogg b/project/sounds/aiy750000120.ogg new file mode 100644 index 0000000..41d7788 Binary files /dev/null and b/project/sounds/aiy750000120.ogg differ diff --git a/project/sounds/aiy750000130.ogg b/project/sounds/aiy750000130.ogg new file mode 100644 index 0000000..161f900 Binary files /dev/null and b/project/sounds/aiy750000130.ogg differ diff --git a/project/sounds/aiy750000140.ogg b/project/sounds/aiy750000140.ogg new file mode 100644 index 0000000..fda459c Binary files /dev/null and b/project/sounds/aiy750000140.ogg differ diff --git a/project/sounds/aiy750000150.ogg b/project/sounds/aiy750000150.ogg new file mode 100644 index 0000000..8422fce Binary files /dev/null and b/project/sounds/aiy750000150.ogg differ diff --git a/project/sounds/aiy750000160.ogg b/project/sounds/aiy750000160.ogg new file mode 100644 index 0000000..62f8163 Binary files /dev/null and b/project/sounds/aiy750000160.ogg differ diff --git a/project/sounds/aiy750000170.ogg b/project/sounds/aiy750000170.ogg new file mode 100644 index 0000000..b9fe06e Binary files /dev/null and b/project/sounds/aiy750000170.ogg differ diff --git a/project/sounds/aiy750000180.ogg b/project/sounds/aiy750000180.ogg new file mode 100644 index 0000000..b7fb85f Binary files /dev/null and b/project/sounds/aiy750000180.ogg differ diff --git a/project/sounds/aiy750000190.ogg b/project/sounds/aiy750000190.ogg new file mode 100644 index 0000000..1d7b4a8 Binary files /dev/null and b/project/sounds/aiy750000190.ogg differ diff --git a/project/sounds/aiy750000200.ogg b/project/sounds/aiy750000200.ogg new file mode 100644 index 0000000..68d41da Binary files /dev/null and b/project/sounds/aiy750000200.ogg differ diff --git a/project/sounds/aiy750000210.ogg b/project/sounds/aiy750000210.ogg new file mode 100644 index 0000000..faf634b Binary files /dev/null and b/project/sounds/aiy750000210.ogg differ diff --git a/project/sounds/aiy750000220.ogg b/project/sounds/aiy750000220.ogg new file mode 100644 index 0000000..1b931cf Binary files /dev/null and b/project/sounds/aiy750000220.ogg differ diff --git a/project/sounds/aiy750000230.ogg b/project/sounds/aiy750000230.ogg new file mode 100644 index 0000000..3c31602 Binary files /dev/null and b/project/sounds/aiy750000230.ogg differ diff --git a/project/sounds/aiy750000240.ogg b/project/sounds/aiy750000240.ogg new file mode 100644 index 0000000..ad8501c Binary files /dev/null and b/project/sounds/aiy750000240.ogg differ diff --git a/project/sounds/aiy750000250.ogg b/project/sounds/aiy750000250.ogg new file mode 100644 index 0000000..3ebaffe Binary files /dev/null and b/project/sounds/aiy750000250.ogg differ diff --git a/project/sounds/aiy750000260.ogg b/project/sounds/aiy750000260.ogg new file mode 100644 index 0000000..c45ca4d Binary files /dev/null and b/project/sounds/aiy750000260.ogg differ diff --git a/project/sounds/aiy750000270.ogg b/project/sounds/aiy750000270.ogg new file mode 100644 index 0000000..ad0c25d Binary files /dev/null and b/project/sounds/aiy750000270.ogg differ diff --git a/project/sounds/aiy750000280.ogg b/project/sounds/aiy750000280.ogg new file mode 100644 index 0000000..2b1a3bc Binary files /dev/null and b/project/sounds/aiy750000280.ogg differ diff --git a/project/sounds/aiy750000290.ogg b/project/sounds/aiy750000290.ogg new file mode 100644 index 0000000..11d69ae Binary files /dev/null and b/project/sounds/aiy750000290.ogg differ diff --git a/project/sounds/aiy750000300.ogg b/project/sounds/aiy750000300.ogg new file mode 100644 index 0000000..145e3b3 Binary files /dev/null and b/project/sounds/aiy750000300.ogg differ diff --git a/project/sounds/aiy750000310.ogg b/project/sounds/aiy750000310.ogg new file mode 100644 index 0000000..aac984e Binary files /dev/null and b/project/sounds/aiy750000310.ogg differ diff --git a/project/sounds/aiy750000320.ogg b/project/sounds/aiy750000320.ogg new file mode 100644 index 0000000..175ab60 Binary files /dev/null and b/project/sounds/aiy750000320.ogg differ diff --git a/project/sounds/aiy750000330.ogg b/project/sounds/aiy750000330.ogg new file mode 100644 index 0000000..dd13862 Binary files /dev/null and b/project/sounds/aiy750000330.ogg differ diff --git a/project/sounds/aiy750000340.ogg b/project/sounds/aiy750000340.ogg new file mode 100644 index 0000000..46c6c87 Binary files /dev/null and b/project/sounds/aiy750000340.ogg differ diff --git a/project/sounds/aiy800000010.ogg b/project/sounds/aiy800000010.ogg new file mode 100644 index 0000000..f7c1058 Binary files /dev/null and b/project/sounds/aiy800000010.ogg differ diff --git a/project/sounds/aiy800000020.ogg b/project/sounds/aiy800000020.ogg new file mode 100644 index 0000000..e5233c7 Binary files /dev/null and b/project/sounds/aiy800000020.ogg differ diff --git a/project/sounds/aiy800000030.ogg b/project/sounds/aiy800000030.ogg new file mode 100644 index 0000000..4b9d26c Binary files /dev/null and b/project/sounds/aiy800000030.ogg differ diff --git a/project/sounds/aiy800000040.ogg b/project/sounds/aiy800000040.ogg new file mode 100644 index 0000000..64cca36 Binary files /dev/null and b/project/sounds/aiy800000040.ogg differ diff --git a/project/sounds/aiy800000050.ogg b/project/sounds/aiy800000050.ogg new file mode 100644 index 0000000..20c4b22 Binary files /dev/null and b/project/sounds/aiy800000050.ogg differ diff --git a/project/sounds/aiy800000060.ogg b/project/sounds/aiy800000060.ogg new file mode 100644 index 0000000..baf6f0a Binary files /dev/null and b/project/sounds/aiy800000060.ogg differ diff --git a/project/sounds/aiy800000070.ogg b/project/sounds/aiy800000070.ogg new file mode 100644 index 0000000..09b6793 Binary files /dev/null and b/project/sounds/aiy800000070.ogg differ diff --git a/project/sounds/aiy800000080.ogg b/project/sounds/aiy800000080.ogg new file mode 100644 index 0000000..42f1925 Binary files /dev/null and b/project/sounds/aiy800000080.ogg differ diff --git a/project/sounds/aiy800000090.ogg b/project/sounds/aiy800000090.ogg new file mode 100644 index 0000000..0d1df0d Binary files /dev/null and b/project/sounds/aiy800000090.ogg differ diff --git a/project/sounds/aiy800000100.ogg b/project/sounds/aiy800000100.ogg new file mode 100644 index 0000000..6f1ecbc Binary files /dev/null and b/project/sounds/aiy800000100.ogg differ diff --git a/project/sounds/aiy810000010.ogg b/project/sounds/aiy810000010.ogg new file mode 100644 index 0000000..141c976 Binary files /dev/null and b/project/sounds/aiy810000010.ogg differ diff --git a/project/sounds/aiy810000020.ogg b/project/sounds/aiy810000020.ogg new file mode 100644 index 0000000..f755114 Binary files /dev/null and b/project/sounds/aiy810000020.ogg differ diff --git a/project/sounds/aiy810000030.ogg b/project/sounds/aiy810000030.ogg new file mode 100644 index 0000000..ece7da3 Binary files /dev/null and b/project/sounds/aiy810000030.ogg differ diff --git a/project/sounds/aiy810000040.ogg b/project/sounds/aiy810000040.ogg new file mode 100644 index 0000000..d600ea7 Binary files /dev/null and b/project/sounds/aiy810000040.ogg differ diff --git a/project/sounds/aiy810000050.ogg b/project/sounds/aiy810000050.ogg new file mode 100644 index 0000000..b3975f8 Binary files /dev/null and b/project/sounds/aiy810000050.ogg differ diff --git a/project/sounds/aiy810000060.ogg b/project/sounds/aiy810000060.ogg new file mode 100644 index 0000000..f6cf315 Binary files /dev/null and b/project/sounds/aiy810000060.ogg differ diff --git a/project/sounds/aiy810000070.ogg b/project/sounds/aiy810000070.ogg new file mode 100644 index 0000000..0944056 Binary files /dev/null and b/project/sounds/aiy810000070.ogg differ diff --git a/project/sounds/aiy860000010.ogg b/project/sounds/aiy860000010.ogg new file mode 100644 index 0000000..d6ffe53 Binary files /dev/null and b/project/sounds/aiy860000010.ogg differ diff --git a/project/sounds/aiy860000020.ogg b/project/sounds/aiy860000020.ogg new file mode 100644 index 0000000..8157a6f Binary files /dev/null and b/project/sounds/aiy860000020.ogg differ diff --git a/project/sounds/aiy860000030.ogg b/project/sounds/aiy860000030.ogg new file mode 100644 index 0000000..f428615 Binary files /dev/null and b/project/sounds/aiy860000030.ogg differ diff --git a/project/sounds/aiy860000040.ogg b/project/sounds/aiy860000040.ogg new file mode 100644 index 0000000..cd1a1eb Binary files /dev/null and b/project/sounds/aiy860000040.ogg differ diff --git a/project/sounds/aiy860000050.ogg b/project/sounds/aiy860000050.ogg new file mode 100644 index 0000000..e0cf702 Binary files /dev/null and b/project/sounds/aiy860000050.ogg differ diff --git a/project/sounds/aiy860000060.ogg b/project/sounds/aiy860000060.ogg new file mode 100644 index 0000000..c540697 Binary files /dev/null and b/project/sounds/aiy860000060.ogg differ diff --git a/project/tilesets/2233.png b/project/tilesets/2233.png new file mode 100644 index 0000000..a3bba4f Binary files /dev/null and b/project/tilesets/2233.png differ diff --git a/project/tilesets/C5.webp b/project/tilesets/C5.webp index 641de3c..bbb361e 100644 Binary files a/project/tilesets/C5.webp and b/project/tilesets/C5.webp differ diff --git a/project/tilesets/c6.png b/project/tilesets/c6.png new file mode 100644 index 0000000..ecec049 Binary files /dev/null and b/project/tilesets/c6.png differ diff --git a/styles.css b/styles.css index 89ddc05..139471b 100644 --- a/styles.css +++ b/styles.css @@ -1,534 +1,618 @@ -html, body { - margin: 0; - padding: 0; - width: 100%; - height: 100%; - background-color: #000; - overflow: hidden; +html, +body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background-color: #000; + overflow: hidden; } #gameGroup { - position: absolute; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - background-color: #000; + position: absolute; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + background-color: #000; } #mainTips { - color: #fff; - font-size: 0.8em; - position: fixed; - top: 10px; - left: 10px; - z-index: 370; + color: #fff; + font-size: 0.8em; + position: fixed; + top: 10px; + left: 10px; + z-index: 370; } #musicBtn { - position: fixed; - bottom: 3px; - right: 3px; - cursor: pointer; - z-index: 400; - display: none; + position: fixed; + bottom: 3px; + right: 3px; + cursor: pointer; + z-index: 400; + display: none; } #enlargeBtn { - position: fixed; - bottom: 3px; - right: 34px; - cursor: pointer; - z-index: 400; - display: none; + position: fixed; + bottom: 3px; + right: 34px; + cursor: pointer; + z-index: 400; + display: none; } #startPanel { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - background-color: #fff; - overflow: hidden; - z-index: 300; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background-color: #fff; + overflow: hidden; + z-index: 300; } #startTop { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - background-color: #000; - z-index: 350; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background-color: #000; + z-index: 350; } #startTopProgressBar { - width: 90%; - height: 5%; - margin: 0 5%; - position: absolute; - top: 5%; - background-color: #fff; - z-index: 15; + width: 90%; + height: 5%; + margin: 0 5%; + position: absolute; + top: 5%; + background-color: #fff; + z-index: 15; } #startTopProgress { - width: 0%; - height: 100%; - background-color: #666; + width: 0%; + height: 100%; + background-color: #666; } #startTopLoadTips { - color: #fff; - font-size: 0.6em; - position: absolute; - top: 10%; - left: 5%; - z-index: 15; + color: #fff; + font-size: 0.6em; + position: absolute; + top: 10%; + left: 5%; + z-index: 15; } #startTopHint { - color: #66CCFF; - position: absolute; - bottom: 0; - left: 5%; - z-index: 15; - font-size: 1.1em; + color: #66ccff; + position: absolute; + bottom: 0; + left: 5%; + z-index: 15; + font-size: 1.1em; } #startBackground { - position:absolute; - top:50%; - left:50%; - height: 100%; - width: 100%; - transform:translate(-50%,-50%); - z-index: 260; + position: absolute; + top: 50%; + left: 50%; + height: 100%; + width: 100%; + transform: translate(-50%, -50%); + z-index: 260; } #startLogo { - user-select: none; - position: absolute; - z-index: 290; - left: 0; - right: 0; - margin-left: auto; - margin-right: auto; - margin-top: 8%; - max-width: 100%; - text-align: center; - font: bold 0em STXingkai; - color: #000000; + user-select: none; + position: absolute; + z-index: 290; + left: 0; + right: 0; + margin-left: auto; + margin-right: auto; + margin-top: 8%; + max-width: 100%; + text-align: center; + font: bold 0em STXingkai; + color: #000000; } #startTitle { - user-select: none; - position: absolute; - z-index: 280; + user-select: none; + position: absolute; + z-index: 280; } #startButtonGroup { - width: auto; - position: absolute; - text-align: center; - font-size: 1.4em; - display: none; - z-index: 310; - bottom: 0; - margin-bottom: 5%; - left: 50%; - transform: translateX(-50%); - padding: 15px 25px; - min-width: 100%; - /* default value */ - background-color: #000000; - opacity: 0.55; - color: #FFFFFF; - border: #FFFFFF 0px solid; - caret-color: #ffffff; - border-radius: 0px; + width: auto; + position: absolute; + text-align: center; + font-size: 1.4em; + display: none; + z-index: 310; + bottom: 0; + margin-bottom: 5%; + left: 50%; + transform: translateX(-50%); + padding: 15px 25px; + min-width: 100%; + /* default value */ + background-color: #000000; + opacity: 0.55; + color: #ffffff; + border: #ffffff 0px solid; + caret-color: #ffffff; + border-radius: 0px; } #startButtons { - display: none; + display: none; } #levelChooseButtons { - display: none; + display: none; } .startButton { - width: 100%; - margin: 0; - font:1.2rem "pala", sans-serif; - font-weight: normal; - display: block; - cursor: pointer; - padding: 0px 0; - border-color: transparent; - border-width: 0px; - border-style: solid; - border-radius: 0px; + width: 100%; + margin: 0; + font: 1.2rem pala, sans-serif; + font-weight: normal; + display: block; + cursor: pointer; + padding: 0px 0; + border-color: transparent; + border-width: 0px; + border-style: solid; + border-radius: 0px; } .onChoiceAnimate { - animation: onChoice 2s ease-in-out 0s infinite normal none running; + animation: onChoice 2s ease-in-out 0s infinite normal none running; } #floorMsgGroup { - position: absolute; - text-align: center; - display: none; - color: #fff; - background-color: #000; - z-index: 230; + position: absolute; + text-align: center; + display: none; + color: #fff; + background-color: #000; + z-index: 230; } #logoLabel { - margin-top: 8%; - font: bold 3em STXingkai; - margin-left: auto; - margin-right: auto; + margin-top: 8%; + font: bold 3em STXingkai; + margin-left: auto; + margin-right: auto; } #versionLabel { - margin-top: -3%; - font-size: 1.2em; - font-weight: bold; + margin-top: -3%; + font-size: 1.2em; + font-weight: bold; } #floorNameLabel { - margin-top: 30px; - font-size: 1.6em; - font-weight: bold; + margin-top: 30px; + font-size: 1.6em; + font-weight: bold; } #statusBar { - position: absolute; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - background: url(project/materials/ground.png) repeat; - z-index: 185; - display: none; - top: 0; - left: 0; - padding: 3px; + position: absolute; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + background: url(project/materials/ground.png) repeat; + z-index: 185; + display: none; + top: 0; + left: 0; + padding: 3px; } -#statusBar .status{ - position: relative; - display: block; - float: left; - width: 100%; +#statusBar .status { + position: relative; + display: block; + float: left; + width: 100%; } -.status img{ - vertical-align: middle; - width: auto; - height: 100%; - max-height: 1.6em; +.status img { + vertical-align: middle; + width: auto; + height: 100%; + max-height: 1.6em; } -#statusBar span{ - font: bold italic 1.1em Verdana; - display: inline; +#statusBar span { + font: bold italic 1.1em Verdana; + display: inline; } #statusBar p { - display: inline-block; - vertical-align: middle; - width: 60%; - margin: 0; - color: white; - font: bold italic 1.1em Verdana; - white-space: nowrap; + display: inline-block; + vertical-align: middle; + width: 60%; + margin: 0; + color: white; + font: bold italic 1.1em Verdana; + white-space: nowrap; } #toolBar { - position: absolute; - background: url(project/materials/ground.png) repeat; - z-index: 210; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - display: none; - padding: 3px; + position: absolute; + background: url(project/materials/ground.png) repeat; + z-index: 210; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + display: none; + padding: 3px; } -#toolBar .tools{ - position: relative; - display: block; - float: left; +#toolBar .tools { + position: relative; + display: block; + float: left; } p#hard { - width: 6em; - vertical-align: middle; - display: inline-block; - color: red; - font: bold normal 1.1em "Arial Black"; - text-align: center; - margin: 0 6px 6px 0; - word-break: keep-all; + width: 6em; + vertical-align: middle; + display: inline-block; + color: red; + font: bold normal 1.1em "Arial Black"; + text-align: center; + margin: 0 6px 6px 0; + word-break: keep-all; } -span#poison, span#weak, span#curse, span#pickaxe, span#bomb, span#fly { - font-style: normal; - font-size: 1em; +span#poison, +span#weak, +span#curse, +span#pickaxe, +span#bomb, +span#fly { + font-style: normal; + font-size: 1em; } p#name { - font-style: normal; + font-style: normal; } .gameCanvas { - position: absolute; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; + position: absolute; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; } #gif { - z-index: 20; - position: absolute; - overflow: hidden; + z-index: 20; + position: absolute; + overflow: hidden; } #gif2 { - z-index: 90; - position: absolute; - overflow: hidden; + z-index: 90; + position: absolute; + overflow: hidden; } #gameDraw { - position: absolute; - background: #000000; - overflow: hidden; - z-index: 185; + position: absolute; + background: #000000; + overflow: hidden; + z-index: 185; } #bg { - z-index: 10; + z-index: 10; } #event { - z-index: 30; + z-index: 30; } #hero { - z-index: 40; + z-index: 40; } #event2 { - z-index: 50; + z-index: 50; } #fg { - z-index: 60; + z-index: 60; } #damage { - z-index: 65; + z-index: 65; } #animate { - z-index: 70; + z-index: 70; } #curtain { - z-index: 125; + z-index: 125; } #ui { - z-index: 140; + z-index: 140; } #data { - z-index: 170; + z-index: 170; } #inputDiv { - display: none; - width: 100%; - height: 100%; - position: fixed; - top: 0; - left: 0; - background: rgba(127,127,127,0.6); - z-index: 2000 + display: none; + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + background: rgba(127, 127, 127, 0.6); + z-index: 2000; } #inputDialog { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -55%); - background: white; - width: 250px; - min-height: 50px; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -55%); + background: white; + width: 250px; + min-height: 50px; } #inputMessage { - word-wrap: break-word; - text-align: left; - margin-left: 8%; - margin-right: 5%; + word-wrap: break-word; + text-align: left; + margin-left: 8%; + margin-right: 5%; } #inputBox { - margin-left: 8%; - width: 80%; - margin-bottom: 10px; - padding: 5px 3px; - border: 1px solid; - background: #F0F0F0; + margin-left: 8%; + width: 80%; + margin-bottom: 10px; + padding: 5px 3px; + border: 1px solid; + background: #f0f0f0; } #inputYes { - margin-bottom: 15px; - margin-left: 8%; + margin-bottom: 15px; + margin-left: 8%; } #inputNo { - float:right; - margin-right: 10%; + float: right; + margin-right: 10%; } -#_selector, ._uievent_selector { - animation: selector 2s ease-in-out 0s infinite normal none running; +#_selector, +._uievent_selector { + animation: selector 2s ease-in-out 0s infinite normal none running; } @-webkit-keyframes selector { - 0% { opacity: 0.95; } - 50% { opacity: 0.55; } - 100% { opacity: 0.95; } + 0% { + opacity: 0.95; + } + 50% { + opacity: 0.55; + } + 100% { + opacity: 0.95; + } } @keyframes selector { - 0% { opacity: 0.95; } - 50% { opacity: 0.55; } - 100% { opacity: 0.95; } + 0% { + opacity: 0.95; + } + 50% { + opacity: 0.55; + } + 100% { + opacity: 0.95; + } } #next { - width: 5px; - height: 5px; - display: none; - position: absolute; - transform: rotate(45deg); - border-bottom-width: 4px; - border-bottom-style: solid; - border-right-width: 4px; - border-right-style: solid; - -webkit-animation: next .5s ease-in-out alternate infinite; - animation: next .5s ease-in-out alternate infinite; - left: 0; - top: 0; - opacity: 0.7; - z-index: 169; + width: 5px; + height: 5px; + display: none; + position: absolute; + transform: rotate(45deg); + border-bottom-width: 4px; + border-bottom-style: solid; + border-right-width: 4px; + border-right-style: solid; + -webkit-animation: next 0.5s ease-in-out alternate infinite; + animation: next 0.5s ease-in-out alternate infinite; + left: 0; + top: 0; + opacity: 0.7; + z-index: 169; } @-webkit-keyframes next { - 100% { - transform: rotate(45deg) translate(-3px, -3px); - } + 100% { + transform: rotate(45deg) translate(-3px, -3px); + } } @keyframes next { - 100% { - transform: rotate(45deg) translate(-3px, -3px); - } + 100% { + transform: rotate(45deg) translate(-3px, -3px); + } } #startImageBackgroundDiv { - display: none; - width: 100%; - height: 100%; - position: fixed; - z-index: 10000; + display: none; + width: 100%; + height: 100%; + position: fixed; + z-index: 10000; } #startImageDiv { - width: 100%; - height: 100%; - position: fixed; - background: black; - opacity: 1; + width: 100%; + height: 100%; + position: fixed; + background: black; + opacity: 1; } #startImageLogo { - opacity: 0; - max-width: 60%; - max-height: 60%; - position: fixed; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); + opacity: 0; + max-width: 60%; + max-height: 60%; + position: fixed; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); } .startImageAnimation { - -webkit-animation: startImage 4s ease-in-out 1s alternate 1; - animation: startImage 4s ease-in-out 1s alternate 1; + -webkit-animation: startImage 4s ease-in-out 1s alternate 1; + animation: startImage 4s ease-in-out 1s alternate 1; } @-webkit-keyframes startImage { - 0% { opacity: 0; } - 60% { opacity: 1; } - 100% { opacity: 0; } + 0% { + opacity: 0; + } + 60% { + opacity: 1; + } + 100% { + opacity: 0; + } } @keyframes startImage { - 0% { opacity: 0; } - 60% { opacity: 1; } - 100% { opacity: 0; } + 0% { + opacity: 0; + } + 60% { + opacity: 1; + } + 100% { + opacity: 0; + } } .startImageDivAnimation { - -webkit-animation: startImageDivDisappear 2s ease-in-out 5s alternate 1; - animation: startImageDivDisappear 2s ease-in-out 5s alternate 1; + -webkit-animation: startImageDivDisappear 2s ease-in-out 5s alternate 1; + animation: startImageDivDisappear 2s ease-in-out 5s alternate 1; } @-webkit-keyframes startImageDivDisappear { - 0% { opacity: 1 } - 100% { opacity: 0 } + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } } @keyframes startImageDivDisappear { - 0% { opacity: 1 } - 100% { opacity: 0 } + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } } #ui-editor { - z-index: 9999; - position: absolute; - overflow: visible; - height: 100%; + z-index: 9999; + position: absolute; + overflow: visible; + height: 100%; } @font-face { - font-family: Fira Code; - src: url(../src/fonts/FiraCode-Regular.ttf); + font-family: Fira Code; + src: url(../src/fonts/FiraCode-Regular.ttf); } /* 注释下面这三行以开启抗锯齿 */ -.anti-aliasing { - image-rendering: pixelated; -} +/* .anti-aliasing { + image-rendering: pixelated; +} */ .warning { - transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s; - -webkit-transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s; - animation: warning 1s linear 0s alternate infinite; - -webkit-animation: warning 1s linear 0s alternate infinite; + transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s; + -webkit-transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s; + animation: warning 1s linear 0s alternate infinite; + -webkit-animation: warning 1s linear 0s alternate infinite; } @keyframes warning { - 0 % { text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0);} - 50 % { text-shadow: 0px 0px 30px rgba(255, 0, 0, 1), 0px 0px 6px rgb(129, 0, 0);} - 100 % { text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0);} + 0 % { + text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0); + } + 50 % { + text-shadow: 0px 0px 30px rgba(255, 0, 0, 1), 0px 0px 6px rgb(129, 0, 0); + } + 100 % { + text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0); + } } @-webkit - keyframes warning { - 0 % { text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0);} - 50 % { text-shadow: 0px 0px 30px rgba(255, 0, 0, 1), 0px 0px 6px rgb(129, 0, 0);} - 100 % { text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0);} + 0 % { + text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0); + } + 50 % { + text-shadow: 0px 0px 30px rgba(255, 0, 0, 1), 0px 0px 6px rgb(129, 0, 0); + } + 100 % { + text-shadow: 0px 0px 9px rgba(255, 0, 0, 0.5), 0px 0px 6px rgb(129, 0, 0); + } } .gameCanvas { - transition: transform 1.5s ease-out; - -webkit-transition: transform 1.5s ease-out; -} \ No newline at end of file + transition: transform 1.5s ease-out; + -webkit-transition: transform 1.5s ease-out; +} +/* ====== 新增加载界面样式 ====== */ +@media screen and (max-width: 600px) { + .loading-slide { + width: 100% + } +} +#startTopGallery { + position: absolute; + width: 85%; + height: 85%; + top: 10%; + left:7.5%; + perspective: 1000px; +} + +.loading-slide { + position: absolute; + width: 100%; + height: 100%; + background-size: cover; + background-position: center; + opacity: 0; + object-fit: contain; + transform: translateX(100%) rotateY(30deg); + transition: all 1s cubic-bezier(0.4, 0, 0.2, 1); + border-radius: 10px; + box-shadow: 0 8px 20px rgba(0,0,0,0.4); +} + +.loading-slide.active { + opacity: 1; + transform: translateX(0) rotateY(0); +}