PracticeManager = {} local this = PracticeManager local XiuXianConfig = ConfigManager.GetConfig(ConfigName.XiuXianConfig) local PropertyConfig = ConfigManager.GetConfig(ConfigName.PropertyConfig) local XiuXianSkillConfig = ConfigManager.GetConfig(ConfigName.XiuXianSkillConfig) local SkillBaseConfig= ConfigManager.GetConfig(ConfigName.PlayerSkillBasicTable) local skillSystemConfig = ConfigManager.GetConfigData(ConfigName.GlobalSystemConfig,FUNCTION_OPEN_TYPE.PLAYER_SKILL) function this.Initialize() this.PracticeLevel = 1--小境界id this.PracticeBigLevel = 1--大境界数 this.StarNum = 0--星星的数量 -- this.PracticeConfigData = {} this.ImprintServerData = {}--服务器发来的神印信息 this.BigLevelImprintList = {}--大境界对应的神印 this.HeroWithImprintList = {}--英雄身上的神印 this.PointsData = {} this.LinesData = {} this.FourQuadrantData={}--四象心法数据 this.fourQuadrantUpStarPropMap={}--四象心法进阶属性加成(职业id:<属性id:属性值>) this.playerSkillList={} --主角技能列表 this.CultivationLevel = 0 for key, value in ConfigPairs(SkillBaseConfig) do this.playerSkillList[value.Id]=0 end end --=========================主角技能 function this.GetSkillInfo() return this.playerSkillList end --更新角色技能 function this.UpdataPlayerSkill(msg) for i = 1, #msg do if this.playerSkillList[msg[i].skillId] then this.playerSkillList[msg[i].skillId]=msg[i].skillLv end end end --设置角色技能等级 function this.SetPlayerSkill(id,lv) if this.playerSkillList[id] then this.playerSkillList[id]=lv end end --设置角色技能等级 function this.AddPlayerSkill(lv) if XiuXianConfig[lv].PlayerSkill then for i = 1, #XiuXianConfig[lv].PlayerSkill do this.playerSkillList[XiuXianConfig[lv].PlayerSkill[i]]=1 PlayerPrefs.SetInt(PlayerManager.uid.."playerSkillRed",XiuXianConfig[lv].PlayerSkill[i]) end end end --检测主角技能红点 function this.CheckPlayerSkillRed(redType) if skillSystemConfig.IsOpen==0 then return false end local id=redType-5000 local lv=this.playerSkillList[id] if id~=100 and lv>=this.playerSkillList[100] then return false end local openId=PlayerPrefs.GetInt(PlayerManager.uid.."playerSkillRed") if openId==id then return true end if lv~=0 then local currData=ConfigManager.TryGetConfigDataByDoubleKey(ConfigName.PlayerSkill,"SkillID",id,"Level",lv) local nextData=ConfigManager.TryGetConfigDataByDoubleKey(ConfigName.PlayerSkill,"SkillID",id,"Level",lv+1) if nextData then local config=this.GetCurConfigData() if config and nextData.Level>config.PlayerSkillLvMax then return false end local isShow=true for i = 1, #currData.LvupCost do if BagManager.GetItemCountById(currData.LvupCost[i][1]) 0 and this.PracticeLevel or 1 this.PracticeBigLevel = XiuXianConfig[this.PracticeLevel].RealmId this.StarNum = FightLevelManager.GetAllChapterStars() HeroPropManager.SetFuncPropDirty(Func_Prop_Type.Practice) HeroPropManager.SetFuncPropDirty(Func_Prop_Type.Cultivation) end --获取当前等级表数据 function this.GetCurConfigData() return XiuXianConfig[this.PracticeLevel] end function this.BuildAddTemplate() local TemplateList = {} for _, configInfo in ConfigPairs(PropertyConfig) do if configInfo.IfShow == 1 or configInfo.IfShow == 2 then TemplateList[configInfo.PropertyId] = 0 end end return TemplateList end --获取每一小点属性加成 function this.GetSinglePointAdd() local singlePointAddList = {} local TotalPros = XiuXianConfig[this.PracticeLevel].TotalPros for i = 1, #TotalPros do if not singlePointAddList[TotalPros[i][1]] then singlePointAddList[TotalPros[i][1]] = 0 end singlePointAddList[TotalPros[i][1]] = TotalPros[i][2] end return singlePointAddList end --获取当前获得的所有属性相加(用于计算战力) function this.GetCurAllGetAdd() local PropertyList = this.BuildAddTemplate() for i = 1, this.PracticeLevel do -- LogPink("i:"..tostring(i)) if XiuXianConfig[i].TotalPros then local Pros = XiuXianConfig[i].TotalPros -- LogGreen("#Pros:"..tostring(#Pros)) for i = 1, #Pros do -- LogBlue("ProsId:"..tostring(Pros[i][1]).." ProsNum:"..tostring(Pros[i][2])) if PropertyConfig[Pros[i][1]].Style == 1 then PropertyList[Pros[i][1]] = PropertyList[Pros[i][1]] + Pros[i][2] elseif PropertyConfig[Pros[i][1]].Style == 2 then PropertyList[Pros[i][1]] = PropertyList[Pros[i][1]] + Pros[i][2] end end end end return PropertyList end --获取当前获得的所有属性相加(用于界面展示) function this.GetCurAllGetAddForShow() local PropertyList = this.BuildAddTemplate() for i = 1, this.PracticeLevel do -- LogPink("i:"..tostring(i)) if XiuXianConfig[i].TotalPros then local Pros = XiuXianConfig[i].TotalPros -- LogGreen("#Pros:"..tostring(#Pros)) for i = 1, #Pros do -- LogBlue("ProsId:"..tostring(Pros[i][1]).." ProsNum:"..tostring(Pros[i][2])) if PropertyConfig[Pros[i][1]].Style == 1 then PropertyList[Pros[i][1]] = PropertyList[Pros[i][1]] + Pros[i][2] elseif PropertyConfig[Pros[i][1]].Style == 2 then PropertyList[Pros[i][1]] = PropertyList[Pros[i][1]] + Pros[i][2]/100 end end end end return PropertyList end --获取各个大境界中所有小属性加成的总和 +模板的 function this.GetAddsListWithTemplate() local PropertyList = this.BuildAddTemplate() local addsList = {} for i, v in ConfigPairs(XiuXianConfig) do if v.TotalPros then local Pros = v.TotalPros for i = 1, #Pros do if PropertyConfig[Pros[i][1]].Style == 1 then PropertyList[Pros[i][1]] = PropertyList[Pros[i][1]] + Pros[i][2] elseif PropertyConfig[Pros[i][1]].Style == 2 then PropertyList[Pros[i][1]] = PropertyList[Pros[i][1]] + Pros[i][2] end end end end return PropertyList end --获取各个大境界中所有小属性加成的总和 不加模板的 function this.GetAddsListWithOutTemplate() local addsList = {} for i, v in ConfigPairs(XiuXianConfig) do if not addsList[v.RealmId] then addsList[v.RealmId] = {} end if v.TotalPros then local Pros = v.TotalPros for i = 1, #Pros do if not addsList[v.RealmId][Pros[i][1]] then addsList[v.RealmId][Pros[i][1]] = 0 end if PropertyConfig[Pros[i][1]].Style == 1 then addsList[v.RealmId][Pros[i][1]] = addsList[v.RealmId][Pros[i][1]] + Pros[i][2] elseif PropertyConfig[Pros[i][1]].Style == 2 then addsList[v.RealmId][Pros[i][1]] = addsList[v.RealmId][Pros[i][1]] + Pros[i][2]/100 end end end end return addsList end --获取预览界面数据 function this.GetPreViewData() local AddListData = this.GetAddsListWithOutTemplate() local previewList = {} for i = 1, #AddListData do local data = {} local configData = ConfigManager.GetConfigDataByKey(ConfigName.XiuXianConfig,"RealmId",i) data.RealmName = configData.RealmName data.NeedStarNum = configData.NeedStarNum if configData.RealmDesc then data.RealmDesc = configData.RealmDesc end if this.PracticeBigLevel > i then data.IsActive = 2--完全激活 elseif this.PracticeBigLevel == i then data.IsActive = 1 elseif this.PracticeBigLevel < i then data.IsActive = 0 end data.AddList = AddListData[i] table.insert(previewList,data) end return previewList end --返回预览界面文字 function this.GetPreviewSingleText(id,value) if PropertyConfig[id].Style == 1 then return string.format("全体神将%s",PropertyConfig[id].Info),string.format("+%s",value) elseif PropertyConfig[id].Style == 2 then return string.format("全体神将%s",PropertyConfig[id].Info),string.format("+%s",value).."%" end end --获取所有神印信息 function this.GetAllImprintData() local AllImprintList = {} for i, v in ConfigPairs(XiuXianConfig) do if v.TeamSkill then table.insert(AllImprintList,v) end end return AllImprintList end --服务器发来的神印信息 function this.UpdataImprintDataFromServer(_imprintList) this.BigLevelWithImprint()--初始化大境界/英雄对应的神印 for key, value in pairs(_imprintList) do if value and value.id then if not this.ImprintServerData[value.id] then this.ImprintServerData[value.id] = {} end this.ImprintServerData[value.id].id = value.id this.ImprintServerData[value.id].type = value.type this.ImprintServerData[value.id].subId = value.subId this.ImprintServerData[value.id].state = value.state -- LogBlue("value.id:"..tostring(value.id).." value.type:"..tostring(value.type).." value.subId:"..tostring(value.subId).." value.state:"..tostring(value.state)) if value.state == 1 then this.BigLevelImprintList[XiuXianSkillConfig[value.id].UnlockId] = value.id if value.subId ~= nil and value.subId ~= "" and value.subId ~= "nil" then this.HeroWithImprintList[value.subId] = value.id end end end end end --初始化大境界/英雄对应的神印 function this.BigLevelWithImprint() for i, v in ConfigPairs(XiuXianSkillConfig) do if v.UnlockId > 0 then this.BigLevelImprintList[v.UnlockId] = 0 end end this.HeroWithImprintList = {} end --获取单个神印的信息(服务器+表) function this.GetSingleImprintData(id) if this.ImprintServerData[id] then return this.ImprintServerData[id],XiuXianSkillConfig[id] else return nil,XiuXianSkillConfig[id] end end function this.SetNameColor(name,level) if level == 0 then level = 1 end local clr = "" clr = XiuXianConfig[level].NameFontColor -- LogYellow("name:"..tostring(name).." clr:"..tostring(clr)) return ""..name.."" end --获取大境界对应的段位名称 function this.GetRankNameByLv(lv) for i, v in ConfigPairs(XiuXianConfig) do if v.RealmId==lv then return ""..v.RealmName.."期".."" end end return nil end --查找英雄对应的神印 function this.CheckHeroWearImprint(heroDid) if this.HeroWithImprintList[heroDid] then return this.HeroWithImprintList[heroDid] end return false end --获取小境界点信息 function this.GetPointsData(parentObj) this.PointsData = {} local width = 880--parentObj.transform.rect.width for i, v in ConfigPairs(XiuXianConfig) do if v.RealmId == this.PracticeBigLevel and v.RealmLevel > 0 then local data = {} data.Id = v.Id--Id data.RealmName = string.format("%s·%s",v.RealmName,v.RealmLevelName)--名字 data.RealmLevel = v.RealmLevel--小境界等级 data.TotalPros = v.TotalPros--属性 data.Pos = Vector3.zero--位置 -- data.Updown = 0--1下0上 data.State = this.PracticeLevel >= v.Id and 1 or 0--是否已经激活该点 data.Img = this.PracticeLevel >= v.Id and "x_xiuxing_dian_01" or "x_xiuxing_dian_02"--图片名字 table.insert(this.PointsData,data) end end --设置点的位置 if (#this.PointsData)%2 == 0 then--双数点 local perSpace = width/#this.PointsData local mid = #this.PointsData/2 for i = 1, #this.PointsData do if i <= mid then local x = (i - mid) * perSpace - perSpace/2 local y = math.pow(-1,i) * 60 this.PointsData[i].Pos = Vector3.New(x,y,0) elseif i > mid then local x = (i - mid -1) * perSpace + perSpace/2 local y = math.pow(-1,i) * 60 this.PointsData[i].Pos = Vector3.New(x,y,0) end end elseif (#this.PointsData)%2 == 1 then--单数点 local perSpace = width/#this.PointsData local mid = math.ceil(#this.PointsData/2) for i = 1, #this.PointsData do if i < mid then local x = (i - mid) * perSpace local y = math.pow(-1,i) * 60 this.PointsData[i].Pos = Vector3.New(x,y,0) elseif i > mid then local x = (i - mid) * perSpace local y = math.pow(-1,i) * 60 this.PointsData[i].Pos = Vector3.New(x,y,0) elseif i == mid then local y = math.pow(-1,i) * 60 this.PointsData[i].Pos = Vector3.New(0,y,0) end end end return this.PointsData end --获取境界点间的线的位置和角度 function this.GetLinesData() this.LinesData = {} for i = 1, #this.PointsData do if this.PointsData[i + 1] then local data = {} local x = (this.PointsData[i].Pos.x + this.PointsData[i + 1].Pos.x)/2 data.Pos = Vector3.New(x,0,0) local r = math.acos((this.PointsData[i + 1].Pos.x - this.PointsData[i].Pos.x)/(this.PointsData[i + 1].Pos.y - this.PointsData[i].Pos.y)) if (r/math.pi)* 180 > 90 then data.Rota = Vector3.New(0,0,(r/math.pi)* 180 - 10) else data.Rota = Vector3.New(0,0,(r/math.pi)* 180 + 10) end data.State = this.PointsData[i + 1].State table.insert(this.LinesData,data) end end return this.LinesData end function this.CalculateWorldPos(...) local _args = {...} local pos = Vector3.New(0,0,0) for i = 1, #_args do local objPos = _args[i]:GetComponent("RectTransform").localPosition pos.x = pos.x + objPos.x pos.y = pos.y + objPos.y end return pos end function this.GetSingleAddition(_data) local data = PropertyConfig[_data[1]] if data.Style == 2 then return string.format("全体%s+%s",data.Info,_data[2]/100).."%" elseif data.Style == 1 then return string.format("全体%s+%s",data.Info,_data[2]) end end --升级红点检测 function this.PracticeCheckUpgrade() if not XiuXianConfig[this.PracticeLevel] then return false end local configData = XiuXianConfig[this.PracticeLevel] if this.StarNum >= configData.NeedStarNum then if configData.LevelUpCost then for i = 1, #configData.LevelUpCost do local data = configData.LevelUpCost[i] if BagManager.GetTotalItemNum(data[1]) < data[2] then -- LogRed("return false Upgrade 1") return false end end end -- LogGreen("return true Upgrade") return true end -- LogRed("return false Upgrade 2") return false end --神印红点检测 function this.PracticeCheckImprint() for i, v in ConfigPairs(XiuXianSkillConfig) do if this.ImprintServerData[v.Id] then local str = PlayerPrefs.GetInt(PlayerManager.uid.."Imprint"..v.Id) if str == 0 then -- LogGreen("return true Imprint") return true end end end -- LogRed("return false Imprint") return false end --检测英雄是否附身中并且神印已激活 function this.CheckHeroHaveImprintAndActive(heroDid) if this.HeroWithImprintList[heroDid] then if this.ImprintServerData[this.HeroWithImprintList[heroDid]] then if this.ImprintServerData[this.HeroWithImprintList[heroDid]].state == 1 then return true end end end return false end function this.SetPracticeIcon(obj,level) local spLoader = SpriteLoader.New() local BigLevel = XiuXianConfig[level].RealmId local name = "x_xiuxing_xiaobiao_00"..BigLevel obj:GetComponent("Image").sprite = spLoader:LoadSprite(name) end --每次升级小境界弹出tips function this.ShowTipsOnUpgrade() local prosData = XiuXianConfig[this.PracticeLevel].TotalPros if prosData then PopupTipPanel.ShowTip("突破成功!") AttriTips.ShowAttriTip(prosData) end end --=====================四象心法部分的代码=============================== --初始化四象心法数据 function this.InitFourQuadrantData(_dataList) for i = 1, #_dataList do local professionInfo={} professionInfo.level=_dataList[i].level professionInfo.propertyList=_dataList[i].propertyInfoList this.FourQuadrantData[_dataList[i].professionId]=professionInfo end for i = 1, 4 do if this.FourQuadrantData[i]==nil then local professionInfo={} professionInfo.level=0 this.FourQuadrantData[i]=professionInfo end end this.UpdateUpStarProperty() -- 设置四象心法脏数据 HeroPropManager.SetFuncPropDirty(Func_Prop_Type.FourQua) end --更新进阶属性数据 function this.UpdateUpStarProperty() for professionId,professionInfo in pairs(this.FourQuadrantData) do local upStarProperty={} for i = 0,professionInfo.level-1 do local fourQuadConfig = ConfigManager.GetConfigDataByKey(ConfigName.FourQuadrantConfig,"Star",i) for j = 1, #fourQuadConfig.PropStar do local propArr=fourQuadConfig.PropStar[j] if upStarProperty[propArr[1]] then upStarProperty[propArr[1]]=upStarProperty[propArr[1]]+propArr[2] else upStarProperty[propArr[1]]=propArr[2] end end end this.fourQuadrantUpStarPropMap[professionId]=upStarProperty end end --获取四象心法共鸣等级 function this.GetFourQuadrantGongmingLv() local lv=0 if this.FourQuadrantData[1] then lv=this.FourQuadrantData[1].level end for i = 1, 4 do if not this.FourQuadrantData[i] then return 0 end if lv>this.FourQuadrantData[i].level then lv=this.FourQuadrantData[i].level end end return lv end ---刷新四象心法对应职业相关属性 function this.UpdateFourQuadrantProperty(_professionId,_propertyList) if this.FourQuadrantData[_professionId] then this.FourQuadrantData[_professionId].propertyList=_propertyList else local professionInfo={} professionInfo.level=0 professionInfo.propertyList=_propertyList this.FourQuadrantData[_professionId]=professionInfo end -- 设置四象心法脏数据 HeroPropManager.SetFuncPropDirty(Func_Prop_Type.FourQua) end --进阶刷新本地数据 function this.UpStarUpdateFourQuadrantData(_professionId,_msg) this.FourQuadrantData[_professionId].level=_msg.starLv this.FourQuadrantData[_professionId].propertyList=_msg.infoList this.UpdateUpStarProperty() -- 设置四象心法脏数据 HeroPropManager.SetFuncPropDirty(Func_Prop_Type.FourQua) end --四象心法计算指定职业的属性加成 function this.HeroCalculateFourQuaWarForce(_professionId) local addAllProVal={} local professionInfo=this.FourQuadrantData[_professionId] if not professionInfo then return addAllProVal end if professionInfo.propertyList then ---计算强化属性 for i = 1, #professionInfo.propertyList do local propertyInfo = professionInfo.propertyList[i] if propertyInfo.propertyNum > 0 then if addAllProVal[propertyInfo.propertyId] then addAllProVal[propertyInfo.propertyId]=addAllProVal[propertyInfo.propertyId]+propertyInfo.propertyNum else addAllProVal[propertyInfo.propertyId]=propertyInfo.propertyNum end end end ---计算进阶属性 if this.fourQuadrantUpStarPropMap[_professionId] then local upStarProp=this.fourQuadrantUpStarPropMap[_professionId] for propertyId,propertyNum in ipairs(upStarProp)do addAllProVal[propertyId]=addAllProVal[propertyId]+propertyNum end end end --计算共鸣属性加成 if this.GetFourQuadrantGongmingLv()>0 then local fourQuadConfig = ConfigManager.GetConfigDataByKey(ConfigName.FourQuadrantConfig,"Star",this.GetFourQuadrantGongmingLv()) for i = 1, #fourQuadConfig.PropResonance do local propAdd=fourQuadConfig.PropResonance[i] if addAllProVal[propAdd[1]] then addAllProVal[propAdd[1]]=addAllProVal[propAdd[1]]+propAdd[2] else addAllProVal[propAdd[1]]=propAdd[2] end end end -- 计算技能属性加成 for key,value in pairs(this.FourQuadrantData) do if value.level>0 then local fourQuadConfig = ConfigManager.GetConfigDataByKey(ConfigName.FourQuadrantConfig,"Star",value.level) local professionSkillAdd=fourQuadConfig.Skill[key] addAllProVal[professionSkillAdd[1]]=professionSkillAdd[2] end end return addAllProVal end --检测四象心法红点 function this.CheckFourQuadrantRed() for professionId,professionInfo in pairs(this.FourQuadrantData) do if this.CheckIsUpStarCondition(professionId) then if this.CheckIsUpStarByProfessionId(professionId) then return true end else if this.CheckIsUpByProfessionId(professionId) then return true end end end return false end ---检测四象心法指定职业进阶条件是否满足 function this.CheckIsUpStarByProfessionId(_professionId) local professionInfo=PracticeManager.FourQuadrantData[_professionId] if not professionInfo then return false end if professionInfo.level>=5 then return false end local fourQuadConfig = ConfigManager.GetConfigDataByKey(ConfigName.FourQuadrantConfig,"Star",professionInfo.level) for i = 1, #fourQuadConfig.PropLimit do local propLimitArr=fourQuadConfig.PropLimit[i] local propertyInfo= professionInfo.propertyList[propLimitArr[1]] if not propertyInfo then return false end if propertyInfo.propertyNum this.CultivationLevel then FormationManager.UserPowerChanged() if (PlayerManager.maxForce - achivePower) > statePower then return true end end return false end function this.GetCultivationPros() local allPros = {} local data1 = this.GetCurConfigData().ProRank local data2 = this.GetCurConfigData().ProLevel for i = 1, #data1 do if this.CultivationLevel == 0 then allPros[data1[i][1]] = 0 else allPros[data1[i][1]] = data1[i][2] + data2[i][2]*this.CultivationLevel --LogRed("Id:"..tostring(data1[i][1]).." value:"..tostring(allPros[data1[i][1]])) end end return allPros end return PracticeManager