mota-js/main.js
2018-02-27 14:12:21 +08:00

473 lines
17 KiB
JavaScript
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.

function main() {
//------------------------ 用户修改内容 ------------------------//
this.version = "1.4.1"; // 游戏版本号如果更改了游戏内容建议修改此version以免造成缓存问题。
this.useCompress = false; // 是否使用压缩文件
// 当你即将发布你的塔时请使用“JS代码压缩工具”将所有js代码进行压缩然后将这里的useCompress改为true。
// 请注意只有useCompress是false时才会读取floors目录下的文件为true时会直接读取libs目录下的floors.min.js文件。
// 如果要进行剧本的修改请务必将其改成false。
this.floorIds = [ // 在这里按顺序放所有的楼层;其顺序直接影响到楼层传送器的顺序和上楼器/下楼器的顺序
"sample0", "sample1", "sample2"
];
this.pngs = [ // 在此存放所有可能使用的图片只能是png格式可以不写后缀名
// 图片可以被作为背景图(的一部分),也可以直接用自定义事件进行显示。
// 图片名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
// 建议对于较大的图片,在网上使用在线的“图片压缩工具(http://compresspng.com/zh/)”来进行压缩,以节省流量
"bg", // 依次向后添加
];
this.animates = [ // 在此存放所有可能使用的动画必须是animate格式在这里不写后缀名
// 动画必须放在animates目录下文件名不能使用中文不能带空格或特殊字符
"hand", "sword", "zone", "yongchang", // "jianji", "thunder" // 根据需求自行添加
];
this.bgms = [ // 在此存放所有的bgm和文件名一致。第一项为默认播放项
// 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
'bgm.mp3', 'qianjin.mid', 'star.mid',
];
this.sounds = [ // 在此存放所有的SE和文件名一致
// 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg', 'zone.ogg'
];
this.bgmRemote = false; // 是否使用远程的背景音乐;此项一般不要开启
//------------------------ 用户修改内容 END ------------------------//
this.dom = {
'body': document.body,
'gameGroup': document.getElementById('gameGroup'),
'mainTips': document.getElementById('mainTips'),
'musicBtn': document.getElementById('musicBtn'),
'startPanel': document.getElementById('startPanel'),
'startTop': document.getElementById('startTop'),
'startTopProgressBar': document.getElementById('startTopProgressBar'),
'startTopProgress': document.getElementById('startTopProgress'),
'startTopLoadTips': document.getElementById('startTopLoadTips'),
'startBackground': document.getElementById('startBackground'),
'startButtonGroup': document.getElementById('startButtonGroup'),
'floorMsgGroup': document.getElementById('floorMsgGroup'),
'logoLabel': document.getElementById('logoLabel'),
'versionLabel': document.getElementById('versionLabel'),
'floorNameLabel': document.getElementById('floorNameLabel'),
'statusBar': document.getElementById('statusBar'),
'status': document.getElementsByClassName('status'),
'toolBar': document.getElementById('toolBar'),
'tools': document.getElementsByClassName('tools'),
'gameCanvas': document.getElementsByClassName('gameCanvas'),
'curtain': document.getElementById('curtain'),
'startButtons': document.getElementById('startButtons'),
'playGame': document.getElementById('playGame'),
'loadGame': document.getElementById('loadGame'),
'replayGame': document.getElementById('replayGame'),
'levelChooseButtons': document.getElementById('levelChooseButtons'),
'easyLevel': document.getElementById('easyLevel'),
'normalLevel': document.getElementById('normalLevel'),
'hardLevel': document.getElementById('hardLevel'),
'data': document.getElementById('data'),
'statusLabels': document.getElementsByClassName('statusLabel'),
'floorCol': document.getElementById('floorCol'),
'lvCol': document.getElementById('lvCol'),
'mdefCol': document.getElementById('mdefCol'),
'moneyCol': document.getElementById('moneyCol'),
'expCol': document.getElementById('expCol'),
'upCol': document.getElementById('upCol'),
'debuffCol': document.getElementById('debuffCol'),
'hard': document.getElementById('hard'),
};
this.loadList = [
'items', 'icons', 'maps', 'enemys', 'events', 'data', 'ui', 'core'
];
this.images = [
'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains'
];
this.statusBar = {
'image': {
'floor': document.getElementById('img-floor'),
'lv': document.getElementById('img-lv'),
'hp': document.getElementById("img-hp"),
'atk': document.getElementById("img-atk"),
'def': document.getElementById("img-def"),
'mdef': document.getElementById("img-mdef"),
'money': document.getElementById("img-money"),
'experience': document.getElementById("img-experience"),
'up': document.getElementById("img-up"),
'book': document.getElementById("img-book"),
'fly': document.getElementById("img-fly"),
'toolbox': document.getElementById("img-toolbox"),
'shop': document.getElementById("img-shop"),
'save': document.getElementById("img-save"),
'load': document.getElementById("img-load"),
'settings': document.getElementById("img-settings")
},
'icons': {
'book': null,
'fly': null,
'toolbox': null,
'save': null,
'load': null,
'settings': null,
'rewind': null, // 减速
'forward': null, // 加速
'play': null, // 播放
'pause': null, // 暂停
'stop': null, // 停止
},
'floor': document.getElementById('floor'),
'lv': document.getElementById('lv'),
'hp': document.getElementById('hp'),
'atk': document.getElementById('atk'),
'def': document.getElementById("def"),
'mdef': document.getElementById('mdef'),
'money': document.getElementById("money"),
'experience': document.getElementById("experience"),
'up': document.getElementById('up'),
'yellowKey': document.getElementById("yellowKey"),
'blueKey': document.getElementById("blueKey"),
'redKey': document.getElementById("redKey"),
'poison': document.getElementById('poison'),
'weak':document.getElementById('weak'),
'curse': document.getElementById('curse'),
'hard': document.getElementById("hard")
}
this.floors = {}
this.instance = {};
this.canvas = {};
}
////// 初始化 //////
main.prototype.init = function () {
for (var i = 0; i < main.dom.gameCanvas.length; i++) {
main.canvas[main.dom.gameCanvas[i].id] = main.dom.gameCanvas[i].getContext('2d');
}
Object.keys(this.statusBar.icons).forEach(function (t) {
var image=new Image();
image.src="images/"+t+".png";
main.statusBar.icons[t] = image;
})
main.loaderJs(function () {
var coreData = {};
for (i = 0; i < main.loadList.length; i++) {
var name = main.loadList[i];
if (name === 'core') continue;
main[name].init(main.dom);
coreData[name] = main[name];
}
main.loaderFloors(function() {
["dom", "statusBar", "canvas", "images", "pngs",
"animates", "bgms", "sounds", "floorIds", "floors"].forEach(function (t) {
coreData[t] = main[t];
})
main.core.init(coreData);
main.core.resize(main.dom.body.clientWidth, main.dom.body.clientHeight);
})
});
}
////// 动态加载所有核心JS文件 //////
main.prototype.loaderJs = function (callback) {
var instanceNum = 0;
// 加载js
main.setMainTipsText('正在加载核心js文件...')
for (var i = 0; i < main.loadList.length; i++) {
main.loadMod(main.loadList[i], function (modName) {
instanceNum = 0;
main.setMainTipsText(modName + '.js 加载完毕');
for (var key in main.instance) {
instanceNum++;
}
if (instanceNum === main.loadList.length) {
delete main.instance;
// main.dom.mainTips.style.display = 'none';
callback();
}
});
}
}
////// 动态加载所有楼层(剧本) //////
main.prototype.loaderFloors = function (callback) {
// 加载js
main.setMainTipsText('正在加载楼层文件...')
if (this.useCompress) { // 读取压缩文件
var script = document.createElement('script');
script.src = 'libs/floors.min.js?v=' + this.version;
main.dom.body.appendChild(script);
script.onload = function () {
main.dom.mainTips.style.display = 'none';
callback();
}
}
else {
for (var i = 0; i < main.floorIds.length; i++) {
main.loadFloor(main.floorIds[i], function (modName) {
main.setMainTipsText("楼层 " + modName + '.js 加载完毕');
if (Object.keys(main.floors).length === main.floorIds.length) {
main.dom.mainTips.style.display = 'none';
callback();
}
});
}
}
}
////// 加载某一个JS文件 //////
main.prototype.loadMod = function (modName, callback) {
var script = document.createElement('script');
var name = modName;
script.src = 'libs/' + modName + (this.useCompress?".min":"") + '.js?v=' + this.version;
main.dom.body.appendChild(script);
script.onload = function () {
main[name] = main.instance[name];
callback(name);
}
}
////// 加载某一个楼层 //////
main.prototype.loadFloor = function(floorId, callback) {
var script = document.createElement('script');
script.src = 'libs/floors/' + floorId +'.js?v=' + this.version;
main.dom.body.appendChild(script);
script.onload = function () {
callback(floorId);
}
}
////// 加载过程提示 //////
main.prototype.setMainTipsText = function (text) {
main.dom.mainTips.innerHTML = text;
}
var main = new main();
main.init();
////// 窗口大小变化时 //////
window.onresize = function () {
try {
main.core.resize(main.dom.body.clientWidth, main.dom.body.clientHeight);
}catch (e) {}
}
////// 在界面上按下某按键时 //////
main.dom.body.onkeydown = function(e) {
try {
if (main.core.isPlaying() || main.core.status.lockControl)
main.core.onkeyDown(e);
} catch (ee) {}
}
////// 在界面上放开某按键时 //////
main.dom.body.onkeyup = function(e) {
try {
if (main.core.isPlaying() || main.core.status.lockControl)
main.core.onkeyUp(e);
} catch (ee) {}
}
////// 开始选择时 //////
main.dom.body.onselectstart = function () {
return false;
}
////// 鼠标按下时 //////
main.dom.data.onmousedown = function (e) {
try {
e.stopPropagation();
if(e.button==1){// 把鼠标中键绑定为ESC
core.keyUp(27);
return;
}
var loc = main.core.getClickLoc(e.clientX, e.clientY);
if (loc == null) return;
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
main.core.ondown(x, y);
} catch (ee) {}
}
////// 鼠标移动时 //////
main.dom.data.onmousemove = function (e) {
try {
e.stopPropagation();
var loc = main.core.getClickLoc(e.clientX, e.clientY);
if (loc == null) return;
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
main.core.onmove(x, y);
}catch (ee) {}
}
////// 鼠标放开时 //////
main.dom.data.onmouseup = function () {
try {
main.core.onup();
}catch (e) {}
}
////// 鼠标滑轮滚动时 //////
main.dom.data.onmousewheel = function(e) {
try {
if (e.wheelDelta)
main.core.onmousewheel(Math.sign(e.wheelDelta))
else if (e.detail)
main.core.onmousewheel(Math.sign(e.detail));
} catch (ee) {}
}
////// 手指在触摸屏开始触摸时 //////
main.dom.data.ontouchstart = function (e) {
try {
e.preventDefault();
var loc = main.core.getClickLoc(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
if (loc == null) return;
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
//main.core.onclick(x, y, []);
main.core.ondown(x, y);
}catch (ee) {}
}
////// 手指在触摸屏上移动时 //////
main.dom.data.ontouchmove = function (e) {
try {
e.preventDefault();
var loc = main.core.getClickLoc(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
if (loc == null) return;
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
main.core.onmove(x, y);
}catch (ee) {}
}
////// 手指离开触摸屏时 //////
main.dom.data.ontouchend = function () {
try {
main.core.onup();
} catch (e) {
}
}
////// 点击状态栏中的怪物手册时 //////
main.statusBar.image.book.onclick = function () {
if (core.isset(core.status.replay) && core.status.replay.replaying) {
core.triggerReplay();
return;
}
if (main.core.isPlaying())
main.core.openBook(true);
}
////// 点击状态栏中的楼层传送器时 //////
main.statusBar.image.fly.onclick = function () {
if (core.isset(core.status.replay) && core.status.replay.replaying) {
core.stopReplay();
return;
}
if (main.core.isPlaying())
main.core.useFly(true);
}
////// 点击状态栏中的工具箱时 //////
main.statusBar.image.toolbox.onclick = function () {
if (main.core.isPlaying())
main.core.openToolbox(true);
}
////// 点击状态栏中的快捷商店时 //////
main.statusBar.image.shop.onclick = function () {
if (main.core.isPlaying())
main.core.openQuickShop(true);
}
////// 点击状态栏中的存档按钮时 //////
main.statusBar.image.save.onclick = function () {
if (core.isset(core.status.replay) && core.status.replay.replaying) {
core.rewindReplay();
return;
}
if (main.core.isPlaying())
main.core.save(true);
}
////// 点击状态栏中的读档按钮时 //////
main.statusBar.image.load.onclick = function () {
if (core.isset(core.status.replay) && core.status.replay.replaying) {
core.forwardReplay();
return;
}
if (main.core.isPlaying())
main.core.load(true);
}
////// 点击状态栏中的系统菜单时 //////
main.statusBar.image.settings.onclick = function () {
if (main.core.isPlaying())
main.core.openSettings(true);
}
////// 点击“开始游戏”时 //////
main.dom.playGame.onclick = function () {
main.dom.startButtons.style.display='none';
if (main.core.isset(main.core.flags.startDirectly) && main.core.flags.startDirectly) {
core.events.startGame("");
}
else {
main.dom.levelChooseButtons.style.display='block';
}
}
////// 点击“载入游戏”时 //////
main.dom.loadGame.onclick = function() {
main.core.load();
}
////// 点击“录像回放”时 //////
main.dom.replayGame.onclick = function () {
core.readFile(function (obj) {
if (obj.name!=core.firstData.name) {
alert("存档和游戏不一致!");
return;
}
if (core.isset(obj.version) && obj.version!=core.firstData.version) {
alert("游戏版本不一致!");
return;
}
if (!core.isset(obj.route) || !core.isset(obj.hard)) {
alert("无效的录像!");
return;
}
core.dom.startPanel.style.display = 'none';
core.resetStatus(core.firstData.hero, obj.hard, core.firstData.floorId, null, core.initStatus.maps);
core.events.setInitData(obj.hard);
core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() {
//core.setHeroMoveTriggerInterval();
core.startReplay(core.decodeRoute(obj.route));
});
}, function () {
})
}
////// 点击“简单难度”时 //////
main.dom.easyLevel.onclick = function() {
core.events.startGame('Easy');
}
////// 点击“普通难度”时 //////
main.dom.normalLevel.onclick = function () {
core.events.startGame('Normal');
}
////// 点击“困难难度”时 //////
main.dom.hardLevel.onclick = function () {
core.events.startGame('Hard');
}