function events() { } events.prototype.init = function () { this.events = { 'battle': function (data, core, callback) { core.battle(data.event.id, data.x, data.y); if (core.isset(callback)) callback(); }, 'changeFloor': function (data, core, callback) { // core.changeFloor(data.event.data.floorId, data.event.data.heroLoc); var heroLoc = null; if (core.isset(data.event.data.loc)) { heroLoc = {'x': data.event.data.loc[0], 'y': data.event.data.loc[1]}; } core.changeFloor(data.event.data.floorId, data.event.data.stair, heroLoc, callback); }, 'getItem': function (data, core, callback) { core.getItem(data.event.id, 1, data.x, data.y); if (core.isset(callback)) callback(); }, 'openDoor': function (data, core, callback) { core.openDoor(data.event.id, data.x, data.y, true); if (core.isset(callback)) callback(); }, 'visitNpc': function (data, core, callback) { core.visitNpc(data.event.npcid, data.x, data.y); if (core.isset(callback)) 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)) callback(); }, "checkBlock": function (data, core, callback) { core.events.checkBlock(data.x, data.y); }, 'action': function (data, core, callback) { core.events.doEvents(data.event.data, data.x, data.y); if (core.isset(callback)) callback(); } } } // 初始化 events.prototype.getEvents = function (eventName) { if (eventName == undefined) { return this.events; } return this.events[eventName]; } main.instance.events = new events(); ////// 游戏开始事件 ////// events.prototype.startGame = function (hard) { core.hideStartAnimate(function() { core.drawText(core.firstData.startText, function() { core.startGame(hard); }); }) } ////// 走到某位置时触发事件 ////// events.prototype.blockEvent = function (data) { } ////// 检查领域、夹击事件 ////// events.prototype.checkBlock = function (x,y) { var damage = 0; // 获得四个方向的怪物 var directions = [[0,-1],[-1,0],[0,1],[1,0]]; // 上,左,下,右 var enemys = [null,null,null,null]; for (var i in directions) { var block = core.getBlock(x+directions[i][0], y+directions[i][1]); if (block==null) continue; // 是怪物 if (block.block.event.cls=='enemys') enemys[i]=core.material.enemys[block.block.event.id]; } // 领域 for (var i in enemys) { if (enemys[i]!=null && enemys[i].special==15) { damage+=enemys[i].value; } } if (damage>0) core.drawTip('受到领域伤害'+damage+'点'); core.status.hero.hp-=damage; if (core.status.hero.hp<=0) { core.status.hero.hp=0; core.updateStatusBar(); core.events.lose('zone'); return; } // 夹击 var has=false; if (enemys[0]!=null && enemys[2]!=null && enemys[0].id==enemys[2].id && enemys[0].special==16) has=true; if (enemys[1]!=null && enemys[3]!=null && enemys[1].id==enemys[3].id && enemys[1].special==16) has=true; if (has && core.status.hero.hp>1) { // 1血夹击不死 core.status.hero.hp = parseInt(core.status.hero.hp/2); core.drawTip('受到夹击,生命变成一半'); } core.updateStatusBar(); } ////// 转换楼层结束的事件 ////// events.prototype.afterChangeFloor = function (floorId) { if (!core.hasFlag("visited_"+floorId)) { this.doEvents(core.status.thisMap.firstArrive); core.setFlag("visited_"+floorId, true); } } ////// 实际事件的处理 ////// events.prototype.doEvents = function (list, x, y, callback) { // 停止勇士 core.waitHeroToStop(function() { if (!core.isset(list)) return; if (!(list instanceof Array)) { list = [list]; } core.lockControl(); core.status.event = {'id': 'action', 'data': { 'list': list, 'x': x, 'y': y, 'callback': callback }} core.events.doAction(); }); } events.prototype.doAction = function() { // 事件处理完毕 if (core.status.event.data.list.length==0) { if (core.isset(core.status.event.data.callback)) core.status.event.data.callback(); core.ui.closePanel(false); return; } var data = core.status.event.data.list.shift(); core.status.event.data.current = data; var x=core.status.event.data.x, y=core.status.event.data.y; // 不同种类的事件 // 如果是文字:显示 if (typeof data == "string") { core.status.event.data.type='text'; core.ui.drawTextBox(data); return; } core.status.event.data.type=data.type; switch (data.type) { case "text": // 文字/对话 core.ui.drawTextBox(data.data); break; case "disappear": // 消失 core.removeBlock('event', x, y); this.doAction(); break; case "sleep": // 等待多少毫秒 setTimeout(function () { core.events.doAction(); }, data.data); break; case "exit": // 立刻结束事件 core.status.event.data.list = []; core.events.doAction(); break; default: core.status.event.data.type='text'; core.ui.drawTextBox("\t[警告,]出错啦!\n"+data.type+" 事件不被支持..."); } return; } ////// 降低难度 ////// events.prototype.decreaseHard = function() { if (core.status.hard == 0) { core.drawTip("当前已是难度0,不能再降低难度了"); return; } var add = 100, x=core.status.hard; while (x<10) { x++; add*=2; } core.ui.drawConfirmBox("本次操作可生命+" + add + ",确定吗?", function () { core.status.hero.hp += add; core.status.hard--; core.updateStatusBar(); core.ui.closePanel(); core.drawTip("降低难度成功,生命+" + add); }, function () { core.ui.drawSettings(false); }); } ////// 能否使用快捷商店 ////// events.prototype.canUseQuickShop = function(index) { if (core.status.floorId == 'MT20') return '当前不能使用快捷商店。'; return null; } ////// 尝试使用道具 ////// events.prototype.useItem = function(itemId) { core.ui.closePanel(false); if (itemId=='book') { core.openBook(false); return; } if (itemId=='fly') { core.useFly(false); return; } if (core.canUseItem(itemId)) core.useItem(itemId); else core.drawTip("当前无法使用"+core.material.items[itemId].name); } /****** 打完怪物 ******/ events.prototype.afterBattle = function(enemyId,x,y,callback) { // 毒衰咒的处理 var special = core.material.enemys[enemyId].special; // 中毒 if (special==12 && !core.hasFlag('poison')) { core.setFlag('poison', true); core.updateStatusBar(); } // 衰弱 if (special==13 && !core.hasFlag('weak')) { core.setFlag('weak', true); core.status.hero.atk-=core.values.weakValue; core.status.hero.def-=core.values.weakValue; core.updateStatusBar(); } // 诅咒 if (special==14 && !core.hasFlag('curse')) { core.setFlag('curse', true); core.updateStatusBar(); } // 检查处理后的事件。 var event = core.floors[core.status.floorId].afterBattle[x+","+y]; if (core.isset(event)) { core.events.doEvents(event, x, y, callback); } //继续行走 else { core.continueAutomaticRoute(); if (core.isset(callback)) callback(); } } /****** 开完门 ******/ events.prototype.afterOpenDoor = function(doorId,x,y,callback) { // 检查处理后的事件。 var event = core.floors[core.status.floorId].afterOpenDoor[x+","+y]; if (core.isset(event)) { core.events.doEvents(event, x, y, callback); } //继续行走 else { core.continueAutomaticRoute(); if (core.isset(callback)) callback(); } } /****** 经过路障 ******/ events.prototype.passNet = function (data) { // 有鞋子 if (core.hasItem('shoes')) return; if (data.event.id=='lavaNet') { core.status.hero.hp -= core.values.lavaDamage; if (core.status.hero.hp<=0) { core.status.hero.hp=0; core.updateStatusBar(); core.events.lose('lava'); return; } core.updateStatusBar(); core.drawTip('经过血网,生命-'+core.values.lavaDamage); } if (data.event.id=='poisonNet') { if (core.hasFlag('poison')) return; core.setFlag('poison', true); core.updateStatusBar(); } if (data.event.id=='weakNet') { if (core.hasFlag('weak')) return; core.setFlag('weak', true); core.status.hero.atk-=core.values.weakValue; core.status.hero.def-=core.values.weakValue; core.updateStatusBar(); } if (data.event.id=='curseNet') { if (core.hasFlag('curse')) return; core.setFlag('curse', true); core.updateStatusBar(); } } // NPC自定义操作 events.prototype.npcCustomAction = function (npcData) { } // 当点击(x,y)位置后自定义操作 events.prototype.npcCustomActionOnClick = function (npcData, x, y) { } // NPC自定义事件处理 events.prototype.npcCustomEffect = function (effect, npc) { } // 存档事件前一刻的处理 events.prototype.beforeSaveData = function(data) { } // 读档事件后,载入事件前,对数据的处理 events.prototype.afterLoadData = function(data) { } events.prototype.win = function(reason) { // 获胜 core.waitHeroToStop(function() { core.clearMap('all'); core.rmGlobalAnimate(0,0,true); core.drawText([ "\t[结局3]恭喜通关!" ], function () { core.restart(); }) }); } events.prototype.lose = function(reason) { // 失败 core.waitHeroToStop(function() { core.drawText('\t[结局1]你死了。', function () { core.restart(); }); }) } /******************************************/ /*********** 界面上的点击事件 ***************/ /******************************************/ // 正在处理事件时的点击操作... events.prototype.clickAction = function (x,y) { if (core.status.event.data.type=='text') { // 文字 this.doAction(); return; } } // 怪物手册 events.prototype.clickBook = function(x,y) { // 上一页 if ((x == 3 || x == 4) && y == 12) { core.ui.drawEnemyBook(core.status.event.data - 1); } // 下一页 if ((x == 8 || x == 9) && y == 12) { core.ui.drawEnemyBook(core.status.event.data + 1); } // 返回 if (x>=10 && x<=12 && y==12) { core.ui.closePanel(true); } return; } // 飞行器 events.prototype.clickFly = function(x,y) { if ((x==10 || x==11) && y==9) core.ui.drawFly(core.status.event.data-1); if ((x==10 || x==11) && y==5) core.ui.drawFly(core.status.event.data+1); if (x>=5 && x<=7 && y==12) core.ui.closePanel(); 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= 5 && x <= 7) { if (y >= 5 && y <= 8) { if (y >= 5 + core.status.event.data.choices.length) return; var money = core.getStatus('money'), experience = core.getStatus('experience'); var shop = core.status.event.data; var times = shop.times, need = eval(shop.need); var use = shop.use; var use_text = use=='money'?"金币":"经验"; var choice = shop.choices[y-5]; if (core.isset(choice.need)) need = eval(choice.need); if (need > eval(use)) { core.drawTip("你的"+use_text+"不足"); return; } eval(use+'-='+need); core.setStatus('money', money); core.setStatus('experience', experience); core.updateStatusBar(); core.npcEffect(choice.effect); core.status.event.data.times++; core.ui.openShop(core.status.event.data.id); return; } // 退出商店 if (y == 9) { core.status.event.data = null; core.ui.closePanel(); return; } } } // 快捷商店 events.prototype.clickSelectShop = 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); var exitIndex = 6 + parseInt((keys.length + 1) / 2); if (y >= topIndex && y - topIndex < keys.length) { var reason = core.events.canUseQuickShop(y-topIndex); if (core.isset(reason)) { core.drawText(reason); return; } var shop=shopList[keys[y - topIndex]]; if (!shop.visited) { if (shop.times==0) core.drawTip('该商店尚未开启'); else core.drawTip('该商店已失效'); return; } core.ui.drawShop(keys[y - topIndex]); } if (y == exitIndex) { core.ui.closePanel(); } } } // 工具栏 events.prototype.clickToolbox = function(x,y) { // 返回 if (x>=10 && x<=12 && y==12) { core.ui.closePanel(false); return; } var items = null; if (y>=4 && y<=7 && x!=12) items = Object.keys(core.status.hero.items.tools).sort(); if (y>=9 && y<=12 && x!=12) items = Object.keys(core.status.hero.items.constants).sort(); if (items==null) return; var index=0; if (y==4||y==5||y==9||y==10) index=parseInt(x/2); else index=6+parseInt(x/2); if (index>=items.length) return; itemId=items[index]; if (itemId==core.status.event.data) { core.events.useItem(itemId); } else { core.ui.drawToolbox(itemId); } } // 存读档 events.prototype.clickSL = function(x,y) { // 上一页 if ((x == 3 || x == 4) && y == 12) { core.ui.drawSLPanel(core.status.event.data - 1); } // 下一页 if ((x == 8 || x == 9) && y == 12) { core.ui.drawSLPanel(core.status.event.data + 1); } // 返回 if (x>=10 && x<=12 && y==12) { core.ui.closePanel(false); if (!core.isPlaying()) { core.showStartAnimate(); } return; } var index=6*core.status.event.data+1; if (y>=1 && y<=4) { if (x>=1 && x<=3) core.doSL(index, core.status.event.id); if (x>=5 && x<=7) core.doSL(index+1, core.status.event.id); if (x>=9 && x<=11) core.doSL(index+2, core.status.event.id); } if (y>=7 && y<=10) { if (x>=1 && x<=3) core.doSL(index+3, core.status.event.id); if (x>=5 && x<=7) core.doSL(index+4, core.status.event.id); if (x>=9 && x<=11) core.doSL(index+5, core.status.event.id); } } // 菜单栏 events.prototype.clickSettings = function (x,y) { if (x<5 || x>7) return; if (y == 3) { if (core.musicStatus.isIOS) { core.drawTip("iOS设备不支持播放音乐"); return; } core.changeSoundStatus(); core.ui.drawSettings(false); } if (y == 4) core.ui.drawSelectShop(); if (y == 5) this.decreaseHard(); if (y == 6) { core.ui.drawSyncSave(); } if (y == 7) { core.ui.drawConfirmBox("你确定要重新开始吗?", function () { core.ui.closePanel(); core.restart(); }, function () { core.ui.drawSettings(false); }); } if (y==8) { core.ui.drawAbout(); // core.debug(); } if (y == 9) core.ui.closePanel(); return; } events.prototype.clickNPC = function(x,y) { var data = core.status.event.data.current; if (core.isset(data)) { // 对话,任意位置继续 if (data.action == 'text') { core.npcAction(); return; } if (data.action == 'choices') { if (x >= 5 && x <= 7) { if (y >= 5 && y <= 8) { if (y >= 5 + data.choices.length) return; var choice = data.choices[y - 5]; if (core.isset(choice.need)) { var able = true; choice.need.split(';').forEach(function (e) { var ones = e.split(','); var type = ones[0], key = ones[1], value = ones[2]; if (type == 'status') { if (core.getStatus(key)