HTML5魔塔样板V2.7接档工具

HTML5魔塔样板V2.7接档工具

// 检查脚本编辑和插件编写;这两个绝对不能接

if (functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.events.setInitData || !plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1.shop) {

document.write("

错误:请勿覆盖脚本编辑(functions.js)和插件编写(plugins.js)!
请从全新的V2.7样板中复制一个functions.js和plugins.js到project文件夹,再继续接档操作。

");

} else {

document.write("

点此一键接档

接档成功!请重启编辑器并继续以下接档流程;若仍然无法打开编辑器请联系小艾处理。

");

}

请严格按照如下流程,一步步进行接档操作。请勿随意增删接档过程,以免出现编辑器白屏、闪退等情况。

  1. 做好备份,做好备份,做好备份!!!接档前请一定先做好备份!
  2. 使用RM转H5刻塔器所刻的塔不适用于此接档工具。
  3. 将V2.6.6样板中project目录下,除了project/functions.jsproject/plugins.js以外的其他文件和文件夹,直接复制到最新的V2.7样板中,然后打开本接档工具。
  4. 点击上述的「点此一键接档」,并看到红字提示接档成功。此时编辑器应该可以正常打开。若此时无法打开编辑器请联系小艾处理。
  5. 下拉框切到「全塔属性」,并注意以下内容:
    • 现在素材和使用的其他图片等在文件夹中被拆分,请检查对应的图片文件已经正确移动到对应的文件夹。
    • 「难度选择项」的逻辑在V2.7中被修改;请重新制作。
    • 「全局商店」的结构在V2.7中被修改;请重新制作。
    • 部分方框进行了合并,请一个个仔细检查是否存在问题。
  6. 下拉框切到「楼层属性」,并注意以下内容:
    • item_ratio被重命名为ratio,请自行修改。
    • 楼层贴图的结构在V2.7中被修改;请重新制作。
  7. 素材区的如下图块有所变动:
    • 三色墙和六色门从terrains中解除引用;请用animates中的进行绘制。
    • 如下图块的图块属性已被重置:三色墙、六色门、四色网、四个单向箭头、亮灯。
    • 所有的noPass:false都改成canPass:true;请仔细检查可通行性。
    • 如下道具的道具属性已被重置,请仔细检查:三色钥匙、四色宝石(已改名Gem)、四色血瓶、破墙、破冰、炸弹、地震、冰冻、大黄门钥匙、上下楼器。
    • 即时道具获得的说明和提示文字均改成了${}计算,ratio需写明全称(参见宝石血瓶写法),请自行处理。
    • npc48的默认动画帧数null改回为4;如需静止状态请手动改成1。
  8. 下拉框切换到「脚本编辑」,并请重新编辑各个自己改过的函数(可以双开一个原版V266项目和当前接档的项目进行处理)。
    • 请注意:V2.7中的经验全部从experience替换成简写的exp;写伤害计算等时请尤其注意。
    • 部分文案有所改变,如「阻击」从snipe改名repulseshoes改名amulet等等,请自行处理。
    • setInitData已被删除,请将需要的额外初始化代码写入startText中。
    • afterChangeLight, afterUseBomb, afterPassNet已被删除,请去对应图块属性内修改。
    • 其他基本每个函数都有大幅修改,请勿直接拿原来的脚本整体覆盖,而是重新对函数进行需要的编辑!
  9. 下拉框切换到「插件编写」,并重新新增自己加过的插件。
    • V2.7不能保证插件的兼容性,请谨慎测试。
    • 如果插件出现不可用问题,请自行联系插件原作者更新插件到支持V2.7的版本。
  10. 请仔细检查每个道具的道具效果、每个怪物的属性、每个楼层属性、以及每个点的事件(建议双开对比)。主要变动如下:
    • 「数值增减」事件已被删除并被数值操作+运算符替代,编辑器将解析为自定义事件;但是游戏中仍然可以正确执行(你可以选择替换与否)。
    • 「隐藏事件」将不再默认删除该点(而只是纯粹的隐藏);请给有需要的「隐藏事件」勾选「同时删除」选项。
    • 「绘制圆」「绘制圆边框」「重启当前事件」已经被删除,并且无法再在游戏中使用,请替换成等价的写法。
  11. 其他
    • V2.7默认采用新版图标;如果觉得不合适可以将materials目录下的icons_old.png替换掉icons.png以使用原版图标。
  12. 接档后请做好充分的测试!最好能跑通录像以确认接档无误!

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 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', 'icons', '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;

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.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.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_ = ":" + k + ":";

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

},

"redGem": {

"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"

},

"blueGem": {

"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"

},

"greenGem": {

"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"

},

"yellowGem": {

"cls": "items",

"name": "黄宝石",

"text": "可以进行加点",

"itemEffect": "core.status.hero.hp+=1000;core.status.hero.atk+=6;core.status.hero.def+=6;core.status.hero.mdef+=10;",

"itemEffectTip": ",全属性提升",

"useItemEvent": [

{

"type": "choices",

"choices": [

{

"text": "攻击+1",

"action": [

{

"type": "setValue",

"name": "status:atk",

"operator": "+=",

"value": "1"

}

]

},

{

"text": "防御+2",

"action": [

{

"type": "setValue",

"name": "status:def",

"operator": "+=",

"value": "2"

}

]

},

{

"text": "生命+200",

"action": [

{

"type": "setValue",

"name": "status:hp",

"operator": "+=",

"value": "200"

}

]

}

]

}

],

"canUseItemEffect": "true"

},

"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.status.hero.items.keys.yellowKey++;core.status.hero.items.keys.blueKey++;core.status.hero.items.keys.redKey++;",

"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];

}

var datastr = 'var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = \n';

datastr += JSON.stringify(items, function (k, v) {

if (v && v.id != null) delete v.id;

return v;

}, '\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\t// 直接插入公共事件进行毒处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [0] });\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\t// 直接插入公共事件进行衰处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [1] });\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\t// 直接插入公共事件进行咒处理\n\tif (!core.hasItem('amulet')) {\n\t\tcore.insertAction({ \"type\": \"insert\", \"name\": \"毒衰咒处理\", \"args\": [2] });\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_ = ':' + v.id + ':';

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();

});

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

html魔塔编辑器,migration.html相关推荐

  1. html5魔塔编辑器安卓版,Mota: 纪元魔塔前传。童年魔塔记忆。使用手机编写的5000行代码...

    #Mota 程序说明: 纪元魔塔前传是一个由HTML5(Canvas + 原生JavaScript)开发的小游戏,所有素材均来自原版的元祖魔塔(魔塔50层) 这个游戏时跨平台的,任何支持HTML5的浏 ...

  2. 用python的tkinter做游戏(五)—— 魔塔 篇

    好久没更新了,今天继续:用python自带的tkinter做游戏系列的第五弹,魔塔 篇 之前的四篇博文介绍的分别是贪食蛇和俄罗斯方块,推箱子的简易版和推箱子的重制版. 用python自带的tkinte ...

  3. qt 好的 github 开源

    1 https://github.com/kevinlq 一些QT开源项目 来源 :https://www.zhihu.com/question/41812714/answer/92575811 qy ...

  4. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~8地图编辑器-处理流程

    魔塔之拯救白娘子 完整工程下载地址: <魔塔之拯救白娘子>处理流程: ①在主游戏窗口里添加一个timer控件,名称为:timerDraw 作用:根据running状态绘制不同的背景 Ena ...

  5. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~6地图编辑器-初始化

    魔塔之拯救白娘子 完整工程下载地址: 从今天开始我将写一下<魔塔之拯救白娘子>的游戏地图编辑器,俗话说,事半功倍.把地图编辑器搞好,基本一个游戏就写好了三分之一了.可以说,魔塔的地图是相对 ...

  6. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~11地图编辑器-鼠标点击

    魔塔之拯救白娘子 完整工程下载地址: <魔塔之拯救白娘子>~11地图编辑器-地图编辑界面鼠标点击判断: 鼠标点击判断: ①点击的对象是卡通图片切换:完成对3种类型的卡通切换并显示 ②点击的 ...

  7. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~9地图编辑器-卡通选择

    魔塔之拯救白娘子 完整工程下载地址: <魔塔之拯救白娘子>地图编辑器:流程控制-卡通选择 本课主要讲一下,卡通图片的选择.如下图所示. 卡通图片由3种: ①基础类:25个,主要是路面.NP ...

  8. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~7地图编辑器-地图格式

    魔塔之拯救白娘子 完整工程下载地址: <魔塔之拯救白娘子>地图编辑器2:确定地图格式 魔塔这个游戏很经典,网上大把源码以及地图之类的,但是DX8做的比较少,源码也没有,因此,我决定自己写一 ...

  9. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~10地图编辑器-卡通绘制

    魔塔之拯救白娘子 完整工程下载地址: <魔塔之拯救白娘子>地图编辑器-背景绘制:这个子程序绘制的背景是静态的,如果绘制动态的可参考完整工程里的 动态背景Draw 子程序: Sub 背景Dr ...

最新文章

  1. mysql 5.5 编译参数_Mysql 5.5 编译参数
  2. C++ decltype类型指示符
  3. PL/SQL如何设置 窗口列表默认显示
  4. 武汉城市职业学院计算机分数线,武汉城市职业学院历年分数线 2021武汉城市职业学院录取分数线...
  5. 学会使用ant design封装一个锚点组件
  6. centos中创建快捷键pycharm
  7. java ssdb查询_java连接ssdb数据库
  8. java B2B2C Springcloud仿淘宝电子商城系统
  9. nginx1.8.1反向代理、负载均衡功能的实现
  10. 【渝粤教育】广东开放大学 经济学基础 形成性考核 (25)
  11. [刘阳Java]_Spring相关配置介绍_第5讲
  12. 以xml格式发送外部系统交易错误_在知行EDI系统中实施SNIP验证
  13. excel vba 字典使用方法学习
  14. arcgis中导入excel数据时显示没有注册类怎么解决?
  15. 【运营】运营网课之活动运营
  16. 单片机看门狗c语言,单片机看门狗程序
  17. Cortex-M3处理器的舞台
  18. Facebook灰度手势识别论文笔记
  19. 2019.8.设计菜单,完成简单计算器功能。要求:设计5个菜单项,功能分别为加减乘除。
  20. 石油专业:一文入门机器学习,以测井岩性分类预测为例

热门文章

  1. java解析pdf格式文件获取文本内容
  2. 已解决:mysql报错> 1067 - Invalid default value for ‘comment_date‘ [DTF] 2> wp_links: Getting
  3. ZeroTier简单使用
  4. Rapid IO接口
  5. 华为鲲鹏HCIA-Cloud Service V2.2考试样题
  6. ffmpy.FFRuntimeError: exited with status 1
  7. python 两种平分列表的方法
  8. linux redis哨兵 sh,Linux下redis的持久化、主从同步与哨兵详解
  9. U盘制作WinPE系统【转】
  10. 身高体重和标准身高的比较