Model.prototype.toNextState = function(n) { var matchModel = require('pnd.model.match'), figureModel = require('pnd.model.figure'), self = this.toNextState.bind(this), n = n || 0; // 处理消除阶段 var data = this.getSimpleData(), matchedData = matchModel.match(data), clearedOrbs = this.getFullData(matchedData); this.updateData({ method: 'clear', indexes: matchedData.reduce(function(previous, current) { return previous.concat(current); }, []) }); // 处理掉落阶段 var emptyArr = this.getSimpleData().reduce(function(previous, current, index){ if (current == -1) { previous.push(index); }; return previous; }, []); var fallingArr = figureModel.getFallingProgress(emptyArr); this.updateData({ method: 'move', startIndexes: fallingArr[0], endIndexes: fallingArr[1] }); // 处理天降阶段 var skyfallOrbs = []; if (this.hasSkyfall) { skyfallOrbs = this.getRandomOrbsByRates(emptyArr.length); this.updateData({ method: 'set', indexes: fallingArr[3], data: skyfallOrbs }); } // 触发事件 var stat = { clearedOrbs: clearedOrbs, empty: emptyArr, startIndexes: fallingArr[0], endIndexes: fallingArr[1], skyfallStartIndexes: fallingArr[2].map(function(item) {return item - this.amount}, this), skyfallEndIndexes: fallingArr[3], skyfallOrbs: skyfallOrbs } if (emptyArr.length == 0) { this.observer.trigger('board.changeFinish'); } else { n += 1; this.observer.trigger('board.statChange', stat); if (n < 100) { setTimeout(function(){self(n)}, 0); } } }
Model.prototype.dropOrbs = function() { var figureModel = require('pnd.model.figure'), data = this.getSimpleData(), emptyArr = [], movedOrbs = { start: [], end: [], skyfall: [] }; // 获得版面上的空位, 若空位为0则返回 data.forEach(function(item, index) { if (item == -1) emptyArr.push(index); }); if (emptyArr.length === 0) {return movedOrbs;} // 获得空位的补集的掉落 var originStartArr = figureModel.getComplementOf(emptyArr), originEndArr = figureModel.getDropOf(originStartArr), temp = figureModel.removeRepeated([originStartArr, originEndArr]), skyfallStartArr = [], skyfallEndArr = [], skyfallArr = [], newDataArr = this.dataArr.concat(); // 消去重复珠后即为原来面板上需要移动的珠子始终位置 originStartArr = temp[0]; originEndArr = temp[1]; // 如果有天降, 获得天降珠子的始终位置, 和天降珠子类型数据 if (this.hasSkyfall) { skyfallArr = this.getRandomOrbsByRates(emptyArr.length); // 天降形状的始终位置其实就是空缺形状的上下掉落 // 天降的起始位置是屏幕外, 每个减去总数目才是真实坐标 // TODO: 30 skyfallStartArr = figureModel.getDropOf(emptyArr).map(function(i){return i - 30}); skyfallEndArr = figureModel.getReverseDropOf(emptyArr); } // 获得最终变动了的珠子始终位置 movedStartArr = originStartArr.concat(skyfallStartArr); movedEndArr = originEndArr.concat(skyfallEndArr); movedOrbs = { start: movedStartArr, end: movedEndArr, skyfall: skyfallArr, skyfallStart: skyfallStartArr, empty: emptyArr }; // 更新本地数据 originEndArr.forEach(function(item, index) { newDataArr[item] = this.dataArr[originStartArr[index]]; }, this) skyfallEndArr.forEach(function(item, index) { newDataArr[item] = skyfallArr[index]; }) this.dataArr = newDataArr.map(function(item, index){ return [index, item[1], item[2]] }) // 通知事件发生 this.observer.trigger('orbsDrop', movedOrbs); return movedOrbs; }