291 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
--英雄系统
 | 
						|
--#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
 |