Merge pull request #71 from zhaouv/v2.0-editor-20180304
V2 0 editor 20180304
This commit is contained in:
commit
e48a8f3106
11
2.0diff.md
11
2.0diff.md
@ -139,14 +139,11 @@ $textarea(evalstr)$end
|
||||
# todo & 目前的bug
|
||||
|
||||
+ `event`,`after...`在地图上没有标记,可以在右下角加类似于无`id`的红问号类似的绿色星号小标记
|
||||
+ 添加新图块只对地形好使,添加的新物品还是需要手动在`project/items.js`中加东西
|
||||
+ 目前未做$range(evalstr:thiseval)$end的检查
|
||||
+ [x] 添加新图块只对地形好使,添加的新物品还是需要手动在`project/items.js`中加东西
|
||||
+ [x] 目前未做$range(evalstr:thiseval)$end的检查
|
||||
+ 通过`core.values.redJewel`的方式设置物品加的数值,在全GUI下反而会不直观
|
||||
+ `idnum`上限改到`999`,不需要在`.js`中手动设置`idnum`的话,根据数字范围来约定类型意义不大,而且`400`内随便输个数就发现已经被占了,体验极差
|
||||
+ `editor.html`中独立换背景的功能不再需要,待移除
|
||||
+ 全GUI下编辑要经常保存修改后F5
|
||||
+ 目前的报错只是throw,如果不开F12注意不到有错误发生,修改没有生效
|
||||
+ 有待美化,以及做成标签页式的模式切换
|
||||
+ replay模式,这个功能对于魔塔网站以及贴吧活动很有意义
|
||||
|
||||
前三条我会尽快修复(添加)
|
||||
+ [x] 目前的报错只是throw,如果不开F12注意不到有错误发生,修改没有生效
|
||||
+ [x] 有待美化,以及做成标签页式的模式切换
|
||||
@ -18,7 +18,7 @@ editor.file.loadFloorFile
|
||||
editor.file.saveFloorFile
|
||||
editor.file.saveFloorFileAs
|
||||
```
|
||||
6个编辑模式有关的查询
|
||||
编辑模式有关的查询
|
||||
```javascript
|
||||
editor.file.editItem('redJewel',[],function(a){console.log(a)});
|
||||
editor.file.editEnemy('redBat',[],function(a){console.log(a)});
|
||||
@ -27,7 +27,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)});
|
||||
```
|
||||
6个编辑模式有关的编辑
|
||||
编辑模式有关的编辑
|
||||
```javascript
|
||||
editor.info={images: "terrains", y: 9};
|
||||
editor.file.changeIdAndIdnum('yellowWall2',16,editor.info,function(a){console.log(a)});
|
||||
@ -50,14 +50,19 @@ editor.mode.functions();
|
||||
```
|
||||
切换模式
|
||||
```javascript
|
||||
editor.mode.onmode('');
|
||||
editor.mode.onmode('');//清空
|
||||
editor.mode.onmode('save');//保存
|
||||
editor.mode.onmode('nextChange');//下次onmode时前端进行切换
|
||||
|
||||
editor.mode.onmode('loc');
|
||||
editor.mode.onmode('emenyitem');
|
||||
editor.mode.onmode('floor');
|
||||
editor.mode.onmode('tower');
|
||||
editor.mode.onmode('functions');
|
||||
editor.mode.onmode('map');
|
||||
editor.mode.onmode('appendpic');
|
||||
```
|
||||
在切换模式时,改动才会保存到文件,并且需要刷新页面使得`editor`能看到改动
|
||||
在`onmode('save')`时,改动才会保存到文件,涉及到图片的改动需要刷新页面使得`editor`能看到
|
||||
|
||||
表格的`onchange`的实现中,获得当前模式的方式.不注意的话,修改`index.html`中页面的结构,会被坑
|
||||
```javascript
|
||||
@ -83,8 +88,8 @@ editor_blockly.confirm();
|
||||
|
||||
### 待调整
|
||||
|
||||
多行文本编辑器独立作为组件
|
||||
editor_multi.js
|
||||
+ [x] 多行文本编辑器独立作为组件
|
||||
+ [x] editor_multi.js
|
||||
|
||||
## z-index
|
||||
|
||||
|
||||
@ -23,6 +23,8 @@ editor.prototype.init = function(callback){
|
||||
|
||||
var afterMainInit = function(){
|
||||
core.floors=JSON.parse(JSON.stringify(core.floors,function(k,v){if(v instanceof Function){return v.toString()}else return v}));
|
||||
core.data=JSON.parse(JSON.stringify(core.data,function(k,v){if(v instanceof Function){return v.toString()}else return v}));
|
||||
data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d=JSON.parse(JSON.stringify(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d,function(k,v){if(v instanceof Function){return v.toString()}else return v}));
|
||||
editor.main=main;
|
||||
editor.core=core;
|
||||
editor.fs=fs;
|
||||
|
||||
@ -312,7 +312,8 @@ editor_blockly.import = function(id_){
|
||||
"['afterGetItem']":'afterGetItem',
|
||||
"['afterOpenDoor']":'afterOpenDoor',
|
||||
|
||||
"['firstData']['shops']":'shop',
|
||||
//"['firstData']['shops']":'shop',
|
||||
"--shop--未完成数组的处理":'shop',
|
||||
|
||||
"['firstArrive']":'firstArrive',
|
||||
"['firstData']['startText']":'firstArrive',
|
||||
|
||||
@ -79,7 +79,7 @@ editor_file = function(editor, callback){
|
||||
}
|
||||
datastr=datastr.concat(['\n}']);
|
||||
datastr=datastr.join('');
|
||||
fs.writeFile(filename,datastr,'utf-8',function(err, data){
|
||||
fs.writeFile(filename,encode(datastr),'base64',function(err, data){
|
||||
callback(err);
|
||||
});
|
||||
}
|
||||
@ -482,7 +482,7 @@ editor_file = function(editor, callback){
|
||||
});
|
||||
var datastr='icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = \n';
|
||||
datastr+=JSON.stringify(icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1,null,4);
|
||||
fs.writeFile('project/icons.js',datastr,'utf-8',function(err, data){
|
||||
fs.writeFile('project/icons.js',encode(datastr),'base64',function(err, data){
|
||||
callback(err);
|
||||
});
|
||||
return;
|
||||
@ -494,7 +494,7 @@ editor_file = function(editor, callback){
|
||||
});
|
||||
var datastr='maps_90f36752_8815_4be8_b32b_d7fad1d0542e = \n';
|
||||
datastr+=JSON.stringify(maps_90f36752_8815_4be8_b32b_d7fad1d0542e,null,4);
|
||||
fs.writeFile('project/maps.js',datastr,'utf-8',function(err, data){
|
||||
fs.writeFile('project/maps.js',encode(datastr),'base64',function(err, data){
|
||||
callback(err);
|
||||
});
|
||||
return;
|
||||
@ -506,7 +506,7 @@ editor_file = function(editor, callback){
|
||||
});
|
||||
var datastr='items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = \n';
|
||||
datastr+=JSON.stringify(items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a,null,4);
|
||||
fs.writeFile('project/items.js',datastr,'utf-8',function(err, data){
|
||||
fs.writeFile('project/items.js',encode(datastr),'base64',function(err, data){
|
||||
callback(err);
|
||||
});
|
||||
return;
|
||||
@ -518,7 +518,7 @@ editor_file = function(editor, callback){
|
||||
});
|
||||
var datastr='enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = \n';
|
||||
datastr+=JSON.stringify(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80,null,4);
|
||||
fs.writeFile('project/enemys.js',datastr,'utf-8',function(err, data){
|
||||
fs.writeFile('project/enemys.js',encode(datastr),'base64',function(err, data){
|
||||
callback(err);
|
||||
});
|
||||
return;
|
||||
@ -530,7 +530,7 @@ editor_file = function(editor, callback){
|
||||
});
|
||||
var datastr='data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = \n';
|
||||
datastr+=JSON.stringify(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d,null,4);
|
||||
fs.writeFile('project/data.js',datastr,'utf-8',function(err, data){
|
||||
fs.writeFile('project/data.js',encode(datastr),'base64',function(err, data){
|
||||
callback(err);
|
||||
});
|
||||
return;
|
||||
|
||||
@ -38,11 +38,25 @@ editor_mode.prototype.init_dom_ids = function(callback){
|
||||
editor_mode.prototype.objToTable = function(obj,commentObj){
|
||||
var outstr=["\n<tr><td>条目</td><td>注释</td><td>值</td></tr>\n"];
|
||||
var guids=[];
|
||||
var checkIsLeaf = function(obj,commentObj,field){
|
||||
var thiseval = eval('obj'+field);
|
||||
if (thiseval == null || thiseval == undefined)return true;//null,undefined
|
||||
if (typeof(thiseval) == typeof(''))return true;//字符串
|
||||
if (Object.keys(thiseval).length == 0)return true;//数字,true,false,空数组,空对象
|
||||
try {
|
||||
var comment = eval('commentObj'+field);
|
||||
if( comment.indexOf('$leaf') != -1){
|
||||
evalstr = comment.split('$leaf')[1].split('$end')[0];
|
||||
if(eval(evalstr) === true)return true;
|
||||
}
|
||||
} catch (error) {}
|
||||
return false;
|
||||
}
|
||||
//深度优先遍历
|
||||
var recursionParse = function(tfield) {
|
||||
for(var ii in eval("obj"+tfield)){
|
||||
var field = tfield+"['"+ii+"']";
|
||||
var isleaf = editor_mode.checkIsLeaf(obj,commentObj,field);
|
||||
var isleaf = checkIsLeaf(obj,commentObj,field);
|
||||
if (isleaf) {
|
||||
var leafnode = editor_mode.objToTr(obj,commentObj,field);
|
||||
outstr.push(leafnode[0]);
|
||||
@ -54,6 +68,13 @@ editor_mode.prototype.objToTable = function(obj,commentObj){
|
||||
}
|
||||
}
|
||||
recursionParse("");
|
||||
var checkRange = function(comment,thiseval){
|
||||
if( comment.indexOf('$range') !== -1){
|
||||
var evalstr = comment.split('$range')[1].split('$end')[0];
|
||||
return eval(evalstr);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
var listen = function(guids) {
|
||||
guids.forEach(function(guid){
|
||||
// tr>td[title=field]
|
||||
@ -69,12 +90,12 @@ editor_mode.prototype.objToTable = function(obj,commentObj){
|
||||
node = node.parentNode;
|
||||
}
|
||||
editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]);
|
||||
editor_mode.addAction(['change',field,JSON.parse(input.value)]);
|
||||
//尚未完成,不完善,目前还没做$range的检查
|
||||
|
||||
// /*临时*/editor_mode.onmode('');/*临时*/
|
||||
//临时改为立刻写入文件,删去此句的时,切换模式才会真正写入
|
||||
//现阶段这样会更实用,20180218
|
||||
var thiseval = JSON.parse(input.value);
|
||||
if(checkRange(comment,thiseval)){
|
||||
editor_mode.addAction(['change',field,thiseval]);
|
||||
} else {
|
||||
printe('输入的值不合要求,请鼠标放置在注释上查看说明');
|
||||
}
|
||||
}
|
||||
input.ondblclick = function(){
|
||||
if(!editor_blockly.import(guid))
|
||||
@ -86,21 +107,6 @@ editor_mode.prototype.objToTable = function(obj,commentObj){
|
||||
return {"HTML":outstr.join(''),"guids":guids,"listen":listen};
|
||||
}
|
||||
|
||||
editor_mode.prototype.checkIsLeaf = function(obj,commentObj,field){
|
||||
var thiseval = eval('obj'+field);
|
||||
if (thiseval == null || thiseval == undefined)return true;//null,undefined
|
||||
if (typeof(thiseval) == typeof(''))return true;//字符串
|
||||
if (Object.keys(thiseval).length == 0)return true;//数字,true,false,空数组,空对象
|
||||
try {
|
||||
var comment = eval('commentObj'+field);
|
||||
if( comment.indexOf('$leaf') != -1){
|
||||
evalstr = comment.split('$leaf')[1].split('$end')[0];
|
||||
if(eval(evalstr) === true)return true;
|
||||
}
|
||||
} catch (error) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
editor_mode.prototype.objToTr = function(obj,commentObj,field){
|
||||
var guid = editor.guid();
|
||||
var thiseval = eval('obj'+field);
|
||||
@ -197,6 +203,12 @@ editor_mode.prototype.showMode = function (mode) {
|
||||
editor_mode.dom[mode].style='';
|
||||
if(editor_mode[mode])editor_mode[mode]();
|
||||
document.getElementById('editModeSelect').value=mode;
|
||||
var tips = [
|
||||
'涉及图片的更改需要F5刷新浏览器来生效',
|
||||
'文本域可以通过双击,在文本编辑器或事件编辑器中编辑',
|
||||
'事件编辑器中的显示文本和自定义脚本的方块也可以双击',
|
||||
];
|
||||
if(!selectBox.isSelected)printf('tips: '+tips[~~(tips.length*Math.random())]);
|
||||
}
|
||||
|
||||
editor_mode.prototype.loc = function(callback){
|
||||
@ -462,7 +474,7 @@ editor_mode.prototype.listen = function(callback){
|
||||
var imgbase64 = sprite.toDataURL().split(',')[1];
|
||||
fs.writeFile('./project/images/'+editor_mode.appendPic.imageName+'.png',imgbase64,'base64',function(err,data){
|
||||
if(err){printe(err);throw(err)}
|
||||
printe('追加素材成功,请刷新编辑器');
|
||||
printe('追加素材成功,请F5刷新编辑器');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -37,13 +37,13 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"name": "显示在状态栏中的层数 ",
|
||||
"canFlyTo": "该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) \n$select({\"values\":[true,false]})$end",
|
||||
"canUseQuickShop": "该层是否允许使用快捷商店 \n$select({\"values\":[true,false]})$end",
|
||||
"defaultGround": "默认地面的图块ID(terrains中) ",
|
||||
"defaultGround": "默认地面的图块ID(terrains中) \n$select({\"values\":Object.keys(editor.core.icons.icons.terrains)})$end",
|
||||
"png": "背景图;你可以选择一张png图片来作为背景素材。详细用法请参见文档“自定义素材”中的说明。 \n$leaf(true)$end",
|
||||
"color": "该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。 \n$leaf(true)$end",
|
||||
"weather": "该层的默认天气。本项可忽略表示晴天,如果写则第一项为\"rain\"或\"snow\"代表雨雪,第二项为1-10之间的数代表强度。 \n$leaf(true)$end",
|
||||
"bgm": "到达该层后默认播放的BGM。本项可忽略。 ",
|
||||
//"map": "地图数据,需要是13x13,建议使用地图生成器来生成 ",
|
||||
"item_ratio": "每一层的宝石/血瓶效果,即获得宝石和血瓶时框内\"ratio\"的值。",
|
||||
"item_ratio": "每一层的宝石/血瓶效果,即获得宝石和血瓶时框内\"ratio\"的值。$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end",
|
||||
"firstArrive": "第一次到该楼层触发的事件 \n$leaf(true)$end",
|
||||
},
|
||||
'loc' : {
|
||||
|
||||
@ -102,7 +102,7 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
]
|
||||
}
|
||||
},*/
|
||||
"levelUp": [
|
||||
"levelUp": " 经验升级所需要的数值,是一个数组 \n 第一项为初始等级,可以简单留空,也可以写name \n 每一个里面可以含有三个参数 need, name, effect \n need为所需要的经验数值,是一个正整数。请确保need所需的依次递增 \n name为该等级的名称,也可以省略代表使用系统默认值;本项将显示在状态栏中 \n effect为本次升级所执行的操作,可由若干项组成,由分号分开 \n 其中每一项写法和上面的商店完全相同,同样必须是X+=Y的形式,Y是一个表达式,同样可以使用status:xxx或item:xxx代表勇士的某项数值/道具个数 \n$leaf(true)$end"/* [
|
||||
" 经验升级所需要的数值,是一个数组 \n 第一项为初始等级,可以简单留空,也可以写name \n 每一个里面可以含有三个参数 need, name, effect \n need为所需要的经验数值,是一个正整数。请确保need所需的依次递增 \n name为该等级的名称,也可以省略代表使用系统默认值;本项将显示在状态栏中 \n effect为本次升级所执行的操作,可由若干项组成,由分号分开 \n 其中每一项写法和上面的商店完全相同,同样必须是X+=Y的形式,Y是一个表达式,同样可以使用status:xxx或item:xxx代表勇士的某项数值/道具个数 \n$leaf(true)$end",
|
||||
{
|
||||
"need": "",
|
||||
@ -113,7 +113,7 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"need": "",
|
||||
"effect": " effect也允许写一个function,代表本次升级将会执行的操作 \n 依次往下写需要的数值即可 "
|
||||
}
|
||||
]
|
||||
] */
|
||||
},
|
||||
"values": {
|
||||
"HPMAX": " 各种数值;一些数值可以在这里设置\n /****** 角色相关 ******/ \n HP上限;-1则无上限 ",
|
||||
|
||||
@ -134,12 +134,12 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
||||
{"need": 20, "name": "第二级", "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, // 先将生命提升攻防和的2倍;再将攻击+10,防御+10
|
||||
|
||||
|
||||
{"need": 40, "effect": `function () {
|
||||
{"need": 40, "effect": function () {
|
||||
core.drawText("恭喜升级!");
|
||||
core.status.hero.hp *= 2;
|
||||
core.status.hero.atk += 100;
|
||||
core.status.hero.def += 100;
|
||||
}`}, // effect也允许写一个function,代表本次升级将会执行的操作
|
||||
}}, // effect也允许写一个function,代表本次升级将会执行的操作
|
||||
|
||||
// 依次往下写需要的数值即可
|
||||
]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user