123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- require "dev/Condition/ConditionBase"
- require "dev/Condition/LevelCondition"
- require "dev/Condition/TimeCondition"
- require "dev/Condition/CareerCondition"
- require "dev/Condition/RechargeCondition"
- require "dev/Condition/VIPCondition"
- require "dev/Condition/BagItemCondition"
- require "dev/Condition/UnionCondition"
- ConditionManager = {}
- local this = ConditionManager
- local excuterMap = {}
- ---获取条件类实例
- ---@param singleCondition string|table 单个条件
- ---@return ConditionBase
- function ConditionManager.GenerateSingleCondition(singleCondition)
- if( type(singleCondition) == "table")then
- local stype = singleCondition[1]
- local param = singleCondition[2] --singleCondition[2]
- if table.count(singleCondition) > 2 then
- param = {}
- for i = 2 ,table.count(singleCondition) do
- table.insert(param,singleCondition[i])
- end
- end
- local classNum = math.floor(stype / 100)
- local comparatorNum = stype % 100
- local instance
- local excuter = excuterMap[classNum]
- if excuter then
- instance = excuter(comparatorNum,param)
- else
- SL:LogError(string.format('%s类型条件不存..参数..%s',classNum,tostring(param)))
- end
- return instance
- else
- local strs = string.split(singleCondition,'#')
- local stype = tonumber(strs[1])
- local param = string.replace(singleCondition,strs[1]..'#','')--strs[2]
- local classNum = math.floor(stype / 100)
- local comparatorNum = stype % 100
- local instance
- local excuter = excuterMap[classNum]
- instance = excuter(comparatorNum,param)
- return instance
- end
- end
- function ConditionManager.Init()
- this.RegistExcuters()
- end
- function ConditionManager.RegistExcuters()
- this.RegistExcuter(1, LevelCondition)
- this.RegistExcuter(2, RechargeCondition)
- this.RegistExcuter(9, TimeCondition)
- this.RegistExcuter(12, VIPCondition)
- this.RegistExcuter(23, BagItemCondition)
- this.RegistExcuter(25, UnionCondition)
- end
- ---注册条件
- ---@param head number 条件的大类 如101除百是1
- ---@param class ConditionBase 对应的条件类
- function ConditionManager.RegistExcuter(head, class)
- excuterMap[head] = class
- class.type = head
- end
- ---对外接口 判断条件集是否满足 案例(等级大于等于1并且小于等于10 )
- ---@param conditionCfg string|table 具体的条件 支持#,&符号
- ---@return boolean
- function ConditionManager.Check(conditionCfg)
- if (type(conditionCfg) == "table") then ---样式:{{101,1},{103,10}}
- local singleStrs = conditionCfg
- local andResult = true
- local conditonInstance
- for j = 1, #singleStrs do
- conditonInstance = this.GenerateSingleCondition(singleStrs[j])
- andResult = andResult and conditonInstance:Check()
- if(andResult == false)then
- return andResult
- end
- end
- return andResult
- else ---样式:"101#1&103#10"
- local groupStr = string.split(conditionCfg,'/')
- local result = false
- local conditonInstance
- for i = 1, #groupStr do
- local singleStrs = string.split(groupStr[i],'&')
- local andResult = true
- for j = 1, #singleStrs do
- conditonInstance = this.GenerateSingleCondition(singleStrs[j])
- andResult = andResult and conditonInstance:Check()
- end
- result = result or andResult
- if(result) then
- break
- end
- end
- return result
- end
- end
- ---对外接口 判断条件集是否满足 案例(等级大于等于1并且小于等于10 )或者 (开服天数大于等于1并且小于等于10)
- ---@param conditionCfg string|table 具体的条件 支持#,&,/符号
- ---@return boolean
- function ConditionManager.Check4D(conditionCfg)
- if (type(conditionCfg) == "table") then ---样式:{{{101,1},{103,10}},{{901,1},{903,10}}}
- local groupStr = conditionCfg
- local result = false
- local conditonInstance
- for i = 1, #groupStr do
- local singleStrs = groupStr[i]
- local andResult = true
- for j = 1, #singleStrs do
- conditonInstance = ConditionManager.GenerateSingleCondition(singleStrs[j])
- andResult = andResult and conditonInstance:Check()
- end
- result = result or andResult
- if(result) then
- break
- end
- end
- return result
- else ---样式:"101#1&103#10/901#1&903#10"
- local groupStr = string.split(conditionCfg,'/')
- local result = false
- local conditonInstance
- for i = 1, #groupStr do
- local singleStrs = string.split(groupStr[i],'&')
- local andResult = true
- for j = 1, #singleStrs do
- conditonInstance = this.GenerateSingleCondition(singleStrs[j])
- andResult = andResult and conditonInstance:Check()
- end
- result = result or andResult
- if(result) then
- break
- end
- end
- return result
- end
- end
- ---获取条件里的参数
- ---"901#1&903#11" 返回{1,11}
- function ConditionManager.GetConditionParams(conditionStr)
- local params = {}
- for param in string.gmatch(conditionStr, "#([0-9]+)") do
- table.insert(params, tonumber(param))
- end
- return params
- end
-
- this.Init()
|