Files
chuanqi-server-instance/LogicServer/data/functions/ActorSystems/HeroSystem/HeroSystemCommon.txt
aixianling 00ee9dd8ea init
2024-12-16 13:51:31 +08:00

291 lines
8.0 KiB
Plaintext

--英雄系统
--#include "data\config\Hero\HeroConfig.txt" once
--人物升级时判断是否自动给予英雄
function AutoAddHero(sysarg,level)
print("[DEBUG] AutoAddHero, level="..level)
for k,v in ipairs(HeroConfig.HeroList) do
if level >= v.OpenLevel and v.AutoGet == true then
local hasHero = Hero.getHeroProperty(sysarg,k,0)
if hasHero == 0 then
if Hero.canAddHero(sysarg,false) == true then
--添加英雄和技能
Hero.addHero(sysarg,k,1,1)
HeroLearnSkill(sysarg,k,1)
Actor.sendTipmsg(sysarg, OldLang.Script.Hero006, ttFlyTip)
end
end
end
end
end
--英雄经验是否已满
function HeroExpIsFull(sysarg,AddExp)
local nHeroId = Hero.getBattleHeroId(sysarg)
if nHeroId == -1 then
nHeroId = 1
end
local Stage = Hero.getHeroProperty(sysarg,nHeroId,enHeroStage)
if Stage == 0 then
return false
end
local Level = Hero.getHeroProperty(sysarg,nHeroId,enHeroLevel)
local Exp = Hero.getHeroProperty(sysarg,nHeroId,enHeroExp)
local cfg = HeroConfig.HeroList[nHeroId]
if not cfg then
return false
end
local LevelCfg = cfg.Levels[Level]
local StageCfg = cfg.Stages[Stage]
if not StageCfg or not LevelCfg then
return false
end
local MaxLevel = StageCfg.MaxLevel
local MaxExp = LevelCfg.LevelUpExp
if Level == MaxLevel and ((Exp + AddExp) >= MaxExp) then
return true
end
return false
end
--英雄升级
function HeroLevelUp(sysarg)
local nHeroId = Hero.getBattleHeroId(sysarg)
if nHeroId == -1 then
nHeroId = 1
end
local Stage = Hero.getHeroProperty(sysarg,nHeroId,enHeroStage)
if Stage == 0 then
return false
end
local Level = Hero.getHeroProperty(sysarg,nHeroId,enHeroLevel)
local nExp = 0
for i=1,#HeroConfig.HeroExpConfig do
nExp = nExp + UseHeroLevlUpItem(sysarg, nHeroId, HeroConfig.HeroExpConfig[i].itemid, HeroConfig.HeroExpConfig[i].exp)
end
local NewLevel = Hero.getHeroProperty(sysarg,nHeroId,enHeroLevel)
local AddLevel = NewLevel - Level
if nExp > 0 then
if AddLevel > 0 then
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.Hero013,nExp,AddLevel), ttFlyTip)
else
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.Hero012,nExp), ttFlyTip)
end
end
end
function UseHeroLevlUpItem(sysarg, nHeroId,itemidx,ItemExp)
local count = Actor.getItemCount(sysarg, itemidx)
if count == 0 then return 0 end
--判断英雄等级是否已经到了本阶最高等级
local Stage = Hero.getHeroProperty(sysarg,nHeroId,enHeroStage)
local Level = Hero.getHeroProperty(sysarg,nHeroId,enHeroLevel)
local Exp = Hero.getHeroProperty(sysarg,nHeroId,enHeroExp)
local cfg = HeroConfig.HeroList[nHeroId]
if not cfg then
return 0
end
local LevelCfg = cfg.Levels[Level]
local StageCfg = cfg.Stages[Stage]
if not StageCfg or not LevelCfg then
return 0
end
local MaxLevel = StageCfg.MaxLevel
local MaxExp = LevelCfg.LevelUpExp
if Level == MaxLevel and Exp >= MaxExp then
return 0
end
local canAddExp = MaxExp - Exp
if Level < MaxLevel then
for idx = Level + 1, MaxLevel do
LevelCfg = cfg.Levels[idx]
canAddExp = canAddExp + LevelCfg.LevelUpExp
end
end
local useCount = math.ceil(canAddExp/ItemExp)
if useCount > count then
useCount = count
end
local logId,logStr = 303,"HeroExp"
useCount = Actor.removeItem(sysarg,itemidx,useCount,-1,-1,-1,logStr,logId)
if useCount > 0 then
local addExp = ItemExp * useCount
if addExp > canAddExp then
addExp = canAddExp
end
Hero.addExp(sysarg, addExp,nHeroId)
return addExp
end
return 0
end
--英雄进阶
function HeroUpStage(sysarg,heroid,stage,bless,count)
--BaseFuc_Print("HeroUpStage:", heroid,stage,bless)
if count <= 0 then
return
end
local ybReplace = true
if count == 1 then
ybReplace = false
end
local HeroCfg = HeroConfig.HeroList[heroid]
if not HeroCfg then
return
end
local StageCfg = HeroCfg.Stages[stage]
if not StageCfg then
return
end
--已达最高阶
local NewStageCfg = HeroCfg.Stages[stage+1]
if not NewStageCfg then
Actor.sendTipmsg(sysarg, OldLang.Script.Hero001, ttFlyTip)
return
end
local oldbless = bless
local realCount = count
local Succ = false
for i=1,count do
if not CheckConsumeCondReplaceEx(sysarg, StageCfg.Consumes, i, ybReplace) then
realCount = i-1
break
end
--如果祝福值已满,进阶必成功,否则按几率提升
if bless >= StageCfg.MaxBless then
Succ = true
realCount = i
break
else
local RandNum = System.getRandomNumber(10000)
if RandNum <= GetStageSuccRate(StageCfg.SuccRate,bless) then
Succ = true
realCount = i
break
else
bless = bless + GetStageUpBless(StageCfg.AddBless)
if bless > StageCfg.MaxBless then
bless = StageCfg.MaxBless
end
end
end
end
if realCount <= 0 then
return
end
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.Hero010,realCount), ttTipmsgWindow)
if not Succ then
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.Hero011,bless-oldbless), ttTipmsgWindow)
end
local logId, logStr = 92, "HeroStageUp"
if UseConsumeCondReplaceEx(sysarg, StageCfg.Consumes, realCount, ybReplace, logId, logStr) ~= true then
return
end
if Succ then
local newStage = stage + 1
Hero.StageUp(sysarg, heroid,newStage,0)
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.Hero002,newStage), ttFlyTip)
--升阶成功,自动学习技能
HeroLearnSkill(sysarg,heroid,newStage)
local broadcast = StageCfg.broadcast or false
if broadcast then
local msg = string.format(OldLang.Script.Hero008,Actor.getName(sysarg),newStage)
System.broadcastTipmsg(msg, ttScreenCenter + ttChatWindow,HeroCfg.OpenLevel)
end
else
Hero.StageUp(sysarg,heroid,stage,bless)
Actor.sendTipmsg(sysarg, OldLang.Script.Hero003, ttFlyTip)
end
end
function GetStageSuccRate(cfg,bless)
for k,v in ipairs(cfg) do
if bless >= v.Min and bless <= v.Max then
return v.rate
end
end
return 0
end
function GetStageUpBless(cfg)
local nMin,nMax = cfg[1], cfg[2]
local rand = System.getRandomNumber(nMax - nMin) + nMin
return rand
end
--英雄学习技能
function HeroLearnSkill(sysarg,heroid,stage)
local HeroCfg = HeroConfig.HeroList[heroid]
if not HeroCfg then
return
end
for k, v in ipairs(HeroCfg.Skills) do
if v.stage == stage and Hero.getSkillLevel(sysarg,heroid, v.skillid) <= 0 then
local flag = Hero.learnSkill(sysarg,heroid,v.skillid)
if flag then
Actor.sendTipmsg(sysarg, OldLang.Script.Hero007, ttFlyTip)
end
end
end
end
--英雄技能升级
function HeroUpSkill(sysarg,heroid,skillid,level)
--BaseFuc_Print("HeroUpSkill:",heroid,skillid,level)
local cfg = GetHeroSKill(heroid,skillid)
if not cfg then
return
end
local LevelCfg = cfg.Levels[level]
if not LevelCfg then
return
end
--所需阶
local stage = Hero.getHeroProperty(sysarg,heroid,enHeroStage)
if stage < LevelCfg.stage then
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.Hero004,LevelCfg.stage), ttFlyTip)
return
end
--消耗
if CommonFunc.Consumes.Check(sysarg, LevelCfg.Consumes) ~= true then
return
end
local logId, logStr = 91, "HeroSkillUp"
if CommonFunc.Consumes.Remove(sysarg, LevelCfg.Consumes, logId, logStr) ~= true then
return
end
Hero.skillLevelUp(sysarg,heroid,skillid)
Actor.sendTipmsg(sysarg, OldLang.Script.Hero005, ttFlyTip)
end
function GetHeroSKill(heroid,skillid)
if not HeroConfig.HeroList[heroid] then
return nil
end
for k,v in ipairs(HeroConfig.HeroList[heroid].Skills) do
if v.skillid == skillid then
return v
end
end
return nil
end
--英雄给人物加BUFF
function HeroAddBuffToOwner(sysarg,heroid,skillid,skilllevel)
local SkillCfg = GetHeroSKill(heroid,skillid)
if not SkillCfg then
return
end
local SkillLevelCfg = SkillCfg.Levels[skilllevel] or nil
if not SkillLevelCfg then
return
end
local BuffCfg = SkillLevelCfg.Buff or nil
if BuffCfg then
for i=1,#BuffCfg do
Actor.addBuffById(sysarg, BuffCfg[i])
end
end
end