本WIKI由呜呜kurumi申请于2021年03月15日创建,编辑权限开放

如有内容错误,可以联系站长呜呜kurumi提交错误,赛马娘WIKI力求给大家带来最好的体验,也欢迎训练员们和我们一起建设
bugfix0531
全站通知:

模块:支援卡突破属性

来自赛马娘WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:支援卡突破属性/doc创建

local p={}
local data = require('模块:支援卡效果数据库内容')

-- 分段线性插值:开始 --
function w0(x,X)
	if(x >= X[1] and x < X[2])then
		return (X[2]-x)/(X[2]-X[1])
	else
		return 0
	end
end
function wj(j,x,X)
	if(x >= X[j-1] and x < X[j])then
		return (X[j-1]-x)/(X[j-1]-X[j])
	elseif(x >= X[j] and x < X[j+1])then
		return (X[j+1]-x)/(X[j+1]-X[j])
	else
		return 0
	end
end
function wn(n,x,X)
	if(x >= X[n-1] and x < X[n])then
		return (X[n-1]-x)/(X[n-1]-X[n])
	else
		return 0
	end
end
-- Piecewise Linear Interpolation
function PLI(x,X,Y)
	n = #X
	ans = w0(x,X)*Y[1]+wn(n,x,X)*Y[n]
	for i=2,n-1 do
		ans = ans + wj(i,x,X)*Y[i]
	end
	return ans
end
-- 分段线性插值:结束 --

function getLvValue(lv,v)
	-- 获取不同等级的值
	Lv_array = {1,5,10,15,20,25,30,35,40,45,50}
	Value_array = {tonumber(v.init)}
	for i=2,11 do
		Value_array[i] = tonumber(v['limit_lv'..Lv_array[i]])
	end
	X = {}
	Y = {}
	for i, v in ipairs(Value_array) do
    	if (v ~= -1) then
    		table.insert(X, Lv_array[i])
    		table.insert(Y, Value_array[i])
    	end
	end 
	if (lv < X[1])then
		return 0
	end
	if (lv >= X[#X])then
		return Y[#X]
	end
	if (#X >= 2) then
		return PLI(lv,X,Y)
	end

end

function getGradeValue(grade,v)
	Rarity = string.sub(v.id, 1 ,1)
	Value = 0
	if(Rarity == "1")then
		-- R卡
		lv = 20+5*grade
		Value =  getLvValue(lv,v)
	elseif(Rarity == "2")then
		-- SR卡
		lv = 25+5*grade
		Value = getLvValue(lv,v)
	else
		-- SSR卡
		lv = 30+5*grade
		Value = getLvValue(lv,v)
	end
	-- 游戏中向下取整
	return math.floor(Value)
end

function getUniqueValue(grade,qLv,Value,id)
	Rarity = string.sub(id, 1 ,1)
	lv = 0
	if(Rarity == "1")then
		-- R卡
		lv = 20+5*grade
	elseif(Rarity == "2")then
		-- SR卡
		lv = 25+5*grade
	else
		-- SSR卡
		lv = 30+5*grade
	end
	if(lv >= tonumber(qLv))then
		return tonumber(Value)
	else
		return 0
	end
end

function getTypeString(TypeNumber)
	local TypeString
	if(TypeNumber == "1")then
		TypeString = "友情加成"
	elseif(TypeNumber == "2")then
		TypeString = "干劲效果提升"
	elseif(TypeNumber == "3")then
		TypeString = "速度加成"
	elseif(TypeNumber == "4")then
		TypeString = "耐力加成"
	elseif(TypeNumber == "5")then
		TypeString = "力量加成"
	elseif(TypeNumber == "6")then
		TypeString = "毅力加成"
	elseif(TypeNumber == "7")then
		TypeString = "智力加成"
	elseif(TypeNumber == "8")then
		TypeString = "训练效果提升"
	elseif(TypeNumber == "9")then
		TypeString = "初期速度提升"
	elseif(TypeNumber == "10")then
		TypeString = "初期耐力提升"
	elseif(TypeNumber == "11")then
		TypeString = "初期力量提升"
	elseif(TypeNumber == "12")then
		TypeString = "初期毅力提升"
	elseif(TypeNumber == "13")then
		TypeString = "初期智力提升"
	elseif(TypeNumber == "14")then
		TypeString = "初期羁绊计量格提升"
	elseif(TypeNumber == "15")then
		TypeString = "赛后加成"
	elseif(TypeNumber == "16")then
		TypeString = "粉丝数加成"
	elseif(TypeNumber == "17")then
		TypeString = "启发等级提升"
	elseif(TypeNumber == "18")then
		TypeString = "启发发生率提升"
	elseif(TypeNumber == "19")then
		TypeString = "得意率提升"
	elseif(TypeNumber == "20")then
		TypeString = "速度最大值提升"
	elseif(TypeNumber == "21")then
		TypeString = "耐力最大值提升"
	elseif(TypeNumber == "22")then
		TypeString = "力量最大值提升"
	elseif(TypeNumber == "23")then
		TypeString = "毅力最大值提升"
	elseif(TypeNumber == "24")then
		TypeString = "智力最大值提升"
	elseif(TypeNumber == "25")then
		TypeString = "事件回复量提升"
	elseif(TypeNumber == "26")then
		TypeString = "事件效果提升"
	elseif(TypeNumber == "27")then
		TypeString = "失败率下降"
	elseif(TypeNumber == "28")then
		TypeString = "体力消费下降"
	elseif(TypeNumber == "29")then
		TypeString = "迷你游戏效果提升"
	elseif(TypeNumber == "30")then
		TypeString = "技能Pt加成"
	elseif(TypeNumber == "31")then
		TypeString = "智力友情回复量提升"
	else
		TypeString = "未知效果"
		mw.log("数据库中存在尚未定义的效果,其类型编号为:"..TypeNumber)
	end
	return TypeString
end

p["突破属性查询"]=function(frame)
	local id = frame.args["id"]
	local Effect_array = {}
	-- 等级加成
	local d_effect = data.support_card_effect_table
	for i,v in pairs (d_effect) do
		if(v.id == id)then
			TypeString = getTypeString(v.type)
			for tp = 0,4 do
				Effect_array[TypeString..'_'..tp] = getGradeValue(tp,v)
				-- mw.log(TypeString..'_'..tp..'突破',getGradeValue(tp,v))
			end
		end
	end
	-- 固有加成
	local unique_effect = data.support_card_unique_effect
	for i,v in pairs (unique_effect) do
		if(v.id == id)then
			-- 第一个固有加成
			if(v.type_0 ~= "0" and tonumber(v.type_0)<100 )then
				TypeString = getTypeString(v.type_0)
				for tp = 0,4 do
					-- 判断固有加成是否与等级加成一致
					if(Effect_array[TypeString..'_'..tp]) ~= nil then
						Effect_array[TypeString..'_'..tp] = Effect_array[TypeString..'_'..tp] + getUniqueValue(tp,v.lv,v.value_0,v.id)
					else 
						Effect_array[TypeString..'_'..tp] = getUniqueValue(tp,v.lv,v.value_0,v.id)
					end
					--mw.log(TypeString..'_'..tp..'突破固有',getUniqueValue(tp,v.lv,v.value_0,v.id))
				end
			end
			-- 第二个固有加成
			if(v.type_1 ~= "0" and tonumber(v.type_0)<100 )then
				TypeString = getTypeString(v.type_1)
				for tp = 0,4 do
					-- 判断固有加成是否与等级加成一致
					if(Effect_array[TypeString..'_'..tp]) ~= nil then
						Effect_array[TypeString..'_'..tp] = Effect_array[TypeString..'_'..tp] + getUniqueValue(tp,v.lv,v.value_1,v.id)
					else 
						Effect_array[TypeString..'_'..tp] = getUniqueValue(tp,v.lv,v.value_1,v.id)
					end
					--mw.log(TypeString..'_'..tp..'突破固有',getUniqueValue(tp,v.lv,v.value_1,v.id))
				end
			end
			-- 处理特殊固有加成
			if(tonumber(v.type_0) >= 100)then
				mw.log("此支援卡存在特殊的固有加成!编号:"..v.type_0)
			end
		end
		
	end
	
	-- 输出最终结果
	--mw.logObject(Effect_array)
	for key, value in pairs(Effect_array) do
		frame:callParserFunction{name='#vardefine',args={key..'突破',value}}
		-- mw.log(key..'突破',value)
	end
end


return p