Merge pull request #103 from ckcz123/v2.0

V2.0
This commit is contained in:
Zhang Chen 2018-04-18 19:32:58 +08:00 committed by GitHub
commit 4bcc12b2d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 27041 additions and 6196 deletions

View File

@ -0,0 +1,7 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" />
</MarkdownNavigatorCodeStyleSettings>
</code_scheme>
</component>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

6
.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
</project>

View File

@ -1,154 +1,285 @@
/* BASICS */ /* BASICS */
.CodeMirror { .CodeMirror {
/* Set height, width, borders, and global font properties here */ /* Set height, width, borders, and global font properties here */
font-family: monospace; font-family: monospace;
height: 300px; height: 300px;
color: black; color: black;
direction: ltr; direction: ltr;
} }
/* PADDING */ /* PADDING */
.CodeMirror-lines { .CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */ padding: 4px 0; /* Vertical padding around content */
} }
.CodeMirror pre { .CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */ padding: 0 4px; /* Horizontal padding of content */
} }
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */ background-color: white; /* The little square between H and V scrollbars */
} }
/* GUTTER */ /* GUTTER */
.CodeMirror-gutters { .CodeMirror-gutters {
border-right: 1px solid #ddd; border-right: 1px solid #ddd;
background-color: #f7f7f7; background-color: #f7f7f7;
white-space: nowrap; white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
} }
.CodeMirror-guttermarker { color: black; } .CodeMirror-linenumbers {
.CodeMirror-guttermarker-subtle { color: #999; } }
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
}
.CodeMirror-guttermarker {
color: black;
}
.CodeMirror-guttermarker-subtle {
color: #999;
}
/* CURSOR */ /* CURSOR */
.CodeMirror-cursor { .CodeMirror-cursor {
border-left: 1px solid black; border-left: 1px solid black;
border-right: none; border-right: none;
width: 0; width: 0;
} }
/* Shown when moving in bi-directional text */ /* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor { .CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver; border-left: 1px solid silver;
} }
.cm-fat-cursor .CodeMirror-cursor { .cm-fat-cursor .CodeMirror-cursor {
width: auto; width: auto;
border: 0 !important; border: 0 !important;
background: #7e7; background: #7e7;
} }
.cm-fat-cursor div.CodeMirror-cursors { .cm-fat-cursor div.CodeMirror-cursors {
z-index: 1; z-index: 1;
} }
.cm-fat-cursor-mark { .cm-fat-cursor-mark {
background-color: rgba(20, 255, 20, 0.5); background-color: rgba(20, 255, 20, 0.5);
-webkit-animation: blink 1.06s steps(1) infinite; -webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite;
} }
.cm-animate-fat-cursor { .cm-animate-fat-cursor {
width: auto; width: auto;
border: 0; border: 0;
-webkit-animation: blink 1.06s steps(1) infinite; -webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite;
background-color: #7e7; background-color: #7e7;
} }
@-moz-keyframes blink { @-moz-keyframes blink {
0% {} 0% {
50% { background-color: transparent; } }
100% {} 50% {
background-color: transparent;
}
100% {
}
} }
@-webkit-keyframes blink { @-webkit-keyframes blink {
0% {} 0% {
50% { background-color: transparent; } }
100% {} 50% {
background-color: transparent;
}
100% {
}
} }
@keyframes blink { @keyframes blink {
0% {} 0% {
50% { background-color: transparent; } }
100% {} 50% {
background-color: transparent;
}
100% {
}
} }
/* Can style cursor different in overwrite (non-insert) mode */ /* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {} .CodeMirror-overwrite .CodeMirror-cursor {
}
.cm-tab { display: inline-block; text-decoration: inherit; } .cm-tab {
display: inline-block;
text-decoration: inherit;
}
.CodeMirror-rulers { .CodeMirror-rulers {
position: absolute; position: absolute;
left: 0; right: 0; top: -50px; bottom: -20px; left: 0;
overflow: hidden; right: 0;
top: -50px;
bottom: -20px;
overflow: hidden;
} }
.CodeMirror-ruler { .CodeMirror-ruler {
border-left: 1px solid #ccc; border-left: 1px solid #ccc;
top: 0; bottom: 0; top: 0;
position: absolute; bottom: 0;
position: absolute;
} }
/* DEFAULT THEME */ /* DEFAULT THEME */
.cm-s-default .cm-header {color: blue;} .cm-s-default .cm-header {
.cm-s-default .cm-quote {color: #090;} color: blue;
.cm-negative {color: #d44;} }
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;} .cm-s-default .cm-quote {
.cm-em {font-style: italic;} color: #090;
.cm-link {text-decoration: underline;} }
.cm-strikethrough {text-decoration: line-through;}
.cm-negative {
color: #d44;
}
.cm-positive {
color: #292;
}
.cm-header, .cm-strong {
font-weight: bold;
}
.cm-em {
font-style: italic;
}
.cm-link {
text-decoration: underline;
}
.cm-strikethrough {
text-decoration: line-through;
}
.cm-s-default .cm-keyword {
color: #708;
}
.cm-s-default .cm-atom {
color: #219;
}
.cm-s-default .cm-number {
color: #164;
}
.cm-s-default .cm-def {
color: #00f;
}
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable, .cm-s-default .cm-variable,
.cm-s-default .cm-punctuation, .cm-s-default .cm-punctuation,
.cm-s-default .cm-property, .cm-s-default .cm-property,
.cm-s-default .cm-operator {} .cm-s-default .cm-operator {
.cm-s-default .cm-variable-2 {color: #05a;} }
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-s-default .cm-error {color: #f00;} .cm-s-default .cm-variable-2 {
.cm-invalidchar {color: #f00;} color: #05a;
}
.CodeMirror-composing { border-bottom: 2px solid; } .cm-s-default .cm-variable-3, .cm-s-default .cm-type {
color: #085;
}
.cm-s-default .cm-comment {
color: #a50;
}
.cm-s-default .cm-string {
color: #a11;
}
.cm-s-default .cm-string-2 {
color: #f50;
}
.cm-s-default .cm-meta {
color: #555;
}
.cm-s-default .cm-qualifier {
color: #555;
}
.cm-s-default .cm-builtin {
color: #30a;
}
.cm-s-default .cm-bracket {
color: #997;
}
.cm-s-default .cm-tag {
color: #170;
}
.cm-s-default .cm-attribute {
color: #00c;
}
.cm-s-default .cm-hr {
color: #999;
}
.cm-s-default .cm-link {
color: #00c;
}
.cm-s-default .cm-error {
color: #f00;
}
.cm-invalidchar {
color: #f00;
}
.CodeMirror-composing {
border-bottom: 2px solid;
}
/* Default styles for common addons */ /* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} div.CodeMirror span.CodeMirror-matchingbracket {
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} color: #0b0;
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } }
.CodeMirror-activeline-background {background: #e8f2ff;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {
color: #a22;
}
.CodeMirror-matchingtag {
background: rgba(255, 150, 0, .3);
}
.CodeMirror-activeline-background {
background: #e8f2ff;
}
/* STOP */ /* STOP */
@ -156,129 +287,162 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
the editor. You probably shouldn't touch them. */ the editor. You probably shouldn't touch them. */
.CodeMirror { .CodeMirror {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
background: white; background: white;
} }
.CodeMirror-scroll { .CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */ overflow: scroll !important; /* Things will break if this is overridden */
/* 30px is the magic margin used to hide the element's real scrollbars */ /* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */ /* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px; margin-bottom: -30px;
padding-bottom: 30px; margin-right: -30px;
height: 100%; padding-bottom: 30px;
outline: none; /* Prevent dragging from highlighting the element */ height: 100%;
position: relative; outline: none; /* Prevent dragging from highlighting the element */
position: relative;
} }
.CodeMirror-sizer { .CodeMirror-sizer {
position: relative; position: relative;
border-right: 30px solid transparent; border-right: 30px solid transparent;
} }
/* The fake, visible scrollbars. Used to force redraw during scrolling /* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and before actual scrolling happens, thus preventing shaking and
flickering artifacts. */ flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute; position: absolute;
z-index: 6; z-index: 6;
display: none; display: none;
} }
.CodeMirror-vscrollbar { .CodeMirror-vscrollbar {
right: 0; top: 0; right: 0;
overflow-x: hidden; top: 0;
overflow-y: scroll; overflow-x: hidden;
overflow-y: scroll;
} }
.CodeMirror-hscrollbar { .CodeMirror-hscrollbar {
bottom: 0; left: 0; bottom: 0;
overflow-y: hidden; left: 0;
overflow-x: scroll; overflow-y: hidden;
overflow-x: scroll;
} }
.CodeMirror-scrollbar-filler { .CodeMirror-scrollbar-filler {
right: 0; bottom: 0; right: 0;
bottom: 0;
} }
.CodeMirror-gutter-filler { .CodeMirror-gutter-filler {
left: 0; bottom: 0; left: 0;
bottom: 0;
} }
.CodeMirror-gutters { .CodeMirror-gutters {
position: absolute; left: 0; top: 0; position: absolute;
min-height: 100%; left: 0;
z-index: 3; top: 0;
min-height: 100%;
z-index: 3;
} }
.CodeMirror-gutter { .CodeMirror-gutter {
white-space: normal; white-space: normal;
height: 100%; height: 100%;
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
margin-bottom: -30px; margin-bottom: -30px;
} }
.CodeMirror-gutter-wrapper { .CodeMirror-gutter-wrapper {
position: absolute; position: absolute;
z-index: 4; z-index: 4;
background: none !important; background: none !important;
border: none !important; border: none !important;
} }
.CodeMirror-gutter-background { .CodeMirror-gutter-background {
position: absolute; position: absolute;
top: 0; bottom: 0; top: 0;
z-index: 4; bottom: 0;
z-index: 4;
} }
.CodeMirror-gutter-elt { .CodeMirror-gutter-elt {
position: absolute; position: absolute;
cursor: default; cursor: default;
z-index: 4; z-index: 4;
}
.CodeMirror-gutter-wrapper ::selection {
background-color: transparent
}
.CodeMirror-gutter-wrapper ::-moz-selection {
background-color: transparent
} }
.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
.CodeMirror-lines { .CodeMirror-lines {
cursor: text; cursor: text;
min-height: 1px; /* prevents collapsing before first draw */ min-height: 1px; /* prevents collapsing before first draw */
} }
.CodeMirror pre { .CodeMirror pre {
/* Reset some styles that the rest of the page might have set */ /* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; -moz-border-radius: 0;
border-width: 0; -webkit-border-radius: 0;
background: transparent; border-radius: 0;
font-family: inherit; border-width: 0;
font-size: inherit; background: transparent;
margin: 0; font-family: inherit;
white-space: pre; font-size: inherit;
word-wrap: normal; margin: 0;
line-height: inherit; white-space: pre;
color: inherit; word-wrap: normal;
z-index: 2; line-height: inherit;
position: relative; color: inherit;
overflow: visible; z-index: 2;
-webkit-tap-highlight-color: transparent; position: relative;
-webkit-font-variant-ligatures: contextual; overflow: visible;
font-variant-ligatures: contextual; -webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: contextual;
font-variant-ligatures: contextual;
} }
.CodeMirror-wrap pre { .CodeMirror-wrap pre {
word-wrap: break-word; word-wrap: break-word;
white-space: pre-wrap; white-space: pre-wrap;
word-break: normal; word-break: normal;
} }
.CodeMirror-linebackground { .CodeMirror-linebackground {
position: absolute; position: absolute;
left: 0; right: 0; top: 0; bottom: 0; left: 0;
z-index: 0; right: 0;
top: 0;
bottom: 0;
z-index: 0;
} }
.CodeMirror-linewidget { .CodeMirror-linewidget {
position: relative; position: relative;
z-index: 2; z-index: 2;
padding: 0.1px; /* Force widget margins to stay inside of the container */ padding: 0.1px; /* Force widget margins to stay inside of the container */
} }
.CodeMirror-widget {} .CodeMirror-widget {
}
.CodeMirror-rtl pre { direction: rtl; } .CodeMirror-rtl pre {
direction: rtl;
}
.CodeMirror-code { .CodeMirror-code {
outline: none; outline: none;
} }
/* Force content-box sizing for the elements where we expect it */ /* Force content-box sizing for the elements where we expect it */
@ -287,60 +451,84 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-gutter, .CodeMirror-gutter,
.CodeMirror-gutters, .CodeMirror-gutters,
.CodeMirror-linenumber { .CodeMirror-linenumber {
-moz-box-sizing: content-box; -moz-box-sizing: content-box;
box-sizing: content-box; box-sizing: content-box;
} }
.CodeMirror-measure { .CodeMirror-measure {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 0; height: 0;
overflow: hidden; overflow: hidden;
visibility: hidden; visibility: hidden;
} }
.CodeMirror-cursor { .CodeMirror-cursor {
position: absolute; position: absolute;
pointer-events: none; pointer-events: none;
}
.CodeMirror-measure pre {
position: static;
} }
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors { div.CodeMirror-cursors {
visibility: hidden; visibility: hidden;
position: relative; position: relative;
z-index: 3; z-index: 3;
} }
div.CodeMirror-dragcursors { div.CodeMirror-dragcursors {
visibility: visible; visibility: visible;
} }
.CodeMirror-focused div.CodeMirror-cursors { .CodeMirror-focused div.CodeMirror-cursors {
visibility: visible; visibility: visible;
} }
.CodeMirror-selected { background: #d9d9d9; } .CodeMirror-selected {
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } background: #d9d9d9;
.CodeMirror-crosshair { cursor: crosshair; } }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } .CodeMirror-focused .CodeMirror-selected {
background: #d7d4f0;
}
.CodeMirror-crosshair {
cursor: crosshair;
}
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection {
background: #d7d4f0;
}
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection {
background: #d7d4f0;
}
.cm-searching { .cm-searching {
background-color: #ffa; background-color: #ffa;
background-color: rgba(255, 255, 0, .4); background-color: rgba(255, 255, 0, .4);
} }
/* Used to force a border model for a node */ /* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; } .cm-force-border {
padding-right: .1px;
}
@media print { @media print {
/* Hide the cursor when printing */ /* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors { .CodeMirror div.CodeMirror-cursors {
visibility: hidden; visibility: hidden;
} }
} }
/* See issue #2901 */ /* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; } .cm-tab-wrap-hack:after {
content: '';
}
/* Help users use markselection to safely style text background */ /* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; } span.CodeMirror-selectedtext {
background: none;
}

View File

@ -1,156 +1,165 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others // CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE // Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) { (function (mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror")); mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod); define(["../../lib/codemirror"], mod);
else // Plain browser env else // Plain browser env
mod(CodeMirror); mod(CodeMirror);
})(function(CodeMirror) { })(function (CodeMirror) {
var Pos = CodeMirror.Pos; var Pos = CodeMirror.Pos;
function forEach(arr, f) { function forEach(arr, f) {
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
} }
function arrayContains(arr, item) { function arrayContains(arr, item) {
if (!Array.prototype.indexOf) { if (!Array.prototype.indexOf) {
var i = arr.length; var i = arr.length;
while (i--) { while (i--) {
if (arr[i] === item) { if (arr[i] === item) {
return true; return true;
} }
}
return false;
} }
return false; return arr.indexOf(item) != -1;
}
return arr.indexOf(item) != -1;
} }
function scriptHint(editor, keywords, getToken, options) { function scriptHint(editor, keywords, getToken, options) {
// Find the token at the cursor // Find the token at the cursor
var cur = editor.getCursor(), token = getToken(editor, cur); var cur = editor.getCursor(), token = getToken(editor, cur);
if (/\b(?:string|comment)\b/.test(token.type)) return; if (/\b(?:string|comment)\b/.test(token.type)) return;
token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;
// If it's not a 'word-style' token, ignore the token. // If it's not a 'word-style' token, ignore the token.
if (!/^[\w$_]*$/.test(token.string)) { if (!/^[\w$_]*$/.test(token.string)) {
token = {start: cur.ch, end: cur.ch, string: "", state: token.state, token = {
type: token.string == "." ? "property" : null}; start: cur.ch, end: cur.ch, string: "", state: token.state,
} else if (token.end > cur.ch) { type: token.string == "." ? "property" : null
token.end = cur.ch; };
token.string = token.string.slice(0, cur.ch - token.start); } else if (token.end > cur.ch) {
} token.end = cur.ch;
token.string = token.string.slice(0, cur.ch - token.start);
var tprop = token; }
// If it is a property, find out what it is a property of.
while (tprop.type == "property") { var tprop = token;
tprop = getToken(editor, Pos(cur.line, tprop.start)); // If it is a property, find out what it is a property of.
if (tprop.string != ".") return; while (tprop.type == "property") {
tprop = getToken(editor, Pos(cur.line, tprop.start)); tprop = getToken(editor, Pos(cur.line, tprop.start));
if (!context) var context = []; if (tprop.string != ".") return;
context.push(tprop); tprop = getToken(editor, Pos(cur.line, tprop.start));
} if (!context) var context = [];
return {list: getCompletions(token, context, keywords, options), context.push(tprop);
from: Pos(cur.line, token.start), }
to: Pos(cur.line, token.end)}; return {
list: getCompletions(token, context, keywords, options),
from: Pos(cur.line, token.start),
to: Pos(cur.line, token.end)
};
} }
function javascriptHint(editor, options) { function javascriptHint(editor, options) {
return scriptHint(editor, javascriptKeywords, return scriptHint(editor, javascriptKeywords,
function (e, cur) {return e.getTokenAt(cur);}, function (e, cur) {
options); return e.getTokenAt(cur);
},
options);
}; };
CodeMirror.registerHelper("hint", "javascript", javascriptHint); CodeMirror.registerHelper("hint", "javascript", javascriptHint);
function getCoffeeScriptToken(editor, cur) { function getCoffeeScriptToken(editor, cur) {
// This getToken, it is for coffeescript, imitates the behavior of // This getToken, it is for coffeescript, imitates the behavior of
// getTokenAt method in javascript.js, that is, returning "property" // getTokenAt method in javascript.js, that is, returning "property"
// type and treat "." as indepenent token. // type and treat "." as indepenent token.
var token = editor.getTokenAt(cur); var token = editor.getTokenAt(cur);
if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
token.end = token.start; token.end = token.start;
token.string = '.'; token.string = '.';
token.type = "property"; token.type = "property";
} }
else if (/^\.[\w$_]*$/.test(token.string)) { else if (/^\.[\w$_]*$/.test(token.string)) {
token.type = "property"; token.type = "property";
token.start++; token.start++;
token.string = token.string.replace(/\./, ''); token.string = token.string.replace(/\./, '');
} }
return token; return token;
} }
function coffeescriptHint(editor, options) { function coffeescriptHint(editor, options) {
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
} }
CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
"toUpperCase toLowerCase split concat match replace search").split(" "); "toUpperCase toLowerCase split concat match replace search").split(" ");
var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " +
"lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); "lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
var funcProps = "prototype apply call bind".split(" "); var funcProps = "prototype apply call bind".split(" ");
var javascriptKeywords = ("break case catch class const continue debugger default delete do else export extends false finally for function " + var javascriptKeywords = ("break case catch class const continue debugger default delete do else export extends false finally for function " +
"if in import instanceof new null return super switch this throw true try typeof var void while with yield").split(" "); "if in import instanceof new null return super switch this throw true try typeof var void while with yield").split(" ");
var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
function forAllProps(obj, callback) { function forAllProps(obj, callback) {
if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) { if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {
for (var name in obj) callback(name) for (var name in obj) callback(name)
} else { } else {
for (var o = obj; o; o = Object.getPrototypeOf(o)) for (var o = obj; o; o = Object.getPrototypeOf(o))
Object.getOwnPropertyNames(o).forEach(callback) Object.getOwnPropertyNames(o).forEach(callback)
}
}
function getCompletions(token, context, keywords, options) {
var found = [], start = token.string, global = options && options.globalScope || window;
function maybeAdd(str) {
if (str==null || str==undefined) return;
if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
}
function gatherCompletions(obj) {
if (typeof obj == "string") forEach(stringProps, maybeAdd);
else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
else if (obj instanceof Function) forEach(funcProps, maybeAdd);
forAllProps(obj, maybeAdd)
}
if (context && context.length) {
// If this is a property, see if it belongs to some object we can
// find in the current environment.
var obj = context.pop(), base;
if (obj.type && obj.type.indexOf("variable") === 0) {
if (options && options.additionalContext)
base = options.additionalContext[obj.string];
if (!options || options.useGlobalScope !== false)
base = base || global[obj.string];
} else if (obj.type == "string") {
base = "";
} else if (obj.type == "atom") {
base = 1;
} else if (obj.type == "function") {
if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
(typeof global.jQuery == 'function'))
base = global.jQuery();
else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))
base = global._();
} }
while (base != null && context.length)
base = base[context.pop().string];
if (base != null) gatherCompletions(base);
} else {
// If not, just look in the global object and any local scope
// (reading into JS mode internals to get at the local and global variables)
for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
if (!options || options.useGlobalScope !== false)
gatherCompletions(global);
forEach(keywords, maybeAdd);
}
return found;
} }
});
function getCompletions(token, context, keywords, options) {
var found = [], start = token.string, global = options && options.globalScope || window;
function maybeAdd(str) {
if (str == null || str == undefined) return;
if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
}
function gatherCompletions(obj) {
if (typeof obj == "string") forEach(stringProps, maybeAdd);
else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
else if (obj instanceof Function) forEach(funcProps, maybeAdd);
forAllProps(obj, maybeAdd)
}
if (context && context.length) {
// If this is a property, see if it belongs to some object we can
// find in the current environment.
var obj = context.pop(), base;
if (obj.type && obj.type.indexOf("variable") === 0) {
if (options && options.additionalContext)
base = options.additionalContext[obj.string];
if (!options || options.useGlobalScope !== false)
base = base || global[obj.string];
} else if (obj.type == "string") {
base = "";
} else if (obj.type == "atom") {
base = 1;
} else if (obj.type == "function") {
if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
(typeof global.jQuery == 'function'))
base = global.jQuery();
else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))
base = global._();
}
while (base != null && context.length)
base = base[context.pop().string];
if (base != null) gatherCompletions(base);
} else {
// If not, just look in the global object and any local scope
// (reading into JS mode internals to get at the local and global variables)
for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
if (!options || options.useGlobalScope !== false)
gatherCompletions(global);
forEach(keywords, maybeAdd);
}
return found;
}
});

View File

@ -1,63 +1,64 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others // CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE // Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) { (function (mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror")); mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod); define(["../../lib/codemirror"], mod);
else // Plain browser env else // Plain browser env
mod(CodeMirror); mod(CodeMirror);
})(function(CodeMirror) { })(function (CodeMirror) {
"use strict"; "use strict";
// declare global: JSHINT // declare global: JSHINT
function validator(text, options) { function validator(text, options) {
if (!window.JSHINT) { if (!window.JSHINT) {
if (window.console) {
window.console.error("Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run.");
}
return [];
}
if (!options.indent) // JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation
options.indent = 1; // JSHint default value is 4
JSHINT(text, options, options.globals);
var errors = JSHINT.data().errors, result = [];
if (errors) parseErrors(errors, result);
return result;
}
CodeMirror.registerHelper("lint", "javascript", validator);
function parseErrors(errors, output) {
for ( var i = 0; i < errors.length; i++) {
var error = errors[i];
if (error) {
if (error.line <= 0) {
if (window.console) { if (window.console) {
window.console.warn("Cannot display JSHint error (invalid line " + error.line + ")", error); window.console.error("Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run.");
} }
continue; return [];
}
var start = error.character - 1, end = start + 1;
if (error.evidence) {
var index = error.evidence.substring(start).search(/.\b/);
if (index > -1) {
end += index;
}
}
// Convert to format expected by validation service
var hint = {
message: error.reason,
severity: error.code ? (error.code.startsWith('W') ? "warning" : "error") : "error",
from: CodeMirror.Pos(error.line - 1, start),
to: CodeMirror.Pos(error.line - 1, end)
};
output.push(hint);
} }
} if (!options.indent) // JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation
options.indent = 1; // JSHint default value is 4
JSHINT(text, options, options.globals);
var errors = JSHINT.data().errors, result = [];
if (errors) parseErrors(errors, result);
return result;
} }
});
CodeMirror.registerHelper("lint", "javascript", validator);
function parseErrors(errors, output) {
for (var i = 0; i < errors.length; i++) {
var error = errors[i];
if (error) {
if (error.line <= 0) {
if (window.console) {
window.console.warn("Cannot display JSHint error (invalid line " + error.line + ")", error);
}
continue;
}
var start = error.character - 1, end = start + 1;
if (error.evidence) {
var index = error.evidence.substring(start).search(/.\b/);
if (index > -1) {
end += index;
}
}
// Convert to format expected by validation service
var hint = {
message: error.reason,
severity: error.code ? (error.code.startsWith('W') ? "warning" : "error") : "error",
from: CodeMirror.Pos(error.line - 1, start),
to: CodeMirror.Pos(error.line - 1, end)
};
output.push(hint);
}
}
}
});

View File

@ -1,9 +1,9 @@
/* The lint marker gutter */ /* The lint marker gutter */
.CodeMirror-lint-markers { .CodeMirror-lint-markers {
width: 16px; width: 16px;
} }
.CodeMirror-lint-tooltip { .CodeMirror-lint-tooltip {
background-color: #ffd; background-color: #ffd;
border: 1px solid black; border: 1px solid black;
border-radius: 4px 4px 4px 4px; border-radius: 4px 4px 4px 4px;
@ -23,24 +23,22 @@
-webkit-transition: opacity .4s; -webkit-transition: opacity .4s;
-o-transition: opacity .4s; -o-transition: opacity .4s;
-ms-transition: opacity .4s; -ms-transition: opacity .4s;
} }
.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning { .CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
background-position: left bottom; background-position: left bottom;
background-repeat: repeat-x; background-repeat: repeat-x;
} }
.CodeMirror-lint-mark-error { .CodeMirror-lint-mark-error {
background-image: background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==");
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==") }
;
} .CodeMirror-lint-mark-warning {
.CodeMirror-lint-mark-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
} }
.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning { .CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
background-position: center center; background-position: center center;
background-repeat: no-repeat; background-repeat: no-repeat;
cursor: pointer; cursor: pointer;
@ -49,25 +47,26 @@
width: 16px; width: 16px;
vertical-align: middle; vertical-align: middle;
position: relative; position: relative;
} }
.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning { .CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
padding-left: 18px; padding-left: 18px;
background-position: top left; background-position: top left;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { .CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
} }
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning { .CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
} }
.CodeMirror-lint-marker-multiple { .CodeMirror-lint-marker-multiple {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC"); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: right bottom; background-position: right bottom;
width: 100%; height: 100%; width: 100%;
} height: 100%;
}

View File

@ -1,252 +1,277 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others // CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE // Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) { (function (mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror")); mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod); define(["../../lib/codemirror"], mod);
else // Plain browser env else // Plain browser env
mod(CodeMirror); mod(CodeMirror);
})(function(CodeMirror) { })(function (CodeMirror) {
"use strict"; "use strict";
var GUTTER_ID = "CodeMirror-lint-markers"; var GUTTER_ID = "CodeMirror-lint-markers";
function showTooltip(e, content) { function showTooltip(e, content) {
var tt = document.createElement("div"); var tt = document.createElement("div");
tt.className = "CodeMirror-lint-tooltip"; tt.className = "CodeMirror-lint-tooltip";
tt.appendChild(content.cloneNode(true)); tt.appendChild(content.cloneNode(true));
document.body.appendChild(tt); document.body.appendChild(tt);
function position(e) { function position(e) {
if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
tt.style.left = (e.clientX + 5) + "px"; tt.style.left = (e.clientX + 5) + "px";
} }
CodeMirror.on(document, "mousemove", position);
position(e); CodeMirror.on(document, "mousemove", position);
if (tt.style.opacity != null) tt.style.opacity = 1; position(e);
return tt; if (tt.style.opacity != null) tt.style.opacity = 1;
return tt;
} }
function rm(elt) { function rm(elt) {
if (elt.parentNode) elt.parentNode.removeChild(elt); if (elt.parentNode) elt.parentNode.removeChild(elt);
} }
function hideTooltip(tt) { function hideTooltip(tt) {
if (!tt.parentNode) return; if (!tt.parentNode) return;
if (tt.style.opacity == null) rm(tt); if (tt.style.opacity == null) rm(tt);
tt.style.opacity = 0; tt.style.opacity = 0;
setTimeout(function() { rm(tt); }, 600); setTimeout(function () {
rm(tt);
}, 600);
} }
function showTooltipFor(e, content, node) { function showTooltipFor(e, content, node) {
var tooltip = showTooltip(e, content); var tooltip = showTooltip(e, content);
function hide() {
CodeMirror.off(node, "mouseout", hide); function hide() {
if (tooltip) { hideTooltip(tooltip); tooltip = null; } CodeMirror.off(node, "mouseout", hide);
} if (tooltip) {
var poll = setInterval(function() { hideTooltip(tooltip);
if (tooltip) for (var n = node;; n = n.parentNode) { tooltip = null;
if (n && n.nodeType == 11) n = n.host; }
if (n == document.body) return;
if (!n) { hide(); break; }
} }
if (!tooltip) return clearInterval(poll);
}, 400); var poll = setInterval(function () {
CodeMirror.on(node, "mouseout", hide); if (tooltip) for (var n = node; ; n = n.parentNode) {
if (n && n.nodeType == 11) n = n.host;
if (n == document.body) return;
if (!n) {
hide();
break;
}
}
if (!tooltip) return clearInterval(poll);
}, 400);
CodeMirror.on(node, "mouseout", hide);
} }
function LintState(cm, options, hasGutter) { function LintState(cm, options, hasGutter) {
this.marked = []; this.marked = [];
this.options = options; this.options = options;
this.timeout = null; this.timeout = null;
this.hasGutter = hasGutter; this.hasGutter = hasGutter;
this.onMouseOver = function(e) { onMouseOver(cm, e); }; this.onMouseOver = function (e) {
this.waitingFor = 0 onMouseOver(cm, e);
};
this.waitingFor = 0
} }
function parseOptions(_cm, options) { function parseOptions(_cm, options) {
if (options instanceof Function) return {getAnnotations: options}; if (options instanceof Function) return {getAnnotations: options};
if (!options || options === true) options = {}; if (!options || options === true) options = {};
return options; return options;
} }
function clearMarks(cm) { function clearMarks(cm) {
var state = cm.state.lint; var state = cm.state.lint;
if (state.hasGutter) cm.clearGutter(GUTTER_ID); if (state.hasGutter) cm.clearGutter(GUTTER_ID);
for (var i = 0; i < state.marked.length; ++i) for (var i = 0; i < state.marked.length; ++i)
state.marked[i].clear(); state.marked[i].clear();
state.marked.length = 0; state.marked.length = 0;
} }
function makeMarker(labels, severity, multiple, tooltips) { function makeMarker(labels, severity, multiple, tooltips) {
var marker = document.createElement("div"), inner = marker; var marker = document.createElement("div"), inner = marker;
marker.className = "CodeMirror-lint-marker-" + severity; marker.className = "CodeMirror-lint-marker-" + severity;
if (multiple) { if (multiple) {
inner = marker.appendChild(document.createElement("div")); inner = marker.appendChild(document.createElement("div"));
inner.className = "CodeMirror-lint-marker-multiple"; inner.className = "CodeMirror-lint-marker-multiple";
}
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
showTooltipFor(e, labels, inner);
});
return marker;
}
function getMaxSeverity(a, b) {
if (a == "error") return a;
else return b;
}
function groupByLine(annotations) {
var lines = [];
for (var i = 0; i < annotations.length; ++i) {
var ann = annotations[i], line = ann.from.line;
(lines[line] || (lines[line] = [])).push(ann);
}
return lines;
}
function annotationTooltip(ann) {
var severity = ann.severity;
if (!severity) severity = "error";
var tip = document.createElement("div");
tip.className = "CodeMirror-lint-message-" + severity;
if (typeof ann.messageHTML != 'undefined') {
tip.innerHTML = ann.messageHTML;
} else {
tip.appendChild(document.createTextNode(ann.message));
}
return tip;
}
function lintAsync(cm, getAnnotations, passOptions) {
var state = cm.state.lint
var id = ++state.waitingFor
function abort() {
id = -1
cm.off("change", abort)
}
cm.on("change", abort)
getAnnotations(cm.getValue(), function(annotations, arg2) {
cm.off("change", abort)
if (state.waitingFor != id) return
if (arg2 && annotations instanceof CodeMirror) annotations = arg2
cm.operation(function() {updateLinting(cm, annotations)})
}, passOptions, cm);
}
function startLinting(cm) {
var state = cm.state.lint, options = state.options;
/*
* Passing rules in `options` property prevents JSHint (and other linters) from complaining
* about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.
*/
var passOptions = options.options || options;
var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint");
if (!getAnnotations) return;
if (options.async || getAnnotations.async) {
lintAsync(cm, getAnnotations, passOptions)
} else {
var annotations = getAnnotations(cm.getValue(), passOptions, cm);
if (!annotations) return;
if (annotations.then) annotations.then(function(issues) {
cm.operation(function() {updateLinting(cm, issues)})
});
else cm.operation(function() {updateLinting(cm, annotations)})
}
}
function updateLinting(cm, annotationsNotSorted) {
clearMarks(cm);
var state = cm.state.lint, options = state.options;
var annotations = groupByLine(annotationsNotSorted);
for (var line = 0; line < annotations.length; ++line) {
var anns = annotations[line];
if (!anns) continue;
var maxSeverity = null;
var tipLabel = state.hasGutter && document.createDocumentFragment();
for (var i = 0; i < anns.length; ++i) {
var ann = anns[i];
var severity = ann.severity;
if (!severity) severity = "error";
maxSeverity = getMaxSeverity(maxSeverity, severity);
if (options.formatAnnotation) ann = options.formatAnnotation(ann);
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
className: "CodeMirror-lint-mark-" + severity,
__annotation: ann
}));
} }
if (state.hasGutter) if (tooltips != false) CodeMirror.on(inner, "mouseover", function (e) {
cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, showTooltipFor(e, labels, inner);
state.options.tooltips)); });
}
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); return marker;
} }
function onChange(cm) { function getMaxSeverity(a, b) {
var state = cm.state.lint; if (a == "error") return a;
if (!state) return; else return b;
clearTimeout(state.timeout);
state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);
} }
function popupTooltips(annotations, e) { function groupByLine(annotations) {
var target = e.target || e.srcElement; var lines = [];
var tooltip = document.createDocumentFragment(); for (var i = 0; i < annotations.length; ++i) {
for (var i = 0; i < annotations.length; i++) { var ann = annotations[i], line = ann.from.line;
var ann = annotations[i]; (lines[line] || (lines[line] = [])).push(ann);
tooltip.appendChild(annotationTooltip(ann)); }
} return lines;
showTooltipFor(e, tooltip, target);
} }
function onMouseOver(cm, e) { function annotationTooltip(ann) {
var target = e.target || e.srcElement; var severity = ann.severity;
if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; if (!severity) severity = "error";
var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2; var tip = document.createElement("div");
var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client")); tip.className = "CodeMirror-lint-message-" + severity;
if (typeof ann.messageHTML != 'undefined') {
var annotations = []; tip.innerHTML = ann.messageHTML;
for (var i = 0; i < spans.length; ++i) { } else {
var ann = spans[i].__annotation; tip.appendChild(document.createTextNode(ann.message));
if (ann) annotations.push(ann); }
} return tip;
if (annotations.length) popupTooltips(annotations, e);
} }
CodeMirror.defineOption("lint", false, function(cm, val, old) { function lintAsync(cm, getAnnotations, passOptions) {
if (old && old != CodeMirror.Init) { var state = cm.state.lint
var id = ++state.waitingFor
function abort() {
id = -1
cm.off("change", abort)
}
cm.on("change", abort)
getAnnotations(cm.getValue(), function (annotations, arg2) {
cm.off("change", abort)
if (state.waitingFor != id) return
if (arg2 && annotations instanceof CodeMirror) annotations = arg2
cm.operation(function () {
updateLinting(cm, annotations)
})
}, passOptions, cm);
}
function startLinting(cm) {
var state = cm.state.lint, options = state.options;
/*
* Passing rules in `options` property prevents JSHint (and other linters) from complaining
* about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.
*/
var passOptions = options.options || options;
var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint");
if (!getAnnotations) return;
if (options.async || getAnnotations.async) {
lintAsync(cm, getAnnotations, passOptions)
} else {
var annotations = getAnnotations(cm.getValue(), passOptions, cm);
if (!annotations) return;
if (annotations.then) annotations.then(function (issues) {
cm.operation(function () {
updateLinting(cm, issues)
})
});
else cm.operation(function () {
updateLinting(cm, annotations)
})
}
}
function updateLinting(cm, annotationsNotSorted) {
clearMarks(cm); clearMarks(cm);
if (cm.state.lint.options.lintOnChange !== false) var state = cm.state.lint, options = state.options;
cm.off("change", onChange);
CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); var annotations = groupByLine(annotationsNotSorted);
clearTimeout(cm.state.lint.timeout);
delete cm.state.lint; for (var line = 0; line < annotations.length; ++line) {
} var anns = annotations[line];
if (!anns) continue;
if (val) {
var gutters = cm.getOption("gutters"), hasLintGutter = false; var maxSeverity = null;
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; var tipLabel = state.hasGutter && document.createDocumentFragment();
var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
if (state.options.lintOnChange !== false) for (var i = 0; i < anns.length; ++i) {
cm.on("change", onChange); var ann = anns[i];
if (state.options.tooltips != false && state.options.tooltips != "gutter") var severity = ann.severity;
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); if (!severity) severity = "error";
maxSeverity = getMaxSeverity(maxSeverity, severity);
startLinting(cm);
} if (options.formatAnnotation) ann = options.formatAnnotation(ann);
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
className: "CodeMirror-lint-mark-" + severity,
__annotation: ann
}));
}
if (state.hasGutter)
cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1,
state.options.tooltips));
}
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
}
function onChange(cm) {
var state = cm.state.lint;
if (!state) return;
clearTimeout(state.timeout);
state.timeout = setTimeout(function () {
startLinting(cm);
}, state.options.delay || 500);
}
function popupTooltips(annotations, e) {
var target = e.target || e.srcElement;
var tooltip = document.createDocumentFragment();
for (var i = 0; i < annotations.length; i++) {
var ann = annotations[i];
tooltip.appendChild(annotationTooltip(ann));
}
showTooltipFor(e, tooltip, target);
}
function onMouseOver(cm, e) {
var target = e.target || e.srcElement;
if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
var annotations = [];
for (var i = 0; i < spans.length; ++i) {
var ann = spans[i].__annotation;
if (ann) annotations.push(ann);
}
if (annotations.length) popupTooltips(annotations, e);
}
CodeMirror.defineOption("lint", false, function (cm, val, old) {
if (old && old != CodeMirror.Init) {
clearMarks(cm);
if (cm.state.lint.options.lintOnChange !== false)
cm.off("change", onChange);
CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
clearTimeout(cm.state.lint.timeout);
delete cm.state.lint;
}
if (val) {
var gutters = cm.getOption("gutters"), hasLintGutter = false;
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
if (state.options.lintOnChange !== false)
cm.on("change", onChange);
if (state.options.tooltips != false && state.options.tooltips != "gutter")
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
startLinting(cm);
}
}); });
CodeMirror.defineExtension("performLint", function() { CodeMirror.defineExtension("performLint", function () {
if (this.state.lint) startLinting(this); if (this.state.lint) startLinting(this);
}); });
}); });

View File

@ -3,34 +3,34 @@
z-index: 301; z-index: 301;
overflow: hidden; overflow: hidden;
list-style: none; list-style: none;
margin: 0; margin: 0;
padding: 2px; padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, .2);
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, .2);
box-shadow: 2px 3px 5px rgba(0,0,0,.2); box-shadow: 2px 3px 5px rgba(0, 0, 0, .2);
border-radius: 3px; border-radius: 3px;
border: 1px solid silver; border: 1px solid silver;
background: white; background: white;
font-size: 90%; font-size: 90%;
font-family: monospace; font-family: monospace;
max-height: 20em; max-height: 20em;
overflow-y: auto; overflow-y: auto;
} }
.CodeMirror-hint { .CodeMirror-hint {
margin: 0; margin: 0;
padding: 0 4px; padding: 0 4px;
border-radius: 2px; border-radius: 2px;
white-space: pre; white-space: pre;
color: black; color: black;
cursor: pointer; cursor: pointer;
} }
li.CodeMirror-hint-active { li.CodeMirror-hint-active {
background: #08f; background: #08f;
color: white; color: white;
} }

View File

@ -1,432 +1,484 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others // CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE // Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) { (function (mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror")); mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod); define(["../../lib/codemirror"], mod);
else // Plain browser env else // Plain browser env
mod(CodeMirror); mod(CodeMirror);
})(function(CodeMirror) { })(function (CodeMirror) {
"use strict"; "use strict";
var HINT_ELEMENT_CLASS = "CodeMirror-hint"; var HINT_ELEMENT_CLASS = "CodeMirror-hint";
var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active";
// This is the old interface, kept around for now to stay // This is the old interface, kept around for now to stay
// backwards-compatible. // backwards-compatible.
CodeMirror.showHint = function(cm, getHints, options) { CodeMirror.showHint = function (cm, getHints, options) {
if (!getHints) return cm.showHint(options); if (!getHints) return cm.showHint(options);
if (options && options.async) getHints.async = true; if (options && options.async) getHints.async = true;
var newOpts = {hint: getHints}; var newOpts = {hint: getHints};
if (options) for (var prop in options) newOpts[prop] = options[prop]; if (options) for (var prop in options) newOpts[prop] = options[prop];
return cm.showHint(newOpts); return cm.showHint(newOpts);
}; };
CodeMirror.defineExtension("showHint", function(options) { CodeMirror.defineExtension("showHint", function (options) {
options = parseOptions(this, this.getCursor("start"), options); options = parseOptions(this, this.getCursor("start"), options);
var selections = this.listSelections() var selections = this.listSelections()
if (selections.length > 1) return; if (selections.length > 1) return;
// By default, don't allow completion when something is selected. // By default, don't allow completion when something is selected.
// A hint function can have a `supportsSelection` property to // A hint function can have a `supportsSelection` property to
// indicate that it can handle selections. // indicate that it can handle selections.
if (this.somethingSelected()) { if (this.somethingSelected()) {
if (!options.hint.supportsSelection) return; if (!options.hint.supportsSelection) return;
// Don't try with cross-line selections // Don't try with cross-line selections
for (var i = 0; i < selections.length; i++) for (var i = 0; i < selections.length; i++)
if (selections[i].head.line != selections[i].anchor.line) return; if (selections[i].head.line != selections[i].anchor.line) return;
} }
if (this.state.completionActive) this.state.completionActive.close(); if (this.state.completionActive) this.state.completionActive.close();
var completion = this.state.completionActive = new Completion(this, options); var completion = this.state.completionActive = new Completion(this, options);
if (!completion.options.hint) return; if (!completion.options.hint) return;
CodeMirror.signal(this, "startCompletion", this); CodeMirror.signal(this, "startCompletion", this);
completion.update(true); completion.update(true);
}); });
function Completion(cm, options) { function Completion(cm, options) {
this.cm = cm; this.cm = cm;
this.options = options; this.options = options;
this.widget = null; this.widget = null;
this.debounce = 0; this.debounce = 0;
this.tick = 0; this.tick = 0;
this.startPos = this.cm.getCursor("start"); this.startPos = this.cm.getCursor("start");
this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
var self = this; var self = this;
cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); }); cm.on("cursorActivity", this.activityFunc = function () {
self.cursorActivity();
});
} }
var requestAnimationFrame = window.requestAnimationFrame || function(fn) { var requestAnimationFrame = window.requestAnimationFrame || function (fn) {
return setTimeout(fn, 1000/60); return setTimeout(fn, 1000 / 60);
}; };
var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
Completion.prototype = { Completion.prototype = {
close: function() { close: function () {
if (!this.active()) return; if (!this.active()) return;
this.cm.state.completionActive = null; this.cm.state.completionActive = null;
this.tick = null; this.tick = null;
this.cm.off("cursorActivity", this.activityFunc); this.cm.off("cursorActivity", this.activityFunc);
if (this.widget && this.data) CodeMirror.signal(this.data, "close"); if (this.widget && this.data) CodeMirror.signal(this.data, "close");
if (this.widget) this.widget.close(); if (this.widget) this.widget.close();
CodeMirror.signal(this.cm, "endCompletion", this.cm); CodeMirror.signal(this.cm, "endCompletion", this.cm);
}, },
active: function() { active: function () {
return this.cm.state.completionActive == this; return this.cm.state.completionActive == this;
}, },
pick: function(data, i) { pick: function (data, i) {
var completion = data.list[i]; var completion = data.list[i];
if (completion.hint) completion.hint(this.cm, data, completion); if (completion.hint) completion.hint(this.cm, data, completion);
else this.cm.replaceRange(getText(completion), completion.from || data.from, else this.cm.replaceRange(getText(completion), completion.from || data.from,
completion.to || data.to, "complete"); completion.to || data.to, "complete");
CodeMirror.signal(data, "pick", completion); CodeMirror.signal(data, "pick", completion);
this.close(); this.close();
}, },
cursorActivity: function() { cursorActivity: function () {
if (this.debounce) { if (this.debounce) {
cancelAnimationFrame(this.debounce); cancelAnimationFrame(this.debounce);
this.debounce = 0; this.debounce = 0;
} }
var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line); var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);
if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
pos.ch < this.startPos.ch || this.cm.somethingSelected() || pos.ch < this.startPos.ch || this.cm.somethingSelected() ||
(pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) { (pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
this.close(); this.close();
} else { } else {
var self = this; var self = this;
this.debounce = requestAnimationFrame(function() {self.update();}); this.debounce = requestAnimationFrame(function () {
if (this.widget) this.widget.disable(); self.update();
} });
}, if (this.widget) this.widget.disable();
}
update: function(first) { },
if (this.tick == null) return
var self = this, myTick = ++this.tick update: function (first) {
fetchHints(this.options.hint, this.cm, this.options, function(data) { if (this.tick == null) return
if (self.tick == myTick) self.finishUpdate(data, first) var self = this, myTick = ++this.tick
}) fetchHints(this.options.hint, this.cm, this.options, function (data) {
}, if (self.tick == myTick) self.finishUpdate(data, first)
finishUpdate: function(data, first) {
if (this.data) CodeMirror.signal(this.data, "update");
var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);
if (this.widget) this.widget.close();
this.data = data;
if (data && data.list.length) {
if (picked && data.list.length == 1) {
this.pick(data, 0);
} else {
this.widget = new Widget(this, data);
CodeMirror.signal(data, "shown");
}
}
}
};
function parseOptions(cm, pos, options) {
var editor = cm.options.hintOptions;
var out = {};
for (var prop in defaultOptions) out[prop] = defaultOptions[prop];
if (editor) for (var prop in editor)
if (editor[prop] !== undefined) out[prop] = editor[prop];
if (options) for (var prop in options)
if (options[prop] !== undefined) out[prop] = options[prop];
if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)
return out;
}
function getText(completion) {
if (typeof completion == "string") return completion;
else return completion.text;
}
function buildKeyMap(completion, handle) {
var baseMap = {
Up: function() {handle.moveFocus(-1);},
Down: function() {handle.moveFocus(1);},
PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},
PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},
Home: function() {handle.setFocus(0);},
End: function() {handle.setFocus(handle.length - 1);},
Enter: handle.pick,
Tab: handle.pick,
Esc: handle.close
};
var custom = completion.options.customKeys;
var ourMap = custom ? {} : baseMap;
function addBinding(key, val) {
var bound;
if (typeof val != "string")
bound = function(cm) { return val(cm, handle); };
// This mechanism is deprecated
else if (baseMap.hasOwnProperty(val))
bound = baseMap[val];
else
bound = val;
ourMap[key] = bound;
}
if (custom)
for (var key in custom) if (custom.hasOwnProperty(key))
addBinding(key, custom[key]);
var extra = completion.options.extraKeys;
if (extra)
for (var key in extra) if (extra.hasOwnProperty(key))
addBinding(key, extra[key]);
return ourMap;
}
function getHintElement(hintsElement, el) {
while (el && el != hintsElement) {
if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el;
el = el.parentNode;
}
}
function Widget(completion, data) {
this.completion = completion;
this.data = data;
this.picked = false;
var widget = this, cm = completion.cm;
var hints = this.hints = document.createElement("ul");
hints.className = "CodeMirror-hints";
this.selectedHint = data.selectedHint || 0;
var completions = data.list;
for (var i = 0; i < completions.length; ++i) {
var elt = hints.appendChild(document.createElement("li")), cur = completions[i];
var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS);
if (cur.className != null) className = cur.className + " " + className;
elt.className = className;
if (cur.render) cur.render(elt, data, cur);
else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));
elt.hintId = i;
}
var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);
var left = pos.left, top = pos.bottom, below = true;
hints.style.left = left + "px";
hints.style.top = top + "px";
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
(completion.options.container || document.body).appendChild(hints);
var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH;
var scrolls = hints.scrollHeight > hints.clientHeight + 1
var startScroll = cm.getScrollInfo();
if (overlapY > 0) {
var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);
if (curTop - height > 0) { // Fits above cursor
hints.style.top = (top = pos.top - height) + "px";
below = false;
} else if (height > winH) {
hints.style.height = (winH - 5) + "px";
hints.style.top = (top = pos.bottom - box.top) + "px";
var cursor = cm.getCursor();
if (data.from.ch != cursor.ch) {
pos = cm.cursorCoords(cursor);
hints.style.left = (left = pos.left) + "px";
box = hints.getBoundingClientRect();
}
}
}
var overlapX = box.right - winW;
if (overlapX > 0) {
if (box.right - box.left > winW) {
hints.style.width = (winW - 5) + "px";
overlapX -= (box.right - box.left) - winW;
}
hints.style.left = (left = pos.left - overlapX) + "px";
}
if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)
node.style.paddingRight = cm.display.nativeBarWidth + "px"
cm.addKeyMap(this.keyMap = buildKeyMap(completion, {
moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },
setFocus: function(n) { widget.changeActive(n); },
menuSize: function() { return widget.screenAmount(); },
length: completions.length,
close: function() { completion.close(); },
pick: function() { widget.pick(); },
data: data
}));
if (completion.options.closeOnUnfocus) {
var closingOnBlur;
cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });
cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); });
}
cm.on("scroll", this.onScroll = function() {
var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();
var newTop = top + startScroll.top - curScroll.top;
var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);
if (!below) point += hints.offsetHeight;
if (point <= editor.top || point >= editor.bottom) return completion.close();
hints.style.top = newTop + "px";
hints.style.left = (left + startScroll.left - curScroll.left) + "px";
});
CodeMirror.on(hints, "dblclick", function(e) {
var t = getHintElement(hints, e.target || e.srcElement);
if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}
});
CodeMirror.on(hints, "click", function(e) {
var t = getHintElement(hints, e.target || e.srcElement);
if (t && t.hintId != null) {
widget.changeActive(t.hintId);
if (completion.options.completeOnSingleClick) widget.pick();
}
});
CodeMirror.on(hints, "mousedown", function() {
setTimeout(function(){cm.focus();}, 20);
});
CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]);
return true;
}
Widget.prototype = {
close: function() {
if (this.completion.widget != this) return;
this.completion.widget = null;
this.hints.parentNode.removeChild(this.hints);
this.completion.cm.removeKeyMap(this.keyMap);
var cm = this.completion.cm;
if (this.completion.options.closeOnUnfocus) {
cm.off("blur", this.onBlur);
cm.off("focus", this.onFocus);
}
cm.off("scroll", this.onScroll);
},
disable: function() {
this.completion.cm.removeKeyMap(this.keyMap);
var widget = this;
this.keyMap = {Enter: function() { widget.picked = true; }};
this.completion.cm.addKeyMap(this.keyMap);
},
pick: function() {
this.completion.pick(this.data, this.selectedHint);
},
changeActive: function(i, avoidWrap) {
if (i >= this.data.list.length)
i = avoidWrap ? this.data.list.length - 1 : 0;
else if (i < 0)
i = avoidWrap ? 0 : this.data.list.length - 1;
if (this.selectedHint == i) return;
var node = this.hints.childNodes[this.selectedHint];
node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, "");
node = this.hints.childNodes[this.selectedHint = i];
node.className += " " + ACTIVE_HINT_ELEMENT_CLASS;
if (node.offsetTop < this.hints.scrollTop)
this.hints.scrollTop = node.offsetTop - 3;
else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;
CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
},
screenAmount: function() {
return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
}
};
function applicableHelpers(cm, helpers) {
if (!cm.somethingSelected()) return helpers
var result = []
for (var i = 0; i < helpers.length; i++)
if (helpers[i].supportsSelection) result.push(helpers[i])
return result
}
function fetchHints(hint, cm, options, callback) {
if (hint.async) {
hint(cm, callback, options)
} else {
var result = hint(cm, options)
if (result && result.then) result.then(callback)
else callback(result)
}
}
function resolveAutoHints(cm, pos) {
var helpers = cm.getHelpers(pos, "hint"), words
if (helpers.length) {
var resolved = function(cm, callback, options) {
var app = applicableHelpers(cm, helpers);
function run(i) {
if (i == app.length) return callback(null)
fetchHints(app[i], cm, options, function(result) {
if (result && result.list.length > 0) callback(result)
else run(i + 1)
}) })
} },
run(0)
finishUpdate: function (data, first) {
if (this.data) CodeMirror.signal(this.data, "update");
var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);
if (this.widget) this.widget.close();
this.data = data;
if (data && data.list.length) {
if (picked && data.list.length == 1) {
this.pick(data, 0);
} else {
this.widget = new Widget(this, data);
CodeMirror.signal(data, "shown");
}
}
} }
resolved.async = true
resolved.supportsSelection = true
return resolved
} else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) }
} else if (CodeMirror.hint.anyword) {
return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }
} else {
return function() {}
}
}
CodeMirror.registerHelper("hint", "auto", {
resolve: resolveAutoHints
});
CodeMirror.registerHelper("hint", "fromList", function(cm, options) {
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
var to = CodeMirror.Pos(cur.line, token.end);
if (token.string && /\w/.test(token.string[token.string.length - 1])) {
var term = token.string, from = CodeMirror.Pos(cur.line, token.start);
} else {
var term = "", from = to;
}
var found = [];
for (var i = 0; i < options.words.length; i++) {
var word = options.words[i];
if (word.slice(0, term.length) == term)
found.push(word);
}
if (found.length) return {list: found, from: from, to: to};
});
CodeMirror.commands.autocomplete = CodeMirror.showHint;
var defaultOptions = {
hint: CodeMirror.hint.auto,
completeSingle: true,
alignWithWord: true,
closeCharacters: /[\s()\[\]{};:>,]/,
closeOnUnfocus: true,
completeOnSingleClick: true,
container: null,
customKeys: null,
extraKeys: null
}; };
function parseOptions(cm, pos, options) {
var editor = cm.options.hintOptions;
var out = {};
for (var prop in defaultOptions) out[prop] = defaultOptions[prop];
if (editor) for (var prop in editor)
if (editor[prop] !== undefined) out[prop] = editor[prop];
if (options) for (var prop in options)
if (options[prop] !== undefined) out[prop] = options[prop];
if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)
return out;
}
function getText(completion) {
if (typeof completion == "string") return completion;
else return completion.text;
}
function buildKeyMap(completion, handle) {
var baseMap = {
Up: function () {
handle.moveFocus(-1);
},
Down: function () {
handle.moveFocus(1);
},
PageUp: function () {
handle.moveFocus(-handle.menuSize() + 1, true);
},
PageDown: function () {
handle.moveFocus(handle.menuSize() - 1, true);
},
Home: function () {
handle.setFocus(0);
},
End: function () {
handle.setFocus(handle.length - 1);
},
Enter: handle.pick,
Tab: handle.pick,
Esc: handle.close
};
var custom = completion.options.customKeys;
var ourMap = custom ? {} : baseMap;
function addBinding(key, val) {
var bound;
if (typeof val != "string")
bound = function (cm) {
return val(cm, handle);
};
// This mechanism is deprecated
else if (baseMap.hasOwnProperty(val))
bound = baseMap[val];
else
bound = val;
ourMap[key] = bound;
}
if (custom)
for (var key in custom) if (custom.hasOwnProperty(key))
addBinding(key, custom[key]);
var extra = completion.options.extraKeys;
if (extra)
for (var key in extra) if (extra.hasOwnProperty(key))
addBinding(key, extra[key]);
return ourMap;
}
function getHintElement(hintsElement, el) {
while (el && el != hintsElement) {
if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el;
el = el.parentNode;
}
}
function Widget(completion, data) {
this.completion = completion;
this.data = data;
this.picked = false;
var widget = this, cm = completion.cm;
var hints = this.hints = document.createElement("ul");
hints.className = "CodeMirror-hints";
this.selectedHint = data.selectedHint || 0;
var completions = data.list;
for (var i = 0; i < completions.length; ++i) {
var elt = hints.appendChild(document.createElement("li")), cur = completions[i];
var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS);
if (cur.className != null) className = cur.className + " " + className;
elt.className = className;
if (cur.render) cur.render(elt, data, cur);
else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));
elt.hintId = i;
}
var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);
var left = pos.left, top = pos.bottom, below = true;
hints.style.left = left + "px";
hints.style.top = top + "px";
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
(completion.options.container || document.body).appendChild(hints);
var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH;
var scrolls = hints.scrollHeight > hints.clientHeight + 1
var startScroll = cm.getScrollInfo();
if (overlapY > 0) {
var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);
if (curTop - height > 0) { // Fits above cursor
hints.style.top = (top = pos.top - height) + "px";
below = false;
} else if (height > winH) {
hints.style.height = (winH - 5) + "px";
hints.style.top = (top = pos.bottom - box.top) + "px";
var cursor = cm.getCursor();
if (data.from.ch != cursor.ch) {
pos = cm.cursorCoords(cursor);
hints.style.left = (left = pos.left) + "px";
box = hints.getBoundingClientRect();
}
}
}
var overlapX = box.right - winW;
if (overlapX > 0) {
if (box.right - box.left > winW) {
hints.style.width = (winW - 5) + "px";
overlapX -= (box.right - box.left) - winW;
}
hints.style.left = (left = pos.left - overlapX) + "px";
}
if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)
node.style.paddingRight = cm.display.nativeBarWidth + "px"
cm.addKeyMap(this.keyMap = buildKeyMap(completion, {
moveFocus: function (n, avoidWrap) {
widget.changeActive(widget.selectedHint + n, avoidWrap);
},
setFocus: function (n) {
widget.changeActive(n);
},
menuSize: function () {
return widget.screenAmount();
},
length: completions.length,
close: function () {
completion.close();
},
pick: function () {
widget.pick();
},
data: data
}));
if (completion.options.closeOnUnfocus) {
var closingOnBlur;
cm.on("blur", this.onBlur = function () {
closingOnBlur = setTimeout(function () {
completion.close();
}, 100);
});
cm.on("focus", this.onFocus = function () {
clearTimeout(closingOnBlur);
});
}
cm.on("scroll", this.onScroll = function () {
var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();
var newTop = top + startScroll.top - curScroll.top;
var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);
if (!below) point += hints.offsetHeight;
if (point <= editor.top || point >= editor.bottom) return completion.close();
hints.style.top = newTop + "px";
hints.style.left = (left + startScroll.left - curScroll.left) + "px";
});
CodeMirror.on(hints, "dblclick", function (e) {
var t = getHintElement(hints, e.target || e.srcElement);
if (t && t.hintId != null) {
widget.changeActive(t.hintId);
widget.pick();
}
});
CodeMirror.on(hints, "click", function (e) {
var t = getHintElement(hints, e.target || e.srcElement);
if (t && t.hintId != null) {
widget.changeActive(t.hintId);
if (completion.options.completeOnSingleClick) widget.pick();
}
});
CodeMirror.on(hints, "mousedown", function () {
setTimeout(function () {
cm.focus();
}, 20);
});
CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]);
return true;
}
Widget.prototype = {
close: function () {
if (this.completion.widget != this) return;
this.completion.widget = null;
this.hints.parentNode.removeChild(this.hints);
this.completion.cm.removeKeyMap(this.keyMap);
var cm = this.completion.cm;
if (this.completion.options.closeOnUnfocus) {
cm.off("blur", this.onBlur);
cm.off("focus", this.onFocus);
}
cm.off("scroll", this.onScroll);
},
disable: function () {
this.completion.cm.removeKeyMap(this.keyMap);
var widget = this;
this.keyMap = {
Enter: function () {
widget.picked = true;
}
};
this.completion.cm.addKeyMap(this.keyMap);
},
pick: function () {
this.completion.pick(this.data, this.selectedHint);
},
changeActive: function (i, avoidWrap) {
if (i >= this.data.list.length)
i = avoidWrap ? this.data.list.length - 1 : 0;
else if (i < 0)
i = avoidWrap ? 0 : this.data.list.length - 1;
if (this.selectedHint == i) return;
var node = this.hints.childNodes[this.selectedHint];
node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, "");
node = this.hints.childNodes[this.selectedHint = i];
node.className += " " + ACTIVE_HINT_ELEMENT_CLASS;
if (node.offsetTop < this.hints.scrollTop)
this.hints.scrollTop = node.offsetTop - 3;
else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;
CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
},
screenAmount: function () {
return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
}
};
function applicableHelpers(cm, helpers) {
if (!cm.somethingSelected()) return helpers
var result = []
for (var i = 0; i < helpers.length; i++)
if (helpers[i].supportsSelection) result.push(helpers[i])
return result
}
function fetchHints(hint, cm, options, callback) {
if (hint.async) {
hint(cm, callback, options)
} else {
var result = hint(cm, options)
if (result && result.then) result.then(callback)
else callback(result)
}
}
function resolveAutoHints(cm, pos) {
var helpers = cm.getHelpers(pos, "hint"), words
if (helpers.length) {
var resolved = function (cm, callback, options) {
var app = applicableHelpers(cm, helpers);
function run(i) {
if (i == app.length) return callback(null)
fetchHints(app[i], cm, options, function (result) {
if (result && result.list.length > 0) callback(result)
else run(i + 1)
})
}
run(0)
}
resolved.async = true
resolved.supportsSelection = true
return resolved
} else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
return function (cm) {
return CodeMirror.hint.fromList(cm, {words: words})
}
} else if (CodeMirror.hint.anyword) {
return function (cm, options) {
return CodeMirror.hint.anyword(cm, options)
}
} else {
return function () {
}
}
}
CodeMirror.registerHelper("hint", "auto", {
resolve: resolveAutoHints
});
CodeMirror.registerHelper("hint", "fromList", function (cm, options) {
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
var to = CodeMirror.Pos(cur.line, token.end);
if (token.string && /\w/.test(token.string[token.string.length - 1])) {
var term = token.string, from = CodeMirror.Pos(cur.line, token.start);
} else {
var term = "", from = to;
}
var found = [];
for (var i = 0; i < options.words.length; i++) {
var word = options.words[i];
if (word.slice(0, term.length) == term)
found.push(word);
}
if (found.length) return {list: found, from: from, to: to};
});
CodeMirror.commands.autocomplete = CodeMirror.showHint;
var defaultOptions = {
hint: CodeMirror.hint.auto,
completeSingle: true,
alignWithWord: true,
closeCharacters: /[\s()\[\]{};:>,]/,
closeOnUnfocus: true,
completeOnSingleClick: true,
container: null,
customKeys: null,
extraKeys: null
};
CodeMirror.defineOption("hintOptions", null); CodeMirror.defineOption("hintOptions", null);
}); });

View File

@ -177,6 +177,10 @@ action
| animate_s | animate_s
| showImage_0_s | showImage_0_s
| showImage_1_s | showImage_1_s
| animateImage_0_s
| animateImage_1_s
| showGif_0_s
| showGif_1_s
| setFg_0_s | setFg_0_s
| setFg_1_s | setFg_1_s
| setWeather_s | setWeather_s
@ -488,7 +492,7 @@ helpUrl : https://ckcz123.github.io/mota-js/#/event?id=changepos-%e5%bd%93%e5%89
default : [0,0,[['不变',''],['上','up'],['下','down'],['左','left'],['右','right']]] default : [0,0,[['不变',''],['上','up'],['下','down'],['左','left'],['右','right']]]
colour : this.dataColor colour : this.dataColor
DirectionEx_List_0 = DirectionEx_List_0 && (', "direction": "'+DirectionEx_List_0+'"'); DirectionEx_List_0 = DirectionEx_List_0 && (', "direction": "'+DirectionEx_List_0+'"');
var code = '{"type": "changePos", "loc": ['+Int_0+','+Int_1+']'+DirectionEx_List_0+'},\n'; var code = '{"type": "changePos", "loc": ['+Number_0+','+Number_1+']'+DirectionEx_List_0+'},\n';
return code; return code;
*/ */
@ -553,7 +557,7 @@ return code;
*/ */
showImage_0_s showImage_0_s
: '显示图片' EvalString '起点像素位置' 'x' Int 'y' Int Newline : '显示图片' EvalString '起点像素位置' 'x' Number 'y' Number Newline
; ;
/* showImage_0_s /* showImage_0_s
@ -561,7 +565,7 @@ tooltip : showImage显示图片
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showimage%ef%bc%9a%e6%98%be%e7%a4%ba%e5%9b%be%e7%89%87 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showimage%ef%bc%9a%e6%98%be%e7%a4%ba%e5%9b%be%e7%89%87
default : ["bg.jpg",0,0] default : ["bg.jpg",0,0]
colour : this.printColor colour : this.printColor
var code = '{"type": "showImage", "name": "'+EvalString_0+'", "loc": ['+Int_0+','+Int_1+']},\n'; var code = '{"type": "showImage", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+']},\n';
return code; return code;
*/ */
@ -577,6 +581,57 @@ var code = '{"type": "showImage"},\n';
return code; return code;
*/ */
animateImage_0_s
: '图片淡入' EvalString '起点像素位置' 'x' Number 'y' Number '动画时间' Int Newline
;
/* animateImage_0_s
tooltip : animageImage图片淡入
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=animateimage%ef%bc%9a%e5%9b%be%e7%89%87%e6%b7%a1%e5%85%a5%e6%b7%a1%e5%87%b
default : ["bg.jpg",0,0,500]
colour : this.printColor
var code = '{"type": "animateImage", "action": "show", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+'], "time": '+Int_0+'},\n';
return code;
*/
animateImage_1_s
: '图片淡出' EvalString '起点像素位置' 'x' Number 'y' Number '动画时间' Int Newline
;
/* animateImage_1_s
tooltip : animageImage图片淡出
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=animateimage%ef%bc%9a%e5%9b%be%e7%89%87%e6%b7%a1%e5%85%a5%e6%b7%a1%e5%87%b
default : ["bg.jpg",0,0,500]
colour : this.printColor
var code = '{"type": "animateImage", "action": "hide", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+'], "time": '+Int_0+'},\n';
return code;
*/
showGif_0_s
: '显示动图' EvalString '起点像素位置' 'x' Number 'y' Number Newline
;
/* showGif_0_s
tooltip : showGif显示动图
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showgif%ef%bc%9a%e6%98%be%e7%a4%ba%e5%8a%a8%e5%9b%be
default : ["bg.gif",0,0]
colour : this.printColor
var code = '{"type": "showGif", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+']},\n';
return code;
*/
showGif_1_s
: '清除所有动图' Newline
;
/* showGif_1_s
tooltip : showGif清除所有显示的动图
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showgif%ef%bc%9a%e6%98%be%e7%a4%ba%e5%8a%a8%e5%9b%be
colour : this.printColor
var code = '{"type": "showGif"},\n';
return code;
*/
setFg_0_s setFg_0_s
: '更改画面色调' Number ',' Number ',' Number ',' Number '动画时间' Int? Newline : '更改画面色调' Number ',' Number ',' Number ',' Number '动画时间' Int? Newline
; ;
@ -712,7 +767,7 @@ return code;
*/ */
win_s win_s
: '游戏胜利,原因' ':' EvalString? Newline : '游戏胜利,结局' ':' EvalString? Newline
; ;
/* win_s /* win_s
@ -724,7 +779,7 @@ return code;
*/ */
lose_s lose_s
: '游戏失败,原因' ':' EvalString? Newline : '游戏失败,结局' ':' EvalString? Newline
; ;
/* lose_s /* lose_s
@ -1244,6 +1299,24 @@ ActionParser.prototype.parseAction = function() {
this.next]); this.next]);
} }
break; break;
case "animateImage": // 显示图片
if(data.action == 'show'){
this.next = MotaActionBlocks['animateImage_0_s'].xmlText([
data.name,data.loc[0],data.loc[1],data.time,this.next]);
} else if (data.action == 'hide') {
this.next = MotaActionBlocks['animateImage_1_s'].xmlText([
data.name,data.loc[0],data.loc[1],data.time,this.next]);
}
break;
case "showGif": // 显示动图
if(this.isset(data.name)){
this.next = MotaActionBlocks['showGif_0_s'].xmlText([
data.name,data.loc[0],data.loc[1],this.next]);
} else {
this.next = MotaActionBlocks['showGif_1_s'].xmlText([
this.next]);
}
break;
case "setFg": // 颜色渐变 case "setFg": // 颜色渐变
if(this.isset(data.color)){ if(this.isset(data.color)){
this.next = MotaActionBlocks['setFg_0_s'].xmlText([ this.next = MotaActionBlocks['setFg_0_s'].xmlText([

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,74 +1,74 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="96px" height="124px"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="96px" height="124px">
<style type="text/css"> <style type="text/css">
#background { #background {
fill: none; fill: none;
} }
.arrows { .arrows {
fill: #000; fill: #000;
stroke: none; stroke: none;
} }
.selected>.arrows { .selected>.arrows {
fill: #fff; fill: #fff;
} }
.checkmark { .checkmark {
fill: #000; fill: #000;
font-family: sans-serif; font-family: sans-serif;
font-size: 10pt; font-size: 10pt;
text-anchor: middle; text-anchor: middle;
} }
.trash { .trash {
fill: #888; fill: #888;
} }
.zoom { .zoom {
fill: none; fill: none;
stroke: #888; stroke: #888;
stroke-width: 2; stroke-width: 2;
stroke-linecap: round; stroke-linecap: round;
} }
.zoom>.center { .zoom>.center {
fill: #888; fill: #888;
stroke-width: 0; stroke-width: 0;
} }
</style> </style>
<rect id="background" width="96" height="124" x="0" y="0" /> <rect id="background" width="96" height="124" x="0" y="0"/>
<g> <g>
<path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z" /> <path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z"/>
<path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z" /> <path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z"/>
<path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z" /> <path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z"/>
</g> </g>
<g class="selected" transform="translate(0, 16)"> <g class="selected" transform="translate(0, 16)">
<path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z" /> <path class="arrows" d="M 13,1.5 13,14.5 1.74,8 z"/>
<path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z" /> <path class="arrows" d="M 17.5,3 30.5,3 24,14.26 z"/>
<path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z" /> <path class="arrows" d="M 35,1.5 35,14.5 46.26,8 z"/>
</g> </g>
<text class="checkmark" x="55.5" y="28">&#10003;</text> <text class="checkmark" x="55.5" y="28">&#10003;</text>
<g class="trash"> <g class="trash">
<path d="M 2,41 v 6 h 42 v -6 h -10.5 l -3,-3 h -15 l -3,3 z" /> <path d="M 2,41 v 6 h 42 v -6 h -10.5 l -3,-3 h -15 l -3,3 z"/>
<rect width="36" height="20" x="5" y="50" /> <rect width="36" height="20" x="5" y="50"/>
<rect width="36" height="42" x="5" y="50" rx="4" ry="4" /> <rect width="36" height="42" x="5" y="50" rx="4" ry="4"/>
</g> </g>
<g class="zoom"> <g class="zoom">
<circle r="11.5" cx="16" cy="108" /> <circle r="11.5" cx="16" cy="108"/>
<circle r="4.3" cx="16" cy="108" class="center" /> <circle r="4.3" cx="16" cy="108" class="center"/>
<path d="m 28,108 h3" /> <path d="m 28,108 h3"/>
<path d="m 1,108 h3" /> <path d="m 1,108 h3"/>
<path d="m 16,120 v3" /> <path d="m 16,120 v3"/>
<path d="m 16,93 v3" /> <path d="m 16,93 v3"/>
</g> </g>
<g class="zoom"> <g class="zoom">
<circle r="15" cx="48" cy="108" /> <circle r="15" cx="48" cy="108"/>
<path d="m 48,101.6 v12.8" /> <path d="m 48,101.6 v12.8"/>
<path d="m 41.6,108 h12.8" /> <path d="m 41.6,108 h12.8"/>
</g> </g>
<g class="zoom"> <g class="zoom">
<circle r="15" cx="80" cy="108" /> <circle r="15" cx="80" cy="108"/>
<path d="m 73.6,108 h12.8" /> <path d="m 73.6,108 h12.8"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,302 +1,346 @@
html,body,div,img{margin:0;padding:0;} html, body, div, img {
body{ margin: 0;
font-family: Roboto,"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;; padding: 0;
background-color: #F5F5F5;
} }
body {
font-family: Roboto, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;;
background-color: #F5F5F5;
}
/* ::-webkit-scrollbar { /* ::-webkit-scrollbar {
width: 5px; width: 5px;
} */ } */
.main { .main {
max-width: 100%; max-width: 100%;
min-height: 500px; min-height: 500px;
margin: 0 auto; margin: 0 auto;
}
#left, #mid, #right{
border-radius: 2px;
box-sizing: border-box;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
}
#left{
position: absolute;
left: 5px;
top: 10px;
width: 435px;
height: 630px;
} }
#editArea{ #left, #mid, #right {
position: absolute; border-radius: 2px;
width: 100%; box-sizing: border-box;
height: 70%; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14), 0 3px 1px -2px rgba(0, 0, 0, .2), 0 1px 5px 0 rgba(0, 0, 0, .12);
left: 0;
top: 0;
/* padding: 10px 5px; */
box-sizing: border-box;
} }
#pout{
display: block; #left {
width: 410px; position: absolute;
height: 100%; left: 5px;
box-sizing: border-box; top: 10px;
margin-left: 22px; width: 435px;
margin-top: 23px; height: 630px;
line-height: 20px;
font-size: 12.3px;
font-family: 'Lucida Console', Monaco, monospace;
white-space: pre;
border: 1px solid #ddd;
border-radius: 2px;
overflow: auto;
} }
#editTip{
position: absolute; #editArea {
width: 100%; position: absolute;
height: 80px; width: 100%;
bottom:10px; height: 70%;
left: 10px; left: 0;
top: 0;
/* padding: 10px 5px; */
box-sizing: border-box;
} }
#editArea p{
margin: 10px; #pout {
display: block; display: block;
width: 70%; width: 410px;
line-height: 20px; height: 100%;
text-align: left; box-sizing: border-box;
font-size: 14px; margin-left: 22px;
margin-top: 23px;
line-height: 20px;
font-size: 12.3px;
font-family: 'Lucida Console', Monaco, monospace;
white-space: pre;
border: 1px solid #ddd;
border-radius: 2px;
overflow: auto;
} }
#editTip .btn{
float: right; #editTip {
margin-right: 20px; position: absolute;
margin-top: 5px; width: 100%;
margin-bottom: 120px;
bottom: 0;
left: 10px;
} }
#mid{
position: absolute; #editArea p {
left: 448px; margin: 10px;
top: 10px; display: block;
width: 440px; width: 70%;
height: 630px; line-height: 20px;
text-align: left;
font-size: 14px;
} }
#editTip .btn {
float: right;
margin-right: 20px;
margin-top: 5px;
}
#mid {
position: absolute;
left: 448px;
top: 10px;
width: 440px;
height: 630px;
}
.map { .map {
position: absolute; position: absolute;
left: 20px; left: 20px;
top: 21px; top: 21px;
width: 416px; width: 416px;
height: 416px; height: 416px;
} }
#mid .tools{
position: absolute; #mid .tools {
width: 425px; position: absolute;
height: 180px; width: 425px;
left: 0; height: 180px;
bottom: 0; left: 0;
border-top: 1px solid #ccc; bottom: 0;
padding: 10px 5px; border-top: 1px solid #ccc;
margin-left: 8px;; padding: 10px 5px;
box-sizing: border-box; margin-left: 8px;;
box-sizing: border-box;
} }
#tip{
float: right; #tip {
width: 50%; float: right;
height: 95%; width: 50%;
padding: 5px 10px 10px 10px; height: 95%;
margin-right: 0; padding: 5px 10px 10px 10px;
box-sizing: border-box; margin-right: 0;
border: 1px solid #ccc; box-sizing: border-box;
border-radius: 2px; border: 1px solid #ccc;
font-size: 15px; border-radius: 2px;
line-height: 14px; font-size: 15px;
line-height: 14px;
} }
.files { .files {
width: 50%; width: 50%;
height: 120px; height: 120px;
/* padding: 10px; */ /* padding: 10px; */
margin-top: 15px; margin-top: 15px;
} }
.input{
display: block; .input {
max-width: 150px; display: block;
height: 20px; max-width: 150px;
padding: 6px 12px; height: 20px;
font-size: 14px; padding: 6px 12px;
margin-top: 10px; font-size: 14px;
color: #555; margin-top: 10px;
background-color: #fff; color: #555;
border: 1px solid #ccc; background-color: #fff;
border-radius: 3px; border: 1px solid #ccc;
box-shadow: inset 0 1px 1px rgba(0,0,0,.075); border-radius: 3px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
} }
#bgSelect{
width: 50%; #bgSelect {
height: 100px; width: 50%;
margin-top: 10px; height: 100px;
margin-top: 10px;
} }
#bgSelect span{
/* display: block; */ #bgSelect span {
font-size: 14px; /* display: block; */
line-height: 30px; font-size: 14px;
line-height: 30px;
} }
#printOut{
margin-top: 10px; #printOut {
height: 20px; margin-top: 10px;
height: 20px;
} }
.btn { .btn {
width: 80px; width: 80px;
border-radius: 2px; border-radius: 2px;
line-height: 30px; line-height: 30px;
margin: 0; margin: 0;
min-width: 50px; min-width: 50px;
padding: 0 5px; padding: 0 5px;
display: inline-block; display: inline-block;
margin-top: 5px; margin-top: 5px;
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
/* text-transform: uppercase; */ /* text-transform: uppercase; */
letter-spacing: 0; letter-spacing: 0;
overflow: hidden; overflow: hidden;
cursor: pointer; cursor: pointer;
text-decoration: none; text-decoration: none;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
border: 0; border: 0;
background: rgba(158,158,158,.2); background: rgba(158, 158, 158, .2);
box-shadow: 0 1px 1px 0 rgba(0,0,0,.14), 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 3px 0 rgba(0,0,0,.12); box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .14), 0 2px 1px -1px rgba(0, 0, 0, .2), 0 1px 3px 0 rgba(0, 0, 0, .12);
color: #fff; color: #fff;
background-color: #26A69A; background-color: #26A69A;
} }
.btn:hover { .btn:hover {
background-color: #009688; background-color: #009688;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14), 0 3px 1px -2px rgba(0, 0, 0, .2), 0 1px 5px 0 rgba(0, 0, 0, .12);
} }
#right{
position: absolute; #right {
left: 900px; position: absolute;
top: 10px; left: 900px;
width: 440px; top: 10px;
height: 630px; width: 440px;
/* border: 1px solid rgb(238, 13, 13); */ height: 630px;
/* border: 1px solid rgb(238, 13, 13); */
} }
#iconLib{
position: absolute; #iconLib {
width: 435px; position: absolute;
height: 620px; width: 435px;
left: 5px; height: 620px;
top: 5px; left: 5px;
overflow: auto; top: 5px;
overflow: auto;
} }
.egameCanvas { .egameCanvas {
position: absolute; position: absolute;
} }
.gameCanvas { .gameCanvas {
position: absolute; position: absolute;
} }
#dataSelection , .appendSelection{
position: absolute; #dataSelection, .appendSelection {
/* top:0; position: absolute;
left:320px; */ /* top:0;
z-index:75; left:320px; */
width:26px; z-index: 75;
height:26px; width: 26px;
margin: 3px 0 0 3px; height: 26px;
padding:0; margin: 3px 0 0 3px;
/* display: none; */ padding: 0;
box-sizing: border-box; /* display: none; */
background-color:rgba(255, 255, 255, 0.0); box-sizing: border-box;
border: 1px solid #000; background-color: rgba(255, 255, 255, 0.0);
box-shadow: 0 0 0 2px #fff, border: 1px solid #000;
0 0 0 3px #000; box-shadow: 0 0 0 2px #fff,
0 0 0 3px #000;
} }
.warnText{
color: #D50000; .warnText {
font-weight: 700; color: #D50000;
font-size: 14px; font-weight: 700;
line-height: 1.2em; font-size: 14px;
line-height: 1.2em;
} }
.infoText{
color: #2196F3; .infoText {
color: #2196F3;
} }
.successText{
color: #00897B; .successText {
line-height: 1.2em; color: #00897B;
line-height: 1.2em;
} }
table, td { table, td {
border: 1px solid #fff; border: 1px solid #fff;
color: #fff; color: #fff;
cursor:crosshair; cursor: crosshair;
} }
table.col{
position: relative; table.col {
position: relative;
text-align: center;
border-collapse: collapse; text-align: center;
border-collapse: collapse;
} }
table.col td{
background-color: #4DB6AC; table.col td {
background-color: #4DB6AC;
} }
#arrColMark td{
width: 16px; #arrColMark td {
width: 16px;
} }
#arrColMark { #arrColMark {
top: 2px; top: 2px;
left: 36px; left: 36px;
width: 385px; width: 385px;
height: 16px; height: 16px;
font-size: 13px; font-size: 13px;
} }
#mapColMark { #mapColMark {
top: 2px; top: 2px;
left: 19px; left: 19px;
width: 418px; width: 418px;
height: 16px; height: 16px;
font-size: 13px; font-size: 13px;
} }
#mapColMark td{
width: 29px; #mapColMark td {
width: 29px;
} }
#mapColMark td:hover .colBlock{
position: absolute; #mapColMark td:hover .colBlock {
top: 19px; position: absolute;
height: 416px; top: 19px;
width: 32px; height: 416px;
z-index: 100; width: 32px;
background-color: rgba(38,166,154,.5); z-index: 100;
background-color: rgba(38, 166, 154, .5);
} }
table.row{
position: relative; table.row {
text-align: right; position: relative;
vertical-align:middle; text-align: right;
border-collapse: collapse; vertical-align: middle;
border-collapse: collapse;
} }
table.row td{
background-color: #4C221B; table.row td {
background-color: #4C221B;
} }
#arrRowMark{
top: 5px; #arrRowMark {
left: 2px; top: 5px;
width: 16px; left: 2px;
height: 262px; width: 16px;
font-size: 12px; height: 262px;
font-size: 12px;
} }
#mapRowMark{
top: 1px; #mapRowMark {
left: 2px; top: 1px;
width: 16px; left: 2px;
height: 416px; width: 16px;
font-size: 12px; height: 416px;
font-size: 12px;
} }
#mapRowMark td{
height: 29px; #mapRowMark td {
height: 29px;
} }
#mapRowMark td:hover .rowBlock{
position: absolute; #mapRowMark td:hover .rowBlock {
left: 18px; position: absolute;
height: 32px; left: 18px;
width: 416px; height: 32px;
z-index: 100; width: 416px;
background-color: rgba(76,34,27,.5); z-index: 100;
background-color: rgba(76, 34, 27, .5);
} }
/* for vue dom */ /* for vue dom */
[v-cloak] { [v-cloak] {
display: none !important; display: none !important;
} }

View File

@ -1,170 +1,203 @@
.leftTab { .leftTab {
border-radius: 2px; border-radius: 2px;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14), 0 3px 1px -2px rgba(0, 0, 0, .2), 0 1px 5px 0 rgba(0, 0, 0, .12);
}
.leftTab {
overflow: auto;
position: absolute;
height: 630px;
} }
.leftTab > *{margin:2.5px 5px;}
.leftTab > :first-child{margin-top:5px;}
.leftTab > :last-child{margin-bottom:5px;}
.leftTab { .leftTab {
left: 5px; overflow: auto;
top: 10px; position: absolute;
width: 435px; height: 630px;
}
.leftTab > * {
margin: 2.5px 5px;
}
.leftTab > :first-child {
margin-top: 5px;
}
.leftTab > :last-child {
margin-bottom: 5px;
}
.leftTab {
left: 5px;
top: 10px;
width: 435px;
} }
.leftTab .leftTabHeader { .leftTab .leftTabHeader {
position: fixed; position: fixed;
top: 15px; top: 15px;
left: 15px; left: 15px;
} }
.leftTab .leftTabContent { .leftTab .leftTabContent {
padding-top: 50px; padding-top: 50px;
} }
#appendPicSelection span { #appendPicSelection span {
position: absolute; position: absolute;
font-size:11px; font-size: 11px;
-webkit-text-stroke: 1px red; -webkit-text-stroke: 1px red;
text-shadow: black 1px 0, black 0 1px, black -1px 0, black 0 -1px; text-shadow: black 1px 0, black 0 1px, black -1px 0, black 0 -1px;
} }
#left6 { #left6 {
left: 5px; left: 5px;
top: 5px; top: 5px;
z-index: 200; z-index: 200;
position: fixed; position: fixed;
background-color: rgb(245, 245, 245); background-color: rgb(245, 245, 245);
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
} }
#left6 #blocklyArea { #left6 #blocklyArea {
float: left; float: left;
width: 60%; width: 60%;
height: 95%; height: 95%;
} }
#left6 #blocklyDiv { #left6 #blocklyDiv {
position: relative; position: relative;
} }
#left6 .CodeMirror { #left6 .CodeMirror {
border: 1px solid #eee; border: 1px solid #eee;
float: left; float: left;
height: 95%; height: 95%;
width: 35%; width: 35%;
}
#left6 #codeArea {
width: 99.5%;
height: 15.4em;
overflow: y; /* resize:none; */
} }
#left6 #codeArea {width: 99.5%; height: 15.4em;overflow:y;/* resize:none; */}
#left7 { #left7 {
/* height: 440px; width: 375px;float:left; */ /* height: 440px; width: 375px;float:left; */
left: 5px; left: 5px;
top: 5px; top: 5px;
z-index: 200; z-index: 200;
position: fixed; position: fixed;
background-color: rgb(245, 245, 245); background-color: rgb(245, 245, 245);
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
#left7 .CodeMirror { #left7 .CodeMirror {
/* border-top: 1px solid black; /* border-top: 1px solid black;
border-bottom: 1px solid black; */ border-bottom: 1px solid black; */
border: 1px solid #eee; border: 1px solid #eee;
font-size: 14px; font-size: 14px;
height: 95%; height: 95%;
width: 95%; width: 95%;
} }
.etable table, .etable table,
.etable table td { .etable table td {
color: #000; color: #000;
cursor: auto; cursor: auto;
} }
/* copy from github-css https://github.com/sindresorhus/github-markdown-css */ /* copy from github-css https://github.com/sindresorhus/github-markdown-css */
.etable table { .etable table {
border-spacing: 0; border-spacing: 0;
border-collapse: collapse; border-collapse: collapse;
} }
.etable table { .etable table {
margin-top: 0; margin-top: 0;
margin-bottom: 16px; margin-bottom: 16px;
} }
.etable table { .etable table {
display: block; display: block;
width: 100%; width: 100%;
overflow: auto; overflow: auto;
} }
.etable table th { .etable table th {
font-weight: 600; font-weight: 600;
} }
.etable table th, .etable table th,
.etable table td { .etable table td {
padding: 6px 13px; padding: 6px 13px;
border: 1px solid #dfe2e5; border: 1px solid #dfe2e5;
} }
.etable table tr { .etable table tr {
background-color: #fff; background-color: #fff;
border-top: 1px solid #c6cbd1; border-top: 1px solid #c6cbd1;
} }
.etable table tr:nth-child(2n) { .etable table tr:nth-child(2n) {
background-color: #f6f8fa; background-color: #f6f8fa;
} }
/* copy end --------------------------------------------- */ /* copy end --------------------------------------------- */
.etable tr {width:100%} .etable tr {
.etable tr > :nth-child(1) {width:20%} width: 100%
.etable tr > :nth-child(2) {width:20%} }
.etable tr > :nth-child(3) {width:60%}
.etable tr > :nth-child(1) {
width: 20%
}
.etable tr > :nth-child(2) {
width: 20%
}
.etable tr > :nth-child(3) {
width: 60%
}
.etable table { .etable table {
overflow: visible; overflow: visible;
} }
.etable tr:not(:first-child) > :last-child:hover { .etable tr:not(:first-child) > :last-child:hover {
border: 1px solid rgb(87, 198, 232); border: 1px solid rgb(87, 198, 232);
box-shadow: 0px 0px 3px rgb(87, 198, 232); box-shadow: 0px 0px 3px rgb(87, 198, 232);
} }
.etable tr:not(:first-child) > :nth-child(2):hover, .etable tr:not(:first-child) > :nth-child(2):hover,
.etable tr:not(:first-child) > :nth-child(1):hover { .etable tr:not(:first-child) > :nth-child(1):hover {
border: 1px solid rgb(87, 232, 198); border: 1px solid rgb(87, 232, 198);
box-shadow: 0px 0px 3px rgb(87, 232, 198); box-shadow: 0px 0px 3px rgb(87, 232, 198);
} }
.etable tr:not(:first-child) > :last-child { .etable tr:not(:first-child) > :last-child {
margin: 0; margin: 0;
padding: 0; padding: 0;
height: 100%; height: 100%;
width: 100%; width: 100%;
position: relative; position: relative;
} }
div.etableInputDiv { div.etableInputDiv {
position: absolute; position: absolute;
padding: 5px 0 0 5px; padding: 5px 0 0 5px;
top: 0; top: 0;
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;
} }
.etableInputDiv > * { .etableInputDiv > * {
margin: 0; margin: 0;
padding: 0; padding: 0;
height: 100%; height: 100%;
width: 100%; width: 100%;
background-color: rgba(255, 255, 255, 0); background-color: rgba(255, 255, 255, 0);
border: none; border: none;
} }
.etableInputDiv input[type="text"] { .etableInputDiv input[type="text"] {
@ -172,22 +205,23 @@ div.etableInputDiv {
} }
.etableInputDiv input[type="checkbox"] { .etableInputDiv input[type="checkbox"] {
width: 16px; width: 16px;
height: 16px; height: 16px;
position: absolute; position: absolute;
left: 50%; left: 50%;
top: 50%; top: 50%;
margin-left: -8px; margin-left: -8px;
margin-top: -8px; margin-top: -8px;
} }
.etableInputDiv select { .etableInputDiv select {
} }
.etableInputDiv textarea { .etableInputDiv textarea {
resize: none; resize: none;
} }
.etableInputDiv textarea:hover { .etableInputDiv textarea:hover {
margin: -5px; margin: -5px;
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
editor_blockly = function(){ editor_blockly = function () {
var editor_blockly = {}; var editor_blockly = {};
initscript=String.raw` initscript = String.raw`
(function(){ (function(){
var getCategory = function(name){ var getCategory = function(name){
for(var node of document.getElementById('toolbox').children) { for(var node of document.getElementById('toolbox').children) {
@ -62,7 +62,11 @@ initscript=String.raw`
]}), ]}),
MotaActionBlocks['setText_s'].xmlText(), MotaActionBlocks['setText_s'].xmlText(),
MotaActionBlocks['showImage_0_s'].xmlText(), MotaActionBlocks['showImage_0_s'].xmlText(),
MotaActionBlocks['animateImage_0_s'].xmlText(),
MotaActionBlocks['animateImage_1_s'].xmlText(),
MotaActionBlocks['showImage_1_s'].xmlText(), MotaActionBlocks['showImage_1_s'].xmlText(),
MotaActionBlocks['showGif_0_s'].xmlText(),
MotaActionBlocks['showGif_1_s'].xmlText(),
MotaActionBlocks['tip_s'].xmlText(), MotaActionBlocks['tip_s'].xmlText(),
MotaActionBlocks['openShop_s'].xmlText(), MotaActionBlocks['openShop_s'].xmlText(),
MotaActionBlocks['win_s'].xmlText(), MotaActionBlocks['win_s'].xmlText(),
@ -278,161 +282,163 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){
})(); })();
`; `;
var input_=''; var input_ = '';
editor_blockly.runOne = function (){ editor_blockly.runOne = function () {
//var printf = console.log; //var printf = console.log;
//var printf = function(){}; //var printf = function(){};
var grammerFile = input_; var grammerFile = input_;
converter = new Converter().init(); converter = new Converter().init();
converter.generBlocks(grammerFile); converter.generBlocks(grammerFile);
//printf(converter.blocks); //printf(converter.blocks);
converter.renderGrammerName(); converter.renderGrammerName();
//converter.generToolbox(); //converter.generToolbox();
converter.generMainFile(); converter.generMainFile();
//printf(converter.mainFile.join('')); //printf(converter.mainFile.join(''));
//console.log(converter); //console.log(converter);
var script = document.createElement('script');
var script = document.createElement('script'); //var initscript = document.getElementById('initscript').innerText;
//var initscript = document.getElementById('initscript').innerText; script.innerHTML = converter.mainFile[5] + initscript;
script.innerHTML = converter.mainFile[5]+initscript; document.body.appendChild(script);
document.body.appendChild(script);
}
var xhr=new XMLHttpRequest();
xhr.onreadystatechange = function (){
if(xhr.readyState!=4) return;
if(xhr.status!=200) {
alert("无法在file://下加载");
return;
} }
input_=xhr.responseText; var xhr = new XMLHttpRequest();
editor_blockly.runOne(); xhr.onreadystatechange = function () {
} if (xhr.readyState != 4) return;
xhr.open('GET','_server/blockly/MotaAction.g4',true); if (xhr.status != 200) {
xhr.send(null); alert("无法在file://下加载");
return;
}
input_ = xhr.responseText;
editor_blockly.runOne();
}
xhr.open('GET', '_server/blockly/MotaAction.g4', true);
xhr.send(null);
codeAreaHL = CodeMirror.fromTextArea(document.getElementById("codeArea"), { codeAreaHL = CodeMirror.fromTextArea(document.getElementById("codeArea"), {
lineNumbers: true, lineNumbers: true,
matchBrackets: true, matchBrackets: true,
lineWrapping: true, lineWrapping: true,
continueComments: "Enter", continueComments: "Enter",
extraKeys: {"Ctrl-Q": "toggleComment"} extraKeys: {"Ctrl-Q": "toggleComment"}
});
editor_blockly.showXML = function () {
var xml = Blockly.Xml.workspaceToDom(editor_blockly.workspace);
var xml_text = Blockly.Xml.domToPrettyText(xml);
console.log(xml_text);
var xml_text = Blockly.Xml.domToText(xml);
console.log(xml_text);
console.log(xml);
}
editor_blockly.runCode = function () {
// Generate JavaScript code and run it.
window.LoopTrap = 1000;
Blockly.JavaScript.INFINITE_LOOP_TRAP =
'if (--window.LoopTrap == 0) throw "Infinite loop.";\n';
var code = Blockly.JavaScript.workspaceToCode(editor_blockly.workspace);
Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
try {
eval('obj=' + code);
console.log(obj);
} catch (e) {
alert(e);
}
}
editor_blockly.parse = function () {
MotaActionFunctions.parse(
eval('obj=' + codeAreaHL.getValue().replace(/[<>&]/g,function(c){return {'<':'&lt;','>':'&gt;','&':'&amp;'}[c];})),
document.getElementById('entryType').value
);
}
editor_blockly.id='';
editor_blockly.import = function(id_,args){
var thisTr = document.getElementById(id_);
if(!thisTr)return false;
var input = thisTr.children[2].children[0].children[0];
var field = thisTr.children[0].getAttribute('title');
var type = args.type;
if(!type)return false;
editor_blockly.id=id_;
codeAreaHL.setValue(input.value);
document.getElementById('entryType').value = type;
editor_blockly.parse();
editor_blockly.show();
return true;
}
var blocklyWidgetDiv = document.getElementsByClassName('blocklyWidgetDiv');
editor_blockly.show = function(){
if(typeof(selectBox)!==typeof(undefined))selectBox.isSelected = false;
document.getElementById('left6').style='';
for(var ii =0,node;node=blocklyWidgetDiv[ii];ii++){
node.style.zIndex = 201;
node.style.opacity = '';
}
}
editor_blockly.hide = function(){
document.getElementById('left6').style='z-index:-1;opacity: 0;';
for(var ii =0,node;node=blocklyWidgetDiv[ii];ii++){
node.style.zIndex = -1;
node.style.opacity = 0;
}
}
editor_blockly.cancel = function(){
editor_blockly.id='';
editor_blockly.hide();
}
editor_blockly.confirm = function (){
if(!editor_blockly.id){
editor_blockly.id='';
return;
}
var setvalue = function(value){
var thisTr = document.getElementById(editor_blockly.id);
editor_blockly.id='';
var input = thisTr.children[2].children[0].children[0];
input.value = value;
editor_blockly.hide();
input.onchange();
}
if(codeAreaHL.getValue()===''){
setvalue('null');
return;
}
var code = Blockly.JavaScript.workspaceToCode(editor_blockly.workspace);
eval('var obj=' + code);
setvalue(JSON.stringify(obj));
}
editor_blockly.doubleClickBlock = function (blockId){
var b=editor_blockly.workspace.getBlockById(blockId);
//console.log(b);
var textStringDict = {
'text_0_s':'EvalString_0',
'text_1_s':'EvalString_2',
'autoText_s':'EvalString_2',
'choices_s':'EvalString_0',
'function_s':'RawEvalString_0',
}
var f=b?textStringDict[b.type]:null;
if(f){
var value = b.getFieldValue(f);
//多行编辑
editor_multi.multiLineEdit(value,b,f,{'lint':f==='RawEvalString_0'},function(newvalue,b,f){
if(textStringDict[b.type]!=='RawEvalString_0'){}
b.setFieldValue(newvalue.split('\n').join('\\n'),f);
}); });
}
}
return editor_blockly; editor_blockly.showXML = function () {
var xml = Blockly.Xml.workspaceToDom(editor_blockly.workspace);
var xml_text = Blockly.Xml.domToPrettyText(xml);
console.log(xml_text);
var xml_text = Blockly.Xml.domToText(xml);
console.log(xml_text);
console.log(xml);
}
editor_blockly.runCode = function () {
// Generate JavaScript code and run it.
window.LoopTrap = 1000;
Blockly.JavaScript.INFINITE_LOOP_TRAP =
'if (--window.LoopTrap == 0) throw "Infinite loop.";\n';
var code = Blockly.JavaScript.workspaceToCode(editor_blockly.workspace);
Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
try {
eval('obj=' + code);
console.log(obj);
} catch (e) {
alert(e);
}
}
editor_blockly.parse = function () {
MotaActionFunctions.parse(
eval('obj=' + codeAreaHL.getValue().replace(/[<>&]/g, function (c) {
return {'<': '&lt;', '>': '&gt;', '&': '&amp;'}[c];
})),
document.getElementById('entryType').value
);
}
editor_blockly.id = '';
editor_blockly.import = function (id_, args) {
var thisTr = document.getElementById(id_);
if (!thisTr) return false;
var input = thisTr.children[2].children[0].children[0];
var field = thisTr.children[0].getAttribute('title');
var type = args.type;
if (!type) return false;
editor_blockly.id = id_;
codeAreaHL.setValue(input.value);
document.getElementById('entryType').value = type;
editor_blockly.parse();
editor_blockly.show();
return true;
}
var blocklyWidgetDiv = document.getElementsByClassName('blocklyWidgetDiv');
editor_blockly.show = function () {
if (typeof(selectBox) !== typeof(undefined)) selectBox.isSelected = false;
document.getElementById('left6').style = '';
for (var ii = 0, node; node = blocklyWidgetDiv[ii]; ii++) {
node.style.zIndex = 201;
node.style.opacity = '';
}
}
editor_blockly.hide = function () {
document.getElementById('left6').style = 'z-index:-1;opacity: 0;';
for (var ii = 0, node; node = blocklyWidgetDiv[ii]; ii++) {
node.style.zIndex = -1;
node.style.opacity = 0;
}
}
editor_blockly.cancel = function () {
editor_blockly.id = '';
editor_blockly.hide();
}
editor_blockly.confirm = function () {
if (!editor_blockly.id) {
editor_blockly.id = '';
return;
}
var setvalue = function (value) {
var thisTr = document.getElementById(editor_blockly.id);
editor_blockly.id = '';
var input = thisTr.children[2].children[0].children[0];
input.value = value;
editor_blockly.hide();
input.onchange();
}
if (codeAreaHL.getValue() === '') {
setvalue('null');
return;
}
var code = Blockly.JavaScript.workspaceToCode(editor_blockly.workspace);
eval('var obj=' + code);
setvalue(JSON.stringify(obj));
}
editor_blockly.doubleClickBlock = function (blockId) {
var b = editor_blockly.workspace.getBlockById(blockId);
//console.log(b);
var textStringDict = {
'text_0_s': 'EvalString_0',
'text_1_s': 'EvalString_2',
'autoText_s': 'EvalString_2',
'choices_s': 'EvalString_0',
'function_s': 'RawEvalString_0',
}
var f = b ? textStringDict[b.type] : null;
if (f) {
var value = b.getFieldValue(f);
//多行编辑
editor_multi.multiLineEdit(value, b, f, {'lint': f === 'RawEvalString_0'}, function (newvalue, b, f) {
if (textStringDict[b.type] !== 'RawEvalString_0') {
}
b.setFieldValue(newvalue.split('\n').join('\\n'), f);
});
}
}
return editor_blockly;
} }
//editor_blockly=editor_blockly(); //editor_blockly=editor_blockly();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,142 +1,157 @@
editor_multi = function(){ editor_multi = function () {
var editor_multi = {}; var editor_multi = {};
var codeEditor = CodeMirror.fromTextArea(document.getElementById("multiLineCode"), { var codeEditor = CodeMirror.fromTextArea(document.getElementById("multiLineCode"), {
lineNumbers: true, lineNumbers: true,
matchBrackets: true, matchBrackets: true,
indentUnit: 4, indentUnit: 4,
tabSize: 4, tabSize: 4,
indentWithTabs: true, indentWithTabs: true,
smartIndent: true, smartIndent: true,
mode: {name: "javascript", globalVars: true, localVars: true}, mode: {name: "javascript", globalVars: true, localVars: true},
lineWrapping: true, lineWrapping: true,
continueComments: "Enter", continueComments: "Enter",
gutters: ["CodeMirror-lint-markers"], gutters: ["CodeMirror-lint-markers"],
lint: true, lint: true,
autocomplete: true, autocomplete: true,
extraKeys: {"Ctrl-Q": "toggleComment"}, extraKeys: {"Ctrl-Q": "toggleComment"},
}); });
codeEditor.on("keyup", function (cm, event) { codeEditor.on("keyup", function (cm, event) {
if (codeEditor.getOption("autocomplete") && (event.keyCode >= 65 && event.keyCode<=90) || (event.keyCode>=49 && event.keyCode<=57) || event.keyCode==190) { if (codeEditor.getOption("autocomplete") && (event.keyCode >= 65 && event.keyCode <= 90) || (event.keyCode >= 49 && event.keyCode <= 57) || event.keyCode == 190) {
try { try {
CodeMirror.commands.autocomplete(cm, null, {completeSingle: false}); CodeMirror.commands.autocomplete(cm, null, {completeSingle: false});
} catch (e) {} } catch (e) {
} }
}); }
});
editor_multi.id=''; editor_multi.id = '';
editor_multi.isString=false; editor_multi.isString = false;
editor_multi.lintAutocomplete=false; editor_multi.lintAutocomplete = false;
editor_multi.show = function(){ editor_multi.show = function () {
if(typeof(selectBox)!==typeof(undefined))selectBox.isSelected = false; if (typeof(selectBox) !== typeof(undefined)) selectBox.isSelected = false;
var valueNow = codeEditor.getValue(); var valueNow = codeEditor.getValue();
//try{eval('function _asdygakufyg_() { return '+valueNow+'\n}');editor_multi.lintAutocomplete=true;}catch(ee){} //try{eval('function _asdygakufyg_() { return '+valueNow+'\n}');editor_multi.lintAutocomplete=true;}catch(ee){}
if(valueNow.slice(0,8)==='function')editor_multi.lintAutocomplete=true; if (valueNow.slice(0, 8) === 'function') editor_multi.lintAutocomplete = true;
editor_multi.setLint(); editor_multi.setLint();
document.getElementById('left7').style=''; document.getElementById('left7').style = '';
}
editor_multi.hide = function(){document.getElementById('left7').style='z-index:-1;opacity: 0;';}
editor_multi.setLint = function() {
codeEditor.setOption("lint", editor_multi.lintAutocomplete);
codeEditor.setOption("autocomplete", editor_multi.lintAutocomplete);
document.getElementById("lintCheckbox").checked = editor_multi.lintAutocomplete;
}
editor_multi.toggerLint = function() {
editor_multi.lintAutocomplete = document.getElementById("lintCheckbox").checked;
editor_multi.setLint();
}
editor_multi.indent = function(field){
if(typeof(editor)!==typeof(undefined) && editor && editor.mode && editor.mode.indent)return editor.mode.indent(field);
return '\t';
}
editor_multi.import = function(id_,args){
var thisTr = document.getElementById(id_);
if(!thisTr)return false;
var input = thisTr.children[2].children[0].children[0];
var field = thisTr.children[0].getAttribute('title');
var comment = thisTr.children[1].getAttribute('title');
if(!input.type || input.type!=='textarea')return false;
editor_multi.id=id_;
editor_multi.isString=false;
editor_multi.lintAutocomplete=false;
if(args.lint===true)editor_multi.lintAutocomplete=true;
if(field.indexOf('Effect') !== -1)editor_multi.lintAutocomplete=true;
if(input.value.slice(0,1)==='"'){
editor_multi.isString=true;
codeEditor.setValue(JSON.parse(input.value)||'');
} else {
var num = editor_multi.indent(field);
eval('var tobj='+(input.value||'null'));
var tmap={};
var tstr = JSON.stringify(tobj,function(k,v){if(typeof(v)===typeof('') && v.slice(0,8)==='function'){var id_ = editor.guid();tmap[id_]=v.toString();return id_;}else return v},num);
for(var id_ in tmap){
tstr = tstr.replace('"'+id_+'"',tmap[id_])
} }
codeEditor.setValue(tstr||''); editor_multi.hide = function () {
} document.getElementById('left7').style = 'z-index:-1;opacity: 0;';
editor_multi.show(); }
return true; editor_multi.setLint = function () {
} codeEditor.setOption("lint", editor_multi.lintAutocomplete);
codeEditor.setOption("autocomplete", editor_multi.lintAutocomplete);
editor_multi.cancel = function(){ document.getElementById("lintCheckbox").checked = editor_multi.lintAutocomplete;
editor_multi.hide(); }
editor_multi.id=''; editor_multi.toggerLint = function () {
multiLineArgs=[null,null,null]; editor_multi.lintAutocomplete = document.getElementById("lintCheckbox").checked;
} editor_multi.setLint();
editor_multi.confirm = function (){
if(!editor_multi.id){
editor_multi.id='';
return;
}
if(editor_multi.id==='callFromBlockly'){
editor_multi.id='';
editor_multi.multiLineDone();
return;
}
var setvalue = function(value){
var thisTr = document.getElementById(editor_multi.id);
editor_multi.id='';
var input = thisTr.children[2].children[0].children[0];
if(editor_multi.isString){
input.value = JSON.stringify(value);
} else {
eval('var tobj='+(value||'null'));
var tmap={};
var tstr = JSON.stringify(tobj,function(k,v){if(v instanceof Function){var id_ = editor.guid();tmap[id_]=v.toString();return id_;}else return v},4);
for(var id_ in tmap){
tstr = tstr.replace('"'+id_+'"',JSON.stringify(tmap[id_]))
}
input.value = tstr;
} }
editor_multi.hide();
input.onchange();
}
setvalue(codeEditor.getValue()||'');
}
var multiLineArgs=[null,null,null]; editor_multi.indent = function (field) {
editor_multi.multiLineEdit = function(value,b,f,args,callback){ if (typeof(editor) !== typeof(undefined) && editor && editor.mode && editor.mode.indent) return editor.mode.indent(field);
editor_multi.id='callFromBlockly'; return '\t';
codeEditor.setValue(value.split('\\n').join('\n')||''); }
multiLineArgs[0]=b;
multiLineArgs[1]=f;
multiLineArgs[2]=callback;
editor_multi.lintAutocomplete=Boolean(args.lint);
editor_multi.show();
}
editor_multi.multiLineDone = function(){
editor_multi.hide();
if(!multiLineArgs[0] || !multiLineArgs[1] || !multiLineArgs[2])return;
var newvalue = codeEditor.getValue()||'';
multiLineArgs[2](newvalue,multiLineArgs[0],multiLineArgs[1])
}
return editor_multi; editor_multi.import = function (id_, args) {
var thisTr = document.getElementById(id_);
if (!thisTr) return false;
var input = thisTr.children[2].children[0].children[0];
var field = thisTr.children[0].getAttribute('title');
var comment = thisTr.children[1].getAttribute('title');
if (!input.type || input.type !== 'textarea') return false;
editor_multi.id = id_;
editor_multi.isString = false;
editor_multi.lintAutocomplete = false;
if (args.lint === true) editor_multi.lintAutocomplete = true;
if (field.indexOf('Effect') !== -1) editor_multi.lintAutocomplete = true;
if (input.value.slice(0, 1) === '"') {
editor_multi.isString = true;
codeEditor.setValue(JSON.parse(input.value) || '');
} else {
var num = editor_multi.indent(field);
eval('var tobj=' + (input.value || 'null'));
var tmap = {};
var tstr = JSON.stringify(tobj, function (k, v) {
if (typeof(v) === typeof('') && v.slice(0, 8) === 'function') {
var id_ = editor.guid();
tmap[id_] = v.toString();
return id_;
} else return v
}, num);
for (var id_ in tmap) {
tstr = tstr.replace('"' + id_ + '"', tmap[id_])
}
codeEditor.setValue(tstr || '');
}
editor_multi.show();
return true;
}
editor_multi.cancel = function () {
editor_multi.hide();
editor_multi.id = '';
multiLineArgs = [null, null, null];
}
editor_multi.confirm = function () {
if (!editor_multi.id) {
editor_multi.id = '';
return;
}
if (editor_multi.id === 'callFromBlockly') {
editor_multi.id = '';
editor_multi.multiLineDone();
return;
}
var setvalue = function (value) {
var thisTr = document.getElementById(editor_multi.id);
editor_multi.id = '';
var input = thisTr.children[2].children[0].children[0];
if (editor_multi.isString) {
input.value = JSON.stringify(value);
} else {
eval('var tobj=' + (value || 'null'));
var tmap = {};
var tstr = JSON.stringify(tobj, function (k, v) {
if (v instanceof Function) {
var id_ = editor.guid();
tmap[id_] = v.toString();
return id_;
} else return v
}, 4);
for (var id_ in tmap) {
tstr = tstr.replace('"' + id_ + '"', JSON.stringify(tmap[id_]))
}
input.value = tstr;
}
editor_multi.hide();
input.onchange();
}
setvalue(codeEditor.getValue() || '');
}
var multiLineArgs = [null, null, null];
editor_multi.multiLineEdit = function (value, b, f, args, callback) {
editor_multi.id = 'callFromBlockly';
codeEditor.setValue(value.split('\\n').join('\n') || '');
multiLineArgs[0] = b;
multiLineArgs[1] = f;
multiLineArgs[2] = callback;
editor_multi.lintAutocomplete = Boolean(args.lint);
editor_multi.show();
}
editor_multi.multiLineDone = function () {
editor_multi.hide();
if (!multiLineArgs[0] || !multiLineArgs[1] || !multiLineArgs[2]) return;
var newvalue = codeEditor.getValue() || '';
multiLineArgs[2](newvalue, multiLineArgs[0], multiLineArgs[1])
}
return editor_multi;
} }
//editor_multi=editor_multi(); //editor_multi=editor_multi();

View File

@ -1,101 +1,103 @@
(function(){ (function () {
fs = {}; fs = {};
var postsomething = function (data,_ip,callback) { var postsomething = function (data, _ip, callback) {
//callback:function(err, data) //callback:function(err, data)
//data:字符串 //data:字符串
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){ xhr.onreadystatechange = function () {
switch(xhr.readyState){ switch (xhr.readyState) {
case 4 : case 4 :
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
if (Boolean(callback)){ if (Boolean(callback)) {
if (xhr.responseText.slice(0,6)=='error:'){ if (xhr.responseText.slice(0, 6) == 'error:') {
callback(xhr.responseText,null); callback(xhr.responseText, null);
} else { } else {
callback(null,xhr.responseText); callback(null, xhr.responseText);
} }
}
//printf(xhr.responseText)
} else {
if (Boolean(callback)) callback(xhr.status, null);
//printf('error:' + xhr.status+'<br>'+(xhr.responseText||''));
}
break;
} }
//printf(xhr.responseText) }
}else{ xhr.open('post', _ip);
if (Boolean(callback))callback(xhr.status,null); xhr.setRequestHeader('Content-Type', 'text/plain');
//printf('error:' + xhr.status+'<br>'+(xhr.responseText||'')); if (typeof(data) == typeof([][0]) || data == null) data = JSON.stringify({1: 2});
} xhr.send(data);
break;
}
} }
xhr.open('post',_ip);
xhr.setRequestHeader('Content-Type','text/plain');
if(typeof(data)==typeof([][0]) || data==null)data=JSON.stringify({1:2});
xhr.send(data);
}
fs.readFile = function (filename,encoding,callback) { fs.readFile = function (filename, encoding, callback) {
if (typeof(filename)!=typeof('')) if (typeof(filename) != typeof(''))
throw 'Type Error in fs.readFile'; throw 'Type Error in fs.readFile';
if (encoding=='utf-8'){ if (encoding == 'utf-8') {
//读文本文件 //读文本文件
//filename:支持"/"做分隔符 //filename:支持"/"做分隔符
//callback:function(err, data) //callback:function(err, data)
//data:字符串 //data:字符串
var data=''; var data = '';
data+='type=utf8&'; data += 'type=utf8&';
data+='name='+filename; data += 'name=' + filename;
postsomething(data,'/readFile',callback); postsomething(data, '/readFile', callback);
return; return;
}
if (encoding == 'base64') {
//读二进制文件
//filename:支持"/"做分隔符
//callback:function(err, data)
//data:base64字符串
var data = '';
data += 'type=base64&';
data += 'name=' + filename;
postsomething(data, '/readFile', callback);
return;
}
throw 'Type Error in fs.readFile';
} }
if (encoding=='base64'){
//读二进制文件
//filename:支持"/"做分隔符
//callback:function(err, data)
//data:base64字符串
var data='';
data+='type=base64&';
data+='name='+filename;
postsomething(data,'/readFile',callback);
return;
}
throw 'Type Error in fs.readFile';
}
fs.writeFile = function (filename,datastr,encoding,callback) { fs.writeFile = function (filename, datastr, encoding, callback) {
if (typeof(filename)!=typeof('') || typeof(datastr)!=typeof('')) if (typeof(filename) != typeof('') || typeof(datastr) != typeof(''))
throw 'Type Error in fs.writeFile'; throw 'Type Error in fs.writeFile';
if (encoding=='utf-8'){ if (encoding == 'utf-8') {
//写文本文件 //写文本文件
//filename:支持"/"做分隔符 //filename:支持"/"做分隔符
//callback:function(err) //callback:function(err)
//datastr:字符串 //datastr:字符串
var data=''; var data = '';
data+='type=utf8&'; data += 'type=utf8&';
data+='name='+filename; data += 'name=' + filename;
data+='&value='+datastr; data += '&value=' + datastr;
postsomething(data,'/writeFile',callback); postsomething(data, '/writeFile', callback);
return; return;
}
if (encoding == 'base64') {
//写二进制文件
//filename:支持"/"做分隔符
//callback:function(err)
//datastr:base64字符串
var data = '';
data += 'type=base64&';
data += 'name=' + filename;
data += '&value=' + datastr;
postsomething(data, '/writeFile', callback);
return;
}
throw 'Type Error in fs.writeFile';
} }
if (encoding=='base64'){
//写二进制文件
//filename:支持"/"做分隔符
//callback:function(err)
//datastr:base64字符串
var data='';
data+='type=base64&';
data+='name='+filename;
data+='&value='+datastr;
postsomething(data,'/writeFile',callback);
return;
}
throw 'Type Error in fs.writeFile';
}
fs.readdir = function (path, callback) { fs.readdir = function (path, callback) {
//callback:function(err, data) //callback:function(err, data)
//path:支持"/"做分隔符,不以"/"结尾 //path:支持"/"做分隔符,不以"/"结尾
//data:[filename1,filename2,..] filename是字符串,只包含文件不包含目录 //data:[filename1,filename2,..] filename是字符串,只包含文件不包含目录
if (typeof(path)!=typeof('')) if (typeof(path) != typeof(''))
throw 'Type Error in fs.readdir'; throw 'Type Error in fs.readdir';
var data=''; var data = '';
data+='name='+path; data += 'name=' + path;
postsomething(data,'/listFile',function(err, data){callback(err,JSON.parse(data))}); postsomething(data, '/listFile', function (err, data) {
return; callback(err, JSON.parse(data))
} });
return;
}
})(); })();

View File

@ -1,24 +1,41 @@
<!doctype html> <!doctype html>
<html> <html>
<head><meta charset="utf-8"></head> <head>
<body> <meta charset="utf-8">
<script src="./fs.js"></script> </head>
<script> <body>
fs.writeFile('_test.txt','123中a文bc','utf-8',function(e,d){console.log(e);console.log(d);}) <script src="./fs.js"></script>
setTimeout(function() { <script>
fs.writeFile('_test_bin.txt','abc=','base64',function(e,d){console.log(e);console.log(d);}) fs.writeFile('_test.txt', '123中a文bc', 'utf-8', function (e, d) {
}, 1000); console.log(e);
setTimeout(function() { console.log(d);
fs.readFile('_test.txt','utf-8',function(e,d){console.log(e);console.log(d);}) })
}, 2000); setTimeout(function () {
setTimeout(function() { fs.writeFile('_test_bin.txt', 'abc=', 'base64', function (e, d) {
fs.readFile('_test_bin.txt','base64',function(e,d){console.log(e);console.log(d);}) console.log(e);
}, 3000); console.log(d);
setTimeout(function() { })
fs.readdir('.',function(e,d){console.log(e);console.log(d);}) }, 1000);
}, 4000); setTimeout(function () {
fs.readFile('_test.txt', 'utf-8', function (e, d) {
console.log(e);
</script> console.log(d);
</body> })
}, 2000);
setTimeout(function () {
fs.readFile('_test_bin.txt', 'base64', function (e, d) {
console.log(e);
console.log(d);
})
}, 3000);
setTimeout(function () {
fs.readdir('.', function (e, d) {
console.log(e);
console.log(d);
})
}, 4000);
</script>
</body>
</html> </html>

View File

@ -1,333 +1,375 @@
// vue 相关处理 // vue 相关处理
document.body.onmousedown = function(e){ document.body.onmousedown = function (e) {
//console.log(e); //console.log(e);
var eid=[]; var eid = [];
e.path.forEach(function(node){ e.path.forEach(function (node) {
if(!node.getAttribute)return; if (!node.getAttribute) return;
var id_ = node.getAttribute('id'); var id_ = node.getAttribute('id');
if (id_){ if (id_) {
if(['left','left1','left2','left3','left4','left5','left8'].indexOf(id_)!==-1)eid.push('edit'); if (['left', 'left1', 'left2', 'left3', 'left4', 'left5', 'left8'].indexOf(id_) !== -1) eid.push('edit');
eid.push(id_); eid.push(id_);
} }
}); });
//console.log(eid); //console.log(eid);
if(eid.indexOf('edit')===-1){ if (eid.indexOf('edit') === -1) {
if(eid.indexOf('tip')===-1)selectBox.isSelected = false; if (eid.indexOf('tip') === -1) {
} if (selectBox.isSelected) {
//editor.mode.onmode(''); editor_mode.onmode('');
editor.info = {}; editor.file.saveFloorFile(function (err) {
} if (err) {
iconLib.onmousedown = function(e){ printe(err);
e.stopPropagation(); throw(err)
} }
var exportM = new Vue({ ;printf('地图保存成功');
el: '#exportM', });
data: { }
isExport: false, selectBox.isSelected = false;
}, }
methods: { }
exportMap: function(){ //editor.mode.onmode('');
editor.updateMap(); editor.info = {};
}
var filestr=''; iconLib.onmousedown = function (e) {
for (var yy = 0; yy < 13; yy++){ e.stopPropagation();
filestr+='[' }
for (var xx = 0; xx < 13; xx++) { var exportMap = new Vue({
var mapxy=editor.map[yy][xx]; el: '#exportMap',
if(typeof(mapxy)==typeof({})){ data: {
if ('idnum' in mapxy)mapxy=mapxy.idnum; isExport: false,
else { },
// mapxy='!!?'; methods: {
tip.whichShow = 3; exportMap: function () {
return; editor.updateMap();
}
}else if(typeof(mapxy)=='undefined'){ var filestr = '';
tip.whichShow = 3; for (var yy = 0; yy < 13; yy++) {
return; filestr += '['
} for (var xx = 0; xx < 13; xx++) {
mapxy=String(mapxy); var mapxy = editor.map[yy][xx];
mapxy=Array(Math.max(4-mapxy.length,0)).join(' ')+mapxy; if (typeof(mapxy) == typeof({})) {
filestr+=mapxy+(xx==12?'':',') if ('idnum' in mapxy) mapxy = mapxy.idnum;
else {
// mapxy='!!?';
tip.whichShow = 3;
return;
}
} else if (typeof(mapxy) == 'undefined') {
tip.whichShow = 3;
return;
}
mapxy = String(mapxy);
mapxy = Array(Math.max(4 - mapxy.length, 0)).join(' ') + mapxy;
filestr += mapxy + (xx == 12 ? '' : ',')
}
filestr += ']' + (yy == 12 ? '' : ',\n');
}
pout.value = filestr;
editArea.mapArr = filestr;
this.isExport = true;
editArea.error = 0;
tip.whichShow = 2;
} }
filestr += ']'+(yy==12?'':',\n');
}
pout.value = filestr;
editArea.mapArr = filestr;
this.isExport = true;
editArea.error = 0;
tip.whichShow = 2;
} }
}
}) })
var editArea = new Vue({ var editArea = new Vue({
el: '#editArea', el: '#editArea',
data: { data: {
mapArr: '', mapArr: '',
errors: [ // 编号1,2,3,4 errors: [ // 编号1,2,3,4
"格式错误!请使用正确格式(13*13数组如不清楚可先点击生成地图查看正确格式)", "格式错误!请使用正确格式(13*13数组如不清楚可先点击生成地图查看正确格式)",
"当前有未定义ID在地图区域显示红块请修改ID或者到icons.js和maps.js中进行定义", "当前有未定义ID在地图区域显示红块请修改ID或者到icons.js和maps.js中进行定义",
"ID越界在地图区域显示红块当前编辑器暂时支持编号小于400请修改编号", "ID越界在地图区域显示红块当前编辑器暂时支持编号小于400请修改编号",
// "发生错误!", // "发生错误!",
], ],
error: 0, error: 0,
formatTimer: null, formatTimer: null,
},
watch: {
mapArr: function (val, oldval) {
var that = this;
if(val=='') return;
if(exportM.isExport){
exportM.isExport = false;
return;
}
if(that.formatArr()){
that.error = 0;
setTimeout(function(){
that.mapArr = that.formatArr();
that.drawMap();
tip.whichShow = 8
}, 1000);
that.formatTimer = setTimeout(function(){
pout.value = that.formatArr();
}, 5000); //5s后再格式化不然光标跳到最后很烦
}else{
that.error = 1;
}
}, },
error: function(){ watch: {
// console.log(editArea.mapArr); mapArr: function (val, oldval) {
} var that = this;
}, if (val == '') return;
methods: { if (exportMap.isExport) {
drawMap: function(){ exportMap.isExport = false;
var that = this; return;
}
if (that.formatArr()) {
that.error = 0;
// var mapArray = that.mapArr.split(/\D+/).join(' ').trim().split(' '); setTimeout(function () {
var mapArray = JSON.parse('['+that.mapArr+']'); that.mapArr = that.formatArr();
for(var y=0; y<13; y++) that.drawMap();
for(var x=0; x<13; x++){ tip.whichShow = 8
var num = mapArray[y][x]; }, 1000);
if(num == 0 ) that.formatTimer = setTimeout(function () {
editor.map[y][x] = 0; pout.value = that.formatArr();
else if(num >= 1000){ }, 5000); //5s后再格式化不然光标跳到最后很烦
that.error = 3; } else {
editor.map[y][x] = undefined; that.error = 1;
}else if(typeof(editor.indexs[num][0]) == 'undefined'){ }
that.error = 2; },
editor.map[y][x] = undefined; error: function () {
}else editor.map[y][x] = editor.ids[[editor.indexs[num][0]]]; // console.log(editArea.mapArr);
} }
editor.updateMap();
}, },
formatArr: function(){ methods: {
var formatArrStr = ''; drawMap: function () {
var that = this; var that = this;
clearTimeout(that.formatTimer);
if(this.mapArr.split(/\D+/).join(' ').trim().split(' ').length != 169) return false;
var arr = this.mapArr.replace(/\s+/g, '').split('],[');
if(arr.length != 13) return ;
for(var i =0; i<13; i++){
var a = [];
formatArrStr +='[';
if(i==0||i==12) a = arr[i].split(/\D+/).join(' ').trim().split(' ');
else a = arr[i].split(/\D+/);
if(a.length != 13){
formatArrStr = '';
return ;
}
for(var k=0; k<13; k++){ // var mapArray = that.mapArr.split(/\D+/).join(' ').trim().split(' ');
var num = parseInt(a[k]); var mapArray = JSON.parse('[' + that.mapArr + ']');
formatArrStr += Array(Math.max(4-String(num).length,0)).join(' ')+num+(k==12?'':','); for (var y = 0; y < 13; y++)
for (var x = 0; x < 13; x++) {
var num = mapArray[y][x];
if (num == 0)
editor.map[y][x] = 0;
else if (num >= 1000) {
that.error = 3;
editor.map[y][x] = undefined;
} else if (typeof(editor.indexs[num][0]) == 'undefined') {
that.error = 2;
editor.map[y][x] = undefined;
} else editor.map[y][x] = editor.ids[[editor.indexs[num][0]]];
}
editor.updateMap();
},
formatArr: function () {
var formatArrStr = '';
var that = this;
clearTimeout(that.formatTimer);
if (this.mapArr.split(/\D+/).join(' ').trim().split(' ').length != 169) return false;
var arr = this.mapArr.replace(/\s+/g, '').split('],[');
if (arr.length != 13) return;
for (var i = 0; i < 13; i++) {
var a = [];
formatArrStr += '[';
if (i == 0 || i == 12) a = arr[i].split(/\D+/).join(' ').trim().split(' ');
else a = arr[i].split(/\D+/);
if (a.length != 13) {
formatArrStr = '';
return;
}
for (var k = 0; k < 13; k++) {
var num = parseInt(a[k]);
formatArrStr += Array(Math.max(4 - String(num).length, 0)).join(' ') + num + (k == 12 ? '' : ',');
}
formatArrStr += ']' + (i == 12 ? '' : ',\n');
}
return formatArrStr;
} }
formatArrStr += ']'+(i==12?'':',\n');
}
return formatArrStr;
} }
}
}); });
var editTip = new Vue({ var copyMap = new Vue({
el: '#editTip', el: '#copyMap',
data: { data: {
err: '' err: ''
}, },
methods: { methods: {
copyMap: function(){ copyMap: function () {
tip.whichShow = 0; tip.whichShow = 0;
if(pout.value.trim() != ''){ if (pout.value.trim() != '') {
if(editArea.error) { if (editArea.error) {
this.err = editArea.errors[editArea.error-1]; this.err = editArea.errors[editArea.error - 1];
tip.whichShow = 5 tip.whichShow = 5
return; return;
}
try {
pout.select();
document.execCommand("Copy");
tip.whichShow = 6;
} catch (e) {
this.err = e;
tip.whichShow = 5;
}
} else {
tip.whichShow = 7;
}
} }
try{ },
pout.select();
document.execCommand("Copy");
tip.whichShow = 6;
}catch(e){
this.err= e;
tip.whichShow = 5;
}
}else{
tip.whichShow = 7;
}
}
},
}) })
var clear = new Vue({ var clearMap = new Vue({
el: '#clear', el: '#clearMap',
methods: { methods: {
clearMap: function(){ clearMap: function () {
editor.mapInit(); editor.mapInit();
editor.updateMap(); editor_mode.onmode('');
clearTimeout(editArea.formatTimer); editor.file.saveFloorFile(function (err) {
clearTimeout(tip.timer); if (err) {
pout.value = ''; printe(err);
editArea.mapArr = ''; throw(err)
tip.whichShow = 4; }
editArea.error = 0; ;printf('地图清除成功');
});
editor.updateMap();
clearTimeout(editArea.formatTimer);
clearTimeout(tip.timer);
pout.value = '';
editArea.mapArr = '';
tip.whichShow = 4;
editArea.error = 0;
}
} }
}
}) })
printf = function(str_,type) { var deleteMap = new Vue({
selectBox.isSelected = false; el: '#deleteMap',
if(!type){ methods: {
tip.whichShow=11; deleteMap: function () {
} else { editor_mode.onmode('');
tip.whichShow=12; var index = core.floorIds.indexOf(editor.currentFloorId);
} if (index>=0) {
setTimeout(function(){ core.floorIds.splice(index,1);
if(!type){ editor.file.editTower([['change', "['main']['floorIds']", core.floorIds]], function (objs_) {/*console.log(objs_);*/
tip.msgs[11]=String(str_); if (objs_.slice(-1)[0] != null) {
tip.whichShow=12; printe(objs_.slice(-1)[0]);
throw(objs_.slice(-1)[0])
}
;printe('删除成功,请F5刷新编辑器生效');
});
}
else printe('删除成功,请F5刷新编辑器生效');
}
}
})
printf = function (str_, type) {
selectBox.isSelected = false;
if (!type) {
tip.whichShow = 11;
} else { } else {
tip.msgs[10]=String(str_); tip.whichShow = 12;
tip.whichShow=11;
} }
},1); setTimeout(function () {
if (!type) {
tip.msgs[11] = String(str_);
tip.whichShow = 12;
} else {
tip.msgs[10] = String(str_);
tip.whichShow = 11;
}
}, 1);
}
printe = function (str_) {
printf(str_, 'error')
} }
printe = function(str_){printf(str_,'error')}
tip_in_showMode = [ tip_in_showMode = [
'涉及图片的更改需要F5刷新浏览器来生效', '涉及图片的更改需要F5刷新浏览器来生效',
'文本域可以通过双击,在文本编辑器或事件编辑器中编辑', '文本域可以通过双击,在文本编辑器或事件编辑器中编辑',
'事件编辑器中的显示文本和自定义脚本的方块也可以双击', '事件编辑器中的显示文本和自定义脚本的方块也可以双击',
"画出的地图要点击\"保存地图\"才会写入到文件中", "画出的地图要点击\"保存地图\"才会写入到文件中",
]; ];
var tip = new Vue({ var tip = new Vue({
el: '#tip', el: '#tip',
data: { data: {
infos: {}, infos: {},
hasId: true, hasId: true,
isAutotile: false, isAutotile: false,
isSelectedBlock: false, isSelectedBlock: false,
isClearBlock: false, isClearBlock: false,
geneMapSuccess: false, geneMapSuccess: false,
timer: null, timer: null,
msgs: [ //分别编号1,2,3,4,5,6,7,8,9,10奇数警告偶数成功 msgs: [ //分别编号1,2,3,4,5,6,7,8,9,10奇数警告偶数成功
"当前未选择任何图块,请先在右边选择要画的图块!", "当前未选择任何图块,请先在右边选择要画的图块!",
"生成地图成功!可点击复制按钮复制地图数组到剪切板", "生成地图成功!可点击复制按钮复制地图数组到剪切板",
"生成失败! 地图中有未定义的图块,建议先用其他有效图块覆盖或点击清除地图!", "生成失败! 地图中有未定义的图块,建议先用其他有效图块覆盖或点击清除地图!",
"地图清除成功!", "地图清除成功!",
"复制失败!", "复制失败!",
"复制成功!可直接粘贴到楼层文件的地图数组中。", "复制成功!可直接粘贴到楼层文件的地图数组中。",
"复制失败!当前还没有数据", "复制失败!当前还没有数据",
"修改成功!可点击复制按钮复制地图数组到剪切板", "修改成功!可点击复制按钮复制地图数组到剪切板",
"选择背景图片失败!文件名格式错误或图片不存在!", "选择背景图片失败!文件名格式错误或图片不存在!",
"更新背景图片成功!", "更新背景图片成功!",
"11:警告", "11:警告",
"12:成功" "12:成功"
], ],
mapMsg: '', mapMsg: '',
whichShow: 0, whichShow: 0,
},
watch: {
infos: {
handler: function(val, oldval){
this.isClearBlock = false;
if(typeof(val) != 'undefined'){
if(val==0) {
this.isClearBlock = true;
return;
}
if('id' in val){
this.hasId = true;
}else{
this.hasId = false;
}
this.isAutotile = false;
if(val.images == "autotile" && this.hasId) this.isAutotile = true;
}
},
deep: true
}, },
watch: {
infos: {
handler: function (val, oldval) {
this.isClearBlock = false;
if (typeof(val) != 'undefined') {
if (val == 0) {
this.isClearBlock = true;
return;
}
if ('id' in val) {
this.hasId = true;
} else {
this.hasId = false;
}
this.isAutotile = false;
if (val.images == "autotile" && this.hasId) this.isAutotile = true;
}
},
deep: true
},
whichShow: function(){ whichShow: function () {
var that = this; var that = this;
that.mapMsg = ''; that.mapMsg = '';
that.msgs[4] = "复制失败!"+editTip.err; that.msgs[4] = "复制失败!" + editTip.err;
clearTimeout(that.timer); clearTimeout(that.timer);
if(that.whichShow){ if (that.whichShow) {
that.mapMsg = that.msgs[that.whichShow-1]; that.mapMsg = that.msgs[that.whichShow - 1];
that.timer = setTimeout(function() { that.timer = setTimeout(function () {
if(!(that.whichShow%2)) if (!(that.whichShow % 2))
that.whichShow = 0; that.whichShow = 0;
}, 5000); //5秒后自动清除successwarn不清除 }, 5000); //5秒后自动清除successwarn不清除
} }
}
} }
}
}) })
var selectBox = new Vue({ var selectBox = new Vue({
el: '#selectBox', el: '#selectBox',
data: { data: {
isSelected: false isSelected: false
}, },
watch: { watch: {
isSelected: function(){ isSelected: function () {
tip.isSelectedBlock = this.isSelected; tip.isSelectedBlock = this.isSelected;
tip.whichShow = 0; tip.whichShow = 0;
clearTimeout(tip.timer); clearTimeout(tip.timer);
}
} }
}
}) })
var bgSelect = new Vue({ var bgSelect = new Vue({
el: '#bgSelect', el: '#bgSelect',
data: { data: {
bgs: {}, bgs: {},
selectedBg: 'ground', selectedBg: 'ground',
imgname: '' imgname: ''
}, },
watch:{ watch: {
selectedBg: function(){ selectedBg: function () {
editor.bgY = this.bgs.indexOf(this.selectedBg); editor.bgY = this.bgs.indexOf(this.selectedBg);
editor.drawMapBg(); editor.drawMapBg();
}
},
methods: {
updatebg: function () {
tip.whichShow = 0;
var regx = /\S+\.(png|bmp|jpg|jpeg|gif)$/i;
if (regx.test(this.imgname)) {
var url = 'images/' + this.imgname;
editor.loadImg(url).then(function (img) {
editor.drawMapBg(img);
tip.whichShow = 10;
}).catch(function (err) {
console.log(err);
tip.whichShow = 9;
});
} else {
tip.whichShow = 9;
}
}
} }
},
methods: {
updatebg: function(){
tip.whichShow = 0;
var regx = /\S+\.(png|bmp|jpg|jpeg|gif)$/i;
if(regx.test(this.imgname)){
var url = 'images/'+this.imgname;
editor.loadImg(url).then(function(img){
editor.drawMapBg(img);
tip.whichShow = 10;
}).catch(function(err){
console.log(err);
tip.whichShow = 9;
});
}else{
tip.whichShow = 9;
}
}
}
}) })

View File

@ -14,14 +14,26 @@
大多数宝物都有默认的效果,屠龙匕首暂未定义,如有自己的需求可参见[自定义道具效果](personalization#自定义道具效果)。 大多数宝物都有默认的效果,屠龙匕首暂未定义,如有自己的需求可参见[自定义道具效果](personalization#自定义道具效果)。
如需让剑盾变成装备,可以直接在`data.js`中设置`'equipment': true`即可。
拿到道具后将触发`afterGetItem`事件,有关事件的详细介绍请参见[事件](event)。 拿到道具后将触发`afterGetItem`事件,有关事件的详细介绍请参见[事件](event)。
如需修改某个道具的效果,在不同区域宝石数据发生变化等问题,请参见[自定义道具效果](personalization#自定义道具效果)的说明。 如需修改某个道具的效果,在不同区域宝石数据发生变化等问题,请参见[自定义道具效果](personalization#自定义道具效果)的说明。
**有关轻按在data.js的系统变量中有定义。如果`enableGentleClick`为true则鼠标触摸屏通过双击勇士键盘通过空格可达到轻按效果即不向前移动而获得前方物品。** **有关轻按在data.js的系统变量中有定义。如果`enableGentleClick`为true则鼠标触摸屏通过双击勇士键盘通过空格可达到轻按效果即不向前移动而获得前方物品。**
## 装备
如果需要让剑盾等变成装备,可以直接在`data.js`中设置`'equipment': true`即可。
值得注意的是,有时候会有一个装备加多种属性的需求,此时需要把剑盾的效果从数值改成一个对象:
``` js
"sword1": {"atk": 10, "def": 0, "mdef": 5}, // 铁剑加10攻和5魔防
"shield1": {"atk": 0, "def": 10, "mdef": 10}, // 铁盾加10防和10魔防
```
将需要的项目按照如上方式修改即可。
## 门 ## 门
本塔支持6种门黄蓝红绿铁花。前五种门需要有对应的钥匙打开花门只能通过调用`openDoor`事件进行打开。 本塔支持6种门黄蓝红绿铁花。前五种门需要有对应的钥匙打开花门只能通过调用`openDoor`事件进行打开。

View File

@ -636,6 +636,50 @@ loc为图片左上角坐标以像素为单位进行计算。
调用show/hide/move/animate等几个事件同样会清除所有显示的图片。 调用show/hide/move/animate等几个事件同样会清除所有显示的图片。
### animateImage图片淡入淡出
我们还可以使用 `{"type": "animateImage"}` 来造成显示图片的淡入淡出效果。
``` js
"x,y": [ // 实际执行的事件列表
{"type": "animateImage", "action": "show", "name": "bg.jpg", "loc": [231,297], "time": 500}, // 在(231,297)淡入bg.jpg动画时间500ms
{"type": "animateImage", "action": "hide", "name": "1.png", "loc": [109,167], "time": 300}, // 在(109,167)淡出1.png动画时间300ms
]
```
action为淡入还是淡出`show`为淡入,`hide`会淡出。
name为图片名。**请确保图片在data.js中的images中被定义过。**
loc为图片左上角坐标以像素为单位进行计算。
time为淡入淡出的时间如果是0则忽略此项。
!> 淡入淡出图片只是会在顶层绘制“淡入”和“淡出”效果动画结束即消失并不会实际对图片的显示造成影响。请与showImage事件合用。
如果多张图片的淡入淡出可以采用以下方式(仅供参考):
假设我现在已经有了`1.jpg`显示在屏幕上:
- 淡入显示`2.png`:调用`animateImage`淡入图片,然后立刻调用`showImage`显示图片。
- 淡出`1.png`:清除所有图片,`showImage`显示`2.png`,然后调用`animateImage`淡出`1.jpg`
### showGif显示动图
我们可以使用 `{"type": "showGif"}` 来显示一张图片。
``` js
"x,y": [ // 实际执行的事件列表
{"type": "showGif", "name": "timg.gif", "loc": [231,297]}, // 在(231,297)显示一张动图
{"type": "showGif"} // 如果不指定name则清除所有动图。
]
```
name为图片名。**请确保图片在data.js中的images中被定义过。**
loc为动图左上角坐标以像素为单位进行计算。
如果不指定name则清除所有显示的动图。
### setFg: 更改画面色调 ### setFg: 更改画面色调
我们可以使用 `{"type": "setFg"}` 来更改画面色调。 我们可以使用 `{"type": "setFg"}` 来更改画面色调。

View File

@ -249,7 +249,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
// 如果有神圣盾免疫吸血等可以在这里写 // 如果有神圣盾免疫吸血等可以在这里写
if (core.hasFlag("shield5")) vampireDamage = 0; // 存在神圣盾吸血伤害为0 if (core.hasFlag("shield5")) vampireDamage = 0; // 存在神圣盾吸血伤害为0
vampireDamage = parseInt(vampireDamage); vampireDamage = Math.floor(vampireDamage) || 0;
// 加到自身 // 加到自身
if (monster.add) // 如果加到自身 if (monster.add) // 如果加到自身
mon_hp += vampireDamage; mon_hp += vampireDamage;
@ -286,7 +286,7 @@ control.prototype.checkBlock = function () {
你需自己指定一个special数字修改getSpecialText函数属性名和getSpecialHint函数属性提示文字 你需自己指定一个special数字修改getSpecialText函数属性名和getSpecialHint函数属性提示文字
如果要修改伤害计算公式请修改下面的calDamage函数。请注意如果无法战斗该函数必须返回`999999999`。 如果要修改伤害计算公式请修改下面的calDamage函数。请注意如果无法战斗该函数必须返回`null`。
对于毒衰弱怪物的战斗后结算在`functions.js`中的afterBattle函数中。 对于毒衰弱怪物的战斗后结算在`functions.js`中的afterBattle函数中。

View File

@ -1,229 +1,269 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<link href="_server/css/editor.css" rel="stylesheet"> <link href="_server/css/editor.css" rel="stylesheet">
<link href="_server/CodeMirror/codemirror.css" rel="stylesheet"> <link href="_server/CodeMirror/codemirror.css" rel="stylesheet">
<link href="_server/CodeMirror/show-hint.css" rel="stylesheet"> <link href="_server/CodeMirror/show-hint.css" rel="stylesheet">
<link href="_server/CodeMirror/lint.css" rel="stylesheet"> <link href="_server/CodeMirror/lint.css" rel="stylesheet">
<link href="_server/css/editor_mode.css" rel="stylesheet"> <link href="_server/css/editor_mode.css" rel="stylesheet">
</head> </head>
<body> <body>
<div class="main"> <div class="main">
<div id="left" style="z-index:-1;opacity: 0;"><!-- map --> <div id="left" style="z-index:-1;opacity: 0;"><!-- map -->
<div id="arrEditor"> <div id="arrEditor">
<table class="col" id='arrColMark'></table> <table class="col" id='arrColMark'></table>
<table class="row" id='arrRowMark'></table> <table class="row" id='arrRowMark'></table>
<div id="editArea" v-cloak> <div id="editArea" v-cloak>
<textarea cols="10" rows="10" id="pout" v-model="mapArr"></textarea> <textarea cols="10" rows="10" id="pout" v-model="mapArr"></textarea>
<p class="warnText" v-if="error">{{ errors[error-1] }}</p> <p class="warnText" v-if="error">{{ errors[error-1] }}</p>
</div>
<div id="editTip">
<input type="button" value="新建空白地图" id='newMap'/>
<input id='newFileName' placeholder="输入新楼层id"/>
</div>
<div style="position: absolute;left: 10px;bottom:0; margin-bottom: 90px">
<input type="button" value="导出地图" id="exportMap" v-on:click="exportMap"/>
<input type="button" value="复制地图" id="copyMap" v-on:click="copyMap"/>
<input type="button" value="清除地图" id='clearMap' v-on:click="clearMap"/>
<input type="button" value="删除地图" id="deleteMap" v-on:click="deleteMap"/>
</div>
</div> </div>
<div id="editTip" v-cloak> <div id="objDataEditor">
<br>
<input type="button" value="当前地图另存为" id='saveFloorAs'/>
<input id='saveAsName' placeholder="输入新楼层id"/>
<input class='btn' type="button" value="复制地图" v-on:click="copyMap"/>
</div>
<div style="position: absolute;right: 10px;bottom:70px;">
<input class='btn' id='clear' type="button" value="清除地图" v-on:click="clearMap"/>
<input class='btn' type="button" value="导出地图" id="exportM" v-on:click="exportMap"/>
</div>
</div>
<div id="objDataEditor">
</div> </div>
<div id="eventEditor"> <div id="eventEditor">
</div>
</div>
</div> </div>
<div id="left1" class='leftTab' style="z-index:-1;opacity: 0;"><!-- appendpic --> <div id="left1" class='leftTab' style="z-index:-1;opacity: 0;"><!-- appendpic -->
<h3 class="leftTabHeader">追加素材</h3> <h3 class="leftTabHeader">追加素材</h3>
<div class="leftTabContent"> <div class="leftTabContent">
<p> <p>
<input id="selectFileBtn" type="button" value="导入文件到画板"/> <input id="selectFileBtn" type="button" value="导入文件到画板"/>
<select id="selectAppend"></select><!-- ["terrains", "animates", "enemys", "enemy48", "items", "npcs", "npc48"] --> <select id="selectAppend"></select>
<input id="appendConfirm" type="button" value="追加"/> <!-- ["terrains", "animates", "enemys", "enemy48", "items", "npcs", "npc48"] -->
</p> <input id="appendConfirm" type="button" value="追加"/>
<div id="appendPicCanvas" style="position:relative;overflow: auto;height:470px;"> </p>
<canvas style="position:absolute"></canvas><!-- 用于画出灰白相间背景 --> <div id="appendPicCanvas" style="position:relative;overflow: auto;height:470px;">
<canvas style="position:absolute"></canvas><!-- 用于画出选中文件 --> <canvas style="position:absolute"></canvas><!-- 用于画出灰白相间背景 -->
<canvas style="position:absolute;z-index:100"></canvas><!-- 用于响应鼠标点击 --> <canvas style="position:absolute"></canvas><!-- 用于画出选中文件 -->
<canvas style="position:absolute;display:none;"></canvas><!-- 画出追加后的sprite用于储存 --> <canvas style="position:absolute;z-index:100"></canvas><!-- 用于响应鼠标点击 -->
<div id="appendPicSelection"> <canvas style="position:absolute;display:none;"></canvas><!-- 画出追加后的sprite用于储存 -->
<div class="appendSelection"><span style="top: 0; left: 2px;">1</span></div> <div id="appendPicSelection">
<div class="appendSelection"><span style="top: 0; left: 14px;">2</span></div> <div class="appendSelection"><span style="top: 0; left: 2px;">1</span></div>
<div class="appendSelection"><span style="top: 12px; left: 2px;">3</span></div> <div class="appendSelection"><span style="top: 0; left: 14px;">2</span></div>
<div class="appendSelection"><span style="top: 12px; left: 14px;">4</span></div> <div class="appendSelection"><span style="top: 12px; left: 2px;">3</span></div>
<div class="appendSelection"><span style="top: 12px; left: 14px;">4</span></div>
</div>
</div>
</div> </div>
</div> </div>
</div></div>
<div id="left2" class='leftTab' style="z-index:-1;opacity: 0;"><!-- loc --> <div id="left2" class='leftTab' style="z-index:-1;opacity: 0;"><!-- loc -->
<h3 class="leftTabHeader">地图选点&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button></h3> <h3 class="leftTabHeader">地图选点&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button>
<div class="leftTabContent"> </h3>
<p id='pos_a6771a78_a099_417c_828f_0a24851ebfce' style="margin-left: 15px">0,0</p> <div class="leftTabContent">
<div class='etable'> <p id='pos_a6771a78_a099_417c_828f_0a24851ebfce' style="margin-left: 15px">0,0</p>
<table> <div class='etable'>
<tbody id='table_3d846fc4_7644_44d1_aa04_433d266a73df'> <table>
<tr><td>条目</td><td>注释</td><td></td></tr> <tbody id='table_3d846fc4_7644_44d1_aa04_433d266a73df'>
</tbody> <tr>
</table> <td>条目</td>
</div> <td>注释</td>
</div></div> <td></td>
<div id="left3" class='leftTab' style="z-index:-1;opacity: 0;"><!-- emenyitem --> </tr>
<h3 class="leftTabHeader">图块属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button></h3> </tbody>
<div class="leftTabContent"> </table>
<div id='newIdIdnum'><!-- id and idnum --> </div>
<input placeholder="输入新id唯一标识符"/>
<input placeholder="输入新idnum数字1000以内"/>
<button>save</button>
</div>
<div><!-- enemy and item -->
<div class='etable'>
<table>
<tbody id='table_a3f03d4c_55b8_4ef6_b362_b345783acd72'>
<tr><td>条目</td><td>注释</td><td></td></tr>
</tbody>
</table>
</div> </div>
</div> </div>
</div></div> <div id="left3" class='leftTab' style="z-index:-1;opacity: 0;"><!-- emenyitem -->
<h3 class="leftTabHeader">图块属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button>
</h3>
<div class="leftTabContent">
<div id='newIdIdnum'><!-- id and idnum -->
<input placeholder="输入新id唯一标识符"/>
<input placeholder="输入新idnum数字1000以内"/>
<button>save</button>
</div>
<div><!-- enemy and item -->
<div class='etable'>
<table>
<tbody id='table_a3f03d4c_55b8_4ef6_b362_b345783acd72'>
<tr>
<td>条目</td>
<td>注释</td>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="left4" class='leftTab' style="z-index:-1;opacity: 0;"><!-- floor --> <div id="left4" class='leftTab' style="z-index:-1;opacity: 0;"><!-- floor -->
<h3 class="leftTabHeader">楼层属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button></h3> <h3 class="leftTabHeader">楼层属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button>
<div class="leftTabContent"> </h3>
<div class='etable'> <div class="leftTabContent">
<table> <div class='etable'>
<tbody id='table_4a3b1b09_b2fb_4bdf_b9ab_9f4cdac14c74'> <table>
<tr><td>条目</td><td>注释</td><td></td></tr> <tbody id='table_4a3b1b09_b2fb_4bdf_b9ab_9f4cdac14c74'>
</tbody> <tr>
</table> <td>条目</td>
</div> <td>注释</td>
</div></div> <td></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="left5" class='leftTab' style="z-index:-1;opacity: 0;"><!-- tower --> <div id="left5" class='leftTab' style="z-index:-1;opacity: 0;"><!-- tower -->
<h3 class="leftTabHeader">全塔属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button></h3> <h3 class="leftTabHeader">全塔属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button>
<div class="leftTabContent"> </h3>
<div class='etable'> <div class="leftTabContent">
<table> <div class='etable'>
<tbody id='table_b6a03e4c_5968_4633_ac40_0dfdd2c9cde5'> <table>
<tr><td>条目</td><td>注释</td><td></td></tr> <tbody id='table_b6a03e4c_5968_4633_ac40_0dfdd2c9cde5'>
</tbody> <tr>
</table> <td>条目</td>
</div> <td>注释</td>
</div></div> <td></td>
<div id="left6" class='leftTab' style="z-index:-1;opacity: 0;"><div style="position: relative; height: 95%"><!-- eventsEditor --> </tr>
<h3>事件编辑器 &nbsp;&nbsp; </tbody>
<button onclick="editor_blockly.showXML()">Show XML</button> </table>
<button onclick="editor_blockly.runCode()">console.log(obj=code)</button> </div>
<select id="entryType" disabled="disabled"> </div>
<option value="event">event</option> </div>
<option value="changeFloor">changeFloor</option> <div id="left6" class='leftTab' style="z-index:-1;opacity: 0;">
<option value="point">point</option> <div style="position: relative; height: 95%"><!-- eventsEditor -->
<option value="shop">shop</option> <h3>事件编辑器 &nbsp;&nbsp;
<option value="afterBattle">afterBattle</option> <!--
<option value="afterGetItem">afterGetItem</option> <button onclick="editor_blockly.showXML()">Show XML</button>
<option value="afterOpenDoor">afterOpenDoor</option> <button onclick="editor_blockly.runCode()">console.log(obj=code)</button>
<option value="firstArrive">firstArrive</option> -->
</select> <select id="entryType" disabled="disabled" style="display: none">
<button onclick="editor_blockly.parse()">parse</button> <option value="event">event</option>
<button onclick="editor_blockly.confirm()">confirm</button> <option value="changeFloor">changeFloor</option>
<button onclick="editor_blockly.cancel()">cancel</button> <option value="point">point</option>
<xml id="toolbox" style="display:none"> <option value="shop">shop</option>
<category name="entry"></category> <option value="afterBattle">afterBattle</option>
<category name="statement"></category> <option value="afterGetItem">afterGetItem</option>
<category name="value"></category> <option value="afterOpenDoor">afterOpenDoor</option>
<category name="template"></category> <option value="firstArrive">firstArrive</option>
</xml> </select>
</h3> <button onclick="editor_blockly.confirm()">confirm</button>
<div style="position: relative;height: 100%"> <button onclick="editor_blockly.cancel()">cancel</button>
<div id="blocklyArea"><div id="blocklyDiv"></div></div> <button onclick="editor_blockly.parse()">parse</button>
<textarea id="codeArea" spellcheck="false"></textarea> <xml id="toolbox" style="display:none">
</div> <category name="entry"></category>
</div></div> <category name="statement"></category>
<category name="value"></category>
<category name="template"></category>
</xml>
</h3>
<div style="position: relative;height: 100%">
<div id="blocklyArea">
<div id="blocklyDiv"></div>
</div>
<textarea id="codeArea" spellcheck="false"></textarea>
</div>
</div>
</div>
<div id="left7" style="z-index:-1;opacity: 0;"><!-- 多行文本编辑器 --> <div id="left7" style="z-index:-1;opacity: 0;"><!-- 多行文本编辑器 -->
<button onclick="editor_multi.confirm()">confirm</button> <button onclick="editor_multi.confirm()">confirm</button>
<button onclick="editor_multi.cancel()">cancel</button> <button onclick="editor_multi.cancel()">cancel</button>
<input type="checkbox" onclick="editor_multi.toggerLint()" id="lintCheckbox" style="vertical-align: bottom;margin-left:6px" /> <input type="checkbox" onclick="editor_multi.toggerLint()" id="lintCheckbox"
<span style="vertical-align: bottom; margin-left: -3px">Lint</span> style="vertical-align: bottom;margin-left:6px"/>
<textarea id="multiLineCode" name="multiLineCode"></textarea> <span style="vertical-align: bottom; margin-left: -3px">Lint</span>
<textarea id="multiLineCode" name="multiLineCode"></textarea>
</div> </div>
<div id="left8" class='leftTab' style="z-index:-1;opacity: 0;"><!-- functions --> <div id="left8" class='leftTab' style="z-index:-1;opacity: 0;"><!-- functions -->
<h3 class="leftTabHeader">脚本编辑&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button></h3> <h3 class="leftTabHeader">脚本编辑&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">save</button>
<div class="leftTabContent"> </h3>
<div class='etable'> <div class="leftTabContent">
<table> <div class='etable'>
<tbody id='table_e260a2be_5690_476a_b04e_dacddede78b3'> <table>
<tr><td>条目</td><td>注释</td><td></td></tr> <tbody id='table_e260a2be_5690_476a_b04e_dacddede78b3'>
</tbody> <tr>
</table> <td>条目</td>
</div> <td>注释</td>
</div></div> <td></td>
<div id="mid"> </tr>
<table class="col" id='mapColMark'></table> </tbody>
<table class="row" id='mapRowMark'></table> </table>
<div class="map" id="mapEdit">
<canvas class='gameCanvas' id='bg' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='event' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='event2' width='416' height='416'></canvas>
<canvas class='egameCanvas' id='eui' width='416' height='416' style='z-index:100'></canvas>
</div>
<div class="tools">
<div id="tip" v-cloak >
<div v-if="isSelectedBlock" >
<p v-if="isClearBlock" class="infoText">当前选择为清除块,可擦除地图上块</p>
<div v-else>
<p v-if="hasId">图块编号:<span class="infoText">{{ infos['idnum'] }}</span></p>
<p v-if="hasId">图块ID<span class="infoText">{{ infos['id'] }}</span></p>
<p v-else class="warnText">该图块无对应的数字或ID存在请先前往icons.js和maps.js中进行定义</p>
<p>图块所在素材:<span class="infoText">{{ infos['images'] + (isAutotile ? '( '+infos['id']+' )' : '') }}</span></p>
<p>图块索引:<span class="infoText">{{ infos['y'] }}</span></p>
</div> </div>
</div>
<div v-else>
<p v-if="whichShow" v-bind:class="[ (whichShow%2) ? 'warnText' : 'successText']">{{ mapMsg }}</p>
</div>
</div> </div>
</div>
<div id="mid">
<table class="col" id='mapColMark'></table>
<table class="row" id='mapRowMark'></table>
<div class="map" id="mapEdit">
<canvas class='gameCanvas' id='bg' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='event' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='event2' width='416' height='416'></canvas>
<canvas class='egameCanvas' id='eui' width='416' height='416' style='z-index:100'></canvas>
</div>
<div class="tools">
<div id="tip" v-cloak>
<div v-if="isSelectedBlock">
<p v-if="isClearBlock" class="infoText">当前选择为清除块,可擦除地图上块</p>
<div v-else>
<p v-if="hasId">图块编号:<span class="infoText">{{ infos['idnum'] }}</span></p>
<p v-if="hasId">图块ID<span class="infoText">{{ infos['id'] }}</span></p>
<p v-else class="warnText">该图块无对应的数字或ID存在请先前往icons.js和maps.js中进行定义</p>
<p>图块所在素材:<span class="infoText">{{ infos['images'] + (isAutotile ? '( '+infos['id']+' )' : '') }}</span>
</p>
<p>图块索引:<span class="infoText">{{ infos['y'] }}</span></p>
</div>
</div>
<div v-else>
<p v-if="whichShow" v-bind:class="[ (whichShow%2) ? 'warnText' : 'successText']">{{ mapMsg }}</p>
</div>
</div>
<select id="editModeSelect">
<option value="map">地图编辑</option> <select id="editModeSelect">
<option value="loc">地图选点</option> <option value="map">地图编辑</option>
<option value="emenyitem">图块属性</option> <option value="loc">地图选点</option>
<option value="floor">楼层属性</option> <option value="emenyitem">图块属性</option>
<option value="tower">全塔属性</option> <option value="floor">楼层属性</option>
<option value="functions">脚本编辑</option> <option value="tower">全塔属性</option>
<option value="appendpic">追加素材</option> <option value="functions">脚本编辑</option>
</select> <option value="appendpic">追加素材</option>
<br><br><br><br> </select>
<select id="selectFloor"></select> <br><br><br><br>
<input type="button" value="保存地图" id='saveFloor'/> <select id="selectFloor"></select>
<!-- --> <input type="button" value="保存地图" id='saveFloor'/>
<div id="bgSelect" v-cloak style="display:none"> <!-- -->
<span>当前地板: </span> <div id="bgSelect" v-cloak style="display:none">
<select v-model="selectedBg"> <span>当前地板: </span>
<option disabled value="">请选择地板</option> <select v-model="selectedBg">
<option v-for="bg in bgs" v-bind:value="bg"> <option disabled value="">请选择地板</option>
{{ bg }} <option v-for="bg in bgs" v-bind:value="bg">
</option> {{ bg }}
</select> </option>
<div class="selectpng"> </select>
<input class='input' id='pin' v-model="imgname" placeholder="请输入自定义背景文件名"/> <div class="selectpng">
<input class='btn' type="button" value="确定" v-on:click="updatebg"/> <input class='input' id='pin' v-model="imgname" placeholder="请输入自定义背景文件名"/>
</div> <input class='btn' type="button" value="确定" v-on:click="updatebg"/>
</div>
</div>
<!-- -->
</div> </div>
<!-- -->
</div>
</div> </div>
<div id="right"> <div id="right">
<div id="iconLib"> <div id="iconLib">
<canvas class='egameCanvas' id='edata' width='416' height='416' style='z-index:0'></canvas> <canvas class='egameCanvas' id='edata' width='416' height='416' style='z-index:0'></canvas>
<div id="selectBox"> <div id="selectBox">
<div id='dataSelection' v-show="isSelected" v-cloak></div> <div id='dataSelection' v-show="isSelected" v-cloak></div>
</div>
</div> </div>
</div>
</div> </div>
</div> </div>
<!-- <script>/* --> <!-- <script>/* -->
<div id='gameGroup' style='display:none'> <div id='gameGroup' style='display:none'>
<p id='mainTips'>请稍后...</p> <p id='mainTips'>请稍后...</p>
<div id='startPanel'> <div id='startPanel'>
<div id='startTop'> <div id='startTop'>
@ -310,6 +350,8 @@
<img src="project/images/settings.png" class="tools" id='img-settings'> <img src="project/images/settings.png" class="tools" id='img-settings'>
<p class="statusLabel tools" id="hard"></p> <p class="statusLabel tools" id="hard"></p>
</div> </div>
<div id="gif"></div>
<div id="gif2"></div>
<div id="curtain"></div> <div id="curtain"></div>
<!-- <canvas class='gameCanvas' id='bg' width='416' height='416'></canvas> --> <!-- <canvas class='gameCanvas' id='bg' width='416' height='416'></canvas> -->
<!-- <canvas class='gameCanvas' id='event' width='416' height='416'></canvas> --> <!-- <canvas class='gameCanvas' id='event' width='416' height='416'></canvas> -->
@ -320,26 +362,26 @@
<canvas class='gameCanvas' id='weather' width='416' height='416'></canvas> <canvas class='gameCanvas' id='weather' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='ui' width='416' height='416'></canvas> <canvas class='gameCanvas' id='ui' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='data' width='416' height='416'>此浏览器不支持HTML5</canvas> <canvas class='gameCanvas' id='data' width='416' height='416'>此浏览器不支持HTML5</canvas>
</div> </div>
<!-- */</script> --> <!-- */</script> -->
<script> <script>
// 生成定位编号 // 生成定位编号
(function(){ (function () {
var colNum = ' '; var colNum = ' ';
for(var i=0; i<13; i++){ for (var i = 0; i < 13; i++) {
var tpl = '<td>'+i+'<div class="colBlock" style="left:'+(i*32+1)+'px;"></div></td>'; var tpl = '<td>' + i + '<div class="colBlock" style="left:' + (i * 32 + 1) + 'px;"></div></td>';
colNum += tpl; colNum += tpl;
} }
arrColMark.innerHTML = '<tr>'+colNum+'</tr>'; arrColMark.innerHTML = '<tr>' + colNum + '</tr>';
mapColMark.innerHTML = '<tr>'+colNum+'</tr>'; mapColMark.innerHTML = '<tr>' + colNum + '</tr>';
var rowNum = ' '; var rowNum = ' ';
for(var i=0; i<13; i++){ for (var i = 0; i < 13; i++) {
var tpl = '<tr><td>'+i+'<div class="rowBlock" style="top:'+(i*32+1)+'px;"></div></td></tr>'; var tpl = '<tr><td>' + i + '<div class="rowBlock" style="top:' + (i * 32 + 1) + 'px;"></div></td></tr>';
rowNum += tpl; rowNum += tpl;
} }
arrRowMark.innerHTML = rowNum; arrRowMark.innerHTML = rowNum;
mapRowMark.innerHTML = rowNum; mapRowMark.innerHTML = rowNum;
})(); })();
</script> </script>
<!-- =========================================================== --> <!-- =========================================================== -->
@ -353,38 +395,38 @@
<script src='_server/vm.js'></script> <script src='_server/vm.js'></script>
<script id='mainScript' src='main.js'></script> <script id='mainScript' src='main.js'></script>
<script> <script>
//所有全局量 //所有全局量
__all__=['Vue','fs','editor_file','editor_mode','main','core','hasOwnProp','printf','printe','editor','converter','ActionParser','MotaActionFunctions','MotaActionBlocks']; __all__ = ['Vue', 'fs', 'editor_file', 'editor_mode', 'main', 'core', 'hasOwnProp', 'printf', 'printe', 'editor', 'converter', 'ActionParser', 'MotaActionFunctions', 'MotaActionBlocks'];
__id__=['editArea','arrRowMark','mapRowMark','data','bg','dataSelection','blocklyDiv','codeAreaHL','entryType']; __id__ = ['editArea', 'arrRowMark', 'mapRowMark', 'data', 'bg', 'dataSelection', 'blocklyDiv', 'codeAreaHL', 'entryType'];
__Vue__=['exportM','editArea','editTip','clear','tip','selectBox']; __Vue__ = ['editArea', 'exportMap', 'copyMap', 'clearMap', 'deleteMap', 'tip', 'selectBox'];
//var event = document.getElementById('event'); //var event = document.getElementById('event');
var hasOwnProperty = Object.prototype.hasOwnProperty; var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwnProp (obj, key) {
return hasOwnProperty.call(obj, key) function hasOwnProp(obj, key) {
} return hasOwnProperty.call(obj, key)
}
</script> </script>
<script src='_server/editor.js'></script> <script src='_server/editor.js'></script>
<script> <script>
main.init('editor', function() { main.init('editor', function () {
editor.init(function(){ editor.init(function () {
editor.pos={x: 0, y: 0}; editor.pos = {x: 0, y: 0};
editor.mode.loc(); editor.mode.loc();
editor.info=editor.ids[editor.indexs[201]]; editor.info = editor.ids[editor.indexs[201]];
editor.mode.emenyitem(); editor.mode.emenyitem();
editor.mode.floor(); editor.mode.floor();
editor.mode.tower(); editor.mode.tower();
editor.mode.functions(); editor.mode.functions();
editor.mode.showMode('floor'); editor.mode.showMode('floor');
editor.mode.listen(); editor.mode.listen();
editor_multi=editor_multi(); editor_multi = editor_multi();
editor_blockly=editor_blockly(); editor_blockly = editor_blockly();
}); });
}); });
//main.listen();
//main.listen();
</script> </script>
<!-- hightlight textarea --> <!-- hightlight textarea -->

View File

@ -103,6 +103,8 @@
<img src="project/images/settings.png" class="tools" id='img-settings'> <img src="project/images/settings.png" class="tools" id='img-settings'>
<p class="statusLabel tools" id="hard"></p> <p class="statusLabel tools" id="hard"></p>
</div> </div>
<div id="gif"></div>
<div id="gif2"></div>
<div id="curtain"></div> <div id="curtain"></div>
<canvas class='gameCanvas' id='bg' width='416' height='416'></canvas> <canvas class='gameCanvas' id='bg' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='event' width='416' height='416'></canvas> <canvas class='gameCanvas' id='event' width='416' height='416'></canvas>

View File

@ -1245,10 +1245,12 @@ actions.prototype.clickSL = function(x,y) {
// 上一页 // 上一页
if ((x == 3 || x == 4) && y == 12) { if ((x == 3 || x == 4) && y == 12) {
core.ui.drawSLPanel(10*(page-1)+offset); core.ui.drawSLPanel(10*(page-1)+offset);
return;
} }
// 下一页 // 下一页
if ((x == 8 || x == 9) && y == 12) { if ((x == 8 || x == 9) && y == 12) {
core.ui.drawSLPanel(10*(page+1)+offset); core.ui.drawSLPanel(10*(page+1)+offset);
return;
} }
// 返回 // 返回
if (x>=10 && x<=12 && y==12) { if (x>=10 && x<=12 && y==12) {
@ -1258,17 +1260,37 @@ actions.prototype.clickSL = function(x,y) {
} }
return; return;
} }
// 删除
if (x>=0 && x<=2 && y==12) {
core.status.event.selection=!core.status.event.selection;
core.ui.drawSLPanel(index);
return;
}
var index=6*page+1; var id=null;
if (y>=1 && y<=4) { if (y>=1 && y<=4) {
if (x>=1 && x<=3) core.doSL("autoSave", core.status.event.id); if (x>=1 && x<=3) id = "autoSave";
if (x>=5 && x<=7) core.doSL(5*page+1, core.status.event.id); if (x>=5 && x<=7) id = 5*page+1;
if (x>=9 && x<=11) core.doSL(5*page+2, core.status.event.id); if (x>=9 && x<=11) id = 5*page+2;
} }
if (y>=7 && y<=10) { if (y>=7 && y<=10) {
if (x>=1 && x<=3) core.doSL(5*page+3, core.status.event.id); if (x>=1 && x<=3) id = 5*page+3;
if (x>=5 && x<=7) core.doSL(5*page+4, core.status.event.id); if (x>=5 && x<=7) id = 5*page+4;
if (x>=9 && x<=11) core.doSL(5*page+5, core.status.event.id); if (x>=9 && x<=11) id = 5*page+5;
}
if (id!=null) {
if (core.status.event.selection) {
if (id == 'autoSave') {
core.drawTip("无法删除自动存档!");
}
else {
core.removeLocalStorage("save"+id);
core.ui.drawSLPanel(index);
}
}
else {
core.doSL(id, core.status.event.id);
}
} }
} }
@ -1346,6 +1368,15 @@ actions.prototype.keyUpSL = function (keycode) {
} }
return; return;
} }
if (keycode==46) {
if (offset==0) {
core.drawTip("无法删除自动存档!");
}
else {
core.removeLocalStorage("save"+(5*page+offset));
core.ui.drawSLPanel(index);
}
}
} }
////// 系统设置界面时的点击操作 ////// ////// 系统设置界面时的点击操作 //////
@ -1389,15 +1420,21 @@ actions.prototype.clickSwitchs = function (x,y) {
core.ui.drawSwitchs(); core.ui.drawSwitchs();
break; break;
case 4: case 4:
core.flags.displayCritical=!core.flags.displayCritical;
core.updateFg();
core.setLocalStorage('critical', core.flags.displayCritical);
core.ui.drawSwitchs();
break;
case 5:
core.flags.displayExtraDamage=!core.flags.displayExtraDamage; core.flags.displayExtraDamage=!core.flags.displayExtraDamage;
core.updateFg(); core.updateFg();
core.setLocalStorage('extraDamage', core.flags.displayExtraDamage); core.setLocalStorage('extraDamage', core.flags.displayExtraDamage);
core.ui.drawSwitchs(); core.ui.drawSwitchs();
break; break;
case 5: case 6:
window.open(core.firstData.name+".zip", "_blank"); window.open(core.firstData.name+".zip", "_blank");
break; break;
case 6: case 7:
core.status.event.selection=0; core.status.event.selection=0;
core.ui.drawSettings(); core.ui.drawSettings();
break; break;

View File

@ -946,7 +946,7 @@ control.prototype.updateCheckBlock = function() {
core.status.checkBlock.betweenAttack[13*x+y]=true; core.status.checkBlock.betweenAttack[13*x+y]=true;
var leftHp = core.status.hero.hp - core.status.checkBlock.damage[13*x+y]; var leftHp = core.status.hero.hp - core.status.checkBlock.damage[13*x+y];
if (leftHp>1) if (leftHp>1)
core.status.checkBlock.damage[13*x+y] += parseInt((leftHp+(core.flags.betweenAttackCeil?0:1))/2); core.status.checkBlock.damage[13*x+y] += Math.floor((leftHp+(core.flags.betweenAttackCeil?0:1))/2);
} }
} }
} }
@ -1039,21 +1039,28 @@ control.prototype.snipe = function (snipes) {
snipe.blockIcon = core.material.icons[cls][block.event.id]; snipe.blockIcon = core.material.icons[cls][block.event.id];
snipe.blockImage = core.material.images[cls]; snipe.blockImage = core.material.images[cls];
snipe.height = height; snipe.height = height;
var damage = core.enemys.getDamage(block.event.id); var damage = core.enemys.getDamage(block.event.id);
var color = '#000000';
var color = "#000000"; if (damage == null) {
if (damage <= 0) color = '#00FF00'; damage = "???";
else if (damage < core.status.hero.hp / 3) color = '#FFFFFF'; color = '#FF0000';
else if (damage < core.status.hero.hp * 2 / 3) color = '#FFFF00'; }
else if (damage < core.status.hero.hp) color = '#FF7F00'; else {
else color = '#FF0000'; if (damage <= 0) color = '#00FF00';
else if (damage < hero_hp / 3) color = '#FFFFFF';
else if (damage < hero_hp * 2 / 3) color = '#FFFF00';
else if (damage < hero_hp) color = '#FF7F00';
else color = '#FF0000';
if (damage >= 999999999) damage = "???"; damage = core.formatBigNumber(damage);
else if (damage > 100000) damage = (damage / 10000).toFixed(1) + "w"; }
snipe.damage = damage; snipe.damage = damage;
snipe.color = color; snipe.color = color;
snipe.block = core.clone(block); snipe.block = core.clone(block);
}) })
var finishSnipe = function () { var finishSnipe = function () {
@ -1245,7 +1252,7 @@ control.prototype.updateFg = function () {
if (!core.hasItem('book')) return; if (!core.hasItem('book')) return;
core.setFont('fg', "bold 11px Arial"); core.setFont('fg', "bold 11px Arial");
var hero_hp = core.status.hero.hp; var hero_hp = core.status.hero.hp;
if (core.flags.displayEnemyDamage) { if (core.flags.displayEnemyDamage || core.flags.displayCritical) {
core.canvas.fg.textAlign = 'left'; core.canvas.fg.textAlign = 'left';
for (var b = 0; b < mapBlocks.length; b++) { for (var b = 0; b < mapBlocks.length; b++) {
var x = mapBlocks[b].x, y = mapBlocks[b].y; var x = mapBlocks[b].x, y = mapBlocks[b].y;
@ -1264,25 +1271,46 @@ control.prototype.updateFg = function () {
var id = mapBlocks[b].event.id; var id = mapBlocks[b].event.id;
var damage = core.enemys.getDamage(id); if (core.flags.displayEnemyDamage) {
var color = "#000000"; var damage = core.enemys.getDamage(id);
if (damage <= 0) color = '#00FF00'; var color = '#000000';
else if (damage < hero_hp / 3) color = '#FFFFFF';
else if (damage < hero_hp * 2 / 3) color = '#FFFF00';
else if (damage < hero_hp) color = '#FF7F00';
else color = '#FF0000';
if (damage >= 999999999) damage = "???"; if (damage == null) {
else if (damage > 100000) damage = (damage / 10000).toFixed(1) + "w"; damage = "???";
color = '#FF0000';
}
else {
if (damage <= 0) color = '#00FF00';
else if (damage < hero_hp / 3) color = '#FFFFFF';
else if (damage < hero_hp * 2 / 3) color = '#FFFF00';
else if (damage < hero_hp) color = '#FF7F00';
else color = '#FF0000';
core.setFillStyle('fg', '#000000'); damage = core.formatBigNumber(damage);
core.canvas.fg.fillText(damage, 32 * x + 2, 32 * (y + 1) - 2); }
core.canvas.fg.fillText(damage, 32 * x, 32 * (y + 1) - 2);
core.canvas.fg.fillText(damage, 32 * x + 2, 32 * (y + 1));
core.canvas.fg.fillText(damage, 32 * x, 32 * (y + 1));
core.setFillStyle('fg', color); core.setFillStyle('fg', '#000000');
core.canvas.fg.fillText(damage, 32 * x + 1, 32 * (y + 1) - 1); core.canvas.fg.fillText(damage, 32 * x + 2, 32 * (y + 1) - 2);
core.canvas.fg.fillText(damage, 32 * x, 32 * (y + 1) - 2);
core.canvas.fg.fillText(damage, 32 * x + 2, 32 * (y + 1));
core.canvas.fg.fillText(damage, 32 * x, 32 * (y + 1));
core.setFillStyle('fg', color);
core.canvas.fg.fillText(damage, 32 * x + 1, 32 * (y + 1) - 1);
}
// 临界显伤
if (core.flags.displayCritical) {
var critical = core.formatBigNumber(core.enemys.getCritical(id));
if (critical == '???') critical = '?';
core.setFillStyle('fg', '#000000');
core.canvas.fg.fillText(critical, 32 * x + 2, 32 * (y + 1) - 2 - 10);
core.canvas.fg.fillText(critical, 32 * x, 32 * (y + 1) - 2 - 10);
core.canvas.fg.fillText(critical, 32 * x + 2, 32 * (y + 1) - 10);
core.canvas.fg.fillText(critical, 32 * x, 32 * (y + 1) - 10);
core.setFillStyle('fg', '#FFFFFF');
core.canvas.fg.fillText(critical, 32 * x + 1, 32 * (y + 1) - 1 - 10);
}
} }
} }
@ -2075,8 +2103,9 @@ control.prototype.updateStatusBar = function () {
var statusList = ['hpmax', 'hp', 'atk', 'def', 'mdef', 'money', 'experience']; var statusList = ['hpmax', 'hp', 'atk', 'def', 'mdef', 'money', 'experience'];
statusList.forEach(function (item) { statusList.forEach(function (item) {
core.statusBar[item].innerHTML = core.getStatus(item); core.statusBar[item].innerHTML = core.formatBigNumber(core.getStatus(item));
}); });
// 进阶 // 进阶
if (core.flags.enableLevelUp && core.status.hero.lv<core.firstData.levelUp.length) { if (core.flags.enableLevelUp && core.status.hero.lv<core.firstData.levelUp.length) {
core.statusBar.up.innerHTML = core.firstData.levelUp[core.status.hero.lv].need || "&nbsp;"; core.statusBar.up.innerHTML = core.firstData.levelUp[core.status.hero.lv].need || "&nbsp;";
@ -2320,6 +2349,24 @@ control.prototype.resize = function(clientWidth, clientHeight) {
border: '3px #fff solid', border: '3px #fff solid',
} }
}, },
{
id: 'gif',
rules: {
width: (canvasWidth - SPACE*2) + unit,
height:(canvasWidth - SPACE*2) + unit,
top: (canvasTop + SPACE) + unit,
right: SPACE + unit,
}
},
{
id: 'gif2',
rules: {
width: (canvasWidth - SPACE*2) + unit,
height:(canvasWidth - SPACE*2) + unit,
top: (canvasTop + SPACE) + unit,
right: SPACE + unit,
}
},
{ {
id: 'curtain', id: 'curtain',
rules: { rules: {

View File

@ -268,6 +268,7 @@ core.prototype.init = function (coreData, callback) {
// switchs // switchs
core.flags.battleAnimate = core.getLocalStorage('battleAnimate', core.flags.battleAnimate); core.flags.battleAnimate = core.getLocalStorage('battleAnimate', core.flags.battleAnimate);
core.flags.displayEnemyDamage = core.getLocalStorage('enemyDamage', core.flags.displayEnemyDamage); core.flags.displayEnemyDamage = core.getLocalStorage('enemyDamage', core.flags.displayEnemyDamage);
core.flags.displayCritical = core.getLocalStorage('critical', core.flags.displayCritical);
core.flags.displayExtraDamage = core.getLocalStorage('extraDamage', core.flags.displayExtraDamage); core.flags.displayExtraDamage = core.getLocalStorage('extraDamage', core.flags.displayExtraDamage);
core.material.ground = new Image(); core.material.ground = new Image();
@ -873,6 +874,11 @@ core.prototype.formatDate2 = function (date) {
return core.utils.formatDate2(date); return core.utils.formatDate2(date);
} }
////// 格式化大数 //////
core.prototype.formatBigNumber = function (x) {
return core.utils.formatBigNumber(x);
}
////// 两位数显示 ////// ////// 两位数显示 //////
core.prototype.setTwoDigits = function (x) { core.prototype.setTwoDigits = function (x) {
return core.utils.setTwoDigits(x); return core.utils.setTwoDigits(x);

View File

@ -84,17 +84,17 @@ enemys.prototype.getSpecialHint = function (enemy, special) {
case 4: return "2连击怪物每回合攻击2次"; case 4: return "2连击怪物每回合攻击2次";
case 5: return "3连击怪物每回合攻击3次"; case 5: return "3连击怪物每回合攻击3次";
case 6: return (enemy.n||4)+"连击: 怪物每回合攻击"+(enemy.n||4)+"次"; case 6: return (enemy.n||4)+"连击: 怪物每回合攻击"+(enemy.n||4)+"次";
case 7: return "破甲:战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor)+"%作为伤害"; case 7: return "破甲:战斗前,怪物附加角色防御的"+Math.floor(100*core.values.breakArmor||0)+"%作为伤害";
case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+Math.floor(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御";
case 9: return "净化:战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; case 9: return "净化:战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害";
case 10: return "模仿:怪物的攻防和勇士攻防相等"; case 10: return "模仿:怪物的攻防和勇士攻防相等";
case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":""); case 11: return "吸血:战斗前,怪物首先吸取角色的"+Math.floor(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":"");
case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点";
case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点";
case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验";
case 15: return "领域:经过怪物周围"+(enemy.range||1)+"格时自动减生命"+(enemy.value||0)+"点"; case 15: return "领域:经过怪物周围"+(enemy.range||1)+"格时自动减生命"+(enemy.value||0)+"点";
case 16: return "夹击:经过两只相同的怪物中间,勇士生命值变成一半"; case 16: return "夹击:经过两只相同的怪物中间,勇士生命值变成一半";
case 17: return "仇恨:战斗前,怪物附加之前积累的仇恨值作为伤害"+(core.flags.hatredDecrease?";战斗后,释放一半的仇恨值":"")+"。(每杀死一个怪物获得"+core.values.hatred+"点仇恨值)"; case 17: return "仇恨:战斗前,怪物附加之前积累的仇恨值作为伤害"+(core.flags.hatredDecrease?";战斗后,释放一半的仇恨值":"")+"。(每杀死一个怪物获得"+(core.values.hatred||0)+"点仇恨值)";
case 18: return "阻击:经过怪物的十字领域时自动减生命"+(enemy.value||0)+"点,同时怪物后退一格"; case 18: return "阻击:经过怪物的十字领域时自动减生命"+(enemy.value||0)+"点,同时怪物后退一格";
case 19: return "自爆战斗后勇士的生命值变成1"; case 19: return "自爆战斗后勇士的生命值变成1";
case 20: return "无敌:勇士无法打败怪物,除非拥有十字架"; case 20: return "无敌:勇士无法打败怪物,除非拥有十字架";
@ -106,11 +106,17 @@ enemys.prototype.getSpecialHint = function (enemy, special) {
return ""; return "";
} }
////// 能否获胜 //////
enemys.prototype.canBattle = function (monsterId) {
var damage = this.getDamage(monsterId);
return damage != null && damage < core.status.hero.hp;
}
////// 获得某个怪物的伤害 ////// ////// 获得某个怪物的伤害 //////
enemys.prototype.getDamage = function (monsterId) { enemys.prototype.getDamage = function (monsterId) {
var monster = core.material.enemys[monsterId]; var monster = core.material.enemys[monsterId];
var damage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); var damage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef);
if (damage >= 999999999) return damage; if (damage == null) return null;
return damage + this.getExtraDamage(monster); return damage + this.getExtraDamage(monster);
} }
@ -132,17 +138,43 @@ enemys.prototype.getCritical = function (monsterId) {
// 坚固、模仿怪物没有临界! // 坚固、模仿怪物没有临界!
if (this.hasSpecial(monster.special, 3) || this.hasSpecial(monster.special, 10)) return "???"; if (this.hasSpecial(monster.special, 3) || this.hasSpecial(monster.special, 10)) return "???";
var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); if (monster.def + monster.hp/2 <= 0) {
if (last <= 0) return 0; var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef);
if (last == null) return '???';
if (last <= 0) return 0;
for (var i = core.status.hero.atk + 1; i <= monster.hp + monster.def; i++) {
var damage = this.calDamage(monster, core.status.hero.hp, i, core.status.hero.def, core.status.hero.mdef);
if (damage == null) return '???';
if (damage < last)
return core.formatBigNumber(i - core.status.hero.atk);
last = damage;
}
return 0;
for (var i = core.status.hero.atk + 1; i <= monster.hp + monster.def; i++) {
var damage = this.calDamage(monster, core.status.hero.hp, i, core.status.hero.def, core.status.hero.mdef);
if (damage < last)
return i - core.status.hero.atk;
last = damage;
} }
return 0; else {
var info = this.getDamageInfo(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef);
if (info == null) return '???';
if (info.damage <= 0) return 0;
var mon_hp = info.mon_hp, hero_atk = core.status.hero.atk, mon_def = monster.def, turn = info.turn;
// turn 是勇士攻击次数
if (turn<=1) return 0; // 攻杀
// 每回合最小伤害 = ⎡怪物生命/勇士攻击次数⎤
var nextAtk = Math.ceil(mon_hp/(turn-1)) + mon_def;
if (nextAtk <= hero_atk) return 0;
return nextAtk - hero_atk;
}
} }
////// 临界减伤计算 ////// ////// 临界减伤计算 //////
@ -152,9 +184,9 @@ enemys.prototype.getCriticalDamage = function (monsterId) {
if (c <= 0) return 0; if (c <= 0) return 0;
var monster = core.material.enemys[monsterId]; var monster = core.material.enemys[monsterId];
var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); var last = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef);
if (last >= 999999999) return '???'; var now = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk+c, core.status.hero.def, core.status.hero.mdef);
if (last == null || now==null) return '???';
return last - this.calDamage(monster, core.status.hero.hp, core.status.hero.atk + c, core.status.hero.def, core.status.hero.mdef); return last - now;
} }
////// 1防减伤计算 ////// ////// 1防减伤计算 //////
@ -162,12 +194,12 @@ enemys.prototype.getDefDamage = function (monsterId) {
var monster = core.material.enemys[monsterId]; var monster = core.material.enemys[monsterId];
var nowDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef); var nowDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def, core.status.hero.mdef);
var nextDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef); var nextDamage = this.calDamage(monster, core.status.hero.hp, core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef);
if (nowDamage >= 999999999 || nextDamage >= 999999999) return "???"; if (nowDamage == null || nextDamage ==null) return "???";
return nowDamage - nextDamage; return nowDamage - nextDamage;
} }
////// 具体的伤害计算公式 ////// ////// 获得战斗伤害信息 //////
enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, hero_mdef) { enemys.prototype.getDamageInfo = function(monster, hero_hp, hero_atk, hero_def, hero_mdef) {
var mon_hp = monster.hp, mon_atk = monster.atk, mon_def = monster.def, mon_special = monster.special; var mon_hp = monster.hp, mon_atk = monster.atk, mon_def = monster.def, mon_special = monster.special;
hero_hp=Math.max(0, hero_hp); hero_hp=Math.max(0, hero_hp);
@ -176,7 +208,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
hero_mdef=Math.max(0, hero_mdef); hero_mdef=Math.max(0, hero_mdef);
if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross")) // 如果是无敌属性,且勇士未持有十字架 if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross")) // 如果是无敌属性,且勇士未持有十字架
return 999999999; // 返回无限大 return null; // 返回不可战斗
var initDamage = 0; // 战前伤害 var initDamage = 0; // 战前伤害
@ -186,7 +218,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
// 如果有神圣盾免疫吸血等可以在这里写 // 如果有神圣盾免疫吸血等可以在这里写
vampireDamage = parseInt(vampireDamage); vampireDamage = Math.floor(vampireDamage) || 0;
// 加到自身 // 加到自身
if (monster.add) // 如果加到自身 if (monster.add) // 如果加到自身
mon_hp += vampireDamage; mon_hp += vampireDamage;
@ -203,7 +235,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
if (this.hasSpecial(mon_special,2)) hero_def = 0; if (this.hasSpecial(mon_special,2)) hero_def = 0;
// 坚固 // 坚固
if (this.hasSpecial(mon_special,3) && mon_def < hero_atk - 1) mon_def = hero_atk - 1; if (this.hasSpecial(mon_special,3) && mon_def < hero_atk - 1) mon_def = hero_atk - 1;
if (hero_atk <= mon_def) return 999999999; // 不可战斗时请直接返回999999999 if (hero_atk <= mon_def) return null; // 不可战斗时请直接返回null
var per_damage = mon_atk - hero_def; var per_damage = mon_atk - hero_def;
if (per_damage < 0) per_damage = 0; if (per_damage < 0) per_damage = 0;
@ -215,7 +247,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
var counterDamage = 0; var counterDamage = 0;
// 反击 // 反击
if (this.hasSpecial(mon_special, 8)) counterDamage += parseInt(core.values.counterAttack * hero_atk); if (this.hasSpecial(mon_special, 8)) counterDamage += Math.floor(core.values.counterAttack * hero_atk);
// 先攻 // 先攻
if (this.hasSpecial(mon_special, 1)) if (this.hasSpecial(mon_special, 1))
@ -223,20 +255,41 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
// 破甲 // 破甲
if (this.hasSpecial(mon_special, 7)) if (this.hasSpecial(mon_special, 7))
initDamage += parseInt(core.values.breakArmor * hero_def); initDamage += Math.floor(core.values.breakArmor * hero_def);
// 净化 // 净化
if (this.hasSpecial(mon_special, 9)) if (this.hasSpecial(mon_special, 9))
initDamage += parseInt(core.values.purify * hero_mdef); initDamage += Math.floor(core.values.purify * hero_mdef);
var turn = parseInt((mon_hp - 1) / (hero_atk - mon_def)); // turn: 勇士攻击回合数
var ans = initDamage + turn * per_damage + (turn + 1) * counterDamage; var turn = Math.ceil(mon_hp / (hero_atk - mon_def));
var ans = initDamage + (turn - 1) * per_damage + turn * counterDamage;
ans -= hero_mdef; ans -= hero_mdef;
if (!core.flags.enableNegativeDamage) if (!core.flags.enableNegativeDamage)
ans=Math.max(0, ans); ans=Math.max(0, ans);
return ans; return {
"hero_atk": hero_atk,
"hero_def": hero_def,
"hero_mdef": hero_mdef,
"mon_hp": mon_hp,
"mon_atk": mon_atk,
"mon_def": mon_def,
"per_damage": per_damage,
"initDamage": initDamage,
"turn": turn,
"damage": ans
};
}
////// 具体的伤害计算公式 //////
enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, hero_mdef) {
var info = this.getDamageInfo(monster, hero_hp, hero_atk, hero_def, hero_mdef);
if (info == null) return null;
return info.damage;
} }
////// 获得当前楼层的怪物列表 ////// ////// 获得当前楼层的怪物列表 //////

View File

@ -123,11 +123,32 @@ events.prototype.lose = function (reason) {
////// 游戏结束 ////// ////// 游戏结束 //////
events.prototype.gameOver = function (ending, fromReplay) { events.prototype.gameOver = function (ending, fromReplay) {
// 下载录像
var confirmDownload = function () {
core.ui.closePanel();
setTimeout(function () {
core.ui.drawConfirmBox("你想下载录像吗?", function () {
var obj = {
'name': core.firstData.name,
'version': core.firstData.version,
'hard': core.status.hard,
'route': core.encodeRoute(core.status.route)
}
core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5route", JSON.stringify(obj));
core.restart();
}, function () {
core.restart();
})
}, 150);
}
// 上传成绩 // 上传成绩
var confirmUpload = function () { var confirmUpload = function () {
core.ui.closePanel();
if (!core.isset(ending)) { if (!core.isset(ending)) {
core.restart(); confirmDownload();
return; return;
} }
@ -154,8 +175,7 @@ events.prototype.gameOver = function (ending, fromReplay) {
formData.append('route', core.encodeRoute(core.status.route)); formData.append('route', core.encodeRoute(core.status.route));
core.http("POST", "/games/upload.php", formData); core.http("POST", "/games/upload.php", formData);
confirmDownload();
core.restart();
} }
core.ui.drawConfirmBox("你想记录你的ID和成绩吗", function () { core.ui.drawConfirmBox("你想记录你的ID和成绩吗", function () {
@ -167,30 +187,14 @@ events.prototype.gameOver = function (ending, fromReplay) {
return; return;
} }
// 下载录像
var confirmDownload = function () {
core.ui.closePanel();
core.ui.drawConfirmBox("你想下载录像吗?", function () {
var obj = {
'name': core.firstData.name,
'version': core.firstData.version,
'hard': core.status.hard,
'route': core.encodeRoute(core.status.route)
}
core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5route", JSON.stringify(obj));
confirmUpload();
}, function () {
confirmUpload();
})
}
if (fromReplay) { if (fromReplay) {
core.drawText("录像回放完毕!", function () { core.drawText("录像回放完毕!", function () {
core.restart(); core.restart();
}); });
} }
else { else {
confirmDownload(); // confirmDownload();
confirmUpload();
} }
} }
@ -386,13 +390,15 @@ events.prototype.doAction = function() {
}); });
break; break;
case "changeFloor": // 楼层转换 case "changeFloor": // 楼层转换
var heroLoc = {"x": data.loc[0], "y": data.loc[1]}; {
if (core.isset(data.direction)) heroLoc.direction=data.direction; var heroLoc = {"x": data.loc[0], "y": data.loc[1]};
core.changeFloor(data.floorId||core.status.floorId, null, heroLoc, data.time, function() { if (core.isset(data.direction)) heroLoc.direction=data.direction;
core.lockControl(); core.changeFloor(data.floorId||core.status.floorId, null, heroLoc, data.time, function() {
core.events.doAction(); core.lockControl();
}); core.events.doAction();
break; });
break;
}
case "changePos": // 直接更换勇士位置,不切换楼层 case "changePos": // 直接更换勇士位置,不切换楼层
core.clearMap('hero', 0, 0, 416, 416); core.clearMap('hero', 0, 0, 416, 416);
if (core.isset(data.loc)) { if (core.isset(data.loc)) {
@ -410,6 +416,36 @@ events.prototype.doAction = function() {
else core.clearMap('animate', 0, 0, 416, 416); else core.clearMap('animate', 0, 0, 416, 416);
this.doAction(); this.doAction();
break; break;
case "animateImage": // 淡入淡出图片
if (core.status.replay.replaying) { // 正在播放录像
this.doAction();
}
else {
if (core.isset(data.loc) && core.isset(core.material.images.images[data.name]) && (data.action=="show" || data.action=="hide")) {
core.events.animateImage(data.action, core.material.images.images[data.name], data.loc, data.time, function() {
core.events.doAction();
});
}
else {
this.doAction();
}
}
break;
case "showGif": // 显示动图
if (core.isset(data.loc) && core.isset(core.material.images.images[data.name])) {
var gif = new Image();
gif.src = core.material.images.images[data.name].src;
gif.style.position = 'absolute';
gif.style.left = (data.loc[0]*core.domStyle.scale)+"px";
gif.style.top = (data.loc[1]*core.domStyle.scale)+"px";
core.dom.gif2.appendChild(gif);
}
else {
while (core.dom.gif2.firstChild)
core.dom.gif2.removeChild(core.dom.gif2.firstChild);
}
this.doAction();
break;
case "setFg": // 颜色渐变 case "setFg": // 颜色渐变
core.setFg(data.color, data.time, function() { core.setFg(data.color, data.time, function() {
core.events.doAction(); core.events.doAction();
@ -420,21 +456,23 @@ events.prototype.doAction = function() {
this.doAction(); this.doAction();
break; break;
case "openDoor": // 开一个门,包括暗墙 case "openDoor": // 开一个门,包括暗墙
var floorId=data.floorId || core.status.floorId; {
var block=core.getBlock(data.loc[0], data.loc[1], floorId); var floorId=data.floorId || core.status.floorId;
if (block!=null) { var block=core.getBlock(data.loc[0], data.loc[1], floorId);
if (floorId==core.status.floorId) if (block!=null) {
core.openDoor(block.block.event.id, block.block.x, block.block.y, false, function() { if (floorId==core.status.floorId)
core.events.doAction(); core.openDoor(block.block.event.id, block.block.x, block.block.y, false, function() {
}) core.events.doAction();
else { })
core.removeBlock(block.block.x,block.block.y,floorId); else {
this.doAction(); core.removeBlock(block.block.x,block.block.y,floorId);
this.doAction();
}
break;
} }
this.doAction();
break; break;
} }
this.doAction();
break;
case "openShop": // 打开一个全局商店 case "openShop": // 打开一个全局商店
if (core.status.replay.replaying) { // 正在播放录像简单将visited置为true if (core.status.replay.replaying) { // 正在播放录像简单将visited置为true
core.status.shops[data.id].visited=true; core.status.shops[data.id].visited=true;
@ -454,21 +492,24 @@ events.prototype.doAction = function() {
}) })
break; break;
case "trigger": // 触发另一个事件;当前事件会被立刻结束。需要另一个地点的事件是有效的 case "trigger": // 触发另一个事件;当前事件会被立刻结束。需要另一个地点的事件是有效的
var toX=data.loc[0], toY=data.loc[1]; {
var block=core.getBlock(toX, toY); var toX=data.loc[0], toY=data.loc[1];
if (block!=null) { var block=core.getBlock(toX, toY);
block = block.block; if (block!=null) {
if (core.isset(block.event) && block.event.trigger=='action') { block = block.block;
// 触发 if (core.isset(block.event) && block.event.trigger=='action') {
core.status.event.data.list = core.clone(block.event.data); // 触发
core.status.event.data.x=block.x; core.status.event.data.list = core.clone(block.event.data);
core.status.event.data.y=block.y; core.status.event.data.x=block.x;
core.status.event.data.y=block.y;
}
} }
this.doAction();
break;
} }
this.doAction();
break;
case "playSound": case "playSound":
core.playSound(data.name); if (!core.status.replay.replaying)
core.playSound(data.name);
this.doAction(); this.doAction();
break; break;
case "playBgm": case "playBgm":
@ -488,7 +529,7 @@ events.prototype.doAction = function() {
var value=core.calValue(data.value); var value=core.calValue(data.value);
// 属性 // 属性
if (data.name.indexOf("status:")==0) { if (data.name.indexOf("status:")==0) {
value=parseInt(value); value=parseFloat(value);
core.setStatus(data.name.substring(7), value); core.setStatus(data.name.substring(7), value);
} }
// 道具 // 道具
@ -581,35 +622,43 @@ events.prototype.doAction = function() {
}); });
break; break;
case "function": case "function":
var func = data["function"]; {
if (core.isset(func)) { var func = data["function"];
if ((typeof func == "string") && func.indexOf("function")==0) { if (core.isset(func)) {
eval('('+func+')()'); if ((typeof func == "string") && func.indexOf("function")==0) {
eval('('+func+')()');
}
else if (func instanceof Function)
func();
} }
else if (func instanceof Function) this.doAction();
func(); break;
} }
this.doAction();
break;
case "update": case "update":
core.updateStatusBar(); core.updateStatusBar();
this.doAction(); this.doAction();
break; break;
case "sleep": // 等待多少毫秒 case "sleep": // 等待多少毫秒
setTimeout(function () { if (core.status.replay.replaying)
core.events.doAction(); core.events.doAction();
}, data.time); else {
setTimeout(function () {
core.events.doAction();
}, data.time);
}
break; break;
case "revisit": // 立刻重新执行该事件 case "revisit": // 立刻重新执行该事件
var block=core.getBlock(x,y); // 重新获得事件 {
if (block!=null) { var block=core.getBlock(x,y); // 重新获得事件
block = block.block; if (block!=null) {
if (core.isset(block.event) && block.event.trigger=='action') { block = block.block;
core.status.event.data.list = core.clone(block.event.data); if (core.isset(block.event) && block.event.trigger=='action') {
core.status.event.data.list = core.clone(block.event.data);
}
} }
this.doAction();
break;
} }
this.doAction();
break;
case "exit": // 立刻结束事件 case "exit": // 立刻结束事件
core.status.event.data.list = []; core.status.event.data.list = [];
core.events.doAction(); core.events.doAction();
@ -732,9 +781,8 @@ events.prototype.battle = function (id, x, y, force, callback) {
core.stopHero(); core.stopHero();
core.stopAutomaticRoute(); core.stopAutomaticRoute();
var damage = core.enemys.getDamage(id);
// 非强制战斗 // 非强制战斗
if (damage >= core.status.hero.hp && !force) { if (!core.enemys.canBattle(id) && !force) {
core.drawTip("你打不过此怪物!"); core.drawTip("你打不过此怪物!");
core.clearContinueAutomaticRoute(); core.clearContinueAutomaticRoute();
return; return;
@ -885,6 +933,10 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback
} }
else core.setWeather(); else core.setWeather();
// 清除gif
while (core.dom.gif.firstChild)
core.dom.gif.removeChild(core.dom.gif.firstChild);
// 检查重生 // 检查重生
if (!core.isset(fromLoad)) { if (!core.isset(fromLoad)) {
core.status.maps[floorId].blocks.forEach(function(block) { core.status.maps[floorId].blocks.forEach(function(block) {
@ -894,7 +946,6 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback
} }
}) })
} }
core.drawMap(floorId, function () { core.drawMap(floorId, function () {
setTimeout(function() { setTimeout(function() {
if (core.isset(heroLoc.direction)) if (core.isset(heroLoc.direction))
@ -933,6 +984,37 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback
}, 25); }, 25);
} }
////// 图片淡入/淡出 //////
events.prototype.animateImage = function (type, image, loc, time, callback) {
time = time||0;
if ((type!='show' && type!='hide') || time<=0) {
if (core.isset(callback)) callback();
return;
}
clearInterval(core.interval.tipAnimate);
core.setAlpha('data', 1);
var opacityVal = 0;
if (type == 'hide') opacityVal = 1;
core.setOpacity('data', opacityVal);
core.canvas.data.drawImage(image, loc[0], loc[1]);
core.status.replay.animate=true;
var animate = setInterval(function () {
if (type=='show') opacityVal += 0.1;
else opacityVal -= 0.1;
core.setOpacity('data', opacityVal);
if (opacityVal >=1 || opacityVal<=0) {
clearInterval(animate);
core.clearMap('data', 0, 0, 416, 416);
core.setOpacity('data', 1);
core.status.replay.animate=false;
if (core.isset(callback)) callback();
}
}, time / 10 / core.status.replay.speed);
}
////// 打开一个全局商店 ////// ////// 打开一个全局商店 //////
events.prototype.openShop = function(shopId, needVisited) { events.prototype.openShop = function(shopId, needVisited) {
var shop = core.status.shops[shopId]; var shop = core.status.shops[shopId];

View File

@ -171,8 +171,8 @@ loader.prototype.loadMusic = function () {
} }
else { else {
var music = new Audio(); var music = new Audio();
music.preload = core.musicStatus.startDirectly?'auto':'none'; music.preload = 'none';
if (main.bgmRemote) music.src = 'https://gitee.com/ckcz123/h5music/raw/master/'+core.firstData.name+'/'+t; if (main.bgmRemote) music.src = main.bgmRemoteRoot+core.firstData.name+'/'+t;
else music.src = 'project/sounds/'+t; else music.src = 'project/sounds/'+t;
music.loop = 'loop'; music.loop = 'loop';
core.material.bgms[t] = music; core.material.bgms[t] = music;

View File

@ -328,8 +328,19 @@ maps.prototype.drawMap = function (mapName, callback) {
if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) {
dx*=32; dy*=32; dx*=32; dy*=32;
var image = core.material.images.images[p]; var image = core.material.images.images[p];
if (!t[3]) if (!t[3]) {
core.canvas.bg.drawImage(image, dx*ratio, dy*ratio, Math.min(size-dx*ratio, ratio*image.width), Math.min(size-dy*ratio, ratio*image.height)); core.canvas.bg.drawImage(image, dx * ratio, dy * ratio, Math.min(size - dx * ratio, ratio * image.width), Math.min(size - dy * ratio, ratio * image.height));
if (/.*\.gif/i.test(p)) {
while (core.dom.gif.firstChild)
core.dom.gif.removeChild(core.dom.gif.firstChild);
var gif = new Image();
gif.src = core.material.images.images[p].src;
gif.style.position = 'absolute';
gif.style.left = (dx*core.domStyle.scale)+"px";
gif.style.top = (dy*core.domStyle.scale)+"px";
core.dom.gif.appendChild(gif);
}
}
else else
core.canvas.event2.drawImage(image, dx*ratio, dy*ratio, Math.min(size-dx*ratio, ratio*image.width), Math.min(size-dy*ratio, ratio*image.height)); core.canvas.event2.drawImage(image, dx*ratio, dy*ratio, Math.min(size-dx*ratio, ratio*image.width), Math.min(size-dy*ratio, ratio*image.height));
} }
@ -669,9 +680,6 @@ maps.prototype.animateBlock = function (loc,type,time,callback) {
if (type=='show') opacityVal += 0.1; if (type=='show') opacityVal += 0.1;
else opacityVal -= 0.1; else opacityVal -= 0.1;
core.setOpacity('animate', opacityVal); core.setOpacity('animate', opacityVal);
core.clearMap('animate',0,0,416,416);
draw();
if (opacityVal >=1 || opacityVal<=0) { if (opacityVal >=1 || opacityVal<=0) {
clearInterval(animate); clearInterval(animate);
core.clearMap('animate', 0, 0, 416, 416); core.clearMap('animate', 0, 0, 416, 416);

View File

@ -734,6 +734,7 @@ ui.prototype.drawSwitchs = function() {
"背景音效:"+(core.musicStatus.soundStatus ? "[ON]" : "[OFF]"), "背景音效:"+(core.musicStatus.soundStatus ? "[ON]" : "[OFF]"),
"战斗动画: "+(core.flags.battleAnimate ? "[ON]" : "[OFF]"), "战斗动画: "+(core.flags.battleAnimate ? "[ON]" : "[OFF]"),
"怪物显伤: "+(core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"), "怪物显伤: "+(core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"),
"临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"),
"领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), "领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"),
"下载离线版本", "下载离线版本",
"返回主菜单" "返回主菜单"
@ -787,7 +788,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) {
// 如果有神圣盾免疫吸血等可以在这里写 // 如果有神圣盾免疫吸血等可以在这里写
vampireDamage = parseInt(vampireDamage); vampireDamage = Math.floor(vampireDamage);
// 加到自身 // 加到自身
if (monster.add) // 如果加到自身 if (monster.add) // 如果加到自身
mon_hp += vampireDamage; mon_hp += vampireDamage;
@ -815,8 +816,8 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) {
if (core.enemys.hasSpecial(mon_special, 6)) turns=1+(monster.n||4); if (core.enemys.hasSpecial(mon_special, 6)) turns=1+(monster.n||4);
// 初始伤害 // 初始伤害
if (core.enemys.hasSpecial(mon_special, 7)) initDamage+=parseInt(core.values.breakArmor * hero_def); if (core.enemys.hasSpecial(mon_special, 7)) initDamage+=Math.floor(core.values.breakArmor * hero_def);
if (core.enemys.hasSpecial(mon_special, 9)) initDamage+=parseInt(core.values.purify * hero_mdef); if (core.enemys.hasSpecial(mon_special, 9)) initDamage+=Math.floor(core.values.purify * hero_mdef);
hero_mdef-=initDamage; hero_mdef-=initDamage;
if (hero_mdef<0) { if (hero_mdef<0) {
hero_hp+=hero_mdef; hero_hp+=hero_mdef;
@ -1001,7 +1002,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) {
// 反击 // 反击
if (core.enemys.hasSpecial(mon_special, 8)) { if (core.enemys.hasSpecial(mon_special, 8)) {
hero_mdef -= parseInt(core.values.counterAttack * hero_atk); hero_mdef -= Math.floor(core.values.counterAttack * hero_atk);
if (hero_mdef<0) { if (hero_mdef<0) {
hero_hp+=hero_mdef; hero_hp+=hero_mdef;
@ -1247,16 +1248,16 @@ ui.prototype.drawBook = function (index) {
} }
core.canvas.ui.textAlign = "left"; core.canvas.ui.textAlign = "left";
core.fillText('ui', '生命', 165, 62 * i + 32, '#DDDDDD', '13px Verdana'); core.fillText('ui', '生命', 165, 62 * i + 32, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.hp, 195, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.hp), 195, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '攻击', 255, 62 * i + 32, '#DDDDDD', '13px Verdana'); core.fillText('ui', '攻击', 255, 62 * i + 32, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.atk, 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.atk), 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '防御', 335, 62 * i + 32, '#DDDDDD', '13px Verdana'); core.fillText('ui', '防御', 335, 62 * i + 32, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.def, 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.def), 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana');
var expOffset = 165, line_cnt=0; var expOffset = 165, line_cnt=0;
if (core.flags.enableMoney) { if (core.flags.enableMoney) {
core.fillText('ui', '金币', 165, 62 * i + 50, '#DDDDDD', '13px Verdana'); core.fillText('ui', '金币', 165, 62 * i + 50, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.money, 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.money), 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
expOffset = 255; expOffset = 255;
line_cnt++; line_cnt++;
} }
@ -1265,7 +1266,7 @@ ui.prototype.drawBook = function (index) {
if (core.flags.enableAddPoint) { if (core.flags.enableAddPoint) {
core.canvas.ui.textAlign = "left"; core.canvas.ui.textAlign = "left";
core.fillText('ui', '加点', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana'); core.fillText('ui', '加点', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.point, expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.point), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
expOffset = 255; expOffset = 255;
line_cnt++; line_cnt++;
} }
@ -1273,7 +1274,7 @@ ui.prototype.drawBook = function (index) {
if (core.flags.enableExperience && line_cnt<2) { if (core.flags.enableExperience && line_cnt<2) {
core.canvas.ui.textAlign = "left"; core.canvas.ui.textAlign = "left";
core.fillText('ui', '经验', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana'); core.fillText('ui', '经验', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.experience, expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.experience), expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana');
line_cnt++; line_cnt++;
} }
@ -1281,31 +1282,30 @@ ui.prototype.drawBook = function (index) {
if (line_cnt==1) damageOffset=326; if (line_cnt==1) damageOffset=326;
if (line_cnt==2) damageOffset=361; if (line_cnt==2) damageOffset=361;
/*
var damageOffet = 281;
if (core.flags.enableMoney && core.flags.enableExperience)
damageOffet = 361;
else if (core.flags.enableMoney || core.flags.enableExperience)
damageOffet = 326;
*/
core.canvas.ui.textAlign = "center"; core.canvas.ui.textAlign = "center";
var damage = enemy.damage; var damage = enemy.damage;
var color = '#FFFF00'; var color = '#FFFF00';
if (damage >= core.status.hero.hp) color = '#FF0000'; if (damage == null) {
if (damage <= 0) color = '#00FF00'; damage = '无法战斗';
if (damage >= 999999999) damage = '无法战斗'; color = '#FF0000';
}
else {
if (damage >= core.status.hero.hp) color = '#FF0000';
if (damage<=0) color = '#00FF00';
damage = core.formatBigNumber(damage);
}
core.fillText('ui', damage, damageOffset, 62 * i + 50, color, 'bold 13px Verdana'); core.fillText('ui', damage, damageOffset, 62 * i + 50, color, 'bold 13px Verdana');
core.canvas.ui.textAlign = "left"; core.canvas.ui.textAlign = "left";
core.fillText('ui', '临界', 165, 62 * i + 68, '#DDDDDD', '13px Verdana'); core.fillText('ui', '临界', 165, 62 * i + 68, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.critical, 195, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.critical), 195, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '减伤', 255, 62 * i + 68, '#DDDDDD', '13px Verdana'); core.fillText('ui', '减伤', 255, 62 * i + 68, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.criticalDamage, 285, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.criticalDamage), 285, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
core.fillText('ui', '1防', 335, 62 * i + 68, '#DDDDDD', '13px Verdana'); core.fillText('ui', '1防', 335, 62 * i + 68, '#DDDDDD', '13px Verdana');
core.fillText('ui', enemy.defDamage, 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', core.formatBigNumber(enemy.defDamage), 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana');
if (index == start+i) { if (index == start+i) {
core.strokeRect('ui', 10, 62 * i + 13, 416-10*2, 62, '#FFD700'); core.strokeRect('ui', 10, 62 * i + 13, 416-10*2, 62, '#FFD700');
@ -1327,10 +1327,9 @@ ui.prototype.drawBookDetail = function (index) {
var enemyId=enemy.id; var enemyId=enemy.id;
var hints=core.enemys.getSpecialHint(core.material.enemys[enemyId]); var hints=core.enemys.getSpecialHint(core.material.enemys[enemyId]);
if (hints.length==0) {
core.drawTip("该怪物无特殊属性!"); if (hints.length==0)
return; hints.push("该怪物无特殊属性。");
}
var content=hints.join("\n"); var content=hints.join("\n");
core.status.event.id = 'book-detail'; core.status.event.id = 'book-detail';
@ -1573,13 +1572,16 @@ ui.prototype.drawSLPanel = function(index) {
var u=416/6, size=118; var u=416/6, size=118;
var strokeColor = '#FFD700';
if (core.status.event.selection) strokeColor = '#FF6A6A';
var name=core.status.event.id=='save'?"存档":"读档"; var name=core.status.event.id=='save'?"存档":"读档";
for (var i=0;i<6;i++) { for (var i=0;i<6;i++) {
var id=5*page+i; var id=5*page+i;
var data=core.getLocalStorage(i==0?"autoSave":"save"+id, null); var data=core.getLocalStorage(i==0?"autoSave":"save"+id, null);
if (i<3) { if (i<3) {
core.fillText('ui', i==0?"自动存档":name+id, (2*i+1)*u, 35, '#FFFFFF', "bold 17px Verdana"); core.fillText('ui', i==0?"自动存档":name+id, (2*i+1)*u, 35, '#FFFFFF', "bold 17px Verdana");
core.strokeRect('ui', (2*i+1)*u-size/2, 50, size, size, i==offset?'#FFD700':'#FFFFFF', i==offset?6:2); core.strokeRect('ui', (2*i+1)*u-size/2, 50, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2);
if (core.isset(data) && core.isset(data.floorId)) { if (core.isset(data) && core.isset(data.floorId)) {
this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc); this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc);
core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 65+size, '#FFFFFF', '10px Verdana'); core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 65+size, '#FFFFFF', '10px Verdana');
@ -1591,7 +1593,7 @@ ui.prototype.drawSLPanel = function(index) {
} }
else { else {
core.fillText('ui', name+id, (2*i-5)*u, 230, '#FFFFFF', "bold 17px Verdana"); core.fillText('ui', name+id, (2*i-5)*u, 230, '#FFFFFF', "bold 17px Verdana");
core.strokeRect('ui', (2*i-5)*u-size/2, 245, size, size, i==offset?'#FFD700':'#FFFFFF', i==offset?6:2); core.strokeRect('ui', (2*i-5)*u-size/2, 245, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2);
if (core.isset(data) && core.isset(data.floorId)) { if (core.isset(data) && core.isset(data.floorId)) {
this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc); this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc);
core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 260+size, '#FFFFFF', '10px Verdana'); core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 260+size, '#FFFFFF', '10px Verdana');
@ -1603,6 +1605,11 @@ ui.prototype.drawSLPanel = function(index) {
} }
} }
this.drawPagination(page+1, 30); this.drawPagination(page+1, 30);
if (core.status.event.selection)
core.setFillStyle('ui', '#FF6A6A');
core.fillText('ui', '删除模式', 48, 403);
} }
////// 绘制一个缩略图 ////// ////// 绘制一个缩略图 //////

View File

@ -145,6 +145,29 @@ utils.prototype.setTwoDigits = function (x) {
return parseInt(x)<10?"0"+x:x; return parseInt(x)<10?"0"+x:x;
} }
utils.prototype.formatBigNumber = function (x) {
x = parseFloat(x);
if (!core.isset(x)) return '???';
var all = [
{"val": 10e20, "c": "g"},
{"val": 10e16, "c": "j"},
{"val": 10e12, "c": "z"},
{"val": 10e8, "c": "e"},
{"val": 10e4, "c": "w"},
]
for (var i=0;i<all.length;i++) {
var one = all[i];
if (x>=10*one.val) {
var v = x/one.val;
return v.toFixed(Math.max(0, Math.floor(4-Math.log10(v)))) + one.c;
}
}
return x;
}
////// 数组转RGB ////// ////// 数组转RGB //////
utils.prototype.arrayToRGB = function (color) { utils.prototype.arrayToRGB = function (color) {
var nowR = parseInt(color[0])||0, nowG = parseInt(color[1])||0, nowB = parseInt(color[2])||0; var nowR = parseInt(color[0])||0, nowG = parseInt(color[1])||0, nowB = parseInt(color[2])||0;
@ -278,7 +301,7 @@ utils.prototype.readFile = function (success, error, readType) {
if (core.platform.fileInput==null) { if (core.platform.fileInput==null) {
core.platform.fileInput = document.createElement("input"); core.platform.fileInput = document.createElement("input");
core.platform.fileInput.style.display = 'none'; core.platform.fileInput.style.opacity = 0;
core.platform.fileInput.type = 'file'; core.platform.fileInput.type = 'file';
core.platform.fileInput.onchange = function () { core.platform.fileInput.onchange = function () {
var files = core.platform.fileInput.files; var files = core.platform.fileInput.files;
@ -301,6 +324,11 @@ utils.prototype.readFile = function (success, error, readType) {
////// 下载文件到本地 ////// ////// 下载文件到本地 //////
utils.prototype.download = function (filename, content) { utils.prototype.download = function (filename, content) {
if (core.isset(window.jsinterface)) {
window.jsinterface.download(filename, content);
return;
}
// Step 0: 不为http/https直接不支持 // Step 0: 不为http/https直接不支持
if (!core.platform.isOnline) { if (!core.platform.isOnline) {
alert("离线状态下不支持下载操作!"); alert("离线状态下不支持下载操作!");

30
main.js
View File

@ -10,6 +10,7 @@ function main() {
// 如果要进行剧本的修改请务必将其改成false。 // 如果要进行剧本的修改请务必将其改成false。
this.bgmRemote = false; // 是否采用远程BGM this.bgmRemote = false; // 是否采用远程BGM
this.bgmRemoteRoot = "https://gitee.com/ckcz123/h5music/raw/master/"; // 远程BGM的根目录
//------------------------ 用户修改内容 END ------------------------// //------------------------ 用户修改内容 END ------------------------//
@ -35,6 +36,8 @@ function main() {
'toolBar': document.getElementById('toolBar'), 'toolBar': document.getElementById('toolBar'),
'tools': document.getElementsByClassName('tools'), 'tools': document.getElementsByClassName('tools'),
'gameCanvas': document.getElementsByClassName('gameCanvas'), 'gameCanvas': document.getElementsByClassName('gameCanvas'),
'gif': document.getElementById('gif'),
'gif2': document.getElementById('gif2'),
'curtain': document.getElementById('curtain'), 'curtain': document.getElementById('curtain'),
'startButtons': document.getElementById('startButtons'), 'startButtons': document.getElementById('startButtons'),
'playGame': document.getElementById('playGame'), 'playGame': document.getElementById('playGame'),
@ -174,17 +177,26 @@ main.prototype.init = function (mode, callback) {
////// 动态加载所有核心JS文件 ////// ////// 动态加载所有核心JS文件 //////
main.prototype.loaderJs = function (dir, loadList, callback) { main.prototype.loaderJs = function (dir, loadList, callback) {
var instanceNum = 0;
// 加载js // 加载js
main.setMainTipsText('正在加载核心js文件...') main.setMainTipsText('正在加载核心js文件...')
for (var i = 0; i < loadList.length; i++) {
main.loadMod(dir, loadList[i], function (modName) { if (this.useCompress) {
main.setMainTipsText(modName + '.js 加载完毕'); main.loadMod(dir, dir, function () {
instanceNum++; callback();
if (instanceNum === loadList.length) { })
callback(); }
} else {
}); var instanceNum = 0;
for (var i = 0; i < loadList.length; i++) {
main.loadMod(dir, loadList[i], function (modName) {
main.setMainTipsText(modName + '.js 加载完毕');
instanceNum++;
if (instanceNum === loadList.length) {
callback();
}
});
}
} }
} }

View File

@ -488,6 +488,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"_bool": "bool", "_bool": "bool",
"_data": "是否地图怪物显伤;用户可以手动在菜单栏中开关" "_data": "是否地图怪物显伤;用户可以手动在菜单栏中开关"
}, },
"displayCritical": {
"_leaf": true,
"_type": "checkbox",
"_bool": "bool",
"_data": "是否地图显示临界;用户可以手动在菜单栏中开关"
},
"displayExtraDamage": { "displayExtraDamage": {
"_leaf": true, "_leaf": true,
"_type": "checkbox", "_type": "checkbox",

View File

@ -5,13 +5,13 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
"sample0", "sample1", "sample2", "MT0" "sample0", "sample1", "sample2", "MT0"
], ],
"images" : [ "images" : [
"bg.jpg", "bg.jpg"
], ],
"animates" : [ "animates" : [
"hand", "sword", "zone", "yongchang", "hand", "sword", "zone",
], ],
"bgms" : [ "bgms" : [
'bgm.mp3', 'qianjin.mid', 'star.mid', 'bgm.mp3'
], ],
"sounds" : [ "sounds" : [
'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg', 'zone.ogg' 'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg', 'zone.ogg'
@ -142,13 +142,13 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
"enableLevelUp": false, "enableLevelUp": false,
"enableDebuff": false, "enableDebuff": false,
"flyNearStair": true, "flyNearStair": true,
"pickaxeFourDirections": true, "pickaxeFourDirections": false,
"bombFourDirections": true, "bombFourDirections": false,
"bigKeyIsBox": false, "bigKeyIsBox": false,
"equipment": true, "equipment": false,
"enableDeleteItem": true, "enableDeleteItem": true,
"enableAddPoint": false, "enableAddPoint": false,
"enableNegativeDamage": true, "enableNegativeDamage": false,
"hatredDecrease": true, "hatredDecrease": true,
"betweenAttackCeil": false, "betweenAttackCeil": false,
"startDirectly": false, "startDirectly": false,
@ -156,6 +156,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
"showBattleAnimateConfirm": true, "showBattleAnimateConfirm": true,
"battleAnimate": true, "battleAnimate": true,
"displayEnemyDamage": true, "displayEnemyDamage": true,
"displayCritical": true,
"displayExtraDamage": true, "displayExtraDamage": true,
"enableGentleClick": true, "enableGentleClick": true,
"potionWhileRouting": false, "potionWhileRouting": false,

View File

@ -15,19 +15,19 @@ main.floors.sample0 =
"bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。 "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。
"item_ratio": 2, // 该层的宝石/血瓶倍率 "item_ratio": 2, // 该层的宝石/血瓶倍率
"map": [ // 地图数据需要是13x13建议使用地图生成器来生成 "map": [ // 地图数据需要是13x13建议使用地图生成器来生成
[0, 0, 220, 0, 0, 20, 87, 3, 65, 64, 44, 43, 42], [ 0, 0,220, 0, 0, 20, 87, 3, 65, 64, 44, 43, 42],
[0, 246, 0, 246, 0, 20, 0, 3, 58, 59, 60, 61, 41], [ 0,246, 0,246, 0, 20, 0, 3, 58, 59, 60, 61, 41],
[219, 0, 0, 0, 219, 20, 0, 3, 57, 26, 62, 63, 40], [219, 0, 0, 0,219, 20, 0, 3, 57, 26, 62, 63, 40],
[20, 20, 125, 20, 20, 20, 0, 3, 53, 54, 55, 56, 39], [ 20, 20,115, 20, 20, 20, 0, 3, 53, 54, 55, 56, 39],
[216, 247, 263, 235, 248, 6, 0, 3, 49, 50, 51, 52, 38], [216,247,263,235,248, 6, 0, 3, 49, 50, 51, 52, 38],
[6, 6, 125, 6, 6, 6, 0, 1, 45, 46, 47, 48, 37], [ 6, 6,115, 6, 6, 6, 0, 1, 45, 46, 47, 48, 37],
[224, 254, 212, 262, 204, 5, 0, 1, 31, 32, 34, 33, 36], [224,254,212,262,204, 5, 0, 1, 31, 32, 34, 33, 36],
[201, 261, 217, 264, 207, 5, 0, 1, 27, 28, 29, 30, 35], [201,261,217,264,207, 5, 0, 1, 27, 28, 29, 30, 35],
[5, 5, 125, 5, 5, 5, 0, 1, 21, 22, 23, 24, 25], [ 5, 5,115, 5, 5, 5, 0, 1, 21, 22, 23, 24, 25],
[0, 0, 237, 0, 0, 0, 45, 1, 1, 1, 121, 1, 1], [ 0, 0,237, 0, 0, 0, 45, 1, 1, 1,111, 1, 1],
[4, 4, 133, 4, 4, 4, 0, 0, 0, 0, 0, 85, 124], [ 4, 4,139, 4, 4, 4, 0, 0, 0, 0, 0, 85,114],
[87, 11, 12, 13, 14, 4, 4, 2, 2, 2, 122, 2, 2], [ 87, 11, 12, 13, 14, 4, 4, 2, 2, 2,112, 2, 2],
[88, 89, 90, 91, 92, 93, 94, 2, 81, 82, 83, 84, 86], [ 88, 89, 90, 91, 92, 93, 94, 2, 81, 82, 83, 84, 86]
], ],
"firstArrive": [ // 第一次到该楼层触发的事件 "firstArrive": [ // 第一次到该楼层触发的事件
"\t[样板提示]首次到达某层可以触发 firstArrive 事件该事件可类似于RMXP中的“自动执行脚本”。\n\n本事件支持一切的事件类型常常用来触发对话例如", "\t[样板提示]首次到达某层可以触发 firstArrive 事件该事件可类似于RMXP中的“自动执行脚本”。\n\n本事件支持一切的事件类型常常用来触发对话例如",

View File

@ -15,19 +15,19 @@ main.floors.sample1 =
// "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。 // "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。
"item_ratio": 1, // 该层的宝石/血瓶倍率 "item_ratio": 1, // 该层的宝石/血瓶倍率
"map": [ // 地图数据需要是13x13建议使用地图生成器来生成 "map": [ // 地图数据需要是13x13建议使用地图生成器来生成
[7, 131, 8, 152, 9, 130, 10, 152, 166, 165, 132, 165, 166], [ 7,121, 8,152, 9,120, 10,352,176,175,122,175,176],
[0, 0, 0, 0, 0, 0, 0, 152, 165, 164, 0, 162, 165], [ 0, 0, 0, 0, 0, 0, 0,352,175,174, 0,172,175],
[152, 152, 152, 152, 121, 152, 152, 152, 0, 0, 229, 0, 0], [352,352,352,352,111,352,352,352, 0, 0,229, 0, 0],
[43, 33, 44, 151, 0, 0, 0, 152, 165, 161, 0, 163, 165], [ 43, 33, 44,151, 0, 0, 0,352,175,171, 0,173,175],
[21, 22, 21, 151, 0, 0, 0, 152, 166, 165, 0, 165, 166], [ 21, 22, 21,151, 0, 0, 0,352,176,175, 0,175,176],
[151, 245, 151, 151, 0, 87, 0, 152, 152, 152, 85, 153, 153], [351,245,351,351, 0, 87, 0,352,352,352, 85,353,353],
[0, 246, 0, 151, 0, 0, 0, 152, 152, 221, 0, 221, 153], [ 0,246, 0,351, 0, 0, 0,352,152,221, 0,221,353],
[246, 0, 246, 151, 0, 0, 0, 121, 85, 0, 0, 0, 153], [246, 0,246,351, 0, 0, 0,111, 85, 0, 0, 0,353],
[151, 246, 151, 151, 0, 153, 153, 153, 153, 153, 153, 153, 153], [351,246,351,351, 0,353,353,353,353,353,353,353,353],
[0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 163, 0, 0], [ 0, 0, 0, 0, 0, 0, 0,174, 0, 0,173, 0, 0],
[1, 1, 1, 1, 0, 20, 0, 0, 0, 162, 0, 161, 0], [ 1, 1, 1, 1, 0, 20, 0, 0, 0,172, 0,171, 0],
[1, 0, 123, 1, 0, 20, 124, 0, 121, 0, 122, 0, 126], [ 1, 0,113, 1, 0, 20,114, 0,111, 0,112, 0,116],
[1, 0, 0, 1, 88, 20, 86, 0, 0, 0, 0, 0, 0], [ 1, 0, 0, 1, 88, 20, 86, 0, 0, 0, 0, 0, 0]
], ],
"firstArrive": [ // 第一次到该楼层触发的事件 "firstArrive": [ // 第一次到该楼层触发的事件

View File

@ -12,22 +12,22 @@ main.floors.sample2 =
"images": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。 "images": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
"color": [255,0,0,0.3], // 该层的默认画面色调。本项可不写代表无色调如果写需要是一个RGBA数组。 "color": [255,0,0,0.3], // 该层的默认画面色调。本项可不写代表无色调如果写需要是一个RGBA数组。
"weather": ["rain",10], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪第二项为1-10之间的数代表强度。 "weather": ["rain",10], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪第二项为1-10之间的数代表强度。
"bgm": "qianjin.mid", // 到达该层后默认播放的BGM。本项可忽略。 "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。
"item_ratio": 1, // 该层的宝石/血瓶倍率 "item_ratio": 1, // 该层的宝石/血瓶倍率
"map": [ // 地图数据需要是13x13建议使用地图生成器来生成 "map": [ // 地图数据需要是13x13建议使用地图生成器来生成
[5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5], [ 5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5],
[5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5],
[5, 4, 4, 4, 4, 1, 85, 1, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 1, 85, 1, 4, 4, 4, 4, 5],
[5, 4, 4, 4, 247, 1, 247, 1, 247, 4, 4, 4, 5], [ 5, 4, 4, 4,247, 1,247, 1,247, 4, 4, 4, 5],
[5, 4, 4, 4, 1, 247, 247, 247, 1, 4, 4, 4, 5], [ 5, 4, 4, 4, 1,247,247,247, 1, 4, 4, 4, 5],
[5, 4, 4, 4, 1, 247, 30, 247, 1, 4, 4, 4, 5], [ 5, 4, 4, 4, 1,247, 30,247, 1, 4, 4, 4, 5],
[5, 4, 4, 4, 247, 1, 124, 1, 247, 4, 4, 4, 5], [ 5, 4, 4, 4,247, 1,114, 1,247, 4, 4, 4, 5],
[5, 4, 4, 4, 4, 1, 123, 1, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 1,113, 1, 4, 4, 4, 4, 5],
[5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5],
[5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5],
[5, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 5],
[5, 4, 4, 4, 4, 4, 85, 4, 4, 4, 4, 4, 5], [ 5, 4, 4, 4, 4, 4, 85, 4, 4, 4, 4, 4, 5],
[5, 5, 5, 5, 5, 5, 88, 5, 5, 5, 5, 5, 5], [ 5, 5, 5, 5, 5, 5, 88, 5, 5, 5, 5, 5, 5]
], ],
"firstArrive": [ // 第一次到该楼层触发的事件 "firstArrive": [ // 第一次到该楼层触发的事件
"\t[实战!]本楼将尝试复刻《宿命的旋律》40F剧情。" "\t[实战!]本楼将尝试复刻《宿命的旋律》40F剧情。"

View File

@ -59,7 +59,7 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
core.removeGlobalAnimate(0,0,true); core.removeGlobalAnimate(0,0,true);
core.clearMap('all'); // 清空全地图 core.clearMap('all'); // 清空全地图
core.drawText([ core.drawText([
"\t[恭喜通关]你的分数是${status:hp}。" "\t[" + (reason||"恭喜通关") + "]你的分数是${status:hp}。"
], function () { ], function () {
core.events.gameOver(reason||'', replaying); core.events.gameOver(reason||'', replaying);
}) })
@ -73,7 +73,7 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
core.stopReplay(); core.stopReplay();
core.waitHeroToStop(function() { core.waitHeroToStop(function() {
core.drawText([ core.drawText([
"\t[结局1]你死了。\n如题。" "\t["+(reason||"结局1")+"]你死了。\n如题。"
], function () { ], function () {
core.events.gameOver(null, replaying); core.events.gameOver(null, replaying);
}); });
@ -116,8 +116,11 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
var enemy = core.material.enemys[enemyId]; var enemy = core.material.enemys[enemyId];
var damage = core.enemys.getDamage(enemyId);
if (damage == null) damage = core.status.hero.hp+1;
// 扣减体力值 // 扣减体力值
core.status.hero.hp -= core.enemys.getDamage(enemyId); core.status.hero.hp -= damage;
if (core.status.hero.hp<=0) { if (core.status.hero.hp<=0) {
core.status.hero.hp=0; core.status.hero.hp=0;
core.updateStatusBar(); core.updateStatusBar();
@ -343,18 +346,52 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
this.useEquipment = function (itemId) { // 使用装备 this.useEquipment = function (itemId) { // 使用装备
if (itemId.indexOf("sword")==0) { if (itemId.indexOf("sword")==0) {
var now=core.getFlag('sword', 'sword0'); // 当前装备剑的ID var now=core.getFlag('sword', 'sword0'); // 当前装备剑的ID
core.status.hero.atk -= core.values[now];
if (typeof core.values[now] == 'number') {
core.status.hero.atk -= core.values[now];
}
else {
core.status.hero.atk -= core.values[now].atk || 0;
core.status.hero.def -= core.values[now].def || 0;
core.status.hero.mdef -= core.values[now].mdef || 0;
}
if (typeof core.values[itemId] == 'number') {
core.status.hero.atk += core.values[itemId];
}
else {
core.status.hero.atk -= core.values[itemId].atk || 0;
core.status.hero.def -= core.values[itemId].def || 0;
core.status.hero.mdef -= core.values[itemId].mdef || 0;
}
core.setItem(now, 1); core.setItem(now, 1);
core.status.hero.atk += core.values[itemId];
core.setItem(itemId, 0); core.setItem(itemId, 0);
core.setFlag('sword', itemId); core.setFlag('sword', itemId);
core.drawTip("已装备"+core.material.items[itemId].name); core.drawTip("已装备"+core.material.items[itemId].name);
} }
if (itemId.indexOf("shield")==0) { if (itemId.indexOf("shield")==0) {
var now=core.getFlag('shield', 'shield0'); var now=core.getFlag('shield', 'shield0');
core.status.hero.def -= core.values[now];
if (typeof core.values[now] == 'number') {
core.status.hero.def -= core.values[now];
}
else {
core.status.hero.atk -= core.values[now].atk || 0;
core.status.hero.def -= core.values[now].def || 0;
core.status.hero.mdef -= core.values[now].mdef || 0;
}
if (typeof core.values[itemId] == 'number') {
core.status.hero.def += core.values[itemId];
}
else {
core.status.hero.atk -= core.values[itemId].atk || 0;
core.status.hero.def -= core.values[itemId].def || 0;
core.status.hero.mdef -= core.values[itemId].mdef || 0;
}
core.setItem(now, 1); core.setItem(now, 1);
core.status.hero.def += core.values[itemId];
core.setItem(itemId, 0); core.setItem(itemId, 0);
core.setFlag('shield', itemId); core.setFlag('shield', itemId);
core.drawTip("已装备"+core.material.items[itemId].name); core.drawTip("已装备"+core.material.items[itemId].name);

View File

@ -99,7 +99,23 @@ icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 =
'wood': 8, 'wood': 8,
'pinkShop': 9, 'pinkShop': 9,
'blueShop': 10, 'blueShop': 10,
'princess': 11 'princess': 11,
'wlt': 12,
'wt': 13,
'wrt': 14,
'wl': 15,
'wc': 16,
'wr': 17,
'wlb': 18,
'wrb': 19,
'dlt': 20,
'dt': 21,
'drt': 22,
'dl': 23,
'dc': 24,
'dr': 25,
'dlb': 26,
'drb': 27,
}, },
'npc48': { 'npc48': {
'npc0': 0, 'npc0': 0,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -23,10 +23,10 @@ maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
// Autotile // Autotile
'20':{'cls': 'autotile', 'id': 'autotile', 'noPass': true}, // autotile '20':{'cls': 'autotile', 'id': 'autotile', 'noPass': true}, // autotile
// 更多的autotile从151到160等只要不和现有的数字冲突即可 // 更多的autotile只要不和现有的数字冲突即可
'151':{'cls': 'autotile', 'id': 'autotile1', 'noPass': true}, '351':{'cls': 'autotile', 'id': 'autotile1', 'noPass': true},
'152':{'cls': 'autotile', 'id': 'autotile2', 'noPass': true}, '352':{'cls': 'autotile', 'id': 'autotile2', 'noPass': true},
'153':{'cls': 'autotile', 'id': 'autotile3', 'noPass': true}, '353':{'cls': 'autotile', 'id': 'autotile3', 'noPass': true},
////////////////////////// 物品部分 ////////////////////////// ////////////////////////// 物品部分 //////////////////////////
@ -99,40 +99,54 @@ maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
////////////////////////// NPC部分 ////////////////////////// ////////////////////////// NPC部分 //////////////////////////
// 121-150 NPC // 111-150 NPC
'121':{'cls': 'npcs', 'id': 'man'}, '111':{'cls': 'npcs', 'id': 'man'},
'122':{'cls': 'npcs', 'id': 'woman'}, '112':{'cls': 'npcs', 'id': 'woman'},
'123':{'cls': 'npcs', 'id': 'thief'}, '113':{'cls': 'npcs', 'id': 'thief'},
'124':{'cls': 'npcs', 'id': 'fairy'}, '114':{'cls': 'npcs', 'id': 'fairy'},
'125':{'cls': 'npcs', 'id': 'magician'}, '115':{'cls': 'npcs', 'id': 'magician'},
'126':{'cls': 'npcs', 'id': 'womanMagician'}, '116':{'cls': 'npcs', 'id': 'womanMagician'},
'127':{'cls': 'npcs', 'id': 'oldMan'}, '117':{'cls': 'npcs', 'id': 'oldMan'},
'128':{'cls': 'npcs', 'id': 'child'}, '118':{'cls': 'npcs', 'id': 'child'},
'129':{'cls': 'npcs', 'id': 'wood'}, '119':{'cls': 'npcs', 'id': 'wood'},
'130':{'cls': 'npcs', 'id': 'pinkShop'}, '120':{'cls': 'npcs', 'id': 'pinkShop'},
'131':{'cls': 'npcs', 'id': 'blueShop'}, '121':{'cls': 'npcs', 'id': 'blueShop'},
'132':{'cls': 'npcs', 'id': 'princess'}, '122':{'cls': 'npcs', 'id': 'princess'},
'133':{'cls': 'npc48', 'id': 'npc0'}, '123': {'cls': 'npcs', 'id': 'wlt'},
'134':{'cls': 'npc48', 'id': 'npc1'}, '124': {'cls': 'npcs', 'id': 'wt'},
'135':{'cls': 'npc48', 'id': 'npc2'}, '125': {'cls': 'npcs', 'id': 'wrt'},
'136':{'cls': 'npc48', 'id': 'npc3'}, '126': {'cls': 'npcs', 'id': 'wl'},
'137':{'cls': 'npc48', 'id': 'npc4'}, '127': {'cls': 'npcs', 'id': 'wc'},
'128': {'cls': 'npcs', 'id': 'wr'},
'129': {'cls': 'npcs', 'id': 'wlb'},
'130': {'cls': 'npcs', 'id': 'wrb'},
'131': {'cls': 'npcs', 'id': 'dlt'},
'132': {'cls': 'npcs', 'id': 'dt'},
'133': {'cls': 'npcs', 'id': 'drt'},
'134': {'cls': 'npcs', 'id': 'dl'},
'135': {'cls': 'npcs', 'id': 'dc'},
'136': {'cls': 'npcs', 'id': 'dr'},
'137': {'cls': 'npcs', 'id': 'dlb'},
'138': {'cls': 'npcs', 'id': 'drb'},
'139': {'cls': 'npc48', 'id': 'npc0'},
'140': {'cls': 'npc48', 'id': 'npc1'},
'141': {'cls': 'npc48', 'id': 'npc2'},
'142': {'cls': 'npc48', 'id': 'npc3'},
'143': {'cls': 'npc48', 'id': 'npc4'},
////////////////////////// 其他部分 ////////////////////////// ////////////////////////// 其他部分 //////////////////////////
// 161-200 其他(单向箭头、灯、箱子等等) // 171-200 其他(单向箭头、灯、箱子等等)
'161':{'cls': 'terrains', 'id': 'arrowUp', 'noPass': false}, // 单向上箭头 '171':{'cls': 'terrains', 'id': 'arrowUp', 'noPass': false}, // 单向上箭头
'162':{'cls': 'terrains', 'id': 'arrowDown', 'noPass': false}, // 单向下箭头 '172':{'cls': 'terrains', 'id': 'arrowDown', 'noPass': false}, // 单向下箭头
'163':{'cls': 'terrains', 'id': 'arrowLeft', 'noPass': false}, // 单向左箭头 '173':{'cls': 'terrains', 'id': 'arrowLeft', 'noPass': false}, // 单向左箭头
'164':{'cls': 'terrains', 'id': 'arrowRight', 'noPass': false}, // 单向右箭头 '174':{'cls': 'terrains', 'id': 'arrowRight', 'noPass': false}, // 单向右箭头
'165':{'cls': 'terrains', 'id': 'light', 'trigger': 'changeLight', 'noPass': false}, // 灯 '175':{'cls': 'terrains', 'id': 'light', 'trigger': 'changeLight', 'noPass': false}, // 灯
'166':{'cls': 'terrains', 'id': 'darkLight', 'noPass': true}, // 暗灯 '176':{'cls': 'terrains', 'id': 'darkLight', 'noPass': true}, // 暗灯
'167':{'cls': 'terrains', 'id': 'ski', 'trigger': 'ski', 'noPass': false}, // 滑冰 '177':{'cls': 'terrains', 'id': 'ski', 'trigger': 'ski', 'noPass': false}, // 滑冰
'168':{'cls': 'terrains', 'id': 'flower', 'noPass': false}, // 花 '178':{'cls': 'terrains', 'id': 'flower', 'noPass': false}, // 花
'169':{'cls': 'terrains', 'id': 'box', 'trigger': 'pushBox', 'noPass': true}, // 箱子 '179':{'cls': 'terrains', 'id': 'box', 'trigger': 'pushBox', 'noPass': true}, // 箱子
'170':{'cls': 'terrains', 'id': 'boxed', 'trigger': 'pushBox', 'noPass': true}, // 完成的箱子 '180':{'cls': 'terrains', 'id': 'boxed', 'trigger': 'pushBox', 'noPass': true}, // 完成的箱子
////////////////////////// 怪物部分 ////////////////////////// ////////////////////////// 怪物部分 //////////////////////////

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -21,7 +21,7 @@
position: fixed; position: fixed;
top: 10px; top: 10px;
left: 10px; left: 10px;
z-index: 15; z-index: 320;
} }
#startPanel { #startPanel {
@ -32,7 +32,7 @@
left: 0; left: 0;
background-color: #fff; background-color: #fff;
overflow: hidden; overflow: hidden;
z-index: 12; z-index: 250;
} }
#startTop { #startTop {
@ -42,7 +42,7 @@
top: 0; top: 0;
left: 0; left: 0;
background-color: #000; background-color: #000;
z-index: 14; z-index: 300;
} }
#startTopProgressBar { #startTopProgressBar {
@ -77,12 +77,12 @@
height: 100%; height: 100%;
width: auto; width: auto;
transform:translate(-50%,-50%); transform:translate(-50%,-50%);
z-index: 12; z-index: 210;
} }
#startLogo { #startLogo {
position: absolute; position: absolute;
z-index: 12; z-index: 240;
left: 0; left: 0;
right: 0; right: 0;
margin-left: auto; margin-left: auto;
@ -95,7 +95,7 @@
#startTitle { #startTitle {
position: absolute; position: absolute;
z-index: 13; z-index: 230;
} }
#startButtonGroup { #startButtonGroup {
@ -106,7 +106,7 @@
background-color: #000; background-color: #000;
opacity: 0.85; opacity: 0.85;
display: none; display: none;
z-index: 12; z-index: 220;
bottom: 0; bottom: 0;
margin-bottom: 7%; margin-bottom: 7%;
} }
@ -142,7 +142,7 @@
display: none; display: none;
color: #fff; color: #fff;
background-color: #000; background-color: #000;
z-index: 11; z-index: 180;
} }
#logoLabel { #logoLabel {
@ -170,7 +170,7 @@
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
background: url(project/images/ground.png) repeat; background: url(project/images/ground.png) repeat;
z-index: 9; z-index: 160;
display: none; display: none;
} }
#statusBar .status{ #statusBar .status{
@ -199,7 +199,7 @@
#toolBar { #toolBar {
position: absolute; position: absolute;
background: url(project/images/ground.png) repeat; background: url(project/images/ground.png) repeat;
z-index: 8; z-index: 150;
box-sizing: border-box; box-sizing: border-box;
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
@ -233,47 +233,59 @@ span#poison, span#weak, span#curse {
-webkit-box-sizing: border-box; -webkit-box-sizing: border-box;
} }
#gif {
z-index: 20;
position: absolute;
overflow: hidden;
}
#gif2 {
z-index: 90;
position: absolute;
overflow: hidden;
}
#curtain { #curtain {
z-index: 8; z-index: 100;
position: absolute; position: absolute;
opacity: 0; opacity: 0;
background: #000000; background: #000000;
} }
#bg { #bg {
z-index: 1; z-index: 10;
} }
#event { #event {
z-index: 2; z-index: 30;
} }
#hero { #hero {
z-index: 3; z-index: 40;
} }
#event2 { #event2 {
z-index: 4; z-index: 50;
} }
#fg { #fg {
z-index: 5; z-index: 60;
} }
#animate { #animate {
z-index: 6; z-index: 70;
} }
#weather { #weather {
z-index: 7; z-index: 80;
} }
#ui { #ui {
z-index: 9; z-index: 110;
} }
#data { #data {
z-index: 10; z-index: 120;
} }
.clearfix:before, .clearfix:before,

View File

@ -1,4 +1,20 @@
HTML5魔塔样板V2.0.1 HTML5魔塔样板V2.0.2
编辑器添加新建和删除按钮;地图自动保存 √
录像支持倒退录像播放中每50步自动存档最多存20个
Gif支持可以作为楼层背景图或者使用显示动图事件 √
图片显示增加淡入淡出效果 √
APP端也能下载录像
地图临界显伤 √
单个存档清理 √
大数据魔塔的支持(临界计算等) √
进一步对JS文件进行压缩 √
修复有时候无法输入ID的问题 √
其他细节优化
-----------------------------------------------------------------------
HTML5魔塔样板V2.0.1
道具使用效果的进一步分离 道具使用效果的进一步分离
支持插件编写,用户可以根据需求来写插件了 支持插件编写,用户可以根据需求来写插件了