occaecatidicta
Version:
982 lines (923 loc) • 39 kB
JavaScript
/**
* 技能动作类
*/
var isNodeJS = 'undefined'!==typeof module;
//如果module没有定义,说明是客户端
if (isNodeJS){
_ = require('underscore');
}
var SkillAction = {};
SkillAction.AttrArr = ['','wuLi','tongShuai','zhiLi','zhengZhi'];
SkillAction.wLayer = null;
/// 计算技能伤害
SkillAction.calDamage = function(equiper, equipObject, target, skill, addParas){
var p = [];
for(var i=0;i<17;i++){
p[i] = 1;
}
p[0] = JueWei.getTroopsLimit(equiper.jueWei, equiper.shiLi);
p[1] = equipObject.shiQi;
p[2] = equipObject.getStatusAtkCoef(); //攻方状态值
switch(skill.attrType){
case SKILL_DEF.ATTR_TYPE_WULI:
p[3] = equiper.getWuLiZXL(); //攻方大将统率执行力
break;
case SKILL_DEF.ATTR_TYPE_TONGSHUAI:
p[3] = equiper.getTongShuaiZXL(); //攻方大将统率执行力
break;
case SKILL_DEF.ATTR_TYPE_ZHILI:
p[3] = equiper.getZhiLiZXL(); //攻方大将统率执行力
break;
case SKILL_DEF.ATTR_TYPE_ZHENGZHI:
p[3] = equiper.getZhengZhiZXL(); //攻方大将统率执行力
break;
}
if(target.wuJiang){
switch(skill.attrType){
case SKILL_DEF.ATTR_TYPE_WULI:
p[4] = target.wuJiang.daJiang.getWuLiZXL(); //对方大将统率执行力
break;
case SKILL_DEF.ATTR_TYPE_TONGSHUAI:
p[4] = target.wuJiang.daJiang.getTongShuaiZXL(); //对方大将统率执行力
break;
case SKILL_DEF.ATTR_TYPE_ZHILI:
p[4] = target.wuJiang.daJiang.getZhiLiZXL(); //对方大将统率执行力
break;
case SKILL_DEF.ATTR_TYPE_ZHENGZHI:
p[4] = target.wuJiang.daJiang.getZhengZhiZXL(); //对方大将统率执行力
break;
}
} else {
p[4] = target.getDJZXL(SkillAction.AttrArr[skill.attrType]);
}
p[5] = SkillAction.wLayer.techs[equipObject.force].getLineupEffect(equipObject._lineup.id); //攻击方阵型成长
p[6] = SkillAction.wLayer.techs[equipObject.force].getCastleEffect();
p[7] = target.shiQi;
p[8] = target.getStatusAtkCoef(); //守方状态值
p[9] = target.def;
p[10] = SkillAction.wLayer.techs[target.force].getLineupEffect(target._lineup.id);
p[11] = SkillAction.wLayer.techs[target.force].getCastleEffect();
if(target.type===MAP_DEF.TYPE_UNIT){
p[14] = 2;
} else {
p[12] = target.durable;
p[13] = target.getDurableMax();
p[14] = 1;
}
if(addParas['atkType']){
p[15] = addParas['atkType'];
} else {
p[15] = 0;
}
p[16] = skill.power;
return FOMULA.skillhurt(p);
};
/// 计算军师技能伤害
SkillAction.calAdviserDamage = function(equiper, equipObject, target, skill, addParas){
var p = [];
p[0] = equipObject;
p[1] = target;
p[2] = skill;
p[3] = equiper;
return FOMULA.junshiskillhurt(p);
};
/// 循环遍历范围内的cell cells为可选参数,如果传入则不调用scopeCells
SkillAction.scopeLoop = function(cx, cy, cs, cb, cells){
if(!cells){
cells = SkillAction.wLayer.map.scopeCellsByTileXY(cx, cy, cs, true);
}
var visitedObjs = [];
for(var i=0;i<cells.length;i++){
//_.log(i, cells[i].cx, cells[i].cy);
var objs = cells[i].objects;
if(objs){
for (var j = 0; j < objs.length; j++) {
var obj = objs[j];
//_.log(obj.name);
if(visitedObjs.indexOf(obj)===-1){
visitedObjs.push(obj);
var breakFlag = cb(obj);
if(breakFlag){
break;
}
}
}
}
}
};
SkillAction.initTileNodes = function(cx, cy, cs) {
var map = SkillAction.wLayer.map;
var node = new cc.Node();
var cells = map.scopeCellsByTileXY(cx, cy, cs, true);
var centerMapPos = map.tile2map(cx, cy);
node.x = centerMapPos[0];
node.y = centerMapPos[1];
SkillAction.wLayer._bgEffNode.addChild(node);
for (var i = 0; i < cells.length; i++) {
var cellPos = map.tile2map(cells[i].cx, cells[i].cy);
var tileNode = new TileNode(SkillAction.wLayer);
tileNode.x = cellPos[0] - centerMapPos[0];
tileNode.y = cellPos[1] - centerMapPos[1];
tileNode.changeColor(TILE_DEF.COLOR_RED);
node.addChild(tileNode, 0);
//this._tileNodes[i] = tileNode;
}
return node;
};
/// 寻找包裹路径的格子
SkillAction.findCellsAroundPath = function(path){
var cellsMap = {};
for(var i=0;i<path.length;i++){
var cell = path[i];
if(!cellsMap[cell.cx+'_'+cell.cy]){
cellsMap[cell.cx+'_'+cell.cy] = cell;
}
var cells = SkillAction.wLayer.map.scopeCells(cell.cx, cell.cy, 1, false);
for(var j=0;j<cells.length;j++){
var ocell = cells[j];
if(!cellsMap[ocell.cx+'_'+ocell.cy]){
cellsMap[ocell.cx+'_'+ocell.cy] = ocell;
}
}
}
var cells = [];
for(var key in cellsMap){
cells.push(cellsMap[key]);
}
return cells;
};
SkillAction.checkTargetBeDebuff = function(target){
return CONFLICT.checkByTask(target, 'beDebuff');
};
/// 检验技能影响类型
SkillAction.checkAffectType = function(target, self, action){
var ret;
switch (action.affectType) {
case SKILL_DEF.AFFECT_ENEMY:
ret = target.force!==self.force;
break;
case SKILL_DEF.AFFECT_FRIEND:
ret = target.force===self.force;
break;
case SKILL_DEF.AFFECT_BOTH:
ret = true;
break;
case SKILL_DEF.AFFECT_SELF:
ret = target.force===self.force;
break;
case SKILL_DEF.AFFECT_TARGET:
ret = target.force!==self.force;
break;
}
return ret;
};
/// 技能影响目标类型
//SkillAction.checkObjectType = function(target){ //技能不对经济建筑起作用
// return !SkillAction.wLayer.ecoBuildingMgr.checkEcoBuilding(target);
//};
/// 根据action的TargetType获取action的target
SkillAction.getActionTarget = function(target, action){
var ret = null;
switch (action.targetType){
case SKILL_DEF.TARGET_ARMY:
if(target.type===MAP_DEF.TYPE_UNIT){
ret = target;
}
break;
case SKILL_DEF.TARGET_BUILDING:
if(target.type===MAP_DEF.TYPE_BUILDING_PORT ||target.type===MAP_DEF.TYPE_BUILDING_GATE ||
target.type===MAP_DEF.TYPE_BUILDING_CASTLE || SkillAction.wLayer.workpieceMgr.checkWorkPiece(target)){
ret = target;
}
break;
case SKILL_DEF.TARGET_ECO:
if(SkillAction.wLayer.ecoBuildingMgr.checkEcoBuilding(target)){
ret = target;
}
break;
case SKILL_DEF.TARGET_ARMY_WJ:
if(target.type===MAP_DEF.TYPE_UNIT){
ret = target.wuJiang.getWuJiangs();
}
break;
case SKILL_DEF.TARGET_BUILDING_WJ:
if(target.type===MAP_DEF.TYPE_BUILDING_PORT ||target.type===MAP_DEF.TYPE_BUILDING_GATE ||
target.type===MAP_DEF.TYPE_BUILDING_CASTLE || SkillAction.wLayer.workpieceMgr.checkWorkPiece(target)){
ret = target.pML.wuJiangMgr.getWJBySuoShu(target.objID);
}
break;
case SKILL_DEF.TARGET_TROOPS:
if(target.type===MAP_DEF.TYPE_BUILDING_PORT ||target.type===MAP_DEF.TYPE_BUILDING_GATE || target.type===MAP_DEF.TYPE_UNIT ||
target.type===MAP_DEF.TYPE_BUILDING_CASTLE || SkillAction.wLayer.workpieceMgr.checkWorkPiece(target)){
ret = target;
}
break;
}
return ret;
};
/// 绑定一次技能
SkillAction.bindSkillOnce = function(paras) {
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
var skillID = addParas['skillID'];
var dj = target.getSatrap(); //获得目标的大将,并创建一个新技能给那个对象
var newSkill = SkillAction.wLayer.skillMgr.createSkill(skillID, dj, null, true, target); //添加给新武将使用一次的军师技能
_.log('bindSkillOnce', target.name);
if(newSkill.needTouch()){
SkillAction.wLayer._selectedSkill = newSkill;
if(!newSkill.checkIsAdviser()){ //军师技能此处不添加施法范围
newSkill.equipObject.setTileNodesVisible(true);
}
} else {
newSkill.cast(null);
}
};
/// 添加buff
SkillAction.addBuff = function(paras) {
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
var buffID = addParas['buffID'];
_.log('SkillAction addbuff', action.condition);
if(buffID>=10000&&buffID<=99999){ //如果buffid只有5位,则补上玩家的等级作为buff等级
buffID = buffID*100+USER.level;
}
//var buffArg = addParas['args'][0]; //buff通常只取第一个参数
var duration = addParas['duration'] || skill.duration; //如果action有duration则取action的 否则取skill的
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (SkillAction.checkAffectType(obj, equipObject, action)) {
//如果有buffid 且每个target满足action的条件
if(buffID!==undefined && (!action.condition || action.condition && SkillCondition[action.condition](obj, equiper, equipObject, skill, action))){
var realTarget = SkillAction.getActionTarget(obj, action);
if(realTarget){
if(realTarget instanceof Array){ //如果是数组类型,则说明取到的是武将
for(var i=0;i<realTarget.length;i++){
if(duration!==0){
SkillAction.wLayer.buffMgr.addBuff(buffID, realTarget[i], duration * _.TIME.SEC);
} else { //如果没有duration 则取buff默认的duration
SkillAction.wLayer.buffMgr.addBuff(buffID, realTarget[i]);
}
}
} else { //否则是建筑或军队,直接加buff
if(duration!==0){
SkillAction.wLayer.buffMgr.addBuff(buffID, realTarget, duration*_.TIME.SEC);
} else { //如果没有duration 则取buff默认的duration
SkillAction.wLayer.buffMgr.addBuff(buffID, realTarget);
}
}
}
}
}
});
};
/// 单体技能伤害
SkillAction.skillhurt = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
if(SkillAction.checkTargetBeDebuff(target)){
var damage = SkillAction.calDamage(equiper, equipObject, target, skill, addParas);
_.log('skillhurt',damage);
SkillAction.attackAction(damage, equipObject, target, ARMY_DEF.DAMAGE_TYPE_NORMAL);
//target.changeTroops(-damage);
}
};
/// 击退
SkillAction.beatBack = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
if(SkillAction.checkTargetBeDebuff(target)){
var damage = SkillAction.calDamage(equiper, equipObject, target, skill, addParas);
//_.log('beatBack',damage);
SkillAction.attackAction(damage, equipObject, target, ARMY_DEF.DAMAGE_TYPE_NORMAL);
//target.changeTroops(-damage);
var dx = target.x - equipObject.x;
var dy = (target.y - equipObject.y)*GRID_WH;
//_.log('beatBack',dx, dy);
var dir = WORLD.getFaceXyDir(dx, dy);
var neighbor = equipObject.pMap.getNeighbor(target.cx, target.cy, WORLD.getNeighborDirByFaceDir(dir));
target.transferToTile(neighbor.cx, neighbor.cy);
}
};
/// 恢复友军武将受伤状态
SkillAction.cureInjury = function(paras) {
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (SkillAction.checkAffectType(obj, equipObject, action)) {
var wjs = [];
if(obj.type===MAP_DEF.TYPE_UNIT){
wjs = obj.wuJiang.getWuJiangs();
}
for(var i=0;i<wjs.length;i++){
var wj = wjs[i];
if(!wj.checkHealthy()){
wj.setJianKang(WJ_DEF.JIAN_KANG);
}
}
}
});
};
/// 驱散友军debuff
SkillAction.refresh = function(paras) {
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
var buffMgr = equipObject.pML.buffMgr;
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (SkillAction.checkAffectType(obj, equipObject, action)) {
if(obj.type===MAP_DEF.TYPE_UNIT){
var buffs = buffMgr.buffList[obj.objID];
if(buffs && buffs.length>0){
for(var i=0;i<buffs.length;i++){
var buff = buffs[i];
if(buff.mode === BUFF_DEF.MODE_DEBUFF){
buff.removeSelf();
}
}
}
}
}
});
};
/// 嘲讽周围部队
SkillAction.taunt = function(paras) {
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
var targets = []; //被嘲讽的目标数组
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (SkillAction.checkAffectType(obj, equipObject, action)) {
if(obj.type===MAP_DEF.TYPE_UNIT){
obj.setTarget(equipObject);
targets.push(obj);
if(obj.emitter){
obj.emitter.emit('beTaunt', {'target':equipObject});
}
}
}
});
if(this.equipObject.emitter){
this.equipObject.emitter.emit('taunt', {'targets':targets});
}
};
/// 范围伤害
SkillAction.adviserAoe = function(paras){
_.log('adviserAoe')
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (obj.force !== equiper.shiLi && SkillAction.checkTargetBeDebuff(obj)) {
var realTarget = SkillAction.getActionTarget(obj, action);
if(realTarget){
var damage = SkillAction.calAdviserDamage(equiper, equipObject, obj, skill, addParas);
_.log('adviserAoe', damage, obj.name);
//obj.changeTroops(-damage);
SkillAction.attackAction(damage, equipObject, obj, ARMY_DEF.DAMAGE_TYPE_NORMAL);
}
}
});
};
/// 军师技能范围伤害
SkillAction.aoe = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (SkillAction.checkAffectType(obj, equipObject, action) && SkillAction.checkTargetBeDebuff(obj)) {
var damage = SkillAction.calDamage(equiper, equipObject, obj, skill, addParas);
_.log('aoe', damage, obj.name);
//obj.changeTroops(-damage);
SkillAction.attackAction(damage, equipObject, obj, ARMY_DEF.DAMAGE_TYPE_NORMAL);
}
});
};
/// 齐攻
SkillAction.linkAtk = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
if(SkillAction.checkTargetBeDebuff(target)) {
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (obj.force === equipObject.force && typeof obj.type===MAP_DEF.TYPE_UNIT) {
var damage = SkillAction.calDamage(equiper, obj, target, skill, addParas);
_.log('linkAtk', damage, obj.name);
//target.changeTroops(-damage);
SkillAction.attackAction(damage, obj, target, ARMY_DEF.DAMAGE_TYPE_NORMAL);
}
});
}
};
/// 持续性范围伤害技能
SkillAction.dotaoe = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var interval = addParas['interval'];
//cx cy oriForce 需要先缓存下来,因为随着时间的推移可能会变化
var cx = target.cx;
var cy = target.cy;
var oriForce = equipObject.force;
var cells = SkillAction.wLayer.map.scopeCellsByTileXY(cx, cy, skill.scope, true);
var tileNode = SkillAction.initTileNodes(cx, cy, skill.scope);
SkillAction.wLayer.setTimeMechine(null, skill.duration* _.TIME.SEC, interval* _.TIME.SEC, function(){
SkillAction.scopeLoop(cx, cy, skill.scope, function(obj){
if (obj.force !== oriForce && typeof obj.changeTroops==='function') {
if(SkillAction.checkTargetBeDebuff(obj)) {
var damage = SkillAction.calDamage(equiper, equipObject, obj, skill, addParas);
_.log('dotaoe', damage, obj.name);
SkillAction.attackAction(damage, equipObject, obj, ARMY_DEF.DAMAGE_TYPE_NORMAL);
//obj.changeTroops(-damage);
}
}
}, cells);
}, function(){
//_.log('dotaoe finish');
tileNode.removeFromParent(true);
});
};
/// 持续性影响的action
SkillAction.dot = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var interval = addParas['interval'];
var funcName = addParas['function'];
var paras = addParas['args'];
SkillAction.wLayer.setTimeMechine(null, skill.duration* _.TIME.SEC, interval* _.TIME.SEC, function(){
if(SkillAction.checkTargetBeDebuff(target)) {
var damage = target[funcName](paras);
SkillAction.attackAction(damage, equipObject, target, ARMY_DEF.DAMAGE_TYPE_NORMAL);
}
}, function(){
});
};
/// 使已经陷入混乱的军队延长混乱时间
SkillAction.continueHunluan = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (obj.force !== equipObject.force && obj.buffStatus===ARMY_DEF.BUFF_STATUS_HUNLUAN) { //对已经混乱的目标继续释放混乱
//_.log('continueHunluan',obj.name);
if(SkillAction.checkTargetBeDebuff(obj)) {
var p = [obj, equiper, equipObject, skill.name, addParas['buffID'], addParas['fomulaID'], addParas['durationID']];
Action.addHunLuan(p);
}
}
});
};
/// 使火焰中的军队变为混乱
//SkillAction.fireHunluan = function(paras){
// var target = paras[0]; //技能目标
// var equiper = paras[1]; //技能装备的武将
// var equipObject = paras[2]; //使用技能的军队或建筑
// var skill = paras[3]; //技能名称
// var addParas = paras[4]; //技能附加参数对象
// var visitedObjs = [];
// var cells = SkillAction.wLayer.map.scopeCellsByTileXY(target.cx, target.cy, skill.scope, true);
// for(var i=0;i<cells.length;i++){
// //_.log(i, cells[i].cx, cells[i].cy);
// var objs = cells[i].objects;
// if(objs){
// for (var j = 0; j < objs.length; j++) {
// var obj = objs[j];
// //_.log(obj.name);
// if(visitedObjs.indexOf(obj)===-1){
// visitedObjs.push(obj);
// var breakFlag = cb(obj);
// if(breakFlag){
// break;
// }
// }
// }
// }
// }
//};
/// 士气变化
SkillAction.changeShiQi = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能
var addParas = paras[4]; //技能附加参数对象
var action = paras[5];
var fomulaID = addParas['fomulaID'];
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (SkillAction.checkAffectType(obj, equipObject, action) && !isNaN(obj.shiQi)) {
var p = [equipObject, obj, skill, equiper,addParas['isBeishui']];
var shiqi = FOMULA.run(fomulaID, p);
if(isNaN(shiqi)){
return ;
}
if (shiqi > 0) {
var frames = cc.getAnimFrames('skill/shiqi/up/%d.png');
var upEffect = cc.createAni({anchor : [0.5, 0.5]}, 3, cc.director.getAnimationInterval()*frames.length, frames);
upEffect.setPosition(cc.p(0.0, 0.0));
upEffect.then(function() {
upEffect.removeFromParent(true);
}).act();
obj.addEffectChildUp(upEffect);
} else {
var frames = cc.getAnimFrames('skill/shiqi/down/%d.png');
var downEffect = cc.createAni({anchor : [0.5, 0.5]}, 3, cc.director.getAnimationInterval()*frames.length, frames);
downEffect.setPosition(cc.p(0.0, 0.0));
downEffect.then(function() {
downEffect.removeFromParent(true);
}).act();
obj.addEffectChildUp(downEffect);
}
obj.changeShiQi(shiqi);
}
});
};
///吸血 将敌方损失部队加到我军上
SkillAction.suckBlood = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
if(!CONFLICT.checkByTask(target, 'beDebuff')){
return ;
}
var damage = SkillAction.calDamage(equiper, equipObject, target, skill, addParas);
_.log('suckBlood '+damage);
if(damage>0){
SkillAction.attackAction(damage, equipObject, target, ARMY_DEF.DAMAGE_TYPE_NORMAL);
//target.changeTroops(-damage);
if(equipObject.wuJiang){ //如果是部队则进行限制,如果是城池则不做限制
var jwID = equipObject.wuJiang.daJiang.jueWei;
var troopsLimit = JueWei.getTroopsLimit(jwID, equipObject.force);
if(troopsLimit - equipObject.troops < damage){ //如果超出主将带兵上限,则修改为达到带兵上限
damage = Math.max(troopsLimit - equipObject.troops, 0);
}
}
// equipObject.changeTroops(damage);
SkillAction.doDamage(equipObject, damage);
}
};
///治疗 恢复伤兵
SkillAction.cure = function(paras) {
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var fomulaID = addParas['fomulaID'];
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (obj.force === equipObject.force && !isNaN(obj.wounded) && !isNaN(obj.troops)) {
var fomulaP = [];
fomulaP[0] = equipObject;
fomulaP[1] = obj;
fomulaP[2] = skill;
fomulaP[3] = equiper;
var cureTroops = Math.round(FOMULA.run(fomulaID, fomulaP));
//_.log('治疗:'+cureTroops+' '+selfArmy.name+' 对 '+target.name);
// obj.changeTroops(cureTroops);
// obj.changeWounded(-cureTroops);
SkillAction.doDamage(obj, cureTroops);
}
});
};
/// 内讧,让范围内的敌人互相攻击
SkillAction.convert = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var oriForceMap = {}; //存储被改变force军队的原始force
var oriObjArr = []; //存储被改变force军队的obj
var startIdx = 1;
//先搜索附近是否有能够转移目标的军队
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (obj.force !== equipObject.force && obj.type===MAP_DEF.TYPE_UNIT) {
oriForceMap[obj.objID] = obj.force;
oriObjArr.push(obj);
obj.force = 1100000+startIdx;
startIdx++;
}
});
for(var i=0;i<oriObjArr.length;i++){
var obj = oriObjArr[i];
var others = _(oriObjArr).without(obj);
if(others.length>0){
var idx = _.rand(others.length); //随机选一个目标
obj.setTarget(others[idx]);
}
}
SkillAction.wLayer.setTimeMechine(null, skill.duration*_.TIME.SEC, null, null, function(){
_(oriObjArr).each(function(v, k){
v.force = oriForceMap[v.objID];
v.findAttackZoneFitEnemy();
})
});
};
/// 骄兵,让敌人出兵来攻打
SkillAction.jiaobing = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var newTarget;
//先搜索附近是否有能够转移目标的军队
SkillAction.scopeLoop(target.cx, target.cy, addParas['findEnemyScope'], function(obj){
if (obj.force === equipObject.force) {
newTarget = obj;
return true;
}
return false;
});
if(newTarget){
//吸引敌军
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if (obj.force !== equipObject.force) {
_.log(obj.name, newTarget.name, obj.type);
if(obj.type===MAP_DEF.TYPE_UNIT){
obj.setTarget(newTarget);
}else if(obj.type===MAP_DEF.TYPE_BUILDING_CASTLE) {
CastleCmd.forceOutArmyFromCity(obj, newTarget);
}
}
});
//消灭自己
// equipObject.changeTroops(-equipObject.troops-1);
SkillAction.doDamage(equipObject, -equipObject.troops - 1);
}
};
/// 点火
SkillAction.addFire = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if(obj.type===MAP_DEF.TYPE_BUILDING_TINDER){
//var origin = role.origin || role;
var info = {
name: "火苗",
type: MAP_DEF.TYPE_FIRE_FRAME,
level: 1,
//origin: origin,
cx: obj.cx,
cy: obj.cy,
x: obj.x,
y: obj.y,
force: obj.force,
keepAlive:WORLD.constConfig['fire_time']
};
SkillAction.wLayer.fireMgr.addSkillFire(info);
obj.destroy();
} else if(obj.type===MAP_DEF.TYPE_BUILDING_TRAP_FIRE){
obj.lightBySkill();
}
});
};
/// 灭火
SkillAction.clearFire = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
//_.log('clearFire',skill.scope, target.name);
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
//_.log(obj.type);
if(obj.type===MAP_DEF.TYPE_FIRE_FRAME){ //如果是火苗,则熄灭该火苗
SkillAction.wLayer.fireMgr.clearFireFrame(obj.fireId);
}
});
};
/// 合兵
SkillAction.fuse = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
//_.log('clearFire',skill.scope, target.name);
var smallestArmy;
var smallestTroops = 99999999;
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
_.log(obj.name);
if(obj.type===MAP_DEF.TYPE_UNIT && obj!==equipObject && obj.force===equipObject.force && obj.troops>0 && obj.troops<smallestTroops){
if(SkillAction.checkTargetBeDebuff(obj)) {
smallestTroops = obj.troops;
smallestArmy = obj;
}
}
});
if(smallestArmy){
// target.changeTroops(smallestArmy.troops);
// target.changeWounded(smallestArmy.wounded);
SkillAction.doDamage(target, smallestArmy.troops, smallestArmy.wounded);
smallestArmy.destroy();
}
};
/// 攻击action 用于发射消息和改变兵力
SkillAction.attackAction = function(damage, attacker, target, damageType){
var info = {
damage: damage, //伤害
attacker: attacker, //伤害来源
target: target, //受到伤害的目标
atkType: ARMY_DEF.ATK_TYPE_SKILL, //攻击类型
damageType: damageType?damageType:ARMY_DEF.DAMAGE_TYPE_NORMAL //伤害类型
};
if(attacker && attacker.emitter){
attacker.emitter.emit('armyAttack', info);
}
if(target && target.emitter){
target.emitter.emit('armyBeAttack', info);
}
// target.changeTroops(-info.damage);
SkillAction.doDamage(target, -info.damage);
};
//加血减血效果
SkillAction.doDamage = function(target, damage, wounded) {
if (damage < 0) {
//减血
target.changeTroops(damage);
ccs.armatureDataManager.addArmatureFileInfo("res/animation/jineng_shanghai/jineng_shanghai.ExportJson");
var armature = new ccs.Armature("jineng_shanghai");
//damage label
armature.getBone("Layer3").removeDisplay(0);
var damageNode = new cc.Node();
var originX = 37;
var numX = originX;
var damageCount = Math.abs(damage);
while (damageCount !== 0) {
var num = damageCount%10;
var numSpr = cc.createSprite("yellow_" + num + ".png", {anchor:[0.5, 0.5]});
numSpr.x = numX;
damageNode.addChild(numSpr);
numX -= 25;
damageCount = (damageCount - num)/10;
}
var minusSpr = cc.createSprite("yellow_-.png", {anchor:[0.5, 0.5]});
minusSpr.x = numX;
damageNode.addChild(minusSpr);
armature.getBone("Layer3").addDisplay(damageNode, 0);
armature.getAnimation().playWithIndex(0, -1, 0);
armature.scale = 1.5;
armature.anchorX = 0.0;
armature.anchorY = 0.0;
armature.x = target.x;
armature.y = target.y;
target._mapLayer._effNode.addChild(armature, UI.TOPMOST_ZORDER + 9);
armature.getAnimation().setMovementEventCallFunc(function (armature, movementType, movementID) {
armature.getAnimation().stop();
armature.removeFromParent();
});
}
else {
//加血
var woundedCount = wounded || -damage;
target.changeTroops(damage);
target.changeWounded(woundedCount);
ccs.armatureDataManager.addArmatureFileInfo("res/animation/jineng_shanghai/jineng_shanghai.ExportJson");
var armature = new ccs.Armature("jineng_shanghai");
//damage label
armature.getBone("Layer3").removeDisplay(0);
var damageNode = new cc.Node();
var originX = 37;
var numX = originX;
var damageCount = Math.abs(damage);
while (damageCount !== 0) {
var num = damageCount%10;
var numSpr = cc.createSprite("green_" + num + ".png", {anchor:[0.5, 0.5]});
numSpr.x = numX;
damageNode.addChild(numSpr);
numX -= 25;
damageCount = (damageCount - num)/10;
}
var minusSpr = cc.createSprite("green_+.png", {anchor:[0.5, 0.5]});
minusSpr.x = numX;
damageNode.addChild(minusSpr);
armature.getBone("Layer3").addDisplay(damageNode, 0);
armature.getAnimation().playWithIndex(0, -1, 0);
armature.scale = 1.5;
armature.anchorX = 0.0;
armature.anchorY = 0.0;
armature.x = target.x;
armature.y = target.y;
target._mapLayer._effNode.addChild(armature, UI.TOPMOST_ZORDER + 9);
armature.getAnimation().setMovementEventCallFunc(function (armature, movementType, movementID) {
armature.getAnimation().stop();
armature.removeFromParent();
});
}
};
/// 冲锋
SkillAction.charge = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
var path = SkillAction.wLayer.map.tilePath(equipObject.cx, equipObject.cy, target.cx, target.cy);
equipObject.setTarget(target, path);
var oriRate = equipObject._speedRate;
equipObject.setSpeedRate(999, true);
equipObject.moveFinishCB = function(){
//_.log('moveFinishCB');
equipObject.setSpeedRate(oriRate, true);
};
equipObject.changeAIState(ArmyStateMovingUnstoppable);
//chargeEffect
var effectNode = new cc.Node();
var frames = cc.getAnimFrames('skill/charge/%d.png');
var upEffect = cc.createAni({anchor : [0.5, 0.5]}, 0, 3*cc.director.getAnimationInterval()*frames.length, frames);
upEffect.then(function() {
upEffect.removeFromParent(true);
}).act();
upEffect.y = 15;
//streak
var streak = cc.ParticleSystem.create("res/images/charge.plist");
effectNode.addChild(streak);
effectNode.setPosition(cc.p(10.0, 35.0));
effectNode.addChild(upEffect);
effectNode.setTag(SYS.ChargeEffectTag*10);
equipObject.addEffectChildUp(effectNode);
var cells = SkillAction.findCellsAroundPath(path);
SkillAction.scopeLoop(target.cx, target.cy, skill.scope, function(obj){
if(obj.force!==equipObject.force && typeof obj.changeTroops==='function'){
if(SkillAction.checkTargetBeDebuff(obj)) {
var damage = SkillAction.calDamage(equiper, equipObject, obj, skill, addParas);
//_.log('charge', damage, obj.name);
SkillAction.attackAction(damage, equipObject, obj, ARMY_DEF.DAMAGE_TYPE_NORMAL);
//有几率无阵
var prob = FOMULA.wuzhen();
var ac = _.rand(100)/100;
if(ac<=prob){
SkillAction.wLayer.buffMgr.addBuff(2300401, obj);
}
}
}
}, cells);
};
/// 入梦 by 孙梦超
SkillAction.rumeng = function(paras){
var target = paras[0]; //技能目标
var equiper = paras[1]; //技能装备的武将
var equipObject = paras[2]; //使用技能的军队或建筑
var skill = paras[3]; //技能名称
var addParas = paras[4]; //技能附加参数对象
//_.log('兵法强度1', target.bfPower);
SkillAction.wLayer.buffMgr.addBuff(2301510, target, skill.duration*_.TIME.SEC);
//_.log('兵法强度2', target.bfPower);
SkillAction.wLayer.setTimeMechine(null, skill.duration* _.TIME.SEC, 10* _.TIME.SEC, null, function(){
var cureNum = Math.min(target.oriTroops*(0.11+skill.power*0.03), target.wounded); //使用回复参数和技能强度计算回复量, 并取该值与受伤人数中较大的一个
var jwID = target.wuJiang.daJiang.jueWei;
var troopsLimit = JueWei.getTroopsLimit(jwID, equipObject.force);
if(troopsLimit - target.troops < cureNum){ //如果超出主将带兵上限,则修改为达到带兵上限
cureNum = Math.max(troopsLimit - target.troops, 0);
}
// target.changeTroops(cureNum);
// target.changeWounded(-cureNum);
SkillAction.doDamage(target, cureNum);
});
_.log('aaa')
};
if (isNodeJS){
module.exports = SkillAction;
}