Files
fc/dev/project/library/imports/5a/5a5b5cf6-a65c-46f4-bf8f-68696b865312.js
2026-05-24 10:21:26 +08:00

319 lines
9.4 KiB
JavaScript

"use strict";
cc._RF.push(module, '5a5b5z2plxG9L+PaGlrhlMS', 'battle_loop');
// Scripts/mod/battle/battle_loop.js
"use strict";
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
// 假战斗单位生成器
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var BCT = require("battle_const");
var BattleLoop = {
/**
* 初始化对象生成器
* @param {*} data
*/
init: function init(data) {
this.next_target_type_pos = 1;
this.next_target_type_kill = 2;
this.talk_cd = 0;
this.col_info = [0, 1, 2, 3, 1, 2, 3, 1, 2, 3],
// this.col_pos_info = [[], [1, 4, 7], [2, 5, 8], [3, 6, 9]],
//新版挂機
this.col_pos_info = [[], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]],
//新版挂機
this.idx = 0;
this.data = data;
this.a_objects = {};
this.target_objects = {};
// this.icon_res_list = [5,2,7];
// this.icon_idx = 0;
this.randWaveTargets();
this.b_formation_type = data.b_formation_type || 1;
this.now_num = 0;
this.max_num = Math.min(data.partner_list.length, 3);
this.needPlays = {};
this.last_pos = 0;
this.last_time = 0;
this.a_col = {};
this.target_play = {};
this.cd_time = 1;
if (data.partner_list.length < 2) {
this.cd_time = 2;
}
var config = game.configs.dungeon_data.data_drama_dungeon_info[data.dun_bid.toString()];
this.talk_list = config.talk_ids;
var play = {};
play.objects = {};
play.target_list = {};
play.comabt_type = data.combat_type;
for (var index = 0; index < data.partner_list.length; index++) {
var element = data.partner_list[index];
element.playing = 0;
var temp_pos = index + 1;
this.a_objects[temp_pos] = element;
play.objects[temp_pos] = {
pos: element.pos,
object_bid: element.bid,
bid: element.bid,
star: element.star,
object_type: 2,
group: 1,
hp: element.hp,
hp_max: element.hp,
skill_list: [],
fashion: element.use_skin
};
var col = this.col_info[element.pos];
this.a_col[col] = this.a_col[col] || {
rnum: 0,
"enum": 0
};
this.a_col[col].rnum += 1;
this.a_col[col][element.pos] = temp_pos;
for (var i = 0; i < element.skill_list.length; i++) {
var temp = element.skill_list[i];
play.objects[temp_pos].skill_list.push(temp.sid);
}
}
play.target_list[0] = this.nextTarget();
return play;
},
// 产出下一波怪
nextTarget: function nextTarget() {
var now = client.socket.getTime();
if (this.now_num >= this.max_num) return;
// if (this.now_num > 0 && (now - this.last_time < this.cd_time)) return;
var pos_list = [];
var pos_list2 = [];
var pos = 0;
var col = 0;
for (var index = 1; index < 10; index++) {
pos = index + BCT.GIRD_POS_OFFSET;
col = this.col_info[index];
if (this.last_pos != pos) {
//this.target_objects[pos] == null && this.a_col[col] != null && && (this.a_col[col].rnum > this.a_col[col].enum)
pos_list.push(pos);
if (this.col_info[this.last_pos - BCT.GIRD_POS_OFFSET] != col) {
pos_list2.push(pos);
}
}
}
if (pos_list2.length > 0) {
pos_list = pos_list2;
}
if (pos_list.length > 0) {
pos = this.rand_item(pos_list); //只保留中間的位置
col = this.col_info[pos - BCT.GIRD_POS_OFFSET];
// this.a_col[col].enum = this.a_col[col].enum + 1;
var target = this.rand_item(this.b_objects);
this.target_objects[pos] = target;
this.needPlays[pos] = 1;
this.last_pos = pos;
this.last_time = now;
this.now_num += 1;
var play = this.init_play(pos);
this.target_play[pos] = play;
return {
pos: pos,
object_bid: target.bid,
bid: target.bid,
star: target.star,
object_type: 3,
group: 2,
hp: target.hp,
hp_max: target.hp,
skill_list: [],
actor: play.actor,
effect_bid: play.effect_bid
};
}
},
// 技能播报计算
init_play: function init_play(pos) {
if (pos == null) return;
var target = this.target_objects[pos];
if (target == null || !this.needPlays[pos]) return;
var a_idx = this.selectActor(pos);
this.needPlays[pos] = a_idx;
var actor = this.a_objects[a_idx];
actor.playing = actor.playing + 1;
var skill = this.rand_item_by_key(actor.skill_list, 'rand');
var play = {
skill_plays: [],
actor: actor.pos,
target: pos,
skill_bid: skill.sid
};
var skill_idx = 1;
var effect_idx = 1;
var rand_object = this.rand_talk();
var talk_pos = rand_object && rand_object.talk_pos ? rand_object.talk_pos : 0;
var talk_content = rand_object && rand_object.talk_content ? rand_object.talk_content : "";
var skill_play = {
order: skill_idx,
bid: actor.bid,
actor: actor.pos,
target: pos,
skill_bid: skill.sid,
effect_play: [],
talk_pos: talk_pos,
talk_content: talk_content
};
var hp = target.hp;
for (var index = 0; index < skill.effect_list.length; index++) {
var element = skill.effect_list[index];
play.effect_bid = element.eid;
var hurt = Utils.randomNum(element.min_hurt, element.max_hurt);
var is_crit = 0;
var tmp_crit = Utils.randomNum(0, 1000);
if (tmp_crit < actor.crit) {
hurt = Math.ceil(hurt * 1.5);
is_crit = 1;
}
var dec_hp = hurt;
if (index != skill.effect_list.length - 1) {
dec_hp = Math.ceil(Math.min(hurt, hp) / skill.effect_list.length);
}
hp = Math.max(hp - dec_hp);
var effect_play = {
order: effect_idx,
actor: actor.pos,
target: pos,
effect_bid: element.eid,
hp: hp,
hurt: -hurt,
is_crit: is_crit
};
skill_play.effect_play.push(effect_play);
effect_idx += 1;
}
play.skill_plays.push(skill_play);
return play;
},
//
play: function play(pos) {
var play = this.target_play[pos];
if (!play) {
for (var i in this.target_play) {
if (this.target_play[i]) {
play = this.target_play[i];
}
}
}
if (play) {
this.target_play[play.target] = null;
}
this.target_play[pos] = null;
return play;
},
// 选择进攻者(选在同行中,优先前排英雄)
selectActor: function selectActor(pos) {
var logic_pos = pos - BCT.GIRD_POS_OFFSET;
var col = this.col_info[logic_pos];
var col_pos = this.col_pos_info[col];
var a_col_pos = this.a_col[col];
//新版挂機
if (!a_col_pos) {
for (var i in this.a_col) {
if (this.a_col[i]) {
a_col_pos = this.a_col[i];
}
}
}
//新版挂機
var a_idx = 0;
var a_front_idx = 0;
for (var index = 0; index < col_pos.length; index++) {
var a_pos = col_pos[index];
a_idx = a_col_pos[a_pos];
if (a_idx) {
a_front_idx = a_front_idx || a_idx;
if (this.a_objects[a_idx].playing == 0) {
return a_idx;
}
}
}
return a_front_idx;
},
// 技能播放完成
playEnd: function playEnd(pos) {
var a_idx = this.needPlays[pos];
if (a_idx) {
var actor = this.a_objects[a_idx];
actor.playing -= 1;
}
this.needPlays[pos] = null;
this.target_objects[pos] = null;
this.now_num -= 1;
var col = this.col_info[pos - BCT.GIRD_POS_OFFSET];
if (this.a_col[col]) {
this.a_col[col]["enum"] -= 1;
}
},
// 随机说话
rand_talk: function rand_talk() {
this.talk_cd = this.talk_cd - 1;
if (this.talk_cd > 0) return;
var talk = this.rand_item_by_key2(this.talk_list, 1, 10000);
if (talk && talk[0]) {
this.talk_cd = 5;
var target = this.rand_item(this.a_objects);
var idx = talk[0] || 1;
var config = game.configs.dungeon_data.data_drama_talk[idx.toString()];
return {
talk_pos: target.pos,
talk_content: config
};
}
},
randWaveTargets: function randWaveTargets() {
if (this.idx % 10 == 0) {
this.b_objects = this.rand_item(this.data.wave_list).unit_list;
}
this.idx += 1;
},
// 随机从里面取出一项
rand_item: function rand_item(tab) {
if (tab instanceof Array) {
var length = tab.length;
var index = Utils.randomNum(1, length);
return tab[index - 1];
} else {
var temp_ary = [];
for (var key in tab) {
temp_ary.push(key);
}
var _length = temp_ary.length;
var index = Utils.randomNum(1, _length);
var tab_key = temp_ary[index - 1];
return tab[tab_key];
}
},
// 按指定建随机一项
rand_item_by_key: function rand_item_by_key(tab, key) {
var sum = 0;
for (var index = 0; index < tab.length; index++) {
var element = tab[index];
sum = sum + element[key];
}
return this.rand_item_by_key2(tab, key, sum);
},
rand_item_by_key2: function rand_item_by_key2(tab, key, sum) {
var rank = Utils.randomNum(1, sum);
for (var index = 0; index < tab.length; index++) {
var element = tab[index];
sum = sum - element[key];
if (rank >= sum) {
return element;
}
}
}
};
module.exports = BattleLoop;
cc._RF.pop();