模块:Hydrogina/sandbox/AllEnemyInfo

可在模块:Hydrogina/sandbox/AllEnemyInfo/doc创建此模块的帮助文档

p={}
global_enemy_info_list={}

tablehead=[[{| class="wikitable filterable sortable" style="text-align:center; display:table; white-space:normal;"
|-
! class="filterable-head" style="width:15%" |关卡
! class="filterable-head" style="width:15%" |敌人
! class="filterable-head" style="width:7%" data-sort-type="number"|数量
! class="filterable-head" style="width:7%" data-sort-type="number"|级别
! class="filterable-head" style="width:7%" |地位
! class="filterable-head" style="width:7%" data-sort-type="number"|生命值
! class="filterable-head" style="width:7%" data-sort-type="number"|攻击力
! class="filterable-head" style="width:7%" data-sort-type="number"|防御力
! class="filterable-head" style="width:8%" data-sort-type="number"|法术抗性
! class="filterable-head" style="width:8%" data-sort-type="number"|攻击间隔
! class="filterable-head" style="width:8%" data-sort-type="number"|重量等级
! class="filterable-head" style="width:8%" data-sort-type="number"|移动速度
! class="filterable-head" style="width:7%" data-sort-type="number"|攻击范围半径
! class="filterable-head" style="width:7%" data-sort-type="number"|生命恢复速度
]]	
tableend="|}\n"

function ask_enemy(frame,enemy_name,enemy_level,enemy_prop)

	local level_str='#LEVEL'..enemy_level
	if(enemy_prop=="地位级别")then
		level_str=""
	end
	
	local key=enemy_name..level_str..enemy_prop
	
	local ask_str=global_enemy_info_list[key]
	
	if(not ask_str)then
		ask_str=frame:callParserFunction{
		name = '#show:'..enemy_name..level_str, args={
			'?'..enemy_prop..'#'
		}}
	
		if(ask_str=="")then
			ask_str="—"
		end
		
		global_enemy_info_list[key]=ask_str
	end
		

	return ask_str
end

function get_enemy_prop(num)
	enemy_prop_list={"","数量","级别","地位级别","最大生命值","攻击力","防御力","法术抗性","攻击间隔","重量等级","移动速度","攻击范围半径","生命恢复速度"}
	return enemy_prop_list[num]
end

function spilt_ask(str)
	hasprop=string.find(str, "(.*)")
	if(hasprop)then
		name=string.gsub(str,"(.*)","")
		prop_str=string.sub(str, string.find(str, "(.*)"))
		prop_str=string.sub(prop_str, 4,-4)
		
		prop=mw.text.split(prop_str, ";", true)
	else
		name=str
		prop=nil
	end
	
	return name,prop
end

function ask_battle(frame,askcondition)
	battle_str=frame:callParserFunction{
		name = '#ask:'..askcondition, args={
		'?敌人类数',
		format='plainlist',
		propsep=';',
		valuesep=';',
		sep='@',
		headers='hide',
		link='none',
		limit='1000',
		order='asc'
	}}

	battle_table = mw.text.split(battle_str, "@", true)
	battle_name={}
	battle_enemynum={}

	for i = 1, #battle_table do
		
		battle_name[i],temp=spilt_ask(battle_table[i])
		if(temp)then
			battle_enemynum[i]=temp[1]
		else
			battle_enemynum[i]="0"
		end
		
	end

	return battle_name ,battle_enemynum
end

function ask_battle_each(frame,battle_name,enemynum)
	battle_str=frame:callParserFunction{
		name = '#ask:[['..battle_name..']]', args={
		"?敌人"..enemynum,
		"?敌人"..enemynum.."数量",
		"?敌人"..enemynum.."级别",
		"?敌人"..enemynum.."地位级别",
		"?敌人"..enemynum.."生命值",
		"?敌人"..enemynum.."攻击力",
		"?敌人"..enemynum.."防御力",
		"?敌人"..enemynum.."法术抗性",
		"?敌人"..enemynum.."攻击间隔",
		"?敌人"..enemynum.."重量等级",
		"?敌人"..enemynum.."移动速度",
		"?敌人"..enemynum.."攻击范围半径",
		"?敌人"..enemynum.."生命恢复速度",
		limit="1000",
		link="none",
		format="template",
		template="Hydrogina/sandbox/EnemyAskShow"
	}}

	battle_str=string.sub(battle_str, string.find(battle_str, "X.*X"))
	battle_str=string.sub(battle_str, 2,-2)
	ememyinfolist=mw.text.split(battle_str, ";", true)

	
	for i = 1, #ememyinfolist do
		if(ememyinfolist[i]=="")then
			local enemy_name=ememyinfolist[1]
			local enemy_level=ememyinfolist[3]
			local enemy_prop=get_enemy_prop(i)
			ememyinfolist[i]=ask_enemy(frame,enemy_name,enemy_level,enemy_prop)
			--ememyinfolist[i]="NA"
		else
			if(i>3)then
				ememyinfolist[i]="style='background:#2F2F2F;color:#FFF'|"..ememyinfolist[i]
			end
		end
	end
	
	ememyinfolist[1]="[["..ememyinfolist[1].."]]"
	
	local rtn="|-\n|[["..battle_name.."]]"
	
	for i = 1, #ememyinfolist do
		rtn=rtn.."||"..ememyinfolist[i]
	end
	
	rtn=rtn.."\n"
	
	return rtn
end

function maketable(frame,battle_name,battle_enemynum,levellimit,preloaddata,str_preload)
	
	local rtn=""
	for i = 1, #battle_name do
		
		local battle_enemynum_i=tonumber(battle_enemynum[i])
		if(battle_enemynum_i==0)then
			strask_battle_each="|-\n|[["..battle_name[i].."]]||无||—||—||—||—||—||—||—||—||—||—||—||—\n"
	    	rtn=rtn..strask_battle_each
		else
			for j=1,battle_enemynum_i do
	    		strask_battle_each=ask_battle_each(frame,battle_name[i],j)
	    		rtn=rtn..strask_battle_each
			end
		end
		
		
		if( i == levellimit)then
			break
		end
		
	end
	
	
	
	if(preloaddata~="no")then
		local fnd= mw.ustring.find( str_preload, tablehead, 1, true )

		if(fnd)then
			rtn=string.sub(str_preload, 1,fnd+#tablehead-1 )..rtn..string.sub(str_preload,fnd+#tablehead )
		else
			rtn=tablehead..rtn..tableend..str_preload
		end
		
	else
		rtn=tablehead..rtn..tableend
	end
	
	return rtn
end

function get_preload(frame,preloadpath,battle_name,battle_enemynum)
	local web=preloadpath
	local str_preload=frame:expandTemplate{title = web, args = {}}
	
	local new_battle_name={}
	local new_battle_enemynum={}
	
	for i = 1, #battle_name do
		local fnd= mw.ustring.find( str_preload, "[["..battle_name[i].."]]", 1, true )
		--local fnd=string.find (str_preload, "%[%["..battle_name[i].."]]")
		
		if(not fnd)then
			table.insert (new_battle_name, battle_name[i])
			table.insert (new_battle_enemynum, battle_enemynum[i])
		end
		
	end
	
	return new_battle_name,new_battle_enemynum,str_preload
end

function p.get(frame)
	local args = (frame == mw.getCurrentFrame() and frame.args) or frame

	
	local askcondition ='[[分类:普通难度关卡]]OR[[分类:剿灭关卡]]'
	local levellimit =-1
	local printlevellist ="no"
	local preloaddata ="no"
	local preloadpath ="模板:详细敌人一览"
	
	if(args["askcondition"])then
		askcondition=args["askcondition"]
	end
	
	if(args["levellimit"])then
		levellimit=tonumber(args["levellimit"])
	end
	
	if(args["printlevellist"])then
		printlevellist=args["printlevellist"]
	end
	
	if(args["preloaddata"])then
		preloaddata=args["preloaddata"]
	end
	
	if(args["preloadpath"])then
		preloadpath=args["preloadpath"]
	end
	
	-------------------------------------------------------------------------
	
	battle_name,battle_enemynum=ask_battle(frame,askcondition)
	
	local str_preload=""
	if(preloaddata~="no")then
		battle_name,battle_enemynum,str_preload=get_preload(frame,preloadpath,battle_name,battle_enemynum)
	end
	
--[[	
	local rtn3=""
	if(printlevellist=="yes")then
		for i = 1, #battle_name do
			
			rtn3=rtn3..i..":aa"..battle_name[i].."bb"..battle_enemynum[i].."cc\n\n"
			
		end
		rtn3=rtn3.."\n\n\n\n"
	end
	]]--
	
	local rtn=""
	rtn=maketable(frame,battle_name,battle_enemynum,levellimit,preloaddata,str_preload)
	
	
	return rtn
end
return p