Merge pull request #73 from zhaouv/v2.0-editor-20180304

V2 0 editor 20180304
This commit is contained in:
Zhang Chen authored and GitHub committed 2018-03-10 23:45:28 +08:00
commit 73f2ea3a84
15 files changed
+173 -2086

No files matched your search

-149
View File
@@ -1,149 +0,0 @@
# v2.0目前的改动
## 总体上:
部分重构了运行时
+ 把`libs`中的数据分离出来保存为类似json的js文件,分离后的数据进一步分离为纯数据和注释两部分
+ 更改目录结构,分离后的`libs`一般无需修改,把数据楼层文件声音图片放入`project`目录中
* 需要相应的修改地图生成器和js压缩工具
+ 设置了三个模式`play|editor|replay`在`editor`模式关闭了部分动画,并且角色无法行动
重构editor
+ 重命名为`editor.html`
* 需要相应的修改本地服务的按钮打开的网址,为了兼容,临时加了个内容为`<html><body><script>window.location='editor.html'</script></body></html>`的`drawMapGUI.html`
+ 不再独立的导入数据和画图,尽可能的通过`main.init('editor')`复用代码
+ 能够在本地服务器环境中直接修改`project`中的数据,即全GUI下做塔
+ 把`editor`的代码拆到了`_server/editor.js`中
+ 添加了`_server/css/editor_mode.css`存放编辑模式有关的样式
+ 添加了`_server/editor_mode.js`存放编辑模式的实现
## 具体:
### main.js
用户修改内容转移到了`project/data.js`中
把事件监听打包成了`main.prototype.listen`
`main.listen`和`main.init`改为在`index.html`中执行
添加了`main.prototype.loadPureData`,在`main.init`中先加载纯数据再加载`libs`
### core.js
`core.drawMap`中`editor`模式下不再画图,而是生成画图的函数提供给`editor`
`editor`模式下`GlobalAnimate`可以独立的选择是否播放
`core.playBgm`和`core.playSound`中非`play`模式不再播放声音
`core.show`和`core.hide`中非`play`模式不再进行动画而是立刻完成并执行回调
`editor`模式不执行`core.resize`
### data.js
数据转移到了`project/data.js`中
注释转移到了`project/data.comment.js`中
### enemy.js,items.js,maps.js,icons.js
数据转移到了`project`下的同名文件中
注释转移到了`project/comment.js`中
### editor_file.js
提供了以下函数进行楼层`map`数组相关的操作
```javascript
editor.file.getFloorFileList
editor.file.loadFloorFile
editor.file.saveFloorFile
editor.file.saveFloorFileAs
```
5个编辑模式有关的查询
```javascript
editor.file.editItem('redJewel',[],function(a){console.log(a)});
editor.file.editEnemy('redBat',[],function(a){console.log(a)});
editor.file.editLoc(2,0,[],function(a){console.log(a)});
editor.file.editFloor([],function(a){console.log(a)});
editor.file.editTower([],function(a){console.log(a)});
```
5个编辑模式有关的编辑
```javascript
editor.info={images: "terrains", y: 9};
editor.file.changeIdAndIdnum('yellowWall2',16,editor.info,function(a){console.log(a)});
editor.file.editItem('book',[["change","['items']['name']","怪物手册的新名字"]],function(a){console.log(a)});
editor.file.editEnemy('redBat',[['change',"['atk']",20]],function(a){console.log(a)});
editor.file.editLoc(2,6,[["change","['afterBattle']",null]],function(a){console.log(a)});
editor.file.editFloor([["change","['title']",'样板 33 层']],function(a){console.log(a)});
editor.file.editTower([["change","['values']['lavaDamage']",200]],function(a){console.log(a)});
```
### editor_mode.js
4个生成表格并绑定事件的函数
```javascript
editor.mode.loc();
editor.mode.emenyitem();
editor.mode.floor();
editor.mode.tower();
```
切换模式
```javascript
editor.mode.onmode('');
editor.mode.onmode('loc');
editor.mode.onmode('emenyitem');
editor.mode.onmode('floor');
editor.mode.onmode('tower');
```
在切换模式时,改动才会保存到文件,并且需要刷新页面使得`editor`能看到改动
表格的`onchange`的实现中,获得当前模式的方式.不注意的话,修改`index.html`中页面的结构,会被坑
```javascript
var node = thisTr.parentNode;
while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) {
node = node.parentNode;
}
editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]);
```
### drawMapGUI.html
重命名为`editor.html`
把`editor`的代码拆到了`_server/editor.js`中
以`display:none`的形式引入了`index.html`的`dom`,修改了原来的`.gameCanvas #ui #data`等的名字以避免冲突
通过`main.init('editor')`加载数据,移除了原有的`editor.loadjs`等
背景层如果未设置`editor.bgY`则通过运行时中的代码画背景
`editor.updateMap`中只画未定义快的报错,其他的由运行时中的代码完成
`editor.ids[0] = 0; editor.indexs[0]=[0];`
添加了`editor.changeFloor`用于切换楼层
### 注释的特殊指令
```
$range(evalstr:thiseval)$end
限制取值范围,要求修改后的eval(evalstr)为true
$leaf(evalstr:thiseval)$end
强制指定为叶节点,如果eval(evalstr)为true
//以下几个中选一个 [
$select(evalstr)$end
渲染成<select>,选项为数组eval(evalstr)['values']
$input(evalstr)$end
渲染成<input>
$textarea(evalstr)$end
渲染成<textarea>
默认选项为$textarea()$end
// ]
```
# todo & 目前的bug
+ `event`,`after...`在地图上没有标记,可以在右下角加类似于无`id`的红问号类似的绿色星号小标记
+ [x] 添加新图块只对地形好使,添加的新物品还是需要手动在`project/items.js`中加东西
+ [x] 目前未做$range(evalstr:thiseval)$end的检查
+ 通过`core.values.redJewel`的方式设置物品加的数值,在全GUI下反而会不直观
+ `idnum`上限改到`999`,不需要在`.js`中手动设置`idnum`的话,根据数字范围来约定类型意义不大,而且`400`内随便输个数就发现已经被占了,体验极差
+ `editor.html`中独立换背景的功能不再需要,待移除
+ 全GUI下编辑要经常保存修改后F5
+ [x] 目前的报错只是throw,如果不开F12注意不到有错误发生,修改没有生效
+ [x] 有待美化,以及做成标签页式的模式切换
+94 -8
View File
@@ -2,15 +2,40 @@
本目录下所有文件,以及`../editor.html`和`../启动服务.exe`([源码](http://github.com/ckcz123/mota-js-server/))是地图编辑器的所有组件.
`editor.js`,`editor_file.js`和`editor_mode.js`耦合较强,`editor_blockly.js`和`fs.js`基本可以独立使用.
`editor.js`,`editor_file.js`和`editor_mode.js`耦合较强,`editor_blockly.js`和`editor_multi.js`和`fs.js`基本可以独立使用.
## 各组件功能
### 总体上
以`display:none`的形式引入了`index.html`的`dom`,修改了原来的`.gameCanvas #ui #data`等的名字以避免冲突
通过`main.init('editor')`加载数据
`editor`模式关闭了部分动画
`core.drawMap`中`editor`模式下不再画图,而是生成画图的函数提供给`editor`
`editor`模式下`GlobalAnimate`可以独立的选择是否播放
`core.playBgm`和`core.playSound`中非`play`模式不再播放声音
`core.show`和`core.hide`中非`play`模式不再进行动画而是立刻完成并执行回调
`editor`模式不执行`core.resize`
### editor.js
暂略
``` js
editor.mapInit();//清空地图
editor.changeFloor('MT2')//切换地图
editor.guid()//产生一个可以作为id的长随机字符串
```
`editor.updateMap`中画未定义快的报错
### editor_file.js
提供了以下函数进行楼层`map`数组相关的操作
```javascript
editor.file.getFloorFileList
@@ -18,6 +43,7 @@ editor.file.loadFloorFile
editor.file.saveFloorFile
editor.file.saveFloorFileAs
```
编辑模式有关的查询
```javascript
editor.file.editItem('redJewel',[],function(a){console.log(a)});
@@ -27,6 +53,7 @@ editor.file.editFloor([],function(a){console.log(a)});
editor.file.editTower([],function(a){console.log(a)});
editor.file.editFunctions([],function(a){console.log(a)});
```
编辑模式有关的编辑
```javascript
editor.info={images: "terrains", y: 9};
@@ -40,7 +67,7 @@ editor.file.editFunctions(["change","['events']['afterChangeLight']","function(x
```
### editor_mode.js
5个生成表格并绑定事件的函数
生成表格并绑定事件的函数
```javascript
editor.mode.loc();
editor.mode.emenyitem();
@@ -48,6 +75,7 @@ editor.mode.floor();
editor.mode.tower();
editor.mode.functions();
```
切换模式
```javascript
editor.mode.onmode('');//清空
@@ -72,24 +100,82 @@ while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) {
}
editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]);
```
`editor.mode.listen`中提供了追加素材的支持.
处理注释的特殊指令
```
$range(evalstr:thiseval)$end
限制取值范围,要求修改后的eval(evalstr)为true
$leaf(evalstr:thiseval)$end
强制指定为叶节点,如果eval(evalstr)为true
//以下几个中选一个 [
$select(evalstr)$end
渲染成<select>,选项为数组eval(evalstr)['values']
$input(evalstr)$end
渲染成<input>
$textarea(evalstr)$end
渲染成<textarea>
默认选项为$textarea()$end
// ]
```
### editor_blockly.js
把选定`id_`的事件用blockly编辑
``` js
editor_blockly.import(id_);
```
把文本区域的代码转换成图块
``` js
editor_blockly.parse();
```
把当前图块对应的事件返回给调用blockly的`id_`
### editor_multi.js
用[CodeMirror](https://github.com/codemirror/CodeMirror) 实现有高亮的多行文本编辑
编辑选定`id_`的文本域
``` js
editor_blockly.confirm();
editor_multi.import(id_)
```
### 待调整
编辑blockly方块的特定域
``` js
editor_multi.multiLineEdit(value,b,f,callback)
```
+ [x] 多行文本编辑器独立作为组件
+ [x] editor_multi.js
### fs.js
模仿node的fs模块提供如下api,与`启动服务.exe`配合为js提供文件读写功能
``` js
fs.readFile('file.in','utf-8',callback)
//读文本文件
//callback:function(err, data)
//data:字符串
fs.readFile('file.in','base64',callback)
//读二进制文件
//callback:function(err, data)
//data:base64字符串
fs.writeFile('file.out', data ,'utf-8', callback)
//写文本文件
//callback:function(err)
//data:字符串
fs.writeFile('file.out', data ,'base64', callback)
//写二进制文件
//callback:function(err)
//data:base64字符串
fs.readdir(path, callback)
//callback:function(err, data)
//path:支持"/"做分隔符
//data:[filename1,filename2,..] filename是字符串,只包含文件不包含目录
//所有参数不允许缺省
```
## z-index
File diff suppressed because it is too large. Load diff
-557
View File
@@ -1,557 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>MotaAction Blockly Demo</title>
<!-- <script src="../../blockly_compressed.js"></script>
<script src="../../blocks_compressed.js"></script>
<script src="../../javascript_compressed.js"></script>
<script src="../../msg/js/zh-hans.js"></script> -->
<!-- <script src="../../msg/js/en.js"></script> -->
<script src="blockly_compressed.js"></script>
<script src="blocks_compressed.js"></script>
<script src="javascript_compressed.js"></script>
<script src="zh-hans.js"></script>
<script src="motaActionBlocks.js"></script>
<style>
body {
background-color: #fff;
font-family: sans-serif;
}
</style>
</head>
<body>
<!-- =========================================================== -->
<p>
<button onclick="showXML()">Show XML</button>
<!-- <button onclick="runCode()">Run JavaScript</button> -->
<button onclick="runCode()">console.log(obj=code)</button>
</p>
<div id="blocklyDiv" style="height: 480px; width: 940px;"></div>
<pre id="codeArea"></pre>
<!-- =========================================================== -->
<xml id="toolboxxx" style="display: none">
<category name="类别" expanded="true">
<category name="events"></category>
<category name="changefloor"></category>
</category>
<sep gap="200"></sep>
<category name="default">
<block type="controls_if"></block>
<block type="logic_compare"></block>
<block type="controls_repeat_ext"></block>
<block type="math_number"></block>
<block type="math_arithmetic"></block>
<block type="text"></block>
<block type="text_print"></block>
</category>
<category name="new"></category>
<category name="变量" expanded="true">
<!-- <category name="status" custom="MY_VARIABLE"></category> -->
<category name="item"></category>
<category name="flag">
<!-- <block type="flagvar"></block> -->
</category>
</category>
<category name="事件例子">
<block type="math_number" disabled="true">
<field name="NUM">42</field>
</block>
<sep gap="200"></sep>
<label text="这是一个循环的例子"></label>
<block type="controls_for">
<value name="FROM">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
<value name="TO">
<block type="math_number">
<field name="NUM">10</field>
</block>
</value>
<value name="BY">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
</block>
<block type="math_arithmetic">
<field name="OP">ADD</field>
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</category>
<!-- <category name="Variables" colour="330" custom="VARIABLE"></category>
<category name="Functions" colour="290" custom="PROCEDURE"></category> -->
</xml>
<xml xmlns="http://www.w3.org/1999/xhtml" id="toolbox_source" style="display: none;">
<block type="math_number">
<field name="NUM">0</field>
</block>
<block type="math_arithmetic">
<field name="OP">ADD</field>
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
</value>
</block>
<block type="logic_compare">
<field name="OP">EQ</field>
</block>
<block type="logic_operation">
<field name="OP">AND</field>
</block>
<block type="logic_negate"></block>
<block type="evalstring_e">
<field name="EvalString">EvalString</field>
</block>
<block type="evalstring_all_e">
<field name="IdString">status</field>
<field name="EvalString">hp</field>
</block>
<block type="evalstring_all_e">
<field name="IdString">item</field>
<field name="EvalString">yellowKey</field>
</block>
<block type="evalstring_all_e">
<field name="IdString">flag</field>
<field name="EvalString">abc</field>
</block>
<block type="event_m">
<statement name="actionList">
<block type="actionlist"></block>
</statement>
</block>
<block type="actionlist"></block>
<block type="text_s_1">
<field name="Evalstring">欢迎使用事件编辑器</field>
</block>
<block type="text_s_2">
<field name="EvalString">小妖精</field>
<field name="IdString">fairy</field>
<field name="Evalstring_1">欢迎使用事件编辑器</field>
</block>
<block type="tip_s">
<field name="EvalString">这段话将在左上角以气泡形式显示</field>
</block>
<block type="setvalue_s">
<value name="EvalString">
<block type="evalstring_all_e">
<field name="IdString">status</field>
<field name="EvalString">hp</field>
</block>
</value>
<value name="EvalString_1">
<block type="math_arithmetic">
<field name="OP">ADD</field>
<value name="A">
<block type="evalstring_all_e">
<field name="IdString">status</field>
<field name="EvalString">hp</field>
</block>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
</value>
</block>
<block type="show_s">
<field name="INT">0</field>
<field name="INT_1">0</field>
<field name="IdString"></field>
<field name="INT_2"></field>
</block>
<block type="hide_s">
<field name="INT"></field>
<field name="INT_1"></field>
<field name="IdString"></field>
<field name="INT_2"></field>
</block>
<block type="trigger_s">
<field name="INT">0</field>
<field name="INT_1">0</field>
</block>
<block type="revisit_s"></block>
<block type="exit_s"></block>
<block type="update_s"></block>
<block type="sleep_s">
<field name="INT">500</field>
</block>
<block type="battle_s">
<field name="IdString">greenSlime</field>
</block>
<block type="opendoor_s">
<field name="INT">0</field>
<field name="INT_1">0</field>
<field name="IdString"></field>
</block>
<block type="changefloor_s">
<field name="IdString">MT1</field>
<field name="INT">0</field>
<field name="INT_1">0</field>
<field name="EvalString"></field>
<field name="INT_2"></field>
</block>
<block type="changepos_s_1">
<field name="INT">0</field>
<field name="INT_2">0</field>
<field name="EvalString"></field>
</block>
<block type="changepos_s_2">
<field name="EvalString">up</field>
</block>
<block type="openshop_s">
<field name="IdString">shop1</field>
</block>
<block type="disableshop_s">
<field name="IdString">shop1</field>
</block>
<block type="setfg_s_1">
<field name="INT">255</field>
<field name="INT_1">255</field>
<field name="INT_2">255</field>
<field name="EvalString">1</field>
<field name="INT_3"></field>
</block>
<block type="setfg_s_2">
<field name="INT"></field>
</block>
<block type="move_s">
<field name="INT"></field>
<field name="INT_1"></field>
<field name="INT_2"></field>
<field name="EvalString">TRUE</field>
<field name="EvalString_1">上右3下2左上左2</field>
</block>
<block type="movehero_s">
<field name="INT"></field>
<field name="EvalString">上右3下2左上左2</field>
</block>
<block type="playbgm_s">
<field name="EvalString">bgm.mp3</field>
</block>
<block type="pausebgm_s"></block>
<block type="resumebgm_s"></block>
<block type="playsound_s">
<field name="EvalString">item.ogg</field>
</block>
<block type="win_s">
<field name="EvalString"></field>
</block>
<block type="lose_s">
<field name="EvalString"></field>
</block>
<block type="if_s">
<value name="EvalString">
<block type="logic_compare">
<field name="OP">GT</field>
<value name="A">
<block type="evalstring_all_e">
<field name="IdString">status</field>
<field name="EvalString">hp</field>
</block>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">100</field>
</shadow>
</value>
</block>
</value>
<statement name="actionList">
<block type="actionlist"></block>
</statement>
<statement name="actionList_1">
<block type="actionlist"></block>
</statement>
</block>
<block type="choices_s">
<field name="EvalString">提示文字:选择一种钥匙</field>
<statement name="choicesContextList">
<block type="choicescontext">
<field name="EvalString">提示文字:黄钥匙</field>
<statement name="actionList">
<block type="actionlist"></block>
</statement>
<next>
<block type="choicescontext">
<field name="EvalString">提示文字:蓝钥匙</field>
<statement name="actionList">
<block type="actionlist"></block>
</statement>
<next>
<block type="choicescontext">
<field name="EvalString">提示文字:红钥匙</field>
<statement name="actionList">
<block type="actionlist"></block>
</statement>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
<block type="function_s">
<field name="EvalString">alert(core.getStatus("atk"));</field>
</block>
</xml>
<xml id="toolbox" style="display: none"><category name="未分类"></category></xml>
<script>
//不允许缺省的标记
/*
INT_CHECK = '999843861743683';
IdString_CHECK = 'this_id_must_be_inputted';
EvalString_CHECK = 'this_value_must_be_inputted';
*/
var moveStepParser = moveStepParser_2ac833aa_9115_48fc_b816_08cc229bb4d0;
var motaActionBlocks = motaActionBlocks_4a3632a9_8716_48b3_bf55_4ebbc4ff040c;
/* var category_new = (function(){
for(var node of document.getElementById('toolbox').children) {
if(node.getAttribute('name')=='new') return node;
}
})(); */
var category_new = document.getElementById('toolbox').children[0];
for(var blockNode of document.getElementById('toolbox_source').children){
category_new.appendChild(Blockly.Xml.textToDom(Blockly.Xml.domToText(blockNode)));
var sepNode=document.createElement('sep');
sepNode.setAttribute('gap',5);
category_new.appendChild(sepNode);
//category_new.innerHTML+='<sep gap="5"></sep>';
}
motaActionBlocks.forEach(function(v){
/*
var blockNode=document.createElement('block');
blockNode.setAttribute('type',v.type);
category_new.appendChild(blockNode);
//category_new.innerHTML+='<block type="'+v.type+'"></block>';
var sepNode=document.createElement('sep');
sepNode.setAttribute('gap',5);
category_new.appendChild(sepNode);
//category_new.innerHTML+='<sep gap="5"></sep>';
*/
var blockFunc;
if(v.hasOwnProperty('initFunc')){
blockFunc = v['initFunc'];
if (!(blockFunc instanceof Function)){
eval('blockFunc = '+v['initFunc']);
}
} else {
blockFunc = function() {this.jsonInit(v);}
}
Blockly.Blocks[v.type] = {
init: blockFunc
};
if(v.hasOwnProperty('generFunc')){
blockFunc = v['generFunc'];
if (!(blockFunc instanceof Function)){
eval('blockFunc = '+v['generFunc']);
}
Blockly.JavaScript[v.type] = blockFunc;
}
});
/*
b=[]
for(var ii in Blockly.JavaScript){if(typeof(Blockly.JavaScript[ii])==typeof(0)){
b.push([ii,Blockly.JavaScript[ii]]);
}}
b.sort(function(a,b){return a[1]-b[1]})
Blockly.JavaScript.ORDER_ATOMIC = 0; // 0 "" ...
Blockly.JavaScript.ORDER_NEW = 1.1; // new
Blockly.JavaScript.ORDER_MEMBER = 1.2; // . []
Blockly.JavaScript.ORDER_FUNCTION_CALL = 2; // ()
Blockly.JavaScript.ORDER_INCREMENT = 3; // ++
Blockly.JavaScript.ORDER_DECREMENT = 3; // --
Blockly.JavaScript.ORDER_BITWISE_NOT = 4.1; // ~
Blockly.JavaScript.ORDER_UNARY_PLUS = 4.2; // +
Blockly.JavaScript.ORDER_UNARY_NEGATION = 4.3; // -
Blockly.JavaScript.ORDER_LOGICAL_NOT = 4.4; // !
Blockly.JavaScript.ORDER_TYPEOF = 4.5; // typeof
Blockly.JavaScript.ORDER_VOID = 4.6; // void
Blockly.JavaScript.ORDER_DELETE = 4.7; // delete
Blockly.JavaScript.ORDER_DIVISION = 5.1; // /
Blockly.JavaScript.ORDER_MULTIPLICATION = 5.2; // *
Blockly.JavaScript.ORDER_MODULUS = 5.3; // %
Blockly.JavaScript.ORDER_SUBTRACTION = 6.1; // -
Blockly.JavaScript.ORDER_ADDITION = 6.2; // +
Blockly.JavaScript.ORDER_BITWISE_SHIFT = 7; // << >> >>>
Blockly.JavaScript.ORDER_RELATIONAL = 8; // < <= > >=
Blockly.JavaScript.ORDER_IN = 8; // in
Blockly.JavaScript.ORDER_INSTANCEOF = 8; // instanceof
Blockly.JavaScript.ORDER_EQUALITY = 9; // == != === !==
Blockly.JavaScript.ORDER_BITWISE_AND = 10; // &
Blockly.JavaScript.ORDER_BITWISE_XOR = 11; // ^
Blockly.JavaScript.ORDER_BITWISE_OR = 12; // |
Blockly.JavaScript.ORDER_LOGICAL_AND = 13; // &&
Blockly.JavaScript.ORDER_LOGICAL_OR = 14; // ||
Blockly.JavaScript.ORDER_CONDITIONAL = 15; // ?:
Blockly.JavaScript.ORDER_ASSIGNMENT = 16; // = += -= *= /= %= <<= >>= ...
Blockly.JavaScript.ORDER_COMMA = 17; // ,
Blockly.JavaScript.ORDER_NONE = 99; // (...)
*/
//===init===
var demoWorkspace = Blockly.inject('blocklyDiv',{
media: 'media/',
toolbox: document.getElementById('toolbox'),
zoom:{
controls: true,
wheel: true,//false
startScale: 1.0,
maxScale: 3,
minScale: 0.3,
scaleSpeed: 1.08
},
trashcan: false,
});
//var xml_init = `<xml><block type="event_m" id="ZjQTmcPqlbmB4rWwtHFb" deletable="false" xxmovable="false"><statement name="actionList"><block type="actionlist" id="EqXfr9escNaQbktsBeeR"></block></statement></block></xml>`
var xml_init = '<xml xmlns="http://www.w3.org/1999/xhtml"><variables></variables><block type="event_m" id="ZjQTmcPqlbmB4rWwtHFb" ><statement name="actionList"><block type="actionlist" id="EqXfr9escNaQbktsBeeR"><statement name="ACTIONS"><block type="text_s_1" id="3.34tovt~URp|A^JLW`-"><field name="Evalstring">实现了文档中 choices: 给用户提供选项 中的复杂事件</field><next><block type="if_s" id="mB{gA~yKm5CmnjboTc)@"><value name="EvalString"><block type="logic_compare" id="Av`[}J)p1a*~f[x%k/iC"><field name="OP">EQ</field><value name="A"><block type="evalstring_all_e" id="L9PP2VY*=G2}u~[XH^~8"><field name="IdString">flag</field><field name="EvalString">women</field></block></value><value name="B"><shadow type="math_number" id="K(e-BEb3lq4p_Uq3a4fP"><field name="NUM">0</field></shadow></value></block></value><statement name="actionList"><block type="actionlist" id="n4IT]Xp(ep!b5Z;A7i!)"><statement name="ACTIONS"><block type="text_s_2" id="Fj~J}^k-ybh%hCTc!HzJ"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">这是个很复杂的例子,它将教会你如何使用if 语句进行条件判断,以及 choices 提供选项来供用户进行选择。</field><next><block type="text_s_2" id="tp$q~?4^N.CkBrW.)m=:"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">第一次访问我将显示这段文字;从第二次开始将会向你出售钥匙。\n钥匙价格将随着访问次数递增。\n当合计出售了七把钥匙后,将送你一把大黄门钥匙,并消失不再出现。</field><next><block type="text_s_2" id="#GN{01Kr#=U]IrEpF81F"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">这部分的逻辑比较长,请细心看样板的写法,是很容易看懂并理解的。</field></block></next></block></next></block></statement></block></statement><statement name="actionList_1"><block type="actionlist" id="zNiAq:34?E~VA]]_.*z?"><statement name="ACTIONS"><block type="if_s" id="q45FD9cEAXzv+6K1Q+As"><value name="EvalString"><block type="logic_compare" id="s(8a`p#Br9D42#:.(Ajp"><field name="OP">EQ</field><value name="A"><block type="evalstring_all_e" id="wY1%gHYZlbTR%w!j=.L;"><field name="IdString">flag</field><field name="EvalString">women</field></block></value><value name="B"><shadow type="math_number" id="=8W59@z1c8z3mg*sF%Yv"><field name="NUM">8</field></shadow></value></block></value><statement name="actionList"><block type="actionlist" id="NPPgOQR,ZNWZ]+qTcYo."><statement name="ACTIONS"><block type="text_s_2" id="7gm0#-f#SSZkhb@}`Vi#"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">你购买的钥匙已经够多了,再继续卖给你的话我会有危险的。</field><next><block type="text_s_2" id="6(z!Sd.3gKP!G3|nYRcq"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">看在你贡献给我这么多钱的份上,送你一把大黄门钥匙吧,希望你能好好用它。</field><next><block type="setvalue_s" id=";=ePDQeTA,kwEh$Ra^X_"><value name="EvalString"><block type="evalstring_all_e" id="z6.,x%^#p/C/Qk,gRjW#"><field name="IdString">item</field><field name="EvalString">bigKey</field></block></value><value name="EvalString_1"><block type="math_arithmetic" id=";etEds+-9.R3D)_h2m!b"><field name="OP">ADD</field><value name="A"><block type="evalstring_all_e" id="X30zJUgVZ^j@,4VzRY+U"><field name="IdString">item</field><field name="EvalString">bigKey</field></block></value><value name="B"><shadow type="math_number" id="8|9c~,axhUiAiXkoDe5L"><field name="NUM">1</field></shadow></value></block></value><next><block type="text_s_2" id="#SD_,q#qW}P_$FVas4e,"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">我先走了,拜拜~</field><next><block type="hide_s" id=")7zo%}*LQeNTH5/(dX:,"><field name="INT"></field><field name="INT_1"></field><field name="IdString"></field><field name="INT_2">500</field></block></next></block></next></block></next></block></next></block></statement></block></statement><statement name="actionList_1"><block type="actionlist" id="Al0uQGP.@b8JT5*AkGt("><statement name="ACTIONS"><block type="choices_s" id="7;M82mnQZq-[SxPg|Q}4"><field name="EvalString">\t[老人,woman]少年,你需要钥匙吗?\n我这里有大把的!</field><statement name="choicesContextList"><block type="choicescontext" id="3KXrI#DBm{X|YrW=yNzr"><field name="EvalString">黄钥匙(${9+flag:woman_times}金币)</field><statement name="actionList"><block type="actionlist" id="W_o#WBfK_M[M$~4NcuY/"><statement name="ACTIONS"><block type="if_s" id="1WMD~nib3*_IF,XbQt18"><value name="EvalString"><block type="logic_compare" id="^S@~Fb^s*:!MA293S-2R"><field name="OP">GT</field><value name="A"><block type="evalstring_all_e" id="aa*eD]u,rpCT9rx-gy9@"><field name="IdString">staLine truncated
var xml = Blockly.Xml.textToDom(xml_init);
Blockly.Xml.domToWorkspace(xml, demoWorkspace);
//demoWorkspace.getBlockById("ZjQTmcPqlbmB4rWwtHFb").setDeletable(false);//设置为不可删除
setTimeout(function(){
//demoWorkspace.getBlockById("ZjQTmcPqlbmB4rWwtHFb").dispose();//删除
}, 1000*1000);
//=== listen
function myUpdateFunction(event) {
gevent=event;
console.log(event);
/*
https://developers.google.com/blockly/guides/configure/web/events
file:///E:/workspace/blockly/blockly-master/demos/[mytest/Events%20%C2%A0_%C2%A0%20Blockly%20%C2%A0_%C2%A0%20Google%20Developers.mhtml
type string One of Blockly.Events.CREATE, Blockly.Events.DELETE, Blockly.Events.CHANGE, Blockly.Events.MOVE, Blockly.Events.UI.
workspaceId string UUID of workspace. The workspace can be found with Blockly.Workspace.getById(event.workspaceId)
blockId string UUID of block. The block can be found with workspace.getBlockById(event.blockId)
group string UUID of group. Some events are part of an indivisible group, such as inserting a statement in a stack.
demoWorkspace.getBlockById(event.blockId).type=="customvar"
*/
try {
var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
document.getElementById('codeArea').innerText = code;
} catch (error) {
document.getElementById('codeArea').innerText = String(error);
console.log(error);
}
}
demoWorkspace.addChangeListener(myUpdateFunction);
demoWorkspace.addChangeListener(Blockly.Events.disableOrphans);//自动禁用任何未连接到根块的块
/*
var MY_VARIABLE_callback = function (workspace) {
var varList = ['status:atk','status:money','status:hp'];
var xmlList = [];
if (Blockly.Blocks['customvar']) {
for (var i = 0; i < varList.length; i++) {
var blockText = '<xml>' +
'<block type="customvar">' +
'<field name="VARNAME">' + varList[i] + '</field>' +
'</block>' +
'</xml>';
var block = Blockly.Xml.textToDom(blockText).firstChild;
xmlList.push(block);
}
}
return xmlList;
}
demoWorkspace.registerToolboxCategoryCallback('MY_VARIABLE', MY_VARIABLE_callback);
*/
</script>
<script>
function showXML() {
/* // Generate JavaScript code and display it.
Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
alert(code); */
var xml = Blockly.Xml.workspaceToDom(demoWorkspace);
var xml_text = Blockly.Xml.domToText(xml);
console.log(xml_text);
console.log(xml);
}
function runCode() {
// 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(demoWorkspace);
Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
try {
eval('obj=' + code.split('\n').join(''));
console.log(obj);
} catch (e) {
alert(e);
}
}
</script>
<script>
/*
var xml = Blockly.Xml.workspaceToDom(demoWorkspace);
var xml_text = Blockly.Xml.domToText(xml);
//------
var xml = Blockly.Xml.textToDom(xml_text);
Blockly.Xml.domToWorkspace(xml, demoWorkspace);
*/
</script>
</body>
</html>
+17 -2
View File
@@ -19,6 +19,11 @@
width: 435px;
}
#appendPicSelection span {
font-size:11px;
-webkit-text-stroke: 1px black;
}
#left6 {
left: 5px;
/* top: 1930px; */
@@ -30,8 +35,17 @@
height: 780px;
}
#left6 #blocklyDiv {height: 480px; width: 940px;float:left;}
#left6 #codeArea {width: 99.5%; height: 15.4em;overflow:y;/* resize:none; */clear:both;}
#left6 #blocklyDiv {
height: 480px;
width: 940px;
}
#left6 .CodeMirror {
border: 1px solid #eee;
height: 200px;
width: 1300px;
}
#left6 #codeArea {width: 99.5%; height: 15.4em;overflow:y;/* resize:none; */}
#left7 {
/* height: 440px; width: 375px;float:left; */
@@ -87,6 +101,7 @@
background-color: #f6f8fa;
}
/* copy end --------------------------------------------- */
.etable tr {width:100%}
.etable tr > :nth-child(1) {width:20%}
.etable tr > :nth-child(2) {width:20%}
+13 -5
View File
@@ -209,9 +209,9 @@ initscript=String.raw`
}
try {
var code = Blockly.JavaScript.workspaceToCode(workspace);
document.getElementById('codeArea').value = code;
codeAreaHL.setValue(code);
} catch (error) {
document.getElementById('codeArea').value = String(error);
codeAreaHL.setValue(String(error));
if (error instanceof OmitedError){
var blockName = error.blockName;
var varName = error.varName;
@@ -267,6 +267,14 @@ xhr.onreadystatechange = function (){
xhr.open('GET','_server/blockly/MotaAction.g4',true);
xhr.send(null);
var codeAreaHL = CodeMirror.fromTextArea(document.getElementById("codeArea"), {
lineNumbers: true,
matchBrackets: true,
lineWrapping: true,
continueComments: "Enter",
extraKeys: {"Ctrl-Q": "toggleComment"}
});
editor_blockly.showXML = function () {
var xml = Blockly.Xml.workspaceToDom(editor_blockly.workspace);
var xml_text = Blockly.Xml.domToPrettyText(xml);
@@ -293,7 +301,7 @@ editor_blockly.runCode = function () {
editor_blockly.parse = function () {
MotaActionFunctions.parse(
eval('obj=' + document.getElementById('codeArea').value.replace(/[<>&]/g,function(c){return {'<':'&lt;','>':'&gt;','&':'&amp;'}[c];})),
eval('obj=' + codeAreaHL.getValue().replace(/[<>&]/g,function(c){return {'<':'&lt;','>':'&gt;','&':'&amp;'}[c];})),
document.getElementById('entryType').value
);
}
@@ -322,7 +330,7 @@ editor_blockly.import = function(id_){
}[field];
if(!type)return false;
editor_blockly.id=id_;
document.getElementById('codeArea').value = input.value;
codeAreaHL.setValue(input.value);
document.getElementById('entryType').value = type;
editor_blockly.parse();
editor_blockly.show();
@@ -350,7 +358,7 @@ editor_blockly.confirm = function (){
editor_blockly.hide();
input.onchange();
}
if(document.getElementById('codeArea').value===''){
if(codeAreaHL.getValue()===''){
setvalue('null');
return;
}
+32 -24
View File
@@ -175,11 +175,11 @@ editor_file = function(editor, callback){
saveSetting('items',actionList,function (err) {
callback([
{'items':(function(){
var locObj={};
var locObj=Object.assign({},editor.core.items.items[id]);
Object.keys(editor_file.comment.items.items).forEach(function(v){
if (isset(editor.core.items.items[id][v]))
locObj[v]=editor.core.items.items[id][v];
else
if (!isset(editor.core.items.items[id][v]))
/* locObj[v]=editor.core.items.items[id][v];
else */
locObj[v]=null;
});
return locObj;
@@ -191,11 +191,11 @@ editor_file = function(editor, callback){
} else {
callback([
{'items':(function(){
var locObj={};
var locObj=Object.assign({},editor.core.items.items[id]);
Object.keys(editor_file.comment.items.items).forEach(function(v){
if (isset(editor.core.items.items[id][v]))
locObj[v]=editor.core.items.items[id][v];
else
if (!isset(editor.core.items.items[id][v]))
/* locObj[v]=editor.core.items.items[id][v];
else */
locObj[v]=null;
});
return locObj;
@@ -223,11 +223,11 @@ editor_file = function(editor, callback){
saveSetting('enemys',actionList,function (err) {
callback([
(function(){
var locObj={};
var locObj=Object.assign({},editor.core.enemys.enemys[id]);
Object.keys(editor_file.comment.enemys).forEach(function(v){
if (isset(editor.core.enemys.enemys[id][v]))
locObj[v]=editor.core.enemys.enemys[id][v];
else
if (!isset(editor.core.enemys.enemys[id][v]))
/* locObj[v]=editor.core.enemys.enemys[id][v];
else */
locObj[v]=null;
});
return locObj;
@@ -238,11 +238,11 @@ editor_file = function(editor, callback){
} else {
callback([
(function(){
var locObj={};
var locObj=Object.assign({},editor.core.enemys.enemys[id]);
Object.keys(editor_file.comment.enemys).forEach(function(v){
if (isset(editor.core.enemys.enemys[id][v]))
locObj[v]=editor.core.enemys.enemys[id][v];
else
if (!isset(editor.core.enemys.enemys[id][v]))
/* locObj[v]=editor.core.enemys.enemys[id][v];
else */
locObj[v]=null;
});
return locObj;
@@ -315,13 +315,17 @@ editor_file = function(editor, callback){
saveSetting('floors',actionList,function (err) {
callback([
(function(){
var locObj={};
var locObj=Object.assign({},editor.currentFloorData);
Object.keys(editor_file.comment.floors.floor).forEach(function(v){
if (isset(editor.currentFloorData[v]))
locObj[v]=editor.currentFloorData[v];
else
if (!isset(editor.currentFloorData[v]))
/* locObj[v]=editor.currentFloorData[v];
else */
locObj[v]=null;
});
Object.keys(editor_file.comment.floors.loc).forEach(function(v){
delete(locObj[v]);
});
delete(locObj.map);
return locObj;
})(),
editor_file.comment.floors.floor,
@@ -330,13 +334,17 @@ editor_file = function(editor, callback){
} else {
callback([
(function(){
var locObj={};
var locObj=Object.assign({},editor.currentFloorData);
Object.keys(editor_file.comment.floors.floor).forEach(function(v){
if (isset(editor.currentFloorData[v]))
locObj[v]=editor.currentFloorData[v];
else
if (!isset(editor.currentFloorData[v]))
/* locObj[v]=editor.currentFloorData[v];
else */
locObj[v]=null;
});
Object.keys(editor_file.comment.floors.loc).forEach(function(v){
delete(locObj[v]);
});
delete(locObj.map);
return locObj;
})(),
editor_file.comment.floors.floor,
-46
View File
@@ -1,46 +0,0 @@
<!doctype html>
<html>
<head><meta charset="utf-8"></head>
<body>
<pre id='pout'>
</pre>
<script src="fs.js"></script>
<script src="editor_file.js"></script>
<script>
pout.innerHTML='waiting\nwaiting waiting';
var editor={};
editor.fs=fs;
editor_file = editor_file(editor);
editor.file=editor_file;
//代码复制到 http://127.0.0.1:1055/drawMapGUI.html 的console中进行测试
/* editor.file.loadFloorFile('sample0',function(err){console.log(err);
editor.file.saveFloorFileAs('aaa',function(err){console.log(err)});
}); */
//查询
/*
editor.file.editItem('redJewel',[],function(a){console.log(a)});
editor.file.editEnemy('redBat',[],function(a){console.log(a)});
editor.file.editLoc(2,6,[],function(a){console.log(a)});
editor.file.editFloor([],function(a){console.log(a)});
editor.file.editTower([],function(a){console.log(a)});
*/
//编辑
/*
editor.info={images: "terrains", y: 9};
editor.file.changeIdAndIdnum('yellowWall2',16,editor.info,function(a){console.log(a)});
editor.file.editItem('book',[["change","['items']['name']","怪物手册的新名字"]],function(a){console.log(a)});
editor.file.editEnemy('redBat',[['change',"['atk']",20]],function(a){console.log(a)});
editor.file.editLoc(2,6,[["change","['afterBattle']",null]],function(a){console.log(a)});
editor.file.editFloor([["change","['title']",'样板 33 层']],function(a){console.log(a)});
editor.file.editTower([["change","['values']['lavaDamage']",200]],function(a){console.log(a)});
*/
pout.innerHTML='succeed\nsucceed succeed';
</script>
</body>
</html>
-1
View File
@@ -371,7 +371,6 @@ editor_mode.prototype.listen = function(callback){
selectAppend.onchange();
var selectFileBtn = document.getElementById('selectFileBtn');
var selectFileStr = document.getElementById('selectFileStr');
selectFileBtn.onclick = function(){
var loadImage = function (content, callback) {
var image = new Image();
+2 -2
View File
@@ -29,7 +29,7 @@ editor_multi.import = function(id_){
editor_multi.isString=true;
codeEditor.setValue(JSON.parse(input.value)||'');
} else {
eval('var tobj='+input.value);
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},4);
for(var id_ in tmap){
@@ -64,7 +64,7 @@ editor_multi.confirm = function (){
if(editor_multi.isString){
input.value = JSON.stringify(value);
} else {
eval('var tobj='+value);
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){
+1
View File
@@ -219,6 +219,7 @@ tip_in_showMode = [
'涉及图片的更改需要F5刷新浏览器来生效',
'文本域可以通过双击,在文本编辑器或事件编辑器中编辑',
'事件编辑器中的显示文本和自定义脚本的方块也可以双击',
"画出的地图要点击\"保存地图\"才会写入到文件中",
];
var tip = new Vue({
el: '#tip',
+12 -10
View File
@@ -17,10 +17,9 @@
<p class="warnText" v-if="error">{{ errors[error-1] }}</p>
</div>
<div id="editTip" v-cloak>
<select id="selectFloor"></select><br>
<br>
<input type="button" value="当前地图另存为" id='saveFloorAs'/>
<input id='saveAsName' placeholder="输入新楼层id"/>
<input class='btn' type="button" value="save" id='saveFloor'/>
<input class='btn' type="button" value="saveAs" id='saveFloorAs'/>
<input class='btn' type="button" value="复制地图" v-on:click="copyMap"/>
</div>
<div style="position: absolute;right: 10px;bottom:70px;">
@@ -49,10 +48,10 @@
<canvas style="position:absolute;z-index:100"></canvas><!-- 用于响应鼠标点击 -->
<canvas style="position:absolute;display:none;"></canvas><!-- 画出追加后的sprite用于储存 -->
<div id="appendPicSelection">
<div class="appendSelection"><span style="font-size:10px">1</span></div>
<div class="appendSelection"><span style="font-size:10px">&nbsp;&nbsp;2</span></div>
<div class="appendSelection"><span style="font-size:10px">&nbsp;&nbsp;&nbsp;&nbsp;3</span></div>
<div class="appendSelection"><span style="font-size:10px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</span></div>
<div class="appendSelection"><span>1</span></div>
<div class="appendSelection"><span>&nbsp;&nbsp;2</span></div>
<div class="appendSelection"><span>&nbsp;&nbsp;&nbsp;&nbsp;3</span></div>
<div class="appendSelection"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</span></div>
</div>
</div>
</div></div>
@@ -128,7 +127,7 @@
<category name="template"></category>
</xml>
</h3>
<div>
<div style="position: relative;">
<div id="blocklyDiv"></div>
<textarea id="codeArea" spellcheck="false"></textarea>
</div>
@@ -183,6 +182,9 @@
<option value="functions">脚本编辑</option>
<option value="appendpic">追加素材</option>
</select>
<br><br><br><br>
<select id="selectFloor"></select>
<input type="button" value="保存地图" id='saveFloor'/>
<!-- -->
<div id="bgSelect" v-cloak style="display:none">
<span>当前地板: </span>
@@ -337,7 +339,7 @@
<script>
//所有全局量
__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','codeArea','entryType'];
__id__=['editArea','arrRowMark','mapRowMark','data','bg','dataSelection','blocklyDiv','codeAreaHL','entryType'];
__Vue__=['exportM','editArea','editTip','clear','tip','selectBox'];
//var event = document.getElementById('event');
@@ -357,7 +359,7 @@ main.init('editor', function() {
editor.mode.floor();
editor.mode.tower();
editor.mode.functions();
editor.mode.showMode('loc');
editor.mode.showMode('floor');
editor.mode.listen();
editor_multi=editor_multi();
editor_blockly=editor_blockly();
+1 -1
View File
@@ -118,7 +118,7 @@ main.prototype.init = function (mode, callback) {
for (var i = 0; i < main.dom.gameCanvas.length; i++) {
main.canvas[main.dom.gameCanvas[i].id] = main.dom.gameCanvas[i].getContext('2d');
}
if (({"editor":0,"replay":0}).hasOwnProperty(mode)) {
if (({"editor":0}).hasOwnProperty(mode)) {
main.mode = mode;
if (mode === 'editor')main.editor = {'disableGlobalAnimate':true};
}
+1
View File
@@ -25,6 +25,7 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
'range': 'range可选,代表领域伤害的范围;不加默认为1\n$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end',
'bomb':' 加入 "bomb": false 代表该怪物不可被炸弹或圣锤炸掉\n$select({\"values\":[true,false]})$end',
'n': '多连击需要在后面指定n代表是几连击\n$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end',
'add': '代表吸血后是否加到自身\n$select({\"values\":[true,false]})$end',
'atkValue':'退化时勇士下降的攻击力点数\n$range(thiseval==~~thiseval||thiseval==null)$end',
'defValue':'退化时勇士下降的防御力点数\n$range(thiseval==~~thiseval||thiseval==null)$end',
'damage':'战前扣血的点数\n$range(thiseval==~~thiseval||thiseval==null)$end'
-152
View File
@@ -1,152 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' content='text/html' charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=Edge, chrome=1'>
<meta name='author' content='ckcz123'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=yes'>
<title></title>
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/>
<meta name="screen-orientation" content="portrait">
<meta name="full-screen" content="yes">
<meta name="browsermode" content="application">
<meta name="x5-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="x5-page-mode" content="app">
<link type='text/css' href='styles.css' rel='stylesheet'>
</head>
<body>
<div id='gameGroup'>
<p id='mainTips'>请稍后...</p>
<div id='startPanel'>
<div id='startTop'>
<div id='startTopProgressBar'>
<div id='startTopProgress'></div>
</div>
<p id='startTopLoadTips'>资源即将开始加载</p>
</div>
<img id='startBackground' src='project/images/bg.png'>
<!-- 标题界面;可以改style的color使标题改变颜色 -->
<p id='startLogo' style="color: black"></p>
<div id='startButtonGroup'>
<div id='startButtons'>
<span class='startButton' id='playGame'>开始游戏</span>
<span class='startButton' id='loadGame'>载入游戏</span>
<span class='startButton' id='aboutGame'>关于本塔</span>
</div>
<div id='levelChooseButtons'>
<span class='startButton' id='easyLevel'>简单</span>
<span class='startButton' id='normalLevel'>普通</span>
<span class='startButton' id='hardLevel'>困难</span>
</div>
</div>
</div>
<div id='floorMsgGroup'>
<p id='logoLabel'></p>
<p id='versionLabel'></p>
<p id='floorNameLabel'></p>
</div>
<div id='statusBar' class="clearfix">
<div class="status" id="floorCol">
<img src='project/images/floor.png' id="img-floor">
<p class='statusLabel' id='floor'></p>
</div>
<div class="status" id="lvCol">
<img src='project/images/lv.png' id="img-lv">
<p class='statusLabel' id='lv'></p>
</div>
<div class="status">
<img src='project/images/hp.png' id="img-hp">
<p class='statusLabel' id='hp'></p>
</div>
<div class="status">
<img src='project/images/atk.png' id="img-atk">
<p class='statusLabel' id='atk'></p>
</div>
<div class="status">
<img src='project/images/def.png' id="img-def">
<p class='statusLabel' id='def'></p>
</div>
<div class="status" id="mdefCol">
<img src='project/images/mdef.png' id="img-mdef">
<p class='statusLabel' id='mdef'></p>
</div>
<div class="status" id="moneyCol">
<img src='project/images/money.png' id="img-money">
<p class='statusLabel' id='money'></p>
</div>
<div class="status" id="expCol">
<img src='project/images/experience.png' id="img-experience">
<p class='statusLabel' id='experience'></p>
</div>
<div class="status" id="upCol">
<img src='project/images/up.png' id="img-up">
<p class='statusLabel' id='up'></p>
</div>
<div class="status">
<span class='statusLabel' id='yellowKey' style="color:#FFCCAA"></span>
<span class='statusLabel' id='blueKey' style="color:#AAAADD"></span>
<span class='statusLabel' id='redKey' style="color:#FF8888"></span>
</div>
<div class="status" id="debuffCol">
<span class='statusLabel' id='poison' style="color: #AFFCA8;"></span>
<span class='statusLabel' id='weak' style="color: #FECCD0;"></span>
<span class='statusLabel' id='curse' style="color: #C2F4E7;"></span>
</div>
</div>
<div id="toolBar" class="clearfix">
<img src="project/images/book.png" class="tools" id='img-book'>
<img src="project/images/fly.png" class="tools" id='img-fly'>
<img src="project/images/toolbox.png" class="tools" id='img-toolbox'>
<img src="project/images/shop.png" class="tools" id='img-shop'>
<img src="project/images/save.png" class="tools" id='img-save'>
<img src="project/images/load.png" class="tools" id='img-load'>
<img src="project/images/settings.png" class="tools" id='img-settings'>
<p class="statusLabel tools" id="hard"></p>
</div>
<div id="curtain"></div>
<canvas class='gameCanvas' id='bg' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='event' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='fg' width='416' height='416'></canvas>
<canvas class='gameCanvas' id='hero' 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>
</div>
<script id='mainScript' src='main.js'></script>
<script>
main.init('editor');
//main.init('replay');
main.listen();
var replayActions = function(){
//core.onclick(7,7,[]);
}
var replay = function(){
core.events.startGame('');
//setTimeout(function(){Array.from(Array(200)).forEach(function(){core.onclick(7,7,[]);});console.log(1);},1000);//关开场剧情
//setTimeout(function(){try {Array.from(Array(200)).forEach(function(){core.drawText();})} catch (error){}},3000);//关firstArrive
//console.log(1);
}
var afterInit = function(){
main.editor.disableGlobalAnimate=false;
main.editor.drawMapBg();
main.editor.updateMap();
core.setHeroMoveTriggerInterval();
}
var start = function(){
var hard = 'Hard';
core.resetStatus(core.firstData.hero, hard, core.firstData.floorId, core.initStatus.maps);
core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() {
/* core.setHeroMoveTriggerInterval(); */
afterInit();
});
core.events.setInitData(hard);
}
setTimeout(start, 300);
//setTimeout(replay, 300);
</script>
</body>
</html>