V2.3.1
This commit is contained in:
parent
6b89497abe
commit
dd12470866
13
README.md
13
README.md
@ -58,6 +58,19 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
|
||||
|
||||
## 更新说明
|
||||
|
||||
### 2018.6.16 V2.3.1
|
||||
|
||||
* [x] 存档采用高比率压缩,单个大小是原来的1/10!
|
||||
* [x] 默认存档数改成100页500个
|
||||
* [x] base64上传成绩,杜绝乱码
|
||||
* [x] 道具栏翻页
|
||||
* [x] 单击瞬移(菜单栏中开关)
|
||||
* [x] 重新补上E键打开光标
|
||||
* [x] 楼层属性增添地下层选项,同层传送至上楼梯
|
||||
* [x] core.debug()穿墙模式不能穿出地图
|
||||
* [x] core.values和core.flags也存入存档
|
||||
* [x] 修复所有已知bug
|
||||
|
||||
### 2018.5.27 V2.3
|
||||
|
||||
* [x] 启动服务和便捷PS工具(Mac版)
|
||||
|
||||
@ -1491,8 +1491,10 @@ ActionParser.prototype.parseAction = function() {
|
||||
break;
|
||||
case "setFg": // 颜色渐变
|
||||
if(this.isset(data.color)){
|
||||
var alpha = data.color[3];
|
||||
if (alpha==undefined || alpha==null) alpha=1;
|
||||
this.next = MotaActionBlocks['setFg_0_s'].xmlText([
|
||||
data.color[0],data.color[1],data.color[2],data.color[3]||1,data.time||0,this.next]);
|
||||
data.color[0],data.color[1],data.color[2],alpha,data.time||0,this.next]);
|
||||
} else {
|
||||
this.next = MotaActionBlocks['setFg_1_s'].xmlText([
|
||||
data.time||0,this.next]);
|
||||
|
||||
@ -307,6 +307,12 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"_type": "event",
|
||||
"_event": "firstArrive",
|
||||
"_data": "第一次到该楼层触发的事件,可以双击进入事件编辑器。"
|
||||
},
|
||||
"underGround": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
"_bool": "bool",
|
||||
"_data": "是否是地下层;如果该项为true则同层传送将传送至上楼梯"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -463,12 +463,14 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"_bool": "bool",
|
||||
"_data": "剑和盾是否直接作为装备。如果此项为true,则作为装备,需要在道具栏使用,否则将直接加属性。"
|
||||
},
|
||||
/*
|
||||
"enableDeleteItem": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
"_bool": "bool",
|
||||
"_data": "是否允许删除(丢弃)道具"
|
||||
},
|
||||
*/
|
||||
"enableAddPoint": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
|
||||
@ -116,8 +116,9 @@
|
||||
<canvas class='gameCanvas' id='ui' width='416' height='416'></canvas>
|
||||
<canvas class='gameCanvas' id='data' width='416' height='416'>此浏览器不支持HTML5</canvas>
|
||||
</div>
|
||||
<script src='libs/thirdparty/mid.min.js'></script>
|
||||
<script src='libs/thirdparty/lz-string.min.js'></script>
|
||||
<script id='mainScript' src='main.js'></script>
|
||||
<script>main.init();main.listen();</script>
|
||||
<script src='libs/thirdparty/mid.min.js'></script>
|
||||
</body>
|
||||
</html>
|
||||
@ -315,11 +315,8 @@ actions.prototype.keyUp = function(keyCode, fromReplay) {
|
||||
core.load(true);
|
||||
break;
|
||||
case 69: // E
|
||||
/*
|
||||
// Cursor is unnecessary!
|
||||
if (core.status.heroStop)
|
||||
core.ui.drawCursor();
|
||||
*/
|
||||
break;
|
||||
case 84: // T
|
||||
if (core.status.heroStop)
|
||||
@ -938,6 +935,8 @@ actions.prototype.clickFly = function(x,y) {
|
||||
if (x>=0 && x<=9 && y>=3 && y<=11) {
|
||||
var index=core.status.hero.flyRange.indexOf(core.status.floorId);
|
||||
var stair=core.status.event.data<index?"upFloor":"downFloor";
|
||||
if (core.status.event.data==index && core.floors[core.status.floorId].underGround)
|
||||
stair = "upFloor";
|
||||
var floorId=core.status.event.data;
|
||||
var toFloor = core.status.hero.flyRange[floorId];
|
||||
core.status.route.push("fly:"+toFloor);
|
||||
@ -1159,6 +1158,7 @@ actions.prototype.clickToolbox = function(x,y) {
|
||||
core.ui.closePanel();
|
||||
return;
|
||||
}
|
||||
/*
|
||||
if (x>=10 && x<=12 && y<=1) {
|
||||
if (!core.isset(core.status.event.data)) return;
|
||||
if (!core.flags.enableDeleteItem) {
|
||||
@ -1170,22 +1170,50 @@ actions.prototype.clickToolbox = function(x,y) {
|
||||
core.ui.drawToolbox();
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
var index=0;
|
||||
if (y==4||y==5||y==9||y==10) index=parseInt(x/2);
|
||||
else index=6+parseInt(x/2);
|
||||
if (y>=9) index+=100;
|
||||
this.clickToolboxIndex(index);
|
||||
// 当前页面
|
||||
var page = parseInt((core.status.event.selection%1000)/12)+1;
|
||||
|
||||
// 上一页
|
||||
if ((x == 3 || x == 4) && y == 12) {
|
||||
if (page>1) {
|
||||
core.ui.drawToolbox(core.status.event.selection-12);
|
||||
}
|
||||
return;
|
||||
}
|
||||
// 下一页
|
||||
if ((x == 8 || x == 9) && y == 12) {
|
||||
var toolPage = parseInt(Object.keys(core.status.hero.items.tools).length/12)+1,
|
||||
constantPage = parseInt(Object.keys(core.status.hero.items.constants).length/12)+1;
|
||||
if (page<toolPage) {
|
||||
core.ui.drawToolbox(12*page);
|
||||
}
|
||||
else if (page<constantPage) {
|
||||
core.ui.drawToolbox(1000+12*page);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var index=parseInt(12*(page-1)+x/2);
|
||||
if (y==4) index+=0;
|
||||
else if (y==6) index+=6;
|
||||
else if (y==9) index+=1000;
|
||||
else if (y==11) index+=1006;
|
||||
else index=-1;
|
||||
|
||||
if (index>=0)
|
||||
this.clickToolboxIndex(index);
|
||||
}
|
||||
|
||||
////// 选择工具栏界面中某个Index后的操作 //////
|
||||
actions.prototype.clickToolboxIndex = function(index) {
|
||||
var items = null;
|
||||
var ii=index;
|
||||
if (ii<100)
|
||||
if (ii<1000)
|
||||
items = Object.keys(core.status.hero.items.tools).sort();
|
||||
else {
|
||||
ii-=100;
|
||||
ii-=1000;
|
||||
items = Object.keys(core.status.hero.items.constants).sort();
|
||||
}
|
||||
if (items==null) return;
|
||||
@ -1206,58 +1234,59 @@ actions.prototype.keyDownToolbox = function (keycode) {
|
||||
var tools = Object.keys(core.status.hero.items.tools).sort();
|
||||
var constants = Object.keys(core.status.hero.items.constants).sort();
|
||||
var index=core.status.event.selection;
|
||||
var page=parseInt(index%1000/12), offset=12*page;
|
||||
|
||||
if (keycode==37) { // left
|
||||
if ((index>0 && index<100) || index>100) {
|
||||
if ((index>0 && index<1000) || index>1000) {
|
||||
this.clickToolboxIndex(index-1);
|
||||
return;
|
||||
}
|
||||
if (index==100 && tools.length>0) {
|
||||
if (index==1000 && tools.length>0) {
|
||||
this.clickToolboxIndex(tools.length-1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (keycode==38) { // up
|
||||
if ((index>5 && index<100) || index>105) {
|
||||
if ((index>offset+5 && index<1000) || index>offset+1005) {
|
||||
this.clickToolboxIndex(index-6);
|
||||
return;
|
||||
}
|
||||
if (index>=100 && index<=105) {
|
||||
if (tools.length>6) {
|
||||
this.clickToolboxIndex(Math.min(tools.length-1, index-100+6));
|
||||
if (index>=offset+1000 && index<=offset+1005) {
|
||||
if (tools.length>offset+6) {
|
||||
this.clickToolboxIndex(Math.min(tools.length-1, index-1000+6));
|
||||
}
|
||||
else if (tools.length>0) {
|
||||
this.clickToolboxIndex(Math.min(tools.length-1, index-100));
|
||||
else if (tools.length>offset) {
|
||||
this.clickToolboxIndex(Math.min(tools.length-1, index-1000));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (keycode==39) { // right
|
||||
if ((index<tools.length-1) || (index>=100 && index<constants.length+100)) {
|
||||
if ((index<tools.length-1) || (index>=1000 && index<constants.length+1000)) {
|
||||
this.clickToolboxIndex(index+1);
|
||||
return;
|
||||
}
|
||||
if (index==tools.length-1 && constants.length>0) {
|
||||
this.clickToolboxIndex(100);
|
||||
this.clickToolboxIndex(1000);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (keycode==40) { // down
|
||||
if (index<=5) {
|
||||
if (tools.length>6) {
|
||||
if (index<=offset+5) {
|
||||
if (tools.length>offset+6) {
|
||||
this.clickToolboxIndex(Math.min(tools.length-1, index+6));
|
||||
}
|
||||
else if (constants.length>0) {
|
||||
this.clickToolboxIndex(100+Math.min(constants.length-1, index));
|
||||
else if (constants.length>offset) {
|
||||
this.clickToolboxIndex(1000+Math.min(constants.length-1, index));
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (index>5 && index<100 && constants.length>0) {
|
||||
this.clickToolboxIndex(100+Math.min(constants.length-1, index-6));
|
||||
if (index>offset+5 && index<offset+1000 && constants.length>offset) {
|
||||
this.clickToolboxIndex(1000+Math.min(constants.length-1, index-6));
|
||||
return;
|
||||
}
|
||||
if (index>=100 && index<=105 && constants.length>6) {
|
||||
this.clickToolboxIndex(Math.min(100+constants.length-1, index+6));
|
||||
if (index>=offset+1000 && index<=offset+1005 && constants.length>offset+6) {
|
||||
this.clickToolboxIndex(Math.min(1000+constants.length-1, index+6));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1276,6 +1305,7 @@ actions.prototype.keyUpToolbox = function (keycode) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
if (keycode==46) { // delete
|
||||
if (!core.isset(core.status.event.data)) return;
|
||||
if (!core.flags.enableDeleteItem) {
|
||||
@ -1287,6 +1317,7 @@ actions.prototype.keyUpToolbox = function (keycode) {
|
||||
core.ui.drawToolbox();
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
@ -1486,9 +1517,14 @@ actions.prototype.clickSwitchs = function (x,y) {
|
||||
core.ui.drawSwitchs();
|
||||
break;
|
||||
case 6:
|
||||
window.open(core.firstData.name+".zip", "_blank");
|
||||
core.status.automaticRoute.clickMoveDirectly=!core.status.automaticRoute.clickMoveDirectly;
|
||||
core.setLocalStorage('clickMoveDirectly', core.status.automaticRoute.clickMoveDirectly);
|
||||
core.ui.drawSwitchs();
|
||||
break;
|
||||
case 7:
|
||||
window.open(core.firstData.name+".zip", "_blank");
|
||||
break;
|
||||
case 8:
|
||||
core.status.event.selection=0;
|
||||
core.ui.drawSettings();
|
||||
break;
|
||||
|
||||
@ -243,7 +243,7 @@ control.prototype.clearStatus = function() {
|
||||
}
|
||||
|
||||
////// 重置游戏状态和初始数据 //////
|
||||
control.prototype.resetStatus = function(hero, hard, floorId, route, maps) {
|
||||
control.prototype.resetStatus = function(hero, hard, floorId, route, maps, values, flags) {
|
||||
|
||||
var totalTime=0;
|
||||
if (core.isset(core.status) && core.isset(core.status.hero)
|
||||
@ -261,6 +261,7 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps) {
|
||||
core.status.maps = core.clone(maps);
|
||||
// 初始化怪物
|
||||
core.material.enemys = core.clone(core.enemys.getEnemys());
|
||||
core.material.items = core.clone(core.items.getItems());
|
||||
// 初始化人物属性
|
||||
core.status.hero = core.clone(hero);
|
||||
// 统计数据
|
||||
@ -285,6 +286,16 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps) {
|
||||
// 保存的Index
|
||||
core.status.saveIndex = core.getLocalStorage('saveIndex2', 1);
|
||||
|
||||
core.status.automaticRoute.clickMoveDirectly = core.getLocalStorage('clickMoveDirectly', false);
|
||||
|
||||
if (core.isset(values))
|
||||
core.values = core.clone(values);
|
||||
|
||||
if (core.isset(flags))
|
||||
core.flags = core.clone(flags);
|
||||
|
||||
core.events.initGame();
|
||||
|
||||
}
|
||||
|
||||
////// 开始游戏 //////
|
||||
@ -304,8 +315,9 @@ control.prototype.startGame = function (hard, callback) {
|
||||
formData.append('name', core.firstData.name);
|
||||
formData.append('version', core.firstData.version);
|
||||
formData.append('platform', core.platform.isPC?"PC":core.platform.isAndroid?"Android":core.platform.isIOS?"iOS":"");
|
||||
formData.append('hard', hard);
|
||||
formData.append('hard', LZString.compressToBase64(hard));
|
||||
formData.append('hardCode', core.getFlag('hard', 0));
|
||||
formData.append('base64', 1);
|
||||
|
||||
core.utils.http("POST", "/games/upload.php", formData);
|
||||
})
|
||||
@ -409,6 +421,22 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// 单击瞬间移动
|
||||
if (core.status.automaticRoute.clickMoveDirectly && core.status.heroStop) {
|
||||
var ignoreSteps = core.canMoveDirectly(destX, destY);
|
||||
if (ignoreSteps>0) {
|
||||
core.clearMap('hero', 0, 0, 416, 416);
|
||||
core.setHeroLoc('x', destX);
|
||||
core.setHeroLoc('y', destY);
|
||||
core.drawHero();
|
||||
core.status.route.push("move:"+destX+":"+destY);
|
||||
core.status.hero.statistics.moveDirectly++;
|
||||
core.status.hero.statistics.ignoreSteps+=ignoreSteps;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var step = 0;
|
||||
var tempStep = null;
|
||||
var moveStep;
|
||||
@ -720,8 +748,19 @@ control.prototype.moveHero = function (direction, callback) {
|
||||
if (!core.status.heroStop) {
|
||||
if (core.hasFlag('debug') && core.status.ctrlDown) {
|
||||
if (core.status.heroMoving!=0) return;
|
||||
// 检测是否穿出去
|
||||
var scan = {
|
||||
'up': {'x': 0, 'y': -1},
|
||||
'left': {'x': -1, 'y': 0},
|
||||
'down': {'x': 0, 'y': 1},
|
||||
'right': {'x': 1, 'y': 0}
|
||||
};
|
||||
direction = core.getHeroLoc('direction');
|
||||
var nx = core.getHeroLoc('x') + scan[direction].x, ny=core.getHeroLoc('y') + scan[direction].y;
|
||||
if (nx<0 || nx>12 || ny<0 || ny>12) return;
|
||||
|
||||
core.status.heroMoving=-1;
|
||||
core.eventMoveHero([core.getHeroLoc('direction')], 100, function () {
|
||||
core.eventMoveHero([direction], 100, function () {
|
||||
core.status.heroMoving=0;
|
||||
doAction();
|
||||
});
|
||||
@ -2077,6 +2116,8 @@ control.prototype.saveData = function() {
|
||||
'hard': core.status.hard,
|
||||
'maps': core.maps.save(core.status.maps),
|
||||
'route': core.encodeRoute(core.status.route),
|
||||
'values': core.clone(core.values),
|
||||
'flags': core.clone(core.flags),
|
||||
'shops': {},
|
||||
'version': core.firstData.version,
|
||||
"time": new Date().getTime()
|
||||
@ -2096,7 +2137,8 @@ control.prototype.saveData = function() {
|
||||
////// 从本地读档 //////
|
||||
control.prototype.loadData = function (data, callback) {
|
||||
|
||||
core.resetStatus(data.hero, data.hard, data.floorId, core.decodeRoute(data.route), core.maps.load(data.maps));
|
||||
core.resetStatus(data.hero, data.hard, data.floorId, core.decodeRoute(data.route), core.maps.load(data.maps),
|
||||
data.values, data.flags);
|
||||
|
||||
// load shop times
|
||||
for (var shop in core.status.shops) {
|
||||
|
||||
@ -103,6 +103,7 @@ function core() {
|
||||
'cursorX': null,
|
||||
'cursorY': null,
|
||||
"moveDirectly": false,
|
||||
'clickMoveDirectly': false,
|
||||
},
|
||||
|
||||
// 按下键的时间:为了判定双击
|
||||
@ -179,7 +180,7 @@ core.prototype.init = function (coreData, callback) {
|
||||
core.dom.logoLabel.innerHTML = core.firstData.title;
|
||||
document.title = core.firstData.title + " - HTML5魔塔";
|
||||
document.getElementById("startLogo").innerHTML = core.firstData.title;
|
||||
core.material.items = core.items.getItems();
|
||||
core.material.items = core.clone(core.items.getItems());
|
||||
core.initStatus.maps = core.maps.initMaps(core.floorIds);
|
||||
core.material.enemys = core.clone(core.enemys.getEnemys());
|
||||
core.material.icons = core.icons.getIcons();
|
||||
@ -303,8 +304,8 @@ core.prototype.clearStatus = function() {
|
||||
}
|
||||
|
||||
////// 重置游戏状态和初始数据 //////
|
||||
core.prototype.resetStatus = function(hero, hard, floorId, route, maps) {
|
||||
core.control.resetStatus(hero, hard, floorId, route, maps)
|
||||
core.prototype.resetStatus = function(hero, hard, floorId, route, maps, values, flags) {
|
||||
core.control.resetStatus(hero, hard, floorId, route, maps, values, flags);
|
||||
}
|
||||
|
||||
////// 开始游戏 //////
|
||||
|
||||
@ -175,9 +175,9 @@ events.prototype.gameOver = function (ending, fromReplay) {
|
||||
formData.append('name', core.firstData.name);
|
||||
formData.append('version', core.firstData.version);
|
||||
formData.append('platform', core.platform.isPC?"PC":core.platform.isAndroid?"Android":core.platform.isIOS?"iOS":"");
|
||||
formData.append('hard', core.status.hard);
|
||||
formData.append('username', username||"");
|
||||
formData.append('ending', ending);
|
||||
formData.append('hard', LZString.compressToBase64(core.status.hard));
|
||||
formData.append('username', LZString.compressToBase64(username||""));
|
||||
formData.append('ending', LZString.compressToBase64(ending));
|
||||
formData.append('lv', core.status.hero.lv);
|
||||
formData.append('hp', Math.min(hp, Math.pow(2, 63)));
|
||||
formData.append('atk', core.status.hero.atk);
|
||||
@ -189,6 +189,7 @@ events.prototype.gameOver = function (ending, fromReplay) {
|
||||
formData.append('seed', core.getFlag('seed'));
|
||||
formData.append('totalTime', Math.floor(core.status.hero.statistics.totalTime/1000));
|
||||
formData.append('route', core.encodeRoute(core.status.route));
|
||||
formData.append('base64', 1);
|
||||
|
||||
if (main.isCompetition)
|
||||
core.http("POST", "/games/competition/upload.php", formData);
|
||||
@ -1482,4 +1483,28 @@ events.prototype.afterLoadData = function (data) {
|
||||
return this.eventdata.afterLoadData(data);
|
||||
}
|
||||
|
||||
////// 上传当前数据 //////
|
||||
events.prototype.uploadCurrent = function () {
|
||||
var formData = new FormData();
|
||||
|
||||
formData.append('type', 'score');
|
||||
formData.append('name', core.firstData.name);
|
||||
formData.append('version', core.firstData.version);
|
||||
formData.append('platform', core.platform.isPC?"PC":core.platform.isAndroid?"Android":core.platform.isIOS?"iOS":"");
|
||||
formData.append('hard', LZString.compressToBase64(core.status.hard));
|
||||
formData.append('lv', core.status.hero.lv);
|
||||
formData.append('hp', Math.min(hp, Math.pow(2, 63)));
|
||||
formData.append('atk', core.status.hero.atk);
|
||||
formData.append('def', core.status.hero.def);
|
||||
formData.append('mdef', core.status.hero.mdef);
|
||||
formData.append('money', core.status.hero.money);
|
||||
formData.append('experience', core.status.hero.experience);
|
||||
formData.append('steps', core.status.hero.steps);
|
||||
formData.append('seed', core.getFlag('seed'));
|
||||
formData.append('totalTime', Math.floor(core.status.hero.statistics.totalTime/1000));
|
||||
formData.append('route', core.encodeRoute(core.status.route));
|
||||
formData.append('deler', 'current');
|
||||
formData.append('base64', 1);
|
||||
|
||||
core.http("POST", "/games/upload.php", formData);
|
||||
}
|
||||
|
||||
1
libs/thirdparty/lz-string.min.js
vendored
Normal file
1
libs/thirdparty/lz-string.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
var LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString);
|
||||
87
libs/ui.js
87
libs/ui.js
@ -737,6 +737,7 @@ ui.prototype.drawSwitchs = function() {
|
||||
"怪物显伤: "+(core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"),
|
||||
"临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"),
|
||||
"领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"),
|
||||
"单击瞬移: "+(core.status.automaticRoute.clickMoveDirectly ? "[ON]" : "[OFF]"),
|
||||
"下载离线版本",
|
||||
"返回主菜单"
|
||||
];
|
||||
@ -1461,19 +1462,27 @@ ui.prototype.drawToolbox = function(index) {
|
||||
|
||||
if (!core.isset(index)) {
|
||||
if (tools.length>0) index=0;
|
||||
else if (constants.length>0) index=100;
|
||||
else if (constants.length>0) index=1000;
|
||||
else index=0;
|
||||
}
|
||||
|
||||
core.status.event.selection=index;
|
||||
|
||||
var selectId;
|
||||
if (index<100)
|
||||
if (index<1000) {
|
||||
if (index>=tools.length) index=Math.max(0, tools.length-1);
|
||||
selectId = tools[index];
|
||||
else
|
||||
selectId = constants[index-100];
|
||||
}
|
||||
else {
|
||||
if (index-1000>=constants.length) index=1000+Math.max(0, constants.length-1);
|
||||
selectId = constants[index-1000];
|
||||
}
|
||||
|
||||
var page = parseInt((index%1000)/12)+1;
|
||||
var totalPage = parseInt(Math.max(tools.length, constants.length)/12)+1;
|
||||
|
||||
if (!core.hasItem(selectId)) selectId=null;
|
||||
|
||||
core.status.event.data=selectId;
|
||||
|
||||
core.clearMap('ui', 0, 0, 416, 416);
|
||||
@ -1485,34 +1494,37 @@ ui.prototype.drawToolbox = function(index) {
|
||||
core.canvas.ui.lineWidth = 2;
|
||||
core.canvas.ui.strokeWidth = 2;
|
||||
|
||||
var ydelta = 20;
|
||||
|
||||
// 画线
|
||||
core.canvas.ui.beginPath();
|
||||
core.canvas.ui.moveTo(0, 130);
|
||||
core.canvas.ui.lineTo(416, 130);
|
||||
core.canvas.ui.moveTo(0, 130-ydelta);
|
||||
core.canvas.ui.lineTo(416, 130-ydelta);
|
||||
core.canvas.ui.stroke();
|
||||
core.canvas.ui.beginPath();
|
||||
core.canvas.ui.moveTo(0,129);
|
||||
core.canvas.ui.lineTo(0,105);
|
||||
core.canvas.ui.lineTo(72,105);
|
||||
core.canvas.ui.lineTo(102,129);
|
||||
core.canvas.ui.moveTo(416,129-ydelta);
|
||||
core.canvas.ui.lineTo(416,105-ydelta);
|
||||
core.canvas.ui.lineTo(416-72,105-ydelta);
|
||||
core.canvas.ui.lineTo(416-102,129-ydelta);
|
||||
core.canvas.ui.fill();
|
||||
|
||||
core.canvas.ui.beginPath();
|
||||
core.canvas.ui.moveTo(0, 290);
|
||||
core.canvas.ui.lineTo(416, 290);
|
||||
core.canvas.ui.moveTo(0, 290-ydelta);
|
||||
core.canvas.ui.lineTo(416, 290-ydelta);
|
||||
core.canvas.ui.stroke();
|
||||
core.canvas.ui.beginPath();
|
||||
core.canvas.ui.moveTo(0,289);
|
||||
core.canvas.ui.lineTo(0,265);
|
||||
core.canvas.ui.lineTo(72,265);
|
||||
core.canvas.ui.lineTo(102,289);
|
||||
core.canvas.ui.moveTo(416,289-ydelta);
|
||||
core.canvas.ui.lineTo(416,265-ydelta);
|
||||
core.canvas.ui.lineTo(416-72,265-ydelta);
|
||||
core.canvas.ui.lineTo(416-102,289-ydelta);
|
||||
core.canvas.ui.fill();
|
||||
|
||||
// 文字
|
||||
core.canvas.ui.textAlign = 'left';
|
||||
core.fillText('ui', "消耗道具", 5, 124, '#333333', "bold 16px Verdana");
|
||||
core.fillText('ui', "永久道具", 5, 284);
|
||||
core.canvas.ui.textAlign = 'right';
|
||||
core.fillText('ui', "消耗道具", 411, 124-ydelta, '#333333', "bold 16px Verdana");
|
||||
core.fillText('ui', "永久道具", 411, 284-ydelta);
|
||||
|
||||
core.canvas.ui.textAlign = 'left';
|
||||
// 描述
|
||||
if (core.isset(selectId)) {
|
||||
var item=core.material.items[selectId];
|
||||
@ -1536,47 +1548,49 @@ ui.prototype.drawToolbox = function(index) {
|
||||
var images = core.material.images.items;
|
||||
// 消耗道具
|
||||
|
||||
for (var i=0;i<tools.length;i++) {
|
||||
var tool=tools[i];
|
||||
for (var i=0;i<12;i++) {
|
||||
var tool=tools[12*(page-1)+i];
|
||||
if (!core.isset(tool)) break;
|
||||
var icon=core.material.icons.items[tool];
|
||||
if (i<6) {
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*i+1)+5, 144+5, 32, 32)
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*i+1)+5, 144+5-ydelta, 32, 32)
|
||||
// 个数
|
||||
core.fillText('ui', core.itemCount(tool), 16*(4*i+1)+40, 144+38, '#FFFFFF', "bold 14px Verdana");
|
||||
core.fillText('ui', core.itemCount(tool), 16*(4*i+1)+40, 144+38-ydelta, '#FFFFFF', "bold 14px Verdana");
|
||||
if (selectId == tool)
|
||||
core.strokeRect('ui', 16*(4*i+1)+1, 144+1, 40, 40, '#FFD700');
|
||||
core.strokeRect('ui', 16*(4*i+1)+1, 144+1-ydelta, 40, 40, '#FFD700');
|
||||
}
|
||||
else {
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*(i-6)+1)+5, 144+64+5, 32, 32)
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*(i-6)+1)+5, 144+64+5-ydelta, 32, 32)
|
||||
// 个数
|
||||
core.fillText('ui', core.itemCount(tool), 16*(4*(i-6)+1)+40, 144+64+38, '#FFFFFF', "bold 14px Verdana");
|
||||
core.fillText('ui', core.itemCount(tool), 16*(4*(i-6)+1)+40, 144+64+38-ydelta, '#FFFFFF', "bold 14px Verdana");
|
||||
if (selectId == tool)
|
||||
core.strokeRect('ui', 16*(4*(i-6)+1)+1, 144+64+1, 40, 40, '#FFD700');
|
||||
core.strokeRect('ui', 16*(4*(i-6)+1)+1, 144+64+1-ydelta, 40, 40, '#FFD700');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 永久道具
|
||||
|
||||
for (var i=0;i<constants.length;i++) {
|
||||
var constant=constants[i];
|
||||
for (var i=0;i<12;i++) {
|
||||
var constant=constants[12*(page-1)+i];
|
||||
if (!core.isset(constant)) break;
|
||||
var icon=core.material.icons.items[constant];
|
||||
if (i<6) {
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*i+1)+5, 304+5, 32, 32)
|
||||
// core.fillText('ui', core.itemCount(constant), 16*(4*i+1)+40, 304+38, '#FFFFFF', "bold 16px Verdana")
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*i+1)+5, 304+5-ydelta, 32, 32)
|
||||
|
||||
if (selectId == constant)
|
||||
core.strokeRect('ui', 16*(4*i+1)+1, 304+1, 40, 40, '#FFD700');
|
||||
core.strokeRect('ui', 16*(4*i+1)+1, 304+1-ydelta, 40, 40, '#FFD700');
|
||||
}
|
||||
else {
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*(i-6)+1)+5, 304+64+5, 32, 32)
|
||||
core.canvas.ui.drawImage(images, 0, icon*32, 32, 32, 16*(4*(i-6)+1)+5, 304+64+5-ydelta, 32, 32)
|
||||
if (selectId == constant)
|
||||
core.strokeRect('ui', 16*(4*(i-6)+1)+1, 304+64+1, 40, 40, '#FFD700');
|
||||
core.strokeRect('ui', 16*(4*(i-6)+1)+1, 304+64+1-ydelta, 40, 40, '#FFD700');
|
||||
}
|
||||
}
|
||||
|
||||
// 退出
|
||||
this.drawPagination(page, totalPage);
|
||||
core.canvas.ui.textAlign = 'center';
|
||||
core.fillText('ui', '删除道具', 370, 32,'#DDDDDD', 'bold 15px Verdana');
|
||||
// core.fillText('ui', '删除道具', 370, 32,'#DDDDDD', 'bold 15px Verdana');
|
||||
core.fillText('ui', '返回游戏', 370, 403,'#DDDDDD', 'bold 15px Verdana');
|
||||
}
|
||||
|
||||
@ -1941,6 +1955,7 @@ ui.prototype.drawHelp = function () {
|
||||
"点状态栏中图标: 进行对应的操作\n"+
|
||||
"点任意块: 寻路并移动\n"+
|
||||
"点任意块并拖动: 指定寻路路线\n"+
|
||||
"双击空地: 瞬间移动\n"+
|
||||
"单击勇士: 转向\n"+
|
||||
"双击勇士: 轻按(仅在轻按开关打开时有效)\n"+
|
||||
"长按任意位置:跳过剧情对话或打开虚拟键盘\n"
|
||||
|
||||
@ -76,7 +76,7 @@ utils.prototype.unshift = function (a,b) {
|
||||
////// 设置本地存储 //////
|
||||
utils.prototype.setLocalStorage = function(key, value) {
|
||||
try {
|
||||
localStorage.setItem(core.firstData.name + "_" + key, JSON.stringify(value));
|
||||
localStorage.setItem(core.firstData.name + "_" + key, LZString.compress(JSON.stringify(value)));
|
||||
return true;
|
||||
}
|
||||
catch (e) {
|
||||
@ -87,9 +87,24 @@ utils.prototype.setLocalStorage = function(key, value) {
|
||||
|
||||
////// 获得本地存储 //////
|
||||
utils.prototype.getLocalStorage = function(key, defaultValue) {
|
||||
var value = localStorage.getItem(core.firstData.name+"_"+key);
|
||||
if (core.isset(value)) return JSON.parse(value);
|
||||
return defaultValue;
|
||||
try {
|
||||
var value = localStorage.getItem(core.firstData.name+"_"+key);
|
||||
if (core.isset(value)) {
|
||||
var output = LZString.decompress(value);
|
||||
if (core.isset(output) && output.length>0) {
|
||||
try {
|
||||
return JSON.parse(output);
|
||||
}
|
||||
catch (ee) {}
|
||||
}
|
||||
return JSON.parse(value);
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
catch (e) {
|
||||
console.log(e);
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
////// 移除本地存储 //////
|
||||
|
||||
4
main.js
4
main.js
@ -2,7 +2,7 @@ function main() {
|
||||
|
||||
//------------------------ 用户修改内容 ------------------------//
|
||||
|
||||
this.version = "2.3"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。
|
||||
this.version = "2.3.1"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。
|
||||
|
||||
this.useCompress = false; // 是否使用压缩文件
|
||||
// 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。
|
||||
@ -14,7 +14,7 @@ function main() {
|
||||
|
||||
this.isCompetition = false; // 是否是比赛模式
|
||||
|
||||
this.savePages = 30; // 存档页数,每页可存5个;默认为30页150个存档
|
||||
this.savePages = 100; // 存档页数,每页可存5个;默认为100页500个存档
|
||||
|
||||
//------------------------ 用户修改内容 END ------------------------//
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
||||
"firstData" : {
|
||||
"title": "魔塔样板",
|
||||
"name": "template",
|
||||
"version": "Ver 2.3",
|
||||
"version": "Ver 2.3.1",
|
||||
"floorId": "sample0",
|
||||
"hero": {
|
||||
"name": "阳光",
|
||||
@ -148,7 +148,6 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
||||
"snowFourDirections": false,
|
||||
"bigKeyIsBox": false,
|
||||
"equipment": false,
|
||||
"enableDeleteItem": true,
|
||||
"enableAddPoint": false,
|
||||
"enableNegativeDamage": false,
|
||||
"hatredDecrease": true,
|
||||
|
||||
17
更新说明.txt
17
更新说明.txt
@ -1,4 +1,19 @@
|
||||
HTML5魔塔样板V2.3
|
||||
HTML5魔塔样板V2.3.1
|
||||
|
||||
存档采用高比率压缩,单个大小是原来的1/10!
|
||||
默认存档数改成100页500个
|
||||
base64上传成绩,杜绝乱码
|
||||
道具栏翻页
|
||||
单击瞬移(菜单栏中开关)
|
||||
重新补上E键打开光标
|
||||
楼层属性增添地下层选项,同层传送至上楼梯
|
||||
core.debug()穿墙模式不能穿出地图
|
||||
core.values和core.flags存入存档
|
||||
修复所有已知bug
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
HTML5魔塔样板V2.3
|
||||
|
||||
启动服务和便捷PS工具(Mac版)
|
||||
地图编辑器可以右键复制或移动图块
|
||||
|
||||
Loading…
Reference in New Issue
Block a user