mota-js/migration.html
2020-06-15 11:22:11 +08:00

606 lines
35 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>HTML5魔塔样板V2.7接档工具</title>
</head>
<body>
<h1>HTML5魔塔样板V2.7接档工具</h1>
<script src='_server/fs.js'></script>
<script src='project/data.js'></script>
<script src='project/enemys.js'></script>
<script src='project/functions.js'></script>
<script src='project/icons.js'></script>
<script src='project/items.js'></script>
<script src='project/maps.js'></script>
<script src='project/plugins.js'></script>
<script>
// 检查脚本编辑和插件编写;这两个绝对不能接
if (functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.events.setInitData || !plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1.shop) {
document.write("<h2 style='color:red'>错误请勿覆盖脚本编辑functions.js和插件编写plugins.js<br/>请从全新的V2.7样板中复制一个functions.js和plugins.js到project文件夹再继续接档操作。</h2>");
} else {
document.write("<p><button id='action' onclick='action()'>点此一键接档</button><p><p id='message' style='color:red; display:none'>接档成功!请重启编辑器并继续以下接档流程;若仍然无法打开编辑器请联系小艾处理。</p>");
}
</script>
<h2>请严格按照如下流程,一步步进行接档操作。请勿随意增删接档过程,以免出现编辑器白屏、闪退等情况。</h2>
<p>
<ol>
<li><b style="color:red">做好备份,做好备份,做好备份!!!</b>接档前请一定先做好备份!</li>
<li>使用RM转H5刻塔器所刻的塔不适用于此接档工具。</li>
<li>将V2.6.6样板中project目录下除了<code>project/functions.js</code><code>project/plugins.js</code>以外的其他文件和文件夹直接复制到最新的V2.7样板中,然后打开本接档工具。</li>
<li>点击上述的「点此一键接档」,并看到红字提示接档成功。此时编辑器应该可以正常打开。若此时无法打开编辑器请联系小艾处理。</li>
<li>下拉框切到「全塔属性」,并注意以下内容:
<ul>
<li>现在素材和使用的其他图片等在文件夹中被拆分,请检查对应的图片文件已经正确移动到对应的文件夹。</li>
<li>「难度选择项」的逻辑在V2.7中被修改;请重新制作。</li>
<li>「全局商店」的结构在V2.7中被修改;请重新制作。</li>
<li>部分方框进行了合并,请一个个仔细检查是否存在问题。</li>
</ul>
</li>
<li>素材区的如下图块有所变动:
<ul>
<li>三色墙和六色门从terrains中解除引用请用animates中的进行绘制。</li>
<li>如下图块的图块属性已被重置:三色墙、六色门、四色网、四个单向箭头、亮灯。</li>
<li>所有的<code>noPass:false</code>都改成<code>canPass:true</code>;请仔细检查可通行性。</li>
<li>如下道具的道具属性已被重置请仔细检查三色钥匙、四色宝石已改名Gem、四色血瓶、破墙、破冰、炸弹、地震、冰冻、大黄门钥匙、上下楼器。</li>
<li>即时道具获得的说明和提示文字均改成了<code>${}</code>计算,<code>ratio</code>需写明全称(参见宝石血瓶写法),请自行处理。</li>
<li>npc48的默认动画帧数<code>null</code>改回为4如需静止状态请手动改成1。</li>
</ul>
</li>
<li>下拉框切到「楼层属性」,并注意以下内容:
<ul>
<li><code>item_ratio</code>被重命名为<code>ratio</code>,请自行修改。</li>
<li>(你也可以直接改宝石和血瓶的效果,将<code>core.status.thisMap.ratio</code>改成<code>core.status.thisMap.item_ratio</code>。)</li>
<li>楼层贴图的结构在V2.7中被修改;请重新制作。</li>
</ul>
</li>
<li>下拉框切换到「脚本编辑」并请重新编辑各个自己改过的函数可以双开一个原版V266项目和当前接档的项目进行处理
<ul>
<li>请注意V2.7中的经验全部从<code>experience</code>替换成简写的<code>exp</code>;写伤害计算等时请尤其注意。</li>
<li>部分文案有所改变,如「阻击」从<code>snipe</code>改名<code>repulse</code><code>shoes</code>改名<code>amulet</code>等等,请自行处理。</li>
<li><code>setInitData</code>已被删除,请将需要的额外初始化代码写入<code>startText</code>中。</li>
<li><code>afterChangeLight, afterUseBomb, afterPassNet</code>已被删除,请去对应图块属性内修改。</li>
<li>其他基本每个函数都有大幅修改,<b style="color:red">请勿直接拿原来的脚本整体覆盖,而是重新对函数进行需要的编辑!</b></li>
</ul>
</li>
<li>下拉框切换到「插件编写」,并重新新增自己加过的插件。
<ul>
<li>V2.7不能保证插件的兼容性,请谨慎测试。</li>
<li>如果插件出现不可用问题请自行联系插件原作者更新插件到支持V2.7的版本。</li>
</ul>
</li>
<li>请仔细检查每个道具的道具效果、每个怪物的属性、每个楼层属性、以及每个点的事件(建议双开对比)。主要变动如下:
<ul>
<li>「数值增减」事件已被删除并被数值操作+运算符替代,编辑器将解析为自定义事件;但是游戏中仍然可以正确执行(你可以选择替换与否)。</li>
<li>「隐藏事件」将不再默认删除该点(而只是纯粹的隐藏);请给有需要的「隐藏事件」勾选「同时删除」选项。</li>
<li>「绘制圆」「绘制圆边框」「重启当前事件」已经被删除,并且无法再在游戏中使用,请替换成等价的写法。</li>
</ul>
</li>
<li>其他
<ul>
<li>V2.7默认采用新版图标;如果觉得不合适可以将<code>materials</code>目录下的<code>icons_old.png</code>替换掉<code>icons.png</code>以使用原版图标。</li>
</ul>
</li>
<li><b style='color:red'>接档后请做好充分的测试!最好能跑通录像以确认接档无误!</b></li>
</ol>
</p>
<script>
function action() {
action_data(function() {
action_enemys(function() {
action_icons(function() {
action_items(function() {
action_maps(function() {
alert('接档成功!请重启编辑器并继续以下接档流程;若仍然无法打开编辑器请联系小艾处理。');
document.getElementById('action').style.display = 'none';
document.getElementById('message').style.display = 'block';
})
})
})
})
})
}
function encode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode(parseInt(p1, 16))
}))
}
function random_string() {
return (Math.random()+"_"+Math.random()).replace(/\./g, "");
}
// 接档全局属性
function action_data(callback) {
var data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d;
var main = data.main, firstData = data.firstData, values = data.values, flags = data.flags;
// Step 0: 移动目录
// materials
['animates', 'enemys', 'items', 'npcs', 'terrains', 'enemy48', 'npc48', 'airwall', 'fog', 'keyboard'].forEach(function (one) {
fs.moveFile('project/images/'+one+".png", 'project/materials/'+one+'.png', function (e, d) {});
});
main.tilesets.forEach(function (one) {
if (one.indexOf('.')<0) one += '.png';
fs.moveFile('project/images/'+one, 'project/tilesets/'+one, function (e, d) {});
});
// bgms
main.bgms.forEach(function (one) {
fs.moveFile('project/sounds/'+one, 'project/bgms/'+one, function (e,d) {});
})
// Step 1: 重置levelChoose和shop
main.levelChoose = [];
firstData.shops = [];
main.fonts = [];
// Step 2: 合并main.styles
if (!main.styles) main.styles = {
"startBackground": "project/images/bg.jpg",
"startVerticalBackground": "project/images/bg.jpg",
"startLogoStyle": "color: black",
"startButtonsStyle": "background-color: #32369F; opacity: 0.85; color: #FFFFFF; border: #FFFFFF 2px solid; caret-color: #FFD700;",
"statusLeftBackground": "url(project/materials/ground.png) repeat",
"statusTopBackground": "url(project/materials/ground.png) repeat",
"toolsBackground": "url(project/materials/ground.png) repeat",
"borderColor": [204,204,204,1],
"statusBarColor": [255,255,255,1],
"floorChangingStyle": "background-color: black; color: white",
"font": "Verdana"
};
["startLogoStyle", "startButtonsStyle", "statusLeftBackground", "statusTopBackground", "toolsBackground", "font"].forEach(function (one) {
if (main[one]) main.styles[one] = main[one];
});
if (main.styles.startVerticalBackground == null) main.styles.startVerticalBackground = main.styles.startBackground;
for (var key in main.styles) delete main[key];
delete main.floorChangingBackground; delete main.floorChangingTextColor;
// Step 3: 重置勇士属性
if (main.images.indexOf('hero.png') < 0) main.images.push('hero.png');
firstData.hero.image = 'hero.png';
firstData.hero.followers = [];
if (firstData.hero.exp == null) firstData.hero.exp = firstData.hero.experience;
delete firstData.hero.experience;
delete firstData.hero.items.keys;
// Step 4: 重置全局开关
if (values.statusCanvasRowsOnMobile == null)
values.statusCanvasRowsOnMobile = flags.statusCanvasRowsOnMobile;
delete flags.statusCanvasRowsOnMobile;
if (values.redGem == null) values.redGem = values.redJewel;
if (values.blueGem == null) values.blueGem = values.blueJewel;
if (values.greenGem == null) values.greenGem = values.greenJewel;
delete values.redJewel;
delete values.blueJewel;
delete values.greenJewel;
delete values.moveSpeed;
delete values.floorChangeTime;
if (flags.enableExperience != null) {
flags.enableExp = flags.enableExperience;
delete flags.enableExperience;
}
var statusList = [
"enableFloor",
"enableName",
"enableLv",
"enableHPMax",
"enableHP",
"enableMana",
"enableAtk",
"enableDef",
"enableMDef",
"enableMoney",
"enableExp",
"enableLevelUp",
"levelUpLeftMode",
"enableKeys",
"enableGreenKey",
"enablePZF",
"enableDebuff",
"enableSkill"
];
if (flags.statusBarItems == null) {
flags.statusBarItems = [];
statusList.forEach(function (one) {
if (flags[one]) flags.statusBarItems.push(one);
});
}
statusList.forEach(function (one) { delete flags[one]; });
delete flags.enableExperience;
delete flags.pickaxeFourDirections;
delete flags.bombFourDirections;
delete flags.snowFourDirections;
delete flags.bigKeyIsBox;
delete flags.equipment;
delete flags.iconInEquipbox;
delete flags.hatredDecrease;
delete flags.betweenAttackCeil;
delete flags.startDirectly;
delete flags.enableDisabledShop;
delete flags.potionWhileRouting;
delete flags.checkConsole;
// 写入
var datastr = 'var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = \n';
datastr += JSON.stringify(data, null, '\t');
fs.writeFile('project/data.js', encode(datastr), 'base64', function (err, data) {
if (err) {
alert('datas接档失败请查看控制台报错并刷新重试。');
console.error(err);
} else callback();
});
}
// 接档怪物experience->exp
function action_enemys(callback) {
var enemy = enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80;
for (var id in enemy) {
if (enemy[id].experience != null) {
enemy[id].exp = enemy[id].experience;
}
delete enemy[id].experience;
}
var datastr = 'var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = \n';
var emap = {};
var estr = JSON.stringify(enemy, function (k, t) {
if (t && t.hp != null) {
delete t.id;
var id_ = random_string();
emap[id_] = JSON.stringify(t);
return id_;
} else return t;
}, '\t');
for (var id_ in emap) {
estr = estr.replace('"' + id_ + '"', emap[id_])
}
datastr += estr;
fs.writeFile('project/enemys.js', encode(datastr), 'base64', function (err, data) {
if (err) {
alert('enemys接档失败请查看控制台报错并刷新重试。');
console.error(err);
} else callback();
});
}
function action_icons(callback) {
var icons = icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1;
var terrains = icons.terrains;
// 三色墙&六色门
delete terrains.yellowWall;
delete terrains.blueWall;
delete terrains.whiteWall;
delete terrains.yellowDoor;
delete terrains.blueDoor;
delete terrains.redDoor;
delete terrains.greenDoor;
delete terrains.specialDoor;
delete terrains.steelDoor;
// shop
if (terrains.blueShopLeft == null) terrains.blueShopLeft = terrains['blueShop-left'];
if (terrains.blueShopRight == null) terrains.blueShopRight = terrains['blueShop-right'];
if (terrains.pinkShopLeft == null) terrains.pinkShopLeft = terrains['pinkShop-left'];
if (terrains.pinkShopRight == null) terrains.pinkShopRight = terrains['pinkShop-right'];
delete terrains['blueShop-left'];
delete terrains['blueShop-right'];
delete terrains['pinkShop-left'];
delete terrains['pinkShop-right'];
if (icons.items.snow != null) icons.items.freezeBadge = icons.items.snow;
delete icons.items.snow;
var datastr = 'var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = \n';
datastr += JSON.stringify(icons, null, '\t');
fs.writeFile('project/icons.js', encode(datastr), 'base64', function (err, data) {
if (err) {
alert('icons接档失败请查看控制台报错并刷新重试。');
console.error(err);
} else callback();
});
Object.keys(icons.autotile).forEach(function (one) {
fs.moveFile('project/images/'+one+'.png', 'project/autotiles/'+one+'.png', function (e,d) {});
});
}
function action_items(callback) {
if (!items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a.itemEffect || !items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a.itemEffectTip) {
callback();
return;
}
// Step 1: 合并内容
var items = items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a.items;
["itemEffect", "itemEffectTip", "useItemEvent", "useItemEffect", "canUseItemEffect", "equipCondition"].forEach(function(one) {
var data = items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a[one];
if (!data) return;
for (var id in data) {
if (data[id] != null && items[id])
items[id][one] = data[id];
}
});
// Step 2: 重置道具效果
var data = {
"yellowKey": {
"cls": "tools",
"name": "黄钥匙",
"text": "可以打开一扇黄门",
"hideInToolbox": true
},
"blueKey": {
"cls": "tools",
"name": "蓝钥匙",
"text": "可以打开一扇蓝门",
"hideInToolbox": true
},
"redKey": {
"cls": "tools",
"name": "红钥匙",
"text": "可以打开一扇红门",
"hideInToolbox": true
},
"redJewel": {
"cls": "items",
"name": "红宝石",
"text": "攻击+${core.values.redGem}",
"itemEffect": "core.status.hero.atk += core.values.redGem * core.status.thisMap.ratio",
"itemEffectTip": ",攻击+${core.values.redGem * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.atk += core.values.redGem",
"canUseItemEffect": "true"
},
"blueJewel": {
"cls": "items",
"name": "蓝宝石",
"text": ",防御+${core.values.blueGem}",
"itemEffect": "core.status.hero.def += core.values.blueGem * core.status.thisMap.ratio",
"itemEffectTip": ",防御+${core.values.blueGem * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.def += core.values.blueGem",
"canUseItemEffect": "true"
},
"greenJewel": {
"cls": "items",
"name": "绿宝石",
"text": ",护盾+${core.values.greenGem}",
"itemEffect": "core.status.hero.mdef += core.values.greenGem * core.status.thisMap.ratio",
"itemEffectTip": ",护盾+${core.values.greenGem * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.mdef += core.values.greenGem",
"canUseItemEffect": "true"
},
"yellowJewel": {
"cls": "items",
"name": "黄宝石",
"text": "可以进行加点",
"itemEffect": "core.status.hero.hp+=1000;core.status.hero.atk+=6;core.status.hero.def+=6;core.status.hero.mdef+=10;",
"itemEffectTip": ",全属性提升",
"useItemEvent": [
{
"type": "choices",
"choices": [
{
"text": "攻击+1",
"action": [
{
"type": "setValue",
"name": "status:atk",
"operator": "+=",
"value": "1"
}
]
},
{
"text": "防御+2",
"action": [
{
"type": "setValue",
"name": "status:def",
"operator": "+=",
"value": "2"
}
]
},
{
"text": "生命+200",
"action": [
{
"type": "setValue",
"name": "status:hp",
"operator": "+=",
"value": "200"
}
]
}
]
}
],
"canUseItemEffect": "true"
},
"redPotion": {
"cls": "items",
"name": "红血瓶",
"text": ",生命+${core.values.redPotion}",
"itemEffect": "core.status.hero.hp += core.values.redPotion * core.status.thisMap.ratio",
"itemEffectTip": ",生命+${core.values.redPotion * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.hp += core.values.redPotion",
"canUseItemEffect": "true"
},
"bluePotion": {
"cls": "items",
"name": "蓝血瓶",
"text": ",生命+${core.values.bluePotion}",
"itemEffect": "core.status.hero.hp += core.values.bluePotion * core.status.thisMap.ratio",
"itemEffectTip": ",生命+${core.values.bluePotion * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.hp += core.values.bluePotion",
"canUseItemEffect": "true"
},
"yellowPotion": {
"cls": "items",
"name": "黄血瓶",
"text": ",生命+${core.values.yellowPotion}",
"itemEffect": "core.status.hero.hp += core.values.yellowPotion * core.status.thisMap.ratio",
"itemEffectTip": ",生命+${core.values.yellowPotion * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.hp += core.values.yellowPotion",
"canUseItemEffect": "true"
},
"greenPotion": {
"cls": "items",
"name": "绿血瓶",
"text": ",生命+${core.values.greenPotion}",
"itemEffect": "core.status.hero.hp += core.values.greenPotion * core.status.thisMap.ratio",
"itemEffectTip": ",生命+${core.values.greenPotion * core.status.thisMap.ratio}",
"useItemEffect": "core.status.hero.hp += core.values.greenPotion",
"canUseItemEffect": "true"
},
"freezeBadge": {
"cls": "constants",
"name": "冰冻徽章",
"text": "可以将面前的熔岩变成平地",
"useItemEffect": "(function () {\n\tvar success = false;\n\n\tvar snowFourDirections = false; // 是否四方向雪花如果是将其改成true\n\tif (snowFourDirections) {\n\t\t// 四方向雪花\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (core.getBlockId(nx, ny) == 'lava') {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (core.getBlockId(core.nextX(), core.nextY()) == 'lava') {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();",
"canUseItemEffect": "true"
},
"bigKey": {
"cls": "tools",
"name": "大黄门钥匙",
"text": "可以开启当前层所有黄门",
"itemEffect": "core.addItem('yellowKey', 1);\ncore.addItem('blueKey', 1);\ncore.addItem('redKey', 1);",
"itemEffectTip": ",全钥匙+1",
"useItemEffect": "(function () {\n\tvar actions = core.searchBlock(\"yellowDoor\").map(function (block) {\n\t\treturn { \"type\": \"openDoor\", \"loc\": [block.x, block.y], \"async\": true };\n\t});\n\tactions.push({ \"type\": \"waitAsync\" });\n\tactions.push({ \"type\": \"tip\", \"text\": core.material.items[itemId].name + \"使用成功\" });\n\tcore.insertAction(actions);\n})();",
"canUseItemEffect": "(function () {\n\treturn core.searchBlock('yellowDoor').length > 0;\n})();"
},
"pickaxe": {
"cls": "tools",
"name": "破墙镐",
"text": "可以破坏勇士面前的墙",
"useItemEffect": "(function () {\n\tvar canBreak = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.block.disable) return false;\n\t\treturn block.block.event.canBreak;\n\t};\n\n\tvar success = false;\n\tvar pickaxeFourDirections = false; // 是否四方向破如果是将其改成true\n\tif (pickaxeFourDirections) {\n\t\t// 四方向破\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBreak(nx, ny)) {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅破当前\n\t\tif (canBreak(core.nextX(), core.nextY())) {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.playSound('pickaxe.mp3');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\t// 无法使用\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();",
"canUseItemEffect": "true"
},
"icePickaxe": {
"cls": "tools",
"name": "破冰镐",
"text": "可以破坏勇士面前的一堵冰墙",
"useItemEffect": "(function () {\n\tcore.removeBlock(core.nextX(), core.nextY());\n\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n})();",
"canUseItemEffect": "(function () {\n\treturn core.getBlockId(core.nextX(), core.nextY()) == 'ice';\n})();"
},
"bomb": {
"cls": "tools",
"name": "炸弹",
"text": "可以炸掉勇士面前的怪物",
"useItemEffect": "(function () {\n\tvar canBomb = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.block.disable || block.block.event.cls.indexOf('enemy') != 0) return false;\n\t\tvar enemy = core.material.enemys[block.block.event.id];\n\t\treturn enemy && !enemy.notBomb;\n\t};\n\n\tvar bombList = []; // 炸掉的怪物坐标列表\n\tvar bombFourDirections = false; // 是否四方向可炸如果是将其改成true。\n\tif (bombFourDirections) {\n\t\t// 四方向炸\n\t\tfor (var direction in core.utils.scan) {\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBomb(nx, ny)) {\n\t\t\t\tbombList.push([nx, ny]);\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅炸当前\n\t\tif (canBomb(core.nextX(), core.nextY())) {\n\t\t\tbombList.push([core.nextX(), core.nextY()]);\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t}\n\t}\n\n\tif (bombList.length > 0) {\n\t\tcore.playSound('bomb.mp3');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t} else {\n\t\tcore.drawTip('当前无法使用' + core.material.items[itemId].name);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n\n\t// 炸弹后事件\n\t// 这是一个使用炸弹也能开门的例子\n\t/*\n\tif (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在\n\t\t&& !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在\n\t{\n\t\tcore.insertAction([ // 插入事件\n\t\t\t{\"type\": \"openDoor\", \"loc\": [x0,y0]} // 开门\n\t\t])\n\t}\n\t*/\n})();",
"canUseItemEffect": "true"
},
"upFly": {
"cls": "tools",
"name": "上楼器",
"text": "可以飞往楼上的相同位置",
"useItemEffect": "(function () {\n\tvar floorId = core.floorIds[core.floorIds.indexOf(core.status.floorId) + 1];\n\tif (core.status.event.id == 'action') {\n\t\tcore.insertAction([\n\t\t\t{ \"type\": \"changeFloor\", \"loc\": [core.getHeroLoc('x'), core.getHeroLoc('y')], \"floorId\": floorId },\n\t\t\t{ \"type\": \"tip\", \"text\": core.material.items[itemId].name + '使用成功' }\n\t\t]);\n\t} else {\n\t\tcore.changeFloor(floorId, null, core.status.hero.loc, null, function () {\n\t\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t\t\tcore.replay();\n\t\t});\n\t}\n})();",
"canUseItemEffect": "(function () {\n\tvar floorId = core.status.floorId,\n\t\tindex = core.floorIds.indexOf(floorId);\n\tif (index < core.floorIds.length - 1) {\n\t\tvar toId = core.floorIds[index + 1],\n\t\t\ttoX = core.getHeroLoc('x'),\n\t\t\ttoY = core.getHeroLoc('y');\n\t\tvar mw = core.floors[toId].width,\n\t\t\tmh = core.floors[toId].height;\n\t\tif (toX >= 0 && toX < mw && toY >= 0 && toY < mh && core.getBlock(toX, toY, toId) == null) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n})();"
},
"downFly": {
"cls": "tools",
"name": "下楼器",
"text": "可以飞往楼下的相同位置",
"useItemEffect": "(function () {\n\tvar floorId = core.floorIds[core.floorIds.indexOf(core.status.floorId) - 1];\n\tif (core.status.event.id == 'action') {\n\t\tcore.insertAction([\n\t\t\t{ \"type\": \"changeFloor\", \"loc\": [core.getHeroLoc('x'), core.getHeroLoc('y')], \"floorId\": floorId },\n\t\t\t{ \"type\": \"tip\", \"text\": core.material.items[itemId].name + '使用成功' }\n\t\t]);\n\t} else {\n\t\tcore.changeFloor(floorId, null, core.status.hero.loc, null, function () {\n\t\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t\t\tcore.replay();\n\t\t});\n\t}\n})();",
"canUseItemEffect": "(function () {\n\tvar floorId = core.status.floorId,\n\t\tindex = core.floorIds.indexOf(floorId);\n\tif (index > 0) {\n\t\tvar toId = core.floorIds[index - 1],\n\t\t\ttoX = core.getHeroLoc('x'),\n\t\t\ttoY = core.getHeroLoc('y');\n\t\tvar mw = core.floors[toId].width,\n\t\t\tmh = core.floors[toId].height;\n\t\tif (toX >= 0 && toX < mw && toY >= 0 && toY < mh && core.getBlock(toX, toY, toId) == null) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n})();"
},
"earthquake": {
"cls": "tools",
"name": "地震卷轴",
"text": "可以破坏当前层的所有墙",
"useItemEffect": "(function () {\n\tvar indexes = [];\n\tfor (var index in core.status.thisMap.blocks) {\n\t\tvar block = core.status.thisMap.blocks[index];\n\t\tif (!block.disable && block.event.canBreak) {\n\t\t\tindexes.push(index);\n\t\t}\n\t}\n\tcore.removeBlockByIndexes(indexes);\n\tcore.drawMap(core.status.floorId, function () {\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功');\n\t});\n})();",
"canUseItemEffect": "(function () {\n\treturn core.status.thisMap.blocks.filter(function (block) {\n\t\treturn !block.disable && block.event.canBreak;\n\t}).length > 0;\n})();"
},
};
for (var id in data) {
items[id] = data[id];
}
delete items.snow;
var datastr = 'var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = \n';
for (var id in items) delete items[id].id;
datastr += JSON.stringify(items, null, '\t');
fs.writeFile('project/items.js', encode(datastr), 'base64', function (err, data) {
if (err) {
alert('items接档失败请查看控制台报错并刷新重试。');
console.error(err);
} else callback();
});
}
function action_maps(callback) {
var maps = maps_90f36752_8815_4be8_b32b_d7fad1d0542e;
var data = {
"1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"7": {"cls":"terrains","id":"blueShopLeft"},
"8": {"cls":"terrains","id":"blueShopRight"},
"9": {"cls":"terrains","id":"pinkShopLeft"},
"10": {"cls":"terrains","id":"pinkShopRight"},
"11": {"cls":"animates","id":"lavaNet","canPass":true,"trigger":"null","script":"(function () {\n\t// 血网的伤害效果移动到 checkBlock 中处理\n\n\t// 如果要做一次性血网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();","name":"血网"},
"12": {"cls":"animates","id":"poisonNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'poison');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性毒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"毒网"},
"13": {"cls":"animates","id":"weakNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'weak');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性衰网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"衰网"},
"14": {"cls":"animates","id":"curseNet","canPass":true,"trigger":"null","script":"(function () {\n\tif (!core.hasItem('amulet')) {\n\t\tcore.triggerDebuff('get', 'curse');\n\t\tcore.updateStatusBar();\n\t}\n\n\t// 如果要做一次性咒网,可直接注释掉下面这句话:\n\t// core.removeBlock(core.getHeroLoc('x'), core.getHeroLoc('y'));\n})()","name":"咒网"},
"54": {"cls":"items","id":"freezeBadge"},
"81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"yellowKey":1}},"name":"黄门"},
"82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"blueKey":1}},"name":"蓝门"},
"83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"redKey":1}},"name":"红门"},
"84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"greenKey":1}},"name":"绿门"},
"85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"specialKey":1}},"name":"机关门"},
"86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"steelKey":1}},"name":"铁门"},
"161": {"cls":"terrains","id":"arrowUp","canPass":true,"cannotOut":["left","right","down"],"cannotIn":["up"]},
"162": {"cls":"terrains","id":"arrowDown","canPass":true,"cannotOut":["left","right","up"],"cannotIn":["down"]},
"163": {"cls":"terrains","id":"arrowLeft","canPass":true,"cannotOut":["up","down","right"],"cannotIn":["left"]},
"164": {"cls":"terrains","id":"arrowRight","canPass":true,"cannotOut":["up","down","left"],"cannotIn":["right"]},
"165": {"cls":"terrains","id":"light","trigger":"null","canPass":true,"script":"(function () {\n\tcore.setBlock(core.getNumberById('darkLight'), core.getHeroLoc('x'), core.getHeroLoc('y'));\n})();"},
};
for (var id in data) {
maps[id] = data[id];
}
for (var id in maps) {
if (maps[id].noPass === false || maps[id].noPass === 'false')
maps[id].canPass = true;
delete maps[id].noPass;
}
var datastr = 'var maps_90f36752_8815_4be8_b32b_d7fad1d0542e = \n';
var emap = {};
var estr = JSON.stringify(maps, function (k, v) {
if (v && v.id != null) {
var id_ = random_string();
emap[id_] = JSON.stringify(v);
return id_;
} else return v
}, '\t');
for (var id_ in emap) {
estr = estr.replace('"' + id_ + '"', emap[id_])
}
datastr += estr;
fs.writeFile('project/maps.js', encode(datastr), 'base64', function (err, data) {
if (err) {
alert('maps接档失败请查看控制台报错并刷新重试。');
console.error(err);
} else callback();
});
}
</script>
</body>