Update Final
This commit is contained in:
parent
3ce60d37c2
commit
eb77c48057
BIN
H5样板使用指南.docx
Normal file
BIN
H5样板使用指南.docx
Normal file
Binary file not shown.
BIN
H5样板使用指南.pdf
Normal file
BIN
H5样板使用指南.pdf
Normal file
Binary file not shown.
402
libs/core.js
402
libs/core.js
@ -630,7 +630,7 @@ core.prototype.onclick = function (x, y, stepPostfix) {
|
||||
|
||||
// 快捷商店
|
||||
if (core.status.event.id == 'selectShop') {
|
||||
core.events.clickSelectShop(x,y);
|
||||
core.events.clickQuickShop(x,y);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -679,124 +679,10 @@ core.prototype.onclick = function (x, y, stepPostfix) {
|
||||
if (core.status.event.id == 'syncSave') {
|
||||
if (x>=4 && x<=8) {
|
||||
if (y==5) {
|
||||
core.ui.drawConfirmBox("你确定要将本地存档同步到服务器吗?", function(){
|
||||
// console.log("同步存档...");
|
||||
core.ui.drawWaiting("正在同步,请稍后...");
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('type', 'save');
|
||||
formData.append('name', core.firstData.name);
|
||||
var saves = [];
|
||||
for (var i=1;i<=180;i++) {
|
||||
var data = core.getLocalStorage("save"+i, null);
|
||||
if (core.isset(data)) {
|
||||
saves.push(data);
|
||||
}
|
||||
}
|
||||
var save_text = JSON.stringify(saves);
|
||||
formData.append('data', save_text);
|
||||
|
||||
// send
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", "../sync.php");
|
||||
xhr.timeout = 1000;
|
||||
xhr.onload = function(e) {
|
||||
if (xhr.status==200) {
|
||||
// console.log("同步成功。");
|
||||
var response = JSON.parse(xhr.response);
|
||||
if (response.code<0) {
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
else {
|
||||
core.drawText("同步成功!\n\n您的存档编号: "+response.code+"\n您的存档密码: "+response.msg+"\n\n请牢记以上两个信息(如截图等),在从服务器\n同步存档时使用。")
|
||||
}
|
||||
}
|
||||
else {
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
};
|
||||
xhr.ontimeout = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
xhr.onerror = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
xhr.send(formData);
|
||||
}, function() {
|
||||
core.ui.drawSyncSave();
|
||||
})
|
||||
core.syncSave("save");
|
||||
}
|
||||
if (y==6) {
|
||||
core.ui.drawConfirmBox("你确定要从服务器加载存档吗?\n该操作将覆盖所有本地存档且不可逆!", function(){
|
||||
var id = prompt("请输入存档编号:");
|
||||
if (id==null || id=="") {
|
||||
core.ui.drawSyncSave(); return;
|
||||
}
|
||||
var password = prompt("请输入存档密码:");
|
||||
if (password==null || password=="") {
|
||||
core.ui.drawSyncSave(); return;
|
||||
}
|
||||
core.ui.drawWaiting("正在同步,请稍后...");
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('type', 'load');
|
||||
formData.append('name', core.firstData.name);
|
||||
formData.append('id', id);
|
||||
formData.append('password', password);
|
||||
|
||||
// send
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", "../sync.php");
|
||||
xhr.timeout = 1000;
|
||||
xhr.onload = function(e) {
|
||||
if (xhr.status==200) {
|
||||
// console.log("同步成功。");
|
||||
var response = JSON.parse(xhr.response);
|
||||
switch (response.code) {
|
||||
case 0:
|
||||
// 成功
|
||||
var data=JSON.parse(response.msg);
|
||||
// console.log(data);
|
||||
for (var i=1;i<=180;i++) {
|
||||
if (i<=data.length) {
|
||||
core.setLocalStorage("save"+i, data[i-1]);
|
||||
}
|
||||
else {
|
||||
core.removeLocalStorage("save"+i);
|
||||
}
|
||||
}
|
||||
core.drawText("同步成功!\n你的本地所有存档均已被覆盖。");
|
||||
break;
|
||||
case -1:
|
||||
core.drawText("出错啦!\n存档编号"+id+"不存在!");
|
||||
break;
|
||||
case -2:
|
||||
core.drawText("出错啦!\n存档密码错误!");
|
||||
break;
|
||||
default:
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
}
|
||||
};
|
||||
xhr.ontimeout = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
}
|
||||
xhr.onerror = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
}
|
||||
xhr.send(formData);
|
||||
}, function() {
|
||||
core.ui.drawSyncSave();
|
||||
})
|
||||
core.syncSave("load");
|
||||
}
|
||||
}
|
||||
if (x>=5 && x<=7 && y==7) {
|
||||
@ -1318,7 +1204,7 @@ core.prototype.openDoor = function (id, x, y, needKey, callback) {
|
||||
var speed=30;
|
||||
if (needKey) {
|
||||
var key = id.replace("Door", "Key");
|
||||
if (!core.rmItem(key)) {
|
||||
if (!core.removeItem(key)) {
|
||||
if (key != "specialKey")
|
||||
core.drawTip("你没有" + core.material.items[key].name);
|
||||
else core.drawTip("无法开启此门");
|
||||
@ -1395,9 +1281,36 @@ core.prototype.battle = function (id, x, y, force, callback) {
|
||||
core.events.afterBattle(id,x,y,callback);
|
||||
}
|
||||
|
||||
core.prototype.trigger = function (x, y) {
|
||||
var mapBlocks = core.status.thisMap.blocks;
|
||||
var noPass;
|
||||
for (var b = 0; b < mapBlocks.length; b++) {
|
||||
if (mapBlocks[b].x == x && mapBlocks[b].y == y && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable)) { // 启用事件
|
||||
noPass = mapBlocks[b].event && mapBlocks[b].event.noPass;
|
||||
if (noPass) {
|
||||
core.clearAutomaticRouteNode(x, y);
|
||||
}
|
||||
if (core.isset(mapBlocks[b].event) && core.isset(mapBlocks[b].event.trigger)) {
|
||||
var trigger = mapBlocks[b].event.trigger;
|
||||
// 转换楼层能否穿透
|
||||
if (trigger=='changeFloor' && (core.status.autoHeroMove || core.status.autoStep<core.status.autoStepRoutes.length)) {
|
||||
var canCross = core.flags.portalWithoutTrigger;
|
||||
if (core.isset(mapBlocks[b].event.data) && core.isset(mapBlocks[b].event.data.portalWithoutTrigger))
|
||||
canCross=mapBlocks[b].event.data.portalWithoutTrigger;
|
||||
if (canCross) continue;
|
||||
}
|
||||
core.material.events[trigger](mapBlocks[b], core, function (data) {
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 楼层切换
|
||||
core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) {
|
||||
time = time || 50;
|
||||
time = time || 800;
|
||||
time /= 20;
|
||||
core.lockControl();
|
||||
core.stopHero();
|
||||
core.stopAutomaticRoute();
|
||||
@ -1519,15 +1432,6 @@ core.prototype.loadCanvas = function (map) {
|
||||
core.canvas[map].restore();
|
||||
}
|
||||
|
||||
core.prototype.setAlpha = function (map, alpha) {
|
||||
if (map == 'all') {
|
||||
for (var m in core.canvas) {
|
||||
core.canvas[m].globalAlpha = alpha;
|
||||
}
|
||||
}
|
||||
core.canvas[map].globalAlpha = alpha;
|
||||
}
|
||||
|
||||
core.prototype.setStrokeStyle = function (map, style) {
|
||||
if (map == 'all') {
|
||||
for (var m in core.canvas) {
|
||||
@ -1580,7 +1484,7 @@ core.prototype.drawMap = function (mapName, callback) {
|
||||
core.status.thisMap = mapData;
|
||||
var blockIcon, blockImage;
|
||||
core.clearMap('all');
|
||||
core.rmGlobalAnimate(null, null, true);
|
||||
core.removeGlobalAnimate(null, null, true);
|
||||
for (var x = 0; x < 13; x++) {
|
||||
for (var y = 0; y < 13; y++) {
|
||||
blockIcon = core.material.icons.terrains.ground;
|
||||
@ -1608,6 +1512,10 @@ core.prototype.noPassExists = function (x, y, floorId) {
|
||||
return core.isset(block.block.event.noPass) && block.block.event.noPass;
|
||||
}
|
||||
|
||||
core.prototype.noPass = function (x, y) {
|
||||
return x<0 || x>12 || y<0 || y>12 || core.noPassExists(x,y);
|
||||
}
|
||||
|
||||
core.prototype.npcExists = function (x, y, floorId) {
|
||||
var block = core.getBlock(x,y,floorId);
|
||||
if (block==null) return false;
|
||||
@ -1650,32 +1558,7 @@ core.prototype.getBlock = function (x, y, floorId, needEnable) {
|
||||
return null;
|
||||
}
|
||||
|
||||
core.prototype.removeBlockById = function (index, floorId) {
|
||||
|
||||
var blocks = core.status.maps[floorId].blocks;
|
||||
var x=blocks[index].x, y=blocks[index].y;
|
||||
|
||||
// 检查该点是否是checkBlock
|
||||
if (core.floors[floorId].checkBlock.indexOf(x+","+y)>=0) {
|
||||
blocks[index] = {'x': x, 'y': y, 'event': {'cls': 'terrains', 'id': 'ground', 'noPass': false, 'trigger': 'checkBlock'}};
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查该点是否存在事件
|
||||
var event = core.floors[floorId].events[x+","+y];
|
||||
if (!core.isset(event))
|
||||
event = core.floors[floorId].changeFloor[x+","+y];
|
||||
|
||||
// 不存在事件,直接删除
|
||||
if (!core.isset(event)) {
|
||||
blocks.splice(index,1);
|
||||
return;
|
||||
}
|
||||
|
||||
blocks[index].enable = false;
|
||||
}
|
||||
|
||||
core.prototype.moveBlock = function(x,y,steps,time,disappear,callback) {
|
||||
core.prototype.moveBlock = function(x,y,steps,time,immediateHide,callback) {
|
||||
time = time || 500;
|
||||
|
||||
clearInterval(core.interval.tipAnimate);
|
||||
@ -1732,7 +1615,7 @@ core.prototype.moveBlock = function(x,y,steps,time,disappear,callback) {
|
||||
var animate=window.setInterval(function() {
|
||||
// 已经移动完毕,消失
|
||||
if (moveSteps.length==0) {
|
||||
if (disappear) opacityVal=0;
|
||||
if (immediateHide) opacityVal=0;
|
||||
else opacityVal -= 0.06;
|
||||
core.setOpacity('data', opacityVal);
|
||||
core.clearMap('data', nowX, nowY, 32, 32);
|
||||
@ -1834,7 +1717,7 @@ core.prototype.removeBlock = function (x, y, floorId) {
|
||||
|
||||
// 删除动画,清除地图
|
||||
if (floorId==core.status.floorId) {
|
||||
core.rmGlobalAnimate(x, y);
|
||||
core.removeGlobalAnimate(x, y);
|
||||
core.canvas.event.clearRect(x * 32, y * 32, 32, 32);
|
||||
}
|
||||
|
||||
@ -1843,42 +1726,38 @@ core.prototype.removeBlock = function (x, y, floorId) {
|
||||
core.updateFg();
|
||||
}
|
||||
|
||||
|
||||
core.prototype.removeBlockById = function (index, floorId) {
|
||||
|
||||
var blocks = core.status.maps[floorId].blocks;
|
||||
var x=blocks[index].x, y=blocks[index].y;
|
||||
|
||||
// 检查该点是否是checkBlock
|
||||
if (core.floors[floorId].checkBlock.indexOf(x+","+y)>=0) {
|
||||
blocks[index] = {'x': x, 'y': y, 'event': {'cls': 'terrains', 'id': 'ground', 'noPass': false, 'trigger': 'checkBlock'}};
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查该点是否存在事件
|
||||
var event = core.floors[floorId].events[x+","+y];
|
||||
if (!core.isset(event))
|
||||
event = core.floors[floorId].changeFloor[x+","+y];
|
||||
|
||||
// 不存在事件,直接删除
|
||||
if (!core.isset(event)) {
|
||||
blocks.splice(index,1);
|
||||
return;
|
||||
}
|
||||
|
||||
blocks[index].enable = false;
|
||||
}
|
||||
|
||||
core.prototype.removeBlockByIds = function (floorId, ids) {
|
||||
ids.sort(function (a,b) {return b-a}).forEach(function (id) {
|
||||
core.removeBlockById(id, floorId);
|
||||
});
|
||||
}
|
||||
|
||||
core.prototype.noPass = function (x, y) {
|
||||
return x<0 || x>12 || y<0 || y>12 || core.noPassExists(x,y);
|
||||
}
|
||||
|
||||
core.prototype.trigger = function (x, y) {
|
||||
var mapBlocks = core.status.thisMap.blocks;
|
||||
var noPass;
|
||||
for (var b = 0; b < mapBlocks.length; b++) {
|
||||
if (mapBlocks[b].x == x && mapBlocks[b].y == y && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable)) { // 启用事件
|
||||
noPass = mapBlocks[b].event && mapBlocks[b].event.noPass;
|
||||
if (noPass) {
|
||||
core.clearAutomaticRouteNode(x, y);
|
||||
}
|
||||
if (core.isset(mapBlocks[b].event) && core.isset(mapBlocks[b].event.trigger)) {
|
||||
var trigger = mapBlocks[b].event.trigger;
|
||||
// 转换楼层能否穿透
|
||||
if (trigger=='changeFloor' && (core.status.autoHeroMove || core.status.autoStep<core.status.autoStepRoutes.length)) {
|
||||
var canCross = core.flags.portalWithoutTrigger;
|
||||
if (core.isset(mapBlocks[b].event.data) && core.isset(mapBlocks[b].event.data.portalWithoutTrigger))
|
||||
canCross=mapBlocks[b].event.data.portalWithoutTrigger;
|
||||
if (canCross) continue;
|
||||
}
|
||||
core.material.events[trigger](mapBlocks[b], core, function (data) {
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
core.prototype.addGlobalAnimate = function (animateMore, x, y, loc, image) {
|
||||
if (animateMore == 2) {
|
||||
core.status.twoAnimateObjs.push({
|
||||
@ -1900,7 +1779,7 @@ core.prototype.addGlobalAnimate = function (animateMore, x, y, loc, image) {
|
||||
}
|
||||
}
|
||||
|
||||
core.prototype.rmGlobalAnimate = function (x, y, all) {
|
||||
core.prototype.removeGlobalAnimate = function (x, y, all) {
|
||||
if (all == true) {
|
||||
core.status.twoAnimateObjs = [];
|
||||
core.status.fourAnimateObjs = [];
|
||||
@ -1982,6 +1861,7 @@ core.prototype.setHeroLoc = function (itemName, itemVal) {
|
||||
}
|
||||
|
||||
core.prototype.getHeroLoc = function (itemName) {
|
||||
if (!core.isset(itemName)) return core.status.hero.loc;
|
||||
return core.status.hero.loc[itemName];
|
||||
}
|
||||
|
||||
@ -2070,7 +1950,7 @@ core.prototype.setItem = function (itemId, itemNum) {
|
||||
core.status.hero.items[itemCls][itemId] = itemNum;
|
||||
}
|
||||
|
||||
core.prototype.rmItem = function (itemId) {
|
||||
core.prototype.removeItem = function (itemId) {
|
||||
if (!core.hasItem(itemId)) return false;
|
||||
var itemCls = core.material.items[itemId].cls;
|
||||
core.status.hero.items[itemCls][itemId]--;
|
||||
@ -2315,15 +2195,12 @@ core.prototype.setTwoDigits = function (x) {
|
||||
return parseInt(x)<10?"0"+x:x;
|
||||
}
|
||||
|
||||
core.prototype.lose = function() {
|
||||
core.stopAutomaticRoute();
|
||||
if (!core.status.heroStop) {
|
||||
setTimeout(function() {
|
||||
core.lose();
|
||||
}, 30);
|
||||
return;
|
||||
}
|
||||
core.events.lose();
|
||||
core.prototype.win = function(reason) {
|
||||
core.events.win(reason);
|
||||
}
|
||||
|
||||
core.prototype.lose = function(reason) {
|
||||
core.events.lose(reason);
|
||||
}
|
||||
|
||||
// 作弊
|
||||
@ -2455,6 +2332,131 @@ core.prototype.doSL = function (id, type) {
|
||||
}
|
||||
}
|
||||
|
||||
core.prototype.syncSave = function(type) {
|
||||
if (type=='save') {
|
||||
core.ui.drawConfirmBox("你确定要将本地存档同步到服务器吗?", function(){
|
||||
// console.log("同步存档...");
|
||||
core.ui.drawWaiting("正在同步,请稍后...");
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('type', 'save');
|
||||
formData.append('name', core.firstData.name);
|
||||
var saves = [];
|
||||
for (var i=1;i<=180;i++) {
|
||||
var data = core.getLocalStorage("save"+i, null);
|
||||
if (core.isset(data)) {
|
||||
saves.push(data);
|
||||
}
|
||||
}
|
||||
var save_text = JSON.stringify(saves);
|
||||
formData.append('data', save_text);
|
||||
|
||||
// send
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", "../sync.php");
|
||||
xhr.timeout = 1000;
|
||||
xhr.onload = function(e) {
|
||||
if (xhr.status==200) {
|
||||
// console.log("同步成功。");
|
||||
var response = JSON.parse(xhr.response);
|
||||
if (response.code<0) {
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
else {
|
||||
core.drawText("同步成功!\n\n您的存档编号: "+response.code+"\n您的存档密码: "+response.msg+"\n\n请牢记以上两个信息(如截图等),在从服务器\n同步存档时使用。")
|
||||
}
|
||||
}
|
||||
else {
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
};
|
||||
xhr.ontimeout = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
xhr.onerror = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法同步存档到服务器。");
|
||||
}
|
||||
xhr.send(formData);
|
||||
}, function() {
|
||||
core.ui.drawSyncSave();
|
||||
})
|
||||
}
|
||||
else if (type=='load') {
|
||||
|
||||
core.ui.drawConfirmBox("你确定要从服务器加载存档吗?\n该操作将覆盖所有本地存档且不可逆!", function(){
|
||||
var id = prompt("请输入存档编号:");
|
||||
if (id==null || id=="") {
|
||||
core.ui.drawSyncSave(); return;
|
||||
}
|
||||
var password = prompt("请输入存档密码:");
|
||||
if (password==null || password=="") {
|
||||
core.ui.drawSyncSave(); return;
|
||||
}
|
||||
core.ui.drawWaiting("正在同步,请稍后...");
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('type', 'load');
|
||||
formData.append('name', core.firstData.name);
|
||||
formData.append('id', id);
|
||||
formData.append('password', password);
|
||||
|
||||
// send
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", "../sync.php");
|
||||
xhr.timeout = 1000;
|
||||
xhr.onload = function(e) {
|
||||
if (xhr.status==200) {
|
||||
// console.log("同步成功。");
|
||||
var response = JSON.parse(xhr.response);
|
||||
switch (response.code) {
|
||||
case 0:
|
||||
// 成功
|
||||
var data=JSON.parse(response.msg);
|
||||
// console.log(data);
|
||||
for (var i=1;i<=180;i++) {
|
||||
if (i<=data.length) {
|
||||
core.setLocalStorage("save"+i, data[i-1]);
|
||||
}
|
||||
else {
|
||||
core.removeLocalStorage("save"+i);
|
||||
}
|
||||
}
|
||||
core.drawText("同步成功!\n你的本地所有存档均已被覆盖。");
|
||||
break;
|
||||
case -1:
|
||||
core.drawText("出错啦!\n存档编号"+id+"不存在!");
|
||||
break;
|
||||
case -2:
|
||||
core.drawText("出错啦!\n存档密码错误!");
|
||||
break;
|
||||
default:
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
}
|
||||
};
|
||||
xhr.ontimeout = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
}
|
||||
xhr.onerror = function(e) {
|
||||
console.log(e);
|
||||
core.drawText("出错啦!\n无法从服务器同步存档。");
|
||||
}
|
||||
xhr.send(formData);
|
||||
}, function() {
|
||||
core.ui.drawSyncSave();
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
core.prototype.saveData = function(dataId) {
|
||||
var data = {
|
||||
'floorId': core.status.floorId,
|
||||
@ -2521,6 +2523,10 @@ core.prototype.hasFlag = function(flag) {
|
||||
return false;
|
||||
}
|
||||
|
||||
core.prototype.insertAction = function (list) {
|
||||
core.events.insertAction(list);
|
||||
}
|
||||
|
||||
core.prototype.lockControl = function () {
|
||||
core.status.lockControl = true;
|
||||
}
|
||||
|
||||
2
libs/core.min.js
vendored
2
libs/core.min.js
vendored
File diff suppressed because one or more lines are too long
@ -85,10 +85,9 @@ data.prototype.init = function() {
|
||||
/****** 角色相关 ******/
|
||||
"HPMAX": 999999, // HP上限;-1则无上限
|
||||
"lavaDamage": 100, // 经过血网受到的伤害
|
||||
"poisonDamage": 10, // 经过毒网受到的伤害
|
||||
"poisonDamage": 10, // 中毒后每步受到的伤害
|
||||
"weakValue": 20, // 衰弱状态下攻防减少的数值
|
||||
/****** 道具相关 ******/
|
||||
"cannotUseQuickShop": ["MT0"], // 不能使用快捷商店的楼层列表
|
||||
"redJewel": 3, // 红宝石加攻击的数值
|
||||
"blueJewel": 3, // 蓝宝石加防御的数值
|
||||
"greenJewel": 5, // 绿宝石加魔防的数值
|
||||
@ -108,7 +107,8 @@ data.prototype.init = function() {
|
||||
"shield5": 160, // 神圣盾加防数值
|
||||
"moneyPocket": 500, // 金钱袋加金币的数值
|
||||
|
||||
/****** 道具相关 ******/
|
||||
/****** 系统相关 ******/
|
||||
"cannotUseQuickShop": ["MT0"], // 不能使用快捷商店的楼层列表
|
||||
'animateSpeed': 500,
|
||||
}
|
||||
// 系统FLAG,在游戏运行中中请不要修改它。
|
||||
|
||||
@ -51,7 +51,7 @@ enemys.prototype.init = function () {
|
||||
'goldHornSlime': {'name': '金角怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0},
|
||||
'redKing': {'name': '红衣魔王', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0},
|
||||
'whiteKing': {'name': '白衣武士', 'hp': 100, 'atk': 120, 'def': 0, 'money': 17, 'experience': 0, 'special': 16},
|
||||
'blackMagician': {'name': '黑暗大法师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 12, 'experience': 0, 'special': 11, 'value': 1/3}, // 吸血怪需要在后面添加value代表吸血比例
|
||||
'blackMagician': {'name': '黑暗大法师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 12, 'experience': 0, 'special': 11, 'value': 1/3}, // 吸血怪需要在后面添加value代表吸血比例
|
||||
'silverSlime': {'name': '银头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 15, 'experience': 0, 'special': 14},
|
||||
'swordEmperor': {'name': '剑圣', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0},
|
||||
'whiteHornSlime': {'name': '尖角怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0},
|
||||
|
||||
@ -29,11 +29,6 @@ events.prototype.init = function () {
|
||||
core.changeFloor(data.event.data.floorId, data.event.data.stair,
|
||||
heroLoc, data.event.data.time, callback);
|
||||
},
|
||||
'openShop': function (data, core, callback) {
|
||||
core.ui.drawShop(data.event.shopid);
|
||||
if (core.isset(callback))
|
||||
callback();
|
||||
},
|
||||
'passNet': function (data, core, callback) {
|
||||
core.events.passNet(data);
|
||||
if (core.isset(callback))
|
||||
@ -72,10 +67,17 @@ events.prototype.startGame = function (hard) {
|
||||
core.hideStartAnimate(function() {
|
||||
core.drawText(core.clone(core.firstData.startText), function() {
|
||||
core.startGame(hard);
|
||||
// 可以在这里设置一些难度分歧
|
||||
// 例如,简单难度下改变初始生命可以调用:
|
||||
// if (hard=='Easy') core.setStatus("hp", 10000);
|
||||
// 具体的各种API参见doc文档
|
||||
if (hard=='Easy') { // 简单难度
|
||||
core.setFlag('hard', 1); // 可以用flag:hard来获得当前难度
|
||||
// 可以在此设置一些初始福利,比如设置初始生命值可以调用:
|
||||
// core.setStatus("hp", 10000);
|
||||
}
|
||||
if (hard=='Normal') { // 普通难度
|
||||
core.setFlag('hard', 2); // 可以用flag:hard来获得当前难度
|
||||
}
|
||||
if (hard=='Hard') { // 困难难度
|
||||
core.setFlag('hard', 3); // 可以用flag:hard来获得当前难度
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
@ -84,7 +86,7 @@ events.prototype.startGame = function (hard) {
|
||||
events.prototype.win = function(reason) {
|
||||
// 获胜
|
||||
core.waitHeroToStop(function() {
|
||||
core.rmGlobalAnimate(0,0,true);
|
||||
core.removeGlobalAnimate(0,0,true);
|
||||
core.clearMap('all'); // 清空全地图
|
||||
core.drawText([
|
||||
"\t[结局2]恭喜通关!你的分数是${status:hp}。"
|
||||
@ -97,7 +99,9 @@ events.prototype.win = function(reason) {
|
||||
events.prototype.lose = function(reason) {
|
||||
// 失败
|
||||
core.waitHeroToStop(function() {
|
||||
core.drawText('\t[结局1]你死了。', function () {
|
||||
core.drawText([
|
||||
"\t[结局1]你死了。\n如题。"
|
||||
], function () {
|
||||
core.restart();
|
||||
});
|
||||
})
|
||||
@ -230,7 +234,7 @@ events.prototype.doAction = function() {
|
||||
else this.doAction();
|
||||
break;
|
||||
case "move": // 移动事件
|
||||
core.moveBlock(x,y,data.steps,data.time,data.disappear,function() {
|
||||
core.moveBlock(x,y,data.steps,data.time,data.immediateHide,function() {
|
||||
core.events.doAction();
|
||||
})
|
||||
break;
|
||||
@ -246,6 +250,7 @@ events.prototype.doAction = function() {
|
||||
core.clearMap('hero', 0, 0, 416, 416);
|
||||
core.setHeroLoc('x', data.loc[0]);
|
||||
core.setHeroLoc('y', data.loc[1]);
|
||||
if (core.isset(data.direction)) core.setHeroLoc('direction', data.direction);
|
||||
core.drawHero(core.getHeroLoc('direction'), core.getHeroLoc('x'), core.getHeroLoc('y'), 'stop');
|
||||
this.doAction();
|
||||
break;
|
||||
@ -675,7 +680,7 @@ events.prototype.clickShop = function(x,y) {
|
||||
}
|
||||
|
||||
// 快捷商店
|
||||
events.prototype.clickSelectShop = function(x,y) {
|
||||
events.prototype.clickQuickShop = function(x, y) {
|
||||
if (x >= 5 && x <= 7) {
|
||||
var shopList = core.status.shops, keys = Object.keys(shopList);
|
||||
var topIndex = 6 - parseInt((keys.length + 1) / 2);
|
||||
|
||||
2
libs/events.min.js
vendored
2
libs/events.min.js
vendored
File diff suppressed because one or more lines are too long
@ -2,9 +2,9 @@
|
||||
// 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头
|
||||
// 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等
|
||||
main.floors.MT0 = {
|
||||
'floorId': 'MT0', // 楼层唯一标识符,需要和名字完全一致
|
||||
'title': "0", // 楼层中文名
|
||||
'name': 0, // 显示在状态栏中的名称
|
||||
"floorId": "MT0", // 楼层唯一标识符,需要和名字完全一致
|
||||
"title": "主塔 0 层", // 楼层中文名
|
||||
"name": 0, // 显示在状态栏中的层数
|
||||
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成
|
||||
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
// 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头
|
||||
// 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等
|
||||
main.floors.sample0 = {
|
||||
'floorId': 'sample0', // 楼层唯一标识符,需要和名字完全一致
|
||||
'title': "样板 0 层", // 楼层中文名
|
||||
'name': 0, // 显示在状态栏中的名称
|
||||
"floorId": "sample0", // 楼层唯一标识符,需要和名字完全一致
|
||||
"title": "样板 0 层", // 楼层中文名
|
||||
"name": 0, // 显示在状态栏中的层数
|
||||
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成
|
||||
[0, 0, 220, 0, 0, 6, 87, 3, 65, 64, 44, 43, 42],
|
||||
@ -79,10 +79,10 @@ main.floors.sample0 = {
|
||||
"0,12": {"floorId": "sample0", "stair": "upFloor"}, // 注意,目标层有多个楼梯的话,写stair可能会导致到达位置不确定。这时候推荐写loc指明目标点位置。
|
||||
"1,12": {"floorId": "sample0", "loc": [1,12]},
|
||||
"2,12": {"floorId": "sample0", "loc": [2,12]},
|
||||
"3,12": {"floorId": "sample0", "loc": [6,1]},
|
||||
"4,12": {"floorId": "sample0", "loc": [0,9]},
|
||||
"3,12": {"floorId": "sample0", "loc": [6,1], "direction": "up"}, // 切换楼层后勇士面对上方
|
||||
"4,12": {"floorId": "sample0", "loc": [0,9], "direction": "left", "time": 1000}, // 切换楼层后勇士面对左边,切换动画1000ms
|
||||
"5,12": {"floorId": "sample0", "loc": [6,10], "portalWithoutTrigger": false}, // 不能穿透
|
||||
"6,12": {"floorId": "sample0", "loc": [10,10]},
|
||||
"6,12": {"floorId": "sample0", "loc": [10,10], "direction": "left", "time": 1000, "portalWithoutTrigger": false},
|
||||
},
|
||||
"afterBattle": { // 战斗后可能触发的事件列表
|
||||
"2,6": ["\t[ghostSkeleton]不可能,你怎么可能打败我!\n(一个打败怪物触发的事件)"]
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
// 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头
|
||||
// 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等
|
||||
main.floors.sample1 = {
|
||||
'floorId': 'sample1', // 楼层唯一标识符,需要和名字完全一致
|
||||
'title': "样板 1 层", // 楼层中文名
|
||||
'name': 1, // 显示在状态栏中的名称
|
||||
"floorId": "sample1", // 楼层唯一标识符,需要和名字完全一致
|
||||
"title": "样板 1 层", // 楼层中文名
|
||||
"name": 1, // 显示在状态栏中的层数
|
||||
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成
|
||||
[7, 131, 8, 2, 9, 130, 10, 2, 0, 0, 132, 0, 0],
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
// 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头
|
||||
// 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等
|
||||
main.floors.sample2 = {
|
||||
'floorId': 'sample2', // 楼层唯一标识符,需要和名字完全一致
|
||||
'title': "主塔 40 层", // 楼层中文名
|
||||
'name': 40, // 显示在状态栏中的名称
|
||||
"floorId": "sample2", // 楼层唯一标识符,需要和名字完全一致
|
||||
"title": "主塔 40 层", // 楼层中文名
|
||||
"name": 40, // 显示在状态栏中的层数
|
||||
"canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成
|
||||
[5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5],
|
||||
@ -296,7 +296,7 @@ main.floors.sample2 = {
|
||||
{"type": "hide", "loc": [4,6]},
|
||||
{"type": "hide", "loc": [8,6]},
|
||||
{"type": "hide", "loc": [8,3]},
|
||||
{"type": "changeFloor", "floorId": "sample2", "loc": [6,6], "direction": "up", "time": 100}, // 更换勇士地点,合计120毫秒
|
||||
{"type": "changeFloor", "floorId": "sample2", "loc": [6,6], "direction": "up", "time": 1000}, // 更换勇士地点,合计1秒
|
||||
{"type": "show", "loc": [6,5]}, // 显示黄宝石
|
||||
{"type": "sleep", "time": 200}, // 等待200毫秒
|
||||
{"type": "playSound", "name": "item.ogg"},
|
||||
|
||||
77
libs/ui.js
77
libs/ui.js
@ -351,76 +351,6 @@ ui.prototype.drawQuickShop = function (need) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制商店
|
||||
* @param id
|
||||
*/
|
||||
ui.prototype.drawShop = function (id) {
|
||||
var shop = core.status.shops[id];
|
||||
// 正在移动中...
|
||||
|
||||
if (!core.status.heroStop) {
|
||||
setTimeout(function () {
|
||||
core.ui.drawShop(id);
|
||||
}, 30);
|
||||
return;
|
||||
}
|
||||
|
||||
core.status.event.data = shop;
|
||||
core.status.event.id = 'shop';
|
||||
core.lockControl();
|
||||
shop.visited = true;
|
||||
|
||||
var background = core.canvas.ui.createPattern(core.material.ground, "repeat");
|
||||
|
||||
var times = shop.times, need = eval(shop.need);
|
||||
|
||||
clearInterval(core.interval.tipAnimate);
|
||||
core.clearMap('data', 0, 0, 416, 416);
|
||||
core.setOpacity('data', 1);
|
||||
|
||||
core.clearMap('ui', 0, 0, 416, 416);
|
||||
core.setAlpha('ui', 1);
|
||||
core.setFillStyle('ui', background);
|
||||
|
||||
var left = 97, top = 64, right = 416 - 2 * left, bottom = 416 - 2 * top;
|
||||
core.fillRect('ui', left, top, right, bottom, background);
|
||||
core.strokeRect('ui', left - 1, top - 1, right + 1, bottom + 1, '#FFFFFF', 2);
|
||||
|
||||
// 名称
|
||||
core.canvas.ui.textAlign = "center";
|
||||
core.fillText('ui', shop.title, left + 135, top + 34, '#FFFFFF', 'bold 19px Verdana');
|
||||
|
||||
// 动画
|
||||
core.strokeRect('ui', left + 15 - 1, top + 30 - 1, 34, 34, '#DDDDDD', 2);
|
||||
core.status.boxAnimateObjs = [];
|
||||
core.status.boxAnimateObjs.push({
|
||||
'bgx': left + 15, 'bgy': top + 30, 'bgsize': 32,
|
||||
'image': core.material.images.npcs,
|
||||
'x': left + 15, 'y': top + 30, 'icon': core.material.icons.npcs[shop.icon]
|
||||
});
|
||||
core.setBoxAnimate();
|
||||
|
||||
// 对话
|
||||
core.canvas.ui.textAlign = "left";
|
||||
if (need<0) need="若干";
|
||||
var use = shop.use=='experience'?"经验":"金币";
|
||||
core.fillText('ui', "勇敢的武士啊,给我" + need, left + 60, top + 65, '#FFFFFF', 'bold 14px Verdana');
|
||||
core.fillText('ui', use + "你就可以:", left + 60, top + 83);
|
||||
|
||||
// 选项
|
||||
core.canvas.ui.textAlign = "center";
|
||||
for (var i = 0; i < shop.choices.length; i++) {
|
||||
var choice = shop.choices[i];
|
||||
var text = choice.text;
|
||||
if (core.isset(choice.need))
|
||||
text += "("+eval(choice.need)+use+")"
|
||||
core.fillText('ui', text, 208, top + 120 + 32 * i, "#FFFFFF", "bold 17px Verdana");
|
||||
}
|
||||
core.fillText('ui', "退出商店", 208, top + 248);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 绘制“请等候...”
|
||||
@ -835,9 +765,11 @@ ui.prototype.drawAbout = function() {
|
||||
|
||||
// 名称
|
||||
core.canvas.ui.textAlign = "left";
|
||||
core.fillText('ui', "异空间", text_start, top+35, "#FFD700", "bold 22px Verdana");
|
||||
core.fillText('ui', "HTML5复刻版", text_start+75, top+37, "#DDDDDD", "bold 15px Verdana");
|
||||
core.fillText('ui', "HTML5 魔塔样板", text_start, top+35, "#FFD700", "bold 22px Verdana");
|
||||
core.fillText('ui', "作者: 艾之葵", text_start, top + 80, "#FFFFFF", "bold 17px Verdana");
|
||||
core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top+112);
|
||||
// TODO: 写自己的“关于”页面
|
||||
/*
|
||||
core.fillText('ui', "原作: ss433_2", text_start, top + 112, "#FFFFFF", "bold 17px Verdana");
|
||||
core.fillText('ui', "制作工具: WebStorm", text_start, top + 144, "#FFFFFF", "bold 17px Verdana");
|
||||
core.fillText('ui', "测试平台: Chrome/微信/iOS", text_start, top + 176, "#FFFFFF", "bold 17px Verdana");
|
||||
@ -846,4 +778,5 @@ ui.prototype.drawAbout = function() {
|
||||
core.fillText('ui', 'iEcho', text_start+len, top+240);
|
||||
core.fillText('ui', '打Dota的喵', text_start+len, top+272);
|
||||
core.fillText('ui', 'HTML5魔塔交流群:539113091', text_start, top+304);
|
||||
*/
|
||||
}
|
||||
BIN
~$样板使用指南.docx
Normal file
BIN
~$样板使用指南.docx
Normal file
Binary file not shown.
BIN
伤害和临界值计算器.exe
Normal file
BIN
伤害和临界值计算器.exe
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user