项目中有挂机设定,期间需根据不同情况自动释放技能;
思路:使用权重计算技能释放的优先级,脱离原先多层级的if else语句,理清的逻辑关系以数据的方式呈现。
代码实现:
----环境状态 外部对权重计算的影响
--是否需要释放群体技能
local is_need_multi = GuajiCtrl.IsMultiTarget(aim_obj_x, aim_obj_y, 1)
--获取设置中的设定好的技能id 判断当前技能是否可使用
local single_skill_idx, multi_skill_idx = SettingData.Instance:GetGuajiSkillData()
local function is_setting_set_guaji_skill(id)
return id == SettingData.SKILL[prof][2][multi_skill_idx + 1] or id == SettingData.SKILL[prof][1][single_skill_idx + 1]
end
--该技能不在设置中设定 需做特殊处理
local function is_bisha(id)
return id == 32
end
--初始化 技能优先级结构体
local function init_skill_data(t)
--根据不同环境状态(是否需要群体攻击is_multi 是否可以使用can_use) 计算技能释放优先级
t.calc_priority_num = function (is_multi, can_use)
return t.damage + (is_multi and t.multi or 0) + (not can_use and t.not_can_use or 0)
end
return t
end
--以技能的 伤害, 范围伤害, 是否可使用 计算优先级
local priority_attr_list = {
[1] = init_skill_data{id = 32, damage = 5, multi = 10, not_can_use = -1000}, --必杀技
[2] = init_skill_data{id = 12, damage = 3, multi = 0, not_can_use = -1000}, --大雷电术
[3] = init_skill_data{id = 83, damage = 4, multi = 0, not_can_use = -1000}, --火龙气焰
[4] = init_skill_data{id = 17, damage = 1, multi = 10, not_can_use = -1000}, --流星火雨
[5] = init_skill_data{id = 18, damage = 2, multi = 10, not_can_use = -1000} --冰雪咆哮
}
--进行排序 筛选最佳技能
table.sort(priority_attr_list, function (a, b)
local a_can_use = GuajiCtrl.CanAutoUseSkill(a.id) and (is_setting_set_guaji_skill(a.id) or is_bisha(a.id))
local b_can_use = GuajiCtrl.CanAutoUseSkill(b.id) and (is_setting_set_guaji_skill(b.id) or is_bisha(b.id))
return a.calc_priority_num(is_need_multi, a_can_use) > b.calc_priority_num(is_need_multi, b_can_use)
end)
--得到技能id
skill_id = priority_attr_list[1].id