miduo_client/Assets/ManagedResources/~Lua/Modules/DiffMonster/DiffMonsterManager.lua

619 lines
23 KiB
Lua
Raw Normal View History

2020-08-25 15:46:38 +08:00
DiffMonsterManager = {}
2020-05-09 13:31:21 +08:00
local propertyConfig = ConfigManager.GetConfig(ConfigName.PropertyConfig)
local pokemonComonpentsConfig = ConfigManager.GetConfig(ConfigName.DifferDemonsComonpentsConfig)
local pokemonStageConfig = ConfigManager.GetConfig(ConfigName.DifferDemonsStageConfig)
local this = DiffMonsterManager
-- 异妖立绘信息
this.demonlive2dInfo = {
[1] = { Name = "live2d_s_jieling_dlg_3010",
Scale = Vector3.New(0.6, 0.6, 1),
Position = Vector2.New(0, -128), },
[2] = { Name = "live2d_s_jieling_zlz_3001",
Scale = Vector3.New(0.6, 0.6, 1),
Position = Vector2.New(0, -128), },
[3] = { Name = "live2d_s_jieling_hg_3002",
Scale = Vector3.New(0.5, 0.5, 1),
Position = Vector2.New(0, -128), },
[4] = { Name = "live2d_s_jieling_jhj_3003",
Scale = Vector3.New(0.7, 0.7, 1),
Position = Vector2.New(0, -128), },
[5] = { Name = "live2d_s_jieling_hs_3006",
Scale = Vector3.New(0.5, 0.5, 1),
Position = Vector2.New(0, -128), },
[6] = { Name = "live2d_s_jieling_lms_3009",
Scale = Vector3.New(0.6, 0.6, 1),
Position = Vector2.New(0, -128), },
[7] = { Name = "live2d_s_jieling_sl_3005",
Scale = Vector3.New(0.8, 0.8, 1),
Position = Vector2.New(0, -128), },
[8] = { Name = "live2d_s_jieling_md_3007",
Scale = Vector3.New(0.8, 0.8, 1),
Position = Vector2.New(0, -128), },
[9] = { Name = "live2d_s_jieling_fl_3008",
Scale = Vector3.New(0.8, 0.8, 1),
Position = Vector2.New(0, -128), },
[10] = { Name = "live2d_s_jieling_tl_3004",
Scale = Vector3.New(0.5, 0.5, 1),
Position = Vector2.New(0, -128), },
}
this.pokemonList = {}
--存储配件ExtraAdd信息
this.extraAddList = {}
--异妖配件战力相关
this.componentPropertyList = {}
this.propertyTotalList = {}
function this.Initialize()
end
-- 数据结构
-- pokemonInfo.id
-- pokemonInfo.stage
-- pokemonInfo.pokemoncomonpent -- id
-- level
function this.Init(_pokemonList)
for i = 1, #_pokemonList do
this.SinglePokemonInfo(_pokemonList[i], i)
end
--初始化每个职业的加成 0 全职业
for i = 0, 5 do
this.extraAddList[i] = {}
end
this.InitComponentsExtraData()
--初始化异妖配件战力相关属性
this.InitComponentsPropertyData()
end
-- 单个异妖数据
function this.SinglePokemonInfo(pokemonInfo, index)
local pokemon = {}
pokemon.id = pokemonInfo.id
if pokemonInfo.id == 0 then
return
end
pokemon.stage = pokemonInfo.stage--也是lv
pokemon.pokemonConfig = ConfigManager.GetConfigData(ConfigName.DifferDemonsConfig, pokemon.id)--异妖静态信息pokemonStageConfig
pokemon.pokemonUpLvConfigList = {}--异妖升级静态信息list
for i, v in ConfigPairs(pokemonStageConfig) do
if math.floor(v.ID / 100) == pokemon.id then
local pokemonUpLvStaticData = {}
pokemonUpLvStaticData.lv = v.ID % 100
pokemonUpLvStaticData.configData = v
pokemon.pokemonUpLvConfigList[pokemonUpLvStaticData.lv] = pokemonUpLvStaticData
end
end
pokemon.pokemoncomonpentList = {}--配件list {idlv,config}
for i = 1, #pokemon.pokemonConfig.ComonpentList do
--配件升级静态信息pokemonComonpentsConfig
local pokemoncomonpent = {}
pokemoncomonpent.id = pokemon.pokemonConfig.ComonpentList[i]
pokemoncomonpent.level = 0
pokemoncomonpent.upLvMateriaConfiglList = {}
for _, configInfo in ConfigPairs(pokemonComonpentsConfig) do
if configInfo.ComonpentsId == pokemoncomonpent.id then
pokemoncomonpent.upLvMateriaConfiglList[configInfo.Stage] = configInfo
end
end
table.insert(pokemon.pokemoncomonpentList, pokemoncomonpent)
end
for i = 1, #pokemonInfo.pokemoncomonpent do
--配件升级动态数据
for j = 1, #pokemon.pokemoncomonpentList do
if pokemon.pokemoncomonpentList[j].id == pokemonInfo.pokemoncomonpent[i].id then
pokemon.pokemoncomonpentList[j].level = pokemonInfo.pokemoncomonpent[i].level
end
end
end
--table.insert(this.pokemonList,pokemon)
this.pokemonList[pokemon.id] = pokemon
end
--获取单个异妖数据
function this.GetSinglePokemonData(_pokemonId)
if this.pokemonList[_pokemonId] then
return this.pokemonList[_pokemonId]
else
return nil
end
end
--获取单个异妖技能id
function this.GetSinglePokemonSkillIdData(_pokemonId)
if this.pokemonList[_pokemonId] then
local curPokemon = this.pokemonList[_pokemonId]
if curPokemon.pokemonUpLvConfigList[curPokemon.stage] then
return curPokemon.pokemonUpLvConfigList[curPokemon.stage].configData.SkillId
else
return 0
end
else
return 0
end
end
--获取单个异妖被动技能id
function this.GetSinglePokemonPassiveSkillIdData(_pokemonId)
if this.pokemonList[_pokemonId] then
local curPokemon = this.pokemonList[_pokemonId]
if curPokemon.pokemonUpLvConfigList[curPokemon.stage] then
return curPokemon.pokemonUpLvConfigList[curPokemon.stage].configData.PassiveSkillId
end
end
end
--更新异妖等级
function this.UpdatePokemonLv(_pokemonId, _Lv)
if this.pokemonList[_pokemonId] then
this.pokemonList[_pokemonId].stage = _Lv
end
end
--更新异妖配件等级
function this.UpdatePokemonPeiJianLv(_pokemonId, _peijianId, _peijianLv)
if this.pokemonList[_pokemonId] then
for i = 1, #this.pokemonList[_pokemonId].pokemoncomonpentList do
if this.pokemonList[_pokemonId].pokemoncomonpentList[i].id == _peijianId then
this.pokemonList[_pokemonId].pokemoncomonpentList[i].level = _peijianLv
FormationManager.UserPowerChanged()
Game.GlobalEvent:DispatchEvent(GameEvent.DiffMonster.OnComponentChange, _pokemonId)
this.SetExtraAddData(_peijianId, _peijianLv)
this.AddOrRefreshBaseAttribute(this.GetActiveComponentInfo(_peijianId))
end
end
end
end
--计算单个异妖加成的属性值
function this.CalculatePokemonProValue(pokemonId)
local propValueList = {}
local diffDemonsConfig = ConfigManager.GetConfigData(ConfigName.DifferDemonsConfig, pokemonId)
for _, componentId in ipairs(diffDemonsConfig.ComonpentList) do
local diffComponentsConfigs = ConfigManager.GetAllConfigsDataByKey(ConfigName.DifferDemonsComonpentsConfig, "ComonpentsId", componentId)
local targetConfig = diffComponentsConfigs[#diffComponentsConfigs]
for _, attributeInfo in ipairs(targetConfig.BaseAttribute) do
if propValueList[attributeInfo[1]] then
propValueList[attributeInfo[1]] = propValueList[attributeInfo[1]] + attributeInfo[2]
else
propValueList[attributeInfo[1]] = attributeInfo[2]
end
end
end
for propId, propValue in pairs(propValueList) do
local propConfig = ConfigManager.GetConfigData(ConfigName.PropertyConfig, propId)
if propConfig.TargetPropertyId ~= 0 and propValueList[propConfig.TargetPropertyId] then
propValueList[propConfig.TargetPropertyId] = math.floor((1 + propValue / 10000) * propValueList[propConfig.TargetPropertyId])
table.remove(propValueList,propId)
end
end
return propValueList
end
-----------初始化所有激活异妖配件的加成数据-----------
--获取所有已激活异妖配件
function this.GetAllActiveDiffComponents()
local activeComponents = {}
for _, pokemon in pairs(this.pokemonList) do
table.walk(pokemon.pokemoncomonpentList, function(componentInfo)
if componentInfo.level > 0 then
table.insert(activeComponents, componentInfo)
end
end)
end
return activeComponents
end
function this.GetActiveComponentInfo(componentId)
for _, pokemon in pairs(this.pokemonList) do
for _, componentInfo in pairs(pokemon.pokemoncomonpentList) do
if componentInfo.id == componentId then
return componentInfo
end
end
end
end
--获取配件Id等级level内的所有ExtraAdd数据
function this.GetComponentIdLevelExtraConfigData(componentInfo)
local configData = {}
for _, configInfo in ConfigPairs(pokemonComonpentsConfig) do
if configInfo.ComonpentsId == componentInfo.id and
configInfo.Stage <= componentInfo.level and
configInfo.ExtraAdd then
table.insert(configData, configInfo.ExtraAdd)
end
end
return configData
end
function this.InitComponentsExtraData()
local allActiveComponents = this.GetAllActiveDiffComponents()
table.walk(allActiveComponents, function(componentInfo)
local ExtraAddData = this.GetComponentIdLevelExtraConfigData(componentInfo)
table.walk(ExtraAddData, function(ExtraInfo)
for i = 1, #ExtraInfo do
this.AddOrRefreshExtraAdd(ExtraInfo[i][1], ExtraInfo[i][2], ExtraInfo[i][3], componentInfo.id)
end
end)
end)
end
------------------------------------------------
--设定加成数值
function this.SetExtraAddData(componentId, level)
local extraAddConfigData = this.GetComponentIdConfigData(componentId, level)
if not extraAddConfigData then
return
end
for i = 1, #extraAddConfigData do
this.AddOrRefreshExtraAdd(extraAddConfigData[i][1], extraAddConfigData[i][2], extraAddConfigData[i][3], componentId)
end
end
--当前Id,level数据
function this.GetComponentIdConfigData(componentId, level)
for _, configInfo in ConfigPairs(pokemonComonpentsConfig) do
if configInfo.ComonpentsId == componentId and
configInfo.Stage == level and
configInfo.ExtraAdd then
return configInfo.ExtraAdd
end
end
return false
end
--刷新赋值或者添加新值
function this.AddOrRefreshExtraAdd(pos, propId, value, componentId)
local isContain = table.keyvalueindexof(this.extraAddList[pos], "Id", propId)
if isContain then
this.extraAddList[pos][isContain].value = this.extraAddList[pos][isContain].value + value
else
table.insert(this.extraAddList[pos], { Id = propId, value = value, componentId = componentId })
end
end
--获取某个职业当前的异妖配件所有加成属性
function this.GetExtraAddEffect(pos)
return this.extraAddList[pos]
end
------------初始化所有激活异妖配件的属性数据-----------
--初始化各属性
function this.InitComponentsPropertyData()
local allActiveComponents = this.GetAllActiveDiffComponents()
for _, componentInfo in ipairs(allActiveComponents) do
this.AddOrRefreshBaseAttribute(componentInfo)
end
end
--获取配件Id等级level内的所有BaseAttribute数据
function this.GetComponentIdLevelBaseAttributeConfigData(componentInfo)
local configData = {}
for _, configInfo in ConfigPairs(pokemonComonpentsConfig) do
if configInfo.ComonpentsId == componentInfo.id and
configInfo.Stage <= componentInfo.level then
table.insert(configData, configInfo.BaseAttribute)
end
end
return configData
end
--刷新赋值或者添加新值
function this.AddOrRefreshBaseAttribute(componentInfo)
local AttributeData = {}
local BaseAttributeData = this.GetComponentIdLevelBaseAttributeConfigData(componentInfo)
table.walk(BaseAttributeData, function(BaseAttributeInfo)
for i = 1, #BaseAttributeInfo do
table.insert(AttributeData, BaseAttributeInfo[i])
end
end)
local componentId = componentInfo.id
if not this.componentPropertyList[componentId] then
this.componentPropertyList[componentId] = {}
this.SetPerPropertyValue(AttributeData, componentId, true)
else
this.SetPerPropertyValue(AttributeData, componentId, false)
end
end
--具体每个属性的赋值和更新(flag是否是全新的)
function this.SetPerPropertyValue(attributeData, componentId, flag)
for i = 1, #attributeData do
--Log("componentId:"..componentId.."ID:"..attributeData[i][1].."value:"..attributeData[i][2])
local attributeInfo = attributeData[i]
local posIndex = table.keyvalueindexof(this.componentPropertyList[componentId], "Id", attributeInfo[1])
if posIndex then
local tempForwardValue = this.componentPropertyList[componentId][posIndex].value
local currentValue = this.propertyTotalList[attributeInfo[1]]
this.propertyTotalList[attributeInfo[1]] = currentValue - tempForwardValue + attributeInfo[2]
this.componentPropertyList[componentId][posIndex].value = attributeInfo[2]
--if not flag then
-- local tempForwardValue = this.componentPropertyList[componentId][posIndex].value
-- local currentValue = this.propertyTotalList[attributeInfo[1]]
-- this.propertyTotalList[attributeInfo[1]] = currentValue - tempForwardValue + attributeInfo[2]
-- this.componentPropertyList[componentId][posIndex].value = attributeInfo[2]
--else
-- this.componentPropertyList[componentId][posIndex].value = attributeInfo[2]
-- this.propertyTotalList[attributeInfo[1]] = this.propertyTotalList[attributeInfo[1]] + attributeInfo[2]
--end
else
table.insert(this.componentPropertyList[componentId], { Id = attributeInfo[1], value = attributeInfo[2] })
if this.propertyTotalList[attributeInfo[1]] then
this.propertyTotalList[attributeInfo[1]] = this.propertyTotalList[attributeInfo[1]] + attributeInfo[2]
else
this.propertyTotalList[attributeInfo[1]] = attributeInfo[2]
end
end
--Log("componentId:"..componentId.."属性Id:"..attributeInfo[1].."最终值:"..attributeInfo[2])
end
--for k, v in pairs(this.propertyTotalList) do
-- Log("属性Id:"..k.."最终值:"..v)
--end
end
function this.DealWithPropertyList()
local desirePropertyList = {}
for k, v in pairs(this.propertyTotalList) do
local configInfo = propertyConfig[k]
if configInfo.TargetPropertyId ~= 0 then
--Log("有ID为"..k.."的属性ID指向TargetId"..configInfo.TargetPropertyId)
local gainProperty = this.propertyTotalList[configInfo.TargetPropertyId]
gainProperty = gainProperty * (1 + v / 10000)
desirePropertyList[configInfo.TargetPropertyId] = gainProperty
else
--Log("有ID:"..k.."的属性Value"..v)
desirePropertyList[k] = v
end
end
return desirePropertyList
end
function this.GetDiffMonstersPowerValue()
local totalPower = 0
local wholePropertyList = this.DealWithPropertyList()
for k, v in pairs(wholePropertyList) do
local configInfo = propertyConfig[k]
if configInfo.Style == 1 then
totalPower = totalPower + v * configInfo.Score
else
totalPower = totalPower + v / 100 * configInfo.Score
end
end
return math.floor(totalPower) * 5
end
------------------------------------------------
function this.CalculatePokemonPeiJiAllProAddVal(_pokemonId)
local allProVal = {}
for i, v in ConfigPairs(propertyConfig) do
allProVal[i] = 0
end
if this.pokemonList[_pokemonId] then
for i = 1, #this.pokemonList[_pokemonId].pokemoncomonpentList do
local item = this.pokemonList[_pokemonId].pokemoncomonpentList[i]
if item.upLvMateriaConfiglList[item.level] then
local BaseAttribute = item.upLvMateriaConfiglList[item.level].BaseAttribute
for j = 1, #BaseAttribute do
allProVal[BaseAttribute[j][1]] = allProVal[BaseAttribute[j][1]] + BaseAttribute[j][2]
end
end
end
end
return allProVal
end
--计算所有异妖配件的加成属性
function this.CalculateAllPokemonPeiJiAllProAddVal(heroPos)
local allProVal = {}
for i, v in ConfigPairs(propertyConfig) do
allProVal[i] = 0
end
for j = 1, #this.pokemonList do
for i = 1, #this.pokemonList[j].pokemoncomonpentList do
if this.pokemonList[j].pokemoncomonpentList[i].upLvMateriaConfiglList[this.pokemonList[j].pokemoncomonpentList[i].level] then
local BaseAttribute = this.pokemonList[j].pokemoncomonpentList[i].upLvMateriaConfiglList[this.pokemonList[j].pokemoncomonpentList[i].level].BaseAttribute
for j = 1, #BaseAttribute do
allProVal[BaseAttribute[j][1]] = allProVal[BaseAttribute[j][1]] + BaseAttribute[j][2]
end
end
end
end
--异妖配件对职业额外加成
local allComonpentExtraAdd = this.GetExtraAddEffect(heroPos)
if allComonpentExtraAdd and #allComonpentExtraAdd > 0 then
for i = 1, #allComonpentExtraAdd do
allProVal[allComonpentExtraAdd[i].Id] = allProVal[allComonpentExtraAdd[i].Id] + allComonpentExtraAdd[i].value
end
end
--异妖配件全职业的加成
local allComonpentExtraAdd2 = this.GetExtraAddEffect(0)
if allComonpentExtraAdd2 and #allComonpentExtraAdd2 > 0 then
for i = 1, #allComonpentExtraAdd2 do
allProVal[allComonpentExtraAdd2[i].Id] = allProVal[allComonpentExtraAdd2[i].Id] + allComonpentExtraAdd2[i].value
end
end
return allProVal
end
-------------红点数据处理--------------------
--异妖主界面是否存在红点
function this.GetDiffMonsterRedPointStatus()
local meetCondition = false
meetCondition = meetCondition or this.CanActiveComponent() or this.CanUpGradComponent() or
this.CanActiveDiffMonster() or this.CanUpGradDiffMonster()
return meetCondition
end
function this.GetSingleDiffMonsterRedPointStatus(pokemon)
local meetCondition = false
meetCondition = meetCondition or this.SingleActiveComponent(pokemon) or this.SingleUpGradComponent(pokemon) or
this.SingleActiveDiffMonster(pokemon) or this.SingleUpGradDiffMonster(pokemon)
return meetCondition
end
--单个异妖是否存在可以激活的妖魂
function this.SingleActiveComponent(pokemon)
local meetCondition = false
for _, pokemonComponent in pairs(pokemon.pokemoncomonpentList) do
if pokemonComponent.level <= 0 and BagManager.GetItemCountById(pokemonComponent.id) > 0 then
meetCondition = true
break
end
end
return meetCondition
end
--所有异妖是否存在可以激活的妖魂
function this.CanActiveComponent()
local meetCondition = false
for _, pokemon in pairs(this.pokemonList) do
meetCondition = meetCondition or this.SingleActiveComponent(pokemon)
if meetCondition then
break
end
end
return meetCondition
end
--单个异妖是否存在可以进阶妖魂
function this.SingleUpGradComponent(pokemon)
local meet = false
table.walk(pokemon.pokemoncomonpentList, function(componentInfo)
local maxLv = #componentInfo.upLvMateriaConfiglList
local currentLv = componentInfo.level + 1
if currentLv >= maxLv then
meet = false
else
local materialEnough = true
if currentLv > 0 then
local costMaterials = componentInfo.upLvMateriaConfiglList[currentLv].Cost
for idx = 1, #costMaterials do
materialEnough = materialEnough and BagManager.GetItemCountById(costMaterials[idx][1]) >= costMaterials[idx][2]
end
else
materialEnough = false
end
meet = meet or materialEnough
end
end)
return meet
end
--所有异妖是否存在可进阶妖魂
function this.CanUpGradComponent()
local meetCondition = false
for _, pokemon in pairs(this.pokemonList) do
meetCondition = meetCondition or this.SingleUpGradComponent(pokemon)
if meetCondition then
break
end
end
return meetCondition
end
--通过配件id获取异妖信息
function this.GetPokemonDataByComonpentId(_comonpentId)
for j = 1, #this.pokemonList do
for i = 1, #this.pokemonList[j].pokemoncomonpentList do
local comonpentData = this.pokemonList[j].pokemoncomonpentList[i]
if comonpentData.id == _comonpentId then
return this.pokemonList[j]
end
end
end
end
--单个异妖是否可以激活
function this.SingleActiveDiffMonster(pokemon)
if pokemon.stage > 0 then
return false
end
local activeComponent = 0
for _, pokemonComponent in pairs(pokemon.pokemoncomonpentList) do
if pokemonComponent.level > 0 then
activeComponent = activeComponent + 1
end
end
return activeComponent >= #pokemon.pokemoncomonpentList
end
--所有异妖是否存在可激活异妖
function this.CanActiveDiffMonster()
local meetCondition = false
for _, pokemon in pairs(this.pokemonList) do
meetCondition = meetCondition or this.SingleActiveDiffMonster(pokemon)
if meetCondition then
break
end
end
return meetCondition
end
--单个异妖是否可以进阶
function this.SingleUpGradDiffMonster(pokemon)
local meet = true
if pokemon.stage >= #pokemon.pokemonUpLvConfigList then
meet = false
else
meet = this.JudgeComponentsMeet(pokemon) and this.JudgeMaterialCostMeet(pokemon)
end
return meet
end
--配件等级进阶判定
function this.JudgeComponentsMeet(pokemon)
local meet = true
table.walk(pokemon.pokemoncomonpentList, function(componentInfo)
meet = meet and componentInfo.level > pokemon.stage
end)
return meet
end
--材料消耗是否都满足
function this.JudgeMaterialCostMeet(pokmon)
local meet = true
local costMaterials = pokmon.pokemonUpLvConfigList[pokmon.stage + 1].configData.Cost
for i = 1, #costMaterials do
meet = meet and BagManager.GetItemCountById(costMaterials[i][1]) >= costMaterials[i][2]
end
return meet
end
--所有异妖是否存在可进阶异妖
function this.CanUpGradDiffMonster()
local meetCondition = false
for _, pokemon in pairs(this.pokemonList) do
meetCondition = meetCondition or this.SingleUpGradDiffMonster(pokemon)
if meetCondition then
break
end
end
return meetCondition
end
--获取异妖技能最大等级( 秘技)
function this.GetDifferSkillMaxLevel(type)
local curHeroData = ConfigManager.GetConfig(ConfigName.DifferDemonsStageConfig)
local maxLv = 0
for id, _ in ConfigPairs(curHeroData) do
if math.floor(id / 100) == type then
maxLv = maxLv + 1
end
end
return maxLv
end
function this.GetDiffMonsterByComponentId(componentId)
local diffMonsterId
local diffDemonsConfig = ConfigManager.GetConfig(ConfigName.DifferDemonsConfig)
for idx, diffMonsterInfo in ConfigPairs(diffDemonsConfig) do
local index = table.indexof(diffMonsterInfo.ComonpentList, componentId)
if index then
diffMonsterId = idx
break
end
end
return diffMonsterId
end
---------------------------------------------------------------------------
2020-06-23 18:36:24 +08:00
return DiffMonsterManager