来自勇者斗恶龙X WIKI_DQX日服PC中文版图鉴 DQX攻略大全

此模块的文档可以在模块:道具Y/doc创建

local p = {}
local getArgs = require('Module:Arguments').getArgs
local smw = require('Module:Util').smw
local monster_list = require('Module:Base').monster_list
local tooltip_c = require('Module:Base').item_tooltip
local item_link_1X = require('Module:Base').item_link_1X
local frame
local iteminfo = {}


-----------------------------------------------------------------------------
-- 入口函数
-----------------------------------------------------------------------------

-- 道具图鉴页
function p.item_info_page(pageframe)
    frame = pageframe
    return _item_info_page(getArgs(pageframe))
end

-- 配方图鉴页(作废)
--function p.repice_info_page(pageframe)
--    frame = pageframe
--    return _repice_info_page(getArgs(pageframe))
--end

-- 道具信息盒,用于其他图鉴调用(外部调用)
function p.item_box(pageframe)
    frame = pageframe
    return _item_box(getArgs(pageframe))
end
function p.InfoBox(args)
    return _infobox(args)
end
-- 道具信息盒,用于其他图鉴调用(内部调用)
function p.item_box_in(pageframe, args)
    frame = pageframe
    return _item_box(args)
end

-- 生成用于调用的浮层
function p.item_tooltip(pageframe)
    frame = pageframe
    return _item_tooltip(getArgs(pageframe))
end
-- 记录宝箱信息
function p.item_chest(pageframe)
    frame = pageframe
    return _item_chest(getArgs(pageframe))
end
p['宝箱'] = p.item_chest
-----------------------------------------------------------------------------
-- 查询数据函数
-----------------------------------------------------------------------------

local itemDataHeader = {'名称', '中文名', '等级', '主类型', '类型', '子类型', '购买价格', '出售价格', '描述', '中文描述', '基本性能', 
'最大体力', '最大能量', '攻击魔力', '恢复魔力', '攻击力', '防御力', '敏捷', '灵巧', '时尚度', '重量',
'会心率', '能量吸收率', '格挡率', '特效', '饰品合成属性', '饰品传承', '可用职业', '获取方式', '单一获取方式', '集中力', '使用次数',
'咬钩度', '大成功度', '白宝箱掉落'}

function _getItemInfo(name)
    if iteminfo[name] then
        return iteminfo[name]
    else
        local query = {'[['..name..']]'}
        for _, v in ipairs(itemDataHeader) do
            table.insert(query, '?'..v)
        end
        b, t = pcall(smw.query, query, frame)
        if b then
            if #t == 1 then
                iteminfo[name] = t[1]
            else
                iteminfo[name] = {["名称"]="错误"}
            end
        else
            iteminfo[name] = {["名称"]="错误"}
        end

        return iteminfo[name]
    end
end

-----------------------------------------------------------------------------
-- 创建预加载浮层
-----------------------------------------------------------------------------

function _tooltip(main_obj, sub_obj, class)
    local html = mw.html.create():tag('div'):addClass('joymewiki-tooltips')

    if class then
        html:addClass(class)
    end

    html:wikitext(main_obj)
    html:tag('div'):addClass('joymewiki-tooltips-sub'):wikitext(sub_obj)

    return tostring(html)
end

-----------------------------------------------------------------------------
-- 创建现加载浮层内容
-----------------------------------------------------------------------------

function _item_tooltip(args)
    return _infobox(_getItemInfo(args[1]))
end

-----------------------------------------------------------------------------
-- 道具图鉴页
-----------------------------------------------------------------------------

function _item_info_page(args)
    local html = mw.html.create():tag('div')
    div_top = html:addClass('container-fluid'):tag('div'):addClass('row')
    
    -- 预处理一些数据
    local result = {}
    local source = {}
    query_list = {
        ['商人'] = {'[[分类:NPC]] [[出售道具::'..args['名称']..']]', '?地区', '?位置', '?位置说明'},
        ['任务报酬'] = {'[[分类:支线任务]] [[报酬道具::'..args['名称']..']]', '?任务编号', '?任务名称', '?初次报酬', '?重玩报酬', 'sort=任务编号'},
        ['委托任务报酬'] = {'[[委托报酬::'..args['名称']..']]', '?委托报酬'},
        ['掉落'] = {'[[分类:怪物]] [[掉落道具::'..args['名称']..']]', '?名称', '?变弱等级#','?普通掉落','?稀有掉落' , '?掉落道具', '?转生自', 'sort=变弱等级','limit=500'},
        ['宝箱'] = {'[[分类:地区]] [[宝箱::'..args['名称']..']]', '?所属大陆', '?宝箱'},
        ['采集'] = {'[[分类:地区]] [[可拾取道具::'..args['名称']..']]', '?所属大陆', '?可拾取道具'},
        ['小徽章兑换'] = {'[[可使用小徽章兑换::'..args['名称']..']]', '?可使用小徽章兑换' },
        ['交换道具'] = {'[[分类:道具]] [[交换道具::'..args['名称']..']]', '?交换道具','?交换NPC','?交换类型', '?名称'},
    }
    for _, v in ipairs({'商人', '任务报酬', '委托任务报酬', '掉落', '宝箱', '采集', '小徽章兑换','交换道具'}) do
        result[v] = smw.query(query_list[v], frame)
        if #result[v] > 0 then
            source[#source+1] = v
        end
    end
    -- 如果可制造
    if args['生产类型'] ~= nil and args['生产类型'] ~= '' then
        source[#source+1] = '制造'
    end
    -- 如果有自定义获得方式
    if args['获取方式'] ~= nil or args['获取方式'] ~= '' then
        args['特殊获取方式'] = args['获取方式']
        source[#source+1] = args['获取方式']
    end

    -- 提取小徽章本道具的数据
    local star_coin
    if #result['小徽章兑换'] > 0 then
        for _, str in ipairs(mw.text.split(result['小徽章兑换'][1]["可使用小徽章兑换"], '<MANY>')) do
            local star_coin_item_info = mw.text.split(str, '<RCRD>')
            if star_coin_item_info[1] == args['名称'] then
                star_coin = {
                    ['数量'] = star_coin_item_info[2],
                    ['类型'] = star_coin_item_info[3]
                }
                break
            end
        end
        if star_coin then
            smw.set({['需要小徽章']=star_coin['数量']}, frame)
        end
    end

    -- 提取生成委托任务报酬
    local random_quest = {}
    local random_quest_difficulty = {
        ['0'] = '所有难度',
        ['1'] = '难度★以上',
        ['1.5'] = '难度★☆以上',
        ['2'] = '难度★★以上',
        ['2.5'] = '难度★★☆以上',
        ['3'] = '难度★★★以上',
        ['紧急'] = '紧急'
    }
    if #result['委托任务报酬'] > 0 then
        for _, str in ipairs(mw.text.split(result['委托任务报酬'][1]["委托报酬"], '<MANY>')) do
            local random_quest_item_info = mw.text.split(str, '<RCRD>')
            if random_quest_item_info[1] == args['名称'] then
                random_quest[#random_quest+1] = string.format('%s[[委托任务]]', random_quest_difficulty[random_quest_item_info[2]])
                smw.set({['委托报酬自']=random_quest_item_info[2]}, frame)
            end
        end
    end

    -- 单一获取条件的描述
    if #source == 1 then
        if source[1] == '商人' then
            if #result['商人'] == 1 then
                local pos_text = {}
                if result['商人'][1]['地区'] ~= '' then
                    pos_text[#pos_text+1] = '[['..result['商人'][1]['地区']..']]'
                end
                if result['商人'][1]['位置'] ~= '' then
                    pos_text[#pos_text+1] = result['商人'][1]['位置']
                end
                if result['商人'][1]['位置说明'] ~= '' then
                    pos_text[#pos_text+1] = result['商人'][1]['位置说明']
                end

                args['单一获取方式'] = '[['..result['商人'][1][1]..']]出售('..table.concat(pos_text, ' ')..')'
            end
        elseif source[1] == '任务报酬' then
            if #result['任务报酬'] == 1 then
                v = result['任务报酬'][1]
                args['单一获取方式'] = string.format('<span class="blue">%03d</span> [[%s|%s]] 报酬', v['任务编号'], v[1], v['任务名称'])
            end
        elseif source[1] == '委托任务报酬' then
            if #random_quest == 1 then
                args['单一获取方式'] = random_quest[1] .. '报酬'
            end
        elseif source[1] == '掉落' then
            if #result['掉落'] == 1 then
                args['单一获取方式'] = '[['..result['掉落'][1]['名称']..']]掉落'
            end
        elseif source[1] == '采集' then
            if #result['采集'] == 1 then
                args['单一获取方式'] = '[['..result['采集'][1][1]..']]可以采集到'
            end
        elseif source[1] == '制造' then
            args['单一获取方式'] = ''..args['生产类型']..' Lv'..args['生产等级']..' 制造'
        elseif source[1] == '小徽章兑换' then
            args['单一获取方式'] = star_coin['数量']..'个[[小徽章]]兑换'
        else
            args['单一获取方式'] = args['获取方式']
        end
    end
	if(args['类型'] == '花') then
		source[1] = '种植,交换'
		args['单一获取方式'] = args['名称']..'种子种植,鲜花交换'
	elseif(args['类型'] == '宝物花') then
		if( string.find(args['名称'],'超宝物花')>1) then
			args['单一获取方式'] = '超宝物花种子种植'
		else
			args['单一获取方式'] = '宝物花种子种植'
		end
	end


    -- 拼合获取方式字符串
    args['获取方式'] = table.concat(source, ', ')

    -- 拼合基本性能字符串
    local stat_list = {'最大体力', '最大能量', '攻击力', '防御力', '格挡率' , '攻击魔力', '恢复魔力','敏捷', '灵巧','会心率','咬钩度', '能量吸收率', '集中力', '使用次数', '大成功度', '重量', '时尚度'}
    local temp_text = {}

    count = 0
    for i=1, #stat_list do
        if args[stat_list[i]] ~= nil and args[stat_list[i]] ~= '' then
            value_name = stat_list[i]
            value_text = args[stat_list[i]]
            if stat_list[i] == '格挡率' then
                value_text = args['格挡率']..'%'
            elseif stat_list[i] == '使用次数' then
                value_text = args['使用次数']..'次'
            elseif stat_list[i] == '会心率' then
                value_text = args['会心率']..'%'
            elseif stat_list[i] == '能量吸收率' then
                value_text = args['能量吸收率']..'%'
            end
            local temp = value_name..'+'..value_text
            value_check = tonumber(args[stat_list[i]])
            if value_check ~= nil then
                if tonumber(args[stat_list[i]]) < 0 then
                    temp = value_name..value_text
                end
            end
            temp_text[#temp_text+1] = temp
            count = count + 1
        end
    end

    args['基本性能'] = table.concat(temp_text, "<br>")
    
    -- 左侧infobox
    div = div_top:tag('div'):addClass('col-xs-12')
    row = div:tag('div'):addClass('row')
    row:tag('div'):addClass('col-xs-12'):wikitext(_infobox(args, 'infobox'))
    if args['主类型'] ~='饰品' and (args['不可交易'] ==nil or (args['不可交易'] ~=nil and args['不可交易'] =='')) and (args['ID'] ~= nil or args['ID'] ~= '') then
        row:tag('div'):addClass('col-xs-12'):wikitext('[http://guangchang.dqx.sdo.com/sc/search/bazaar/'..args['ID']..'/ 在旅行者市场中搜索该道具]<br>'
        ..'[http://guangchang.dqx.sdo.com/sc/search/iraisyo/1/'..args['名称']..'/0 在旅行者市场中搜索报酬为该道具的委托书]')
    else
		row:tag('div'):addClass('col-xs-12'):wikitext('[http://guangchang.dqx.sdo.com/sc/search/iraisyo/1/'..args['名称']..'/0 在旅行者市场中搜索报酬为该道具的委托书]')
	end
    -- 右侧的各种信息
    right_div = div_top:tag('div'):addClass('col-xs-12')
    
    if args['说明'] ~= nil or args['说明'] ~= '' then
        right_div:wikitext(args['说明'])
    end

    -- 可以使用小徽章兑换
    if #result['小徽章兑换'] > 0 and star_coin then
        right_div:tag('h2'):wikitext('可使用小徽章兑换')
        right_div:wikitext('可以在[[娱乐岛拉卡兰]],与徽章岛主格雷克,使用'..star_coin['数量']..'个[[小徽章]]兑换(兑换分类:'..star_coin['类型']..')。')
    end

    -- 可以从商人购买
    if #result['商人'] > 0 then
    	if args['购买价格'] == nil then
			args['购买价格'] = 0
    	end
        right_div:tag('h2'):wikitext('可从商人购买<small>('..#result['商人']..')</small>')
        right_div:tag('div'):cssText('margin: 0.5em 0 1em 0;'):addClass('item-pice'):attr('data-code',args['ID']):attr('data-pice',args['购买价格']):wikitext(string.format('从商人处购买的价格是 %s。', args['购买价格']))
        html_table = right_div:tag('table'):addClass('wikitable'):cssText('text-align:left')
        html_table:tag('tr')
        :tag('th'):addClass('pc-w-30'):wikitext('商人名称'):done()
        :tag('th'):addClass('pc-w-70'):wikitext('商人位置'):done()
        for _, v in ipairs(result['商人']) do
            smw.set({['购买自']=v[1]..';'..v['地区']..';'..v['位置']..';'..v['位置说明']}, frame)
            pos_text = {}
            if v['地区'] ~= '' then
                pos_text[#pos_text+1] = '[['..v['地区']..']]'
            end
            if v['位置'] ~= '' then
                pos_text[#pos_text+1] = v['位置']
            end
            if v['位置说明'] ~= '' then
                pos_text[#pos_text+1] = v['位置说明']
            end
            html_table:tag('tr')
            :tag('td'):wikitext('[['..v[1]..']]'):done()
            :tag('td'):wikitext(table.concat(pos_text, ' ')):done()
        end
    end
	
    -- 任务报酬
    if #result['任务报酬'] > 0 then
        right_div:tag('h2'):wikitext('任务报酬<small>('..#result['任务报酬']..')</small>')
        html_table = right_div:tag('table'):addClass('wikitable'):cssText('text-align:left')
        html_table:tag('tr')
        :tag('th'):addClass('pc-w-30'):wikitext('任务'):done()
        :tag('th'):addClass('pc-w-35'):wikitext('初次报酬道具'):done()
        :tag('th'):addClass('pc-w-35'):wikitext('重玩报酬道具')
        for _, v in ipairs(result['任务报酬']) do
            smw.set({['任务报酬自']=v[1]..';'..v['任务名称']..';'..v['任务编号']}, frame)
			local _quest_str = ''
			if tonumber(v['任务编号'])<1 or v['任务编号'] == nil then
				_quest_str = string.format('<span class="blue">限期</span> [[%s|%s]]', v[1], v['任务名称'])
			else
				_quest_str = string.format('<span class="blue">%03d</span> [[%s|%s]]', v['任务编号'], v[1], v['任务名称'])
			end
            html_table:tag('tr')
            :tag('td'):wikitext(_quest_str):done()
            :tag('td'):wikitext(v['初次报酬']):done()
            :tag('td'):wikitext(v['重玩报酬']):done()
        end
    end

    -- 委托任务报酬
    if #result['委托任务报酬'] > 0 then
        right_div:tag('h2'):wikitext('委托任务报酬')
        right_div:wikitext('可以通过「'..table.concat( random_quest, "」或「")..'」获得。')
    end

    -- 可以从宝箱获得
    if #result['宝箱'] > 0 then
        right_div:tag('h2'):wikitext('可从宝箱获得<small>('..#result['宝箱']..')</small>')
        html_table = right_div:tag('table'):addClass('wikitable'):cssText('text-align:left')
        html_table:tag('tr')
        :tag('th'):addClass('pc-w-20'):wikitext('宝箱类型'):done()
        :tag('th'):addClass('pc-w-30'):wikitext('宝箱内容'):done()
        :tag('th'):addClass('pc-w-50'):wikitext('宝箱位置'):done()
        for _, v in ipairs(result['宝箱']) do
            text = '[['..v[1]..']]'
            for _, str in ipairs(mw.text.split(v['宝箱'], '<MANY>')) do
                kv = mw.text.split(str, '<RCRD>')
                if kv[1] == args['名称'] then
                    if kv[3] == '' then
                        kv[3] = '1'
                    end
                    html_table:tag('tr')
                    :tag('td'):cssText('text-align:center'):wikitext(string.format('%s宝箱', kv[2])):done()
                    :tag('td'):wikitext(string.format('%s×%s', item_link_1X(args['名称'], 'no-bg', 14), kv[3])):done()
                    :tag('td'):wikitext(string.format('[[%s]] %s', v[1], kv[4])):done()
                end
            end
        end
    end

    -- 可以从采集点获得
    if #result['采集'] > 0 then
        right_div:tag('h2'):wikitext('可拾取到的地区<small>('..#result['采集']..')</small>')
        get_text = {}
        for _, v in ipairs(result['采集']) do
            smw.set({['采集自']=v[1]}, frame)
            get_text[#get_text+1] = '[['..v[1]..']]'
        end
        div = right_div:tag('div')
        div:wikitext('可以在以下地区采集到该道具:'.. table.concat(get_text, ',')..'。')
    end

	
	-- 其他入手方式
	if #result['交换道具'] > 0 then
        right_div:tag('h2'):wikitext('其他获取方式<small>('..#result['交换道具']..')</small>')
		html_table = right_div:tag('table'):addClass('wikitable'):cssText('text-align:left')
        html_table:tag('tr')
        :tag('th'):addClass('pc-w-20'):wikitext('来源道具'):done()
        :tag('th'):addClass('pc-w-20'):wikitext('来源NPC'):done()
        :tag('th'):addClass('pc-w-60'):wikitext('来源信息'):done()
		for _, v in ipairs(result['交换道具']) do
			if v['交换类型'] ~= nil or  v['交换类型'] ~='无' then
				args['获取方式'] = mw.ustring.gsub(args['获取方式'],'交换道具',v['交换类型'])
			end
			if v['交换NPC'] ~= nil and v['交换NPC'] ~='无' and v['交换NPC'] ~='' then
				_JH_NPC = '[['..v['交换NPC']..']]'
			else
				_JH_NPC = '直接使用'
			end
			for __, _str in ipairs(mw.text.split(v['交换道具'], '<MANY>')) do
				__str = mw.text.split(_str, '<RCRD>')
				if __str[1] == args['名称'] then
					html_table:tag('tr')
					:tag('td'):wikitext(item_link_1X(v['名称'],nil,14)):done()
					:tag('td'):wikitext(_JH_NPC):cssText('text-align:center'):done()
					:tag('td'):wikitext(__str[2]):done()
				end
			end
		end
	end
	-- 记录交换道具
    if(args['交换内容'] ~=nil and args['交换内容'] ~='') then
			args['交换列表'] = {}
			if args['交换NPC'] == nil or args['交换NPC'] =='无' or args['交换NPC'] =='' then
				_JH_NPC = '直接使用'
			else
				_JH_NPC = '[['..args['交换NPC']..']]'
			end
			jh_data = mw.text.split(args['交换内容'],',')
			right_div:tag('h2'):wikitext('可入手道具<small>('..#jh_data..')</small>')
			html_table = right_div:tag('table'):addClass('wikitable'):cssText('text-align:left')
			html_table:tag('tr')
			:tag('th'):addClass('pc-w-25'):wikitext('入手物品'):done()
			:tag('th'):addClass('pc-w-20'):wikitext('来源NPC'):done()
			:tag('th'):addClass('pc-w-55'):wikitext('来源信息'):done()
			for _, str in ipairs(jh_data) do
				_str = mw.text.split(str,'*') 
				if(_str[2] == nil or  _str[2] == '' ) then 
					_str[2] = '';
				end
				if(_str[3] == nil or _str[3] == '' ) then 
					_str[3] = '';
				end
				if(args['交换模板'] ~=nil and args['交换模板'] ~= '') then
					_jhdj_msg = mw.ustring.gsub(args['交换模板'],'#道具',_str[1]);
					_jhdj_msg = mw.ustring.gsub(_jhdj_msg,'#参数',_str[2]);
					_jhdj_msg = mw.ustring.gsub(_jhdj_msg,'#备注',_str[3]);
					_jhdj_msg = mw.ustring.gsub(_jhdj_msg,'#NPC',args['交换NPC']);
					_jhdj_msg = mw.ustring.gsub(_jhdj_msg,'#名称',item_link_1X(args['名称'],nil,14));
				else
					_jhdj_msg = '需要\'\'\''.._str[2]..'\'\'\'个\'\'\''..args['名称']..'\'\'\''..args['交换类型'].._str[3]
				end
				table.insert(args['交换列表'],_str[1])
				smw.set({['交换道具'] = _str[1]..';'.._jhdj_msg..';'.._str[2]..';'.._str[3]},frame);
				html_table:tag('tr')
				:tag('td'):wikitext(item_link_1X(_str[1],nil,14)):done()
				:tag('td'):wikitext(_JH_NPC):cssText('text-align:center'):done()
				:tag('td'):wikitext(_jhdj_msg):done()
			end
			html_table:done()
	end
    -- 可以从怪物获得
    if #result['掉落'] > 0 then
        right_div:tag('h2'):wikitext('可从怪物获得<small>('..#result['掉落']..')</small>')
        for _, v in ipairs(result['掉落']) do
            smw.set({['掉落自']=v[1]}, frame)
        end
        right_div:tag('div'):wikitext(monster_list(result['掉落'], 'item_info_page'))
    end

    -- 【成品类道具用】判断是否是可制造的物品
    if args['生产类型'] ~= nil and args['生产类型'] ~= '' then
        right_div:tag('h2'):wikitext('制造配方')
        right_div:tag('div'):cssText('margin: 0.5em 0 1em 0;'):wikitext(string.format('通过学习%s获得配方。', item_link_1X(args['学习自'], 'no-bg', 14)))
        reg_text = mw.ustring.gsub(args['材料'], ',', '<MANY>')
        reg_text = mw.ustring.gsub(reg_text, '*', '<RCRD>')
        craft_args = {
            [1]={
            ['名称'] = args['名称'],
            ['生产类型'] = args['生产类型'],
            ['生产等级'] = args['生产等级'],
            ['材料'] = reg_text,
            ['学习自'] = args['学习自']
            }
        }
        right_div:wikitext(p._craft_table(craft_args))
    end
--    if #result['制造'] > 0 then
--        for _, str in ipairs(mw.text.split(result['制造'][1]['材料'], '<MANY>')) do
--            kv = mw.text.split(str, '<RCRD>')
--            smw.set(frame, {['材料']=kv[1]..';'..kv[2]})
--        end
--        div:tag('h2'):wikitext('制造配方')
--        div:wikitext(p._craft_table(result['制造']))
--    end

    -- 【材料类道具用】判断是否可以用来制造物品
    query = {'', '?名称', '?生产类型', '?生产等级', '?材料', '?学习自', 'sort=生产类型,生产等级'}
    query[1] = '[[分类:道具]] [[材料::'..args['名称']..']]'
    result = smw.query(query, frame)
--    div:wikitext(mw.dumpObject(result))
    if #result > 0 then
        right_div:tag('h2'):wikitext('可用于配方<small>('..#result..')</small>')
        right_div:wikitext(p._craft_table(result))
    end

    -- 【配方类道具用】判断是否可以学会配方
    query[1] = '[[分类:道具]] [[学习自::'..args['名称']..']]'
    result = smw.query(query, frame)
--    div:wikitext(mw.dumpObject(result))
    local max_level = 0
    local min_level = 99
    if #result > 0 then
        for i=1, #result do
            smw.set({['可学会']=result[i]['名称']}, frame)
            repice_level = tonumber(result[i]['生产等级'])
            if repice_level > max_level then max_level = repice_level end
            if repice_level < min_level then min_level = repice_level end
        end
        right_div:tag('h2'):wikitext('可学会配方<small>('..#result..')</small>')
        right_div:wikitext(p._craft_table(result))
        
        smw.set({['最小配方等级']=min_level}, frame)
        smw.set({['最大配方等级']=max_level}, frame)
    end

    -- 如果有截图则配上截图
--[===[
    if args['相关截图'] ~= nil and args['相关截图'] ~= '' then
        right_div:tag('h2'):wikitext('相关截图')
        pic_list = mw.text.split(args['相关截图'], ',')
        for i=1, #pic_list do
            pic_list[i] = '[[File:'..pic_list[i]..'|link=]]'
        end
        right_div:wikitext(table.concat( pic_list, "<br>"))
	elseif args['类型'] == '配方集' then
		if args['套装图片'] ~= nil and args['套装图片'] ~= '' then
			picname = args['套装图片']
		else
			picname = string.gsub(args['名称'],"配方", "").."效果图"
			picname = string.gsub(picname,"的制作方法", "")
		end
		right_div:tag('h2'):wikitext('相关截图')
		rowdiv = right_div:tag('div'):addClass('craft-table container-fluid')
		rowdiv:tag('div'):addClass('row craft-table-header visible-md-block visible-lg-block'):wikitext('<div class="col-md-3">正面</div><div class="col-md-3">背面</div><div class="col-md-3">侧面</div><div class="col-md-3">其他</div>')
		rowdiv:tag('div'):addClass('row craft-table-header'):wikitext('<div class="col-md-3">[[File:'..picname..'01.jpg|150px|link=]]</div><div class="col-md-3">[[File:'..picname..'02.jpg|150px|link=]]</div><div class="col-md-3">[[File:'..picname..'03.jpg|150px|link=]]</div><div class="col-md-3">[[File:'..picname..'04.jpg|150px|link=]]</div>')
		rowdiv:done()
		right_div:done()
    end
]===]

    -- 分类
    html:wikitext('[[分类:道具]]__NOTOC__')

    -- 存储数据变量
    _set_item_info(args)

    return tostring(html)
end


-----------------------------------------------------------------------------
-- 道具信息栏
-- 道具信息页和道具浮层用
-----------------------------------------------------------------------------

function _infobox(args, class)
    local html = mw.html.create():tag('div')
    html:addClass('dqx_item')
    if class then
        html:addClass(class)
    end

    local div, i, count

    -- 基本信息(名称、等级、类型、图标)
    div = html:tag('div'):addClass('item-base-info')
    local item_name = args['名称'] or nil
    if item_name == nil or item_name == '错误' or item_name == '' then
        return 'Error:道具信息错误'
    end

    -- 添加图标
    div:wikitext(_item_icon(item_name))
    if args['日文名'] ~= nil then
        html:tag('div'):addClass('item-description'):wikitext(args['日文名'])
    end
    div:tag('div'):addClass('item-name'):wikitext(item_name)
    if args['等级'] ~= nil and args['等级'] ~= '' then
        div:tag('div'):addClass('item-level'):wikitext(( (args['主类型']=='钓具' and '垂钓 ') or '')..'Lv'..args['等级']..'&nbsp;')
    end
    local item_type = args['类型'] or '暂无类型'
    if item_type == '原料' and (args['子类型'] ~= nil and args['子类型'] ~= '') then
        item_type = item_type .. ' - '.. args['子类型']
    elseif (args['主类型'] == '家具') or (args['主类型'] == '庭具') then
        item_type = args['主类型'] .. ' - ' .. item_type
    end
    div:tag('div'):addClass('item-type'):wikitext(item_type)
    div:done()

    -- 描述
    if args['描述'] ~= nil and args['中文描述'] ~= nil then
        html:tag('div'):addClass('item-description'):wikitext(args['中文描述'].. '<br><br>' ..args['描述'])
    elseif args['描述'] ~= nil and args['中文描述'] == nil then
        html:tag('div'):addClass('item-description'):wikitext(args['描述'])
    end

    -- 基础属性
    -- 如果是工具采取旧类型
    args['主类型'] = args['主类型'] or ''

    if args['主类型'] == '工具' then
        -- 先判断是否有任意基础属性
        -- local stat_list = {'基本性能','攻击力', '防御力', '格挡率', '最大体力','最大能量','敏捷', '灵巧', '攻击魔力', '恢复魔力', '能量吸收率', '特效', '集中力', '使用次数', '会心率','咬钩度','大成功度'}
        local stat_list = {'集中力', '使用次数', '会心率','咬钩度', '大成功度'}

        count = 0
        for i=1, #stat_list do
            if args[stat_list[i]] ~= nil and args[stat_list[i]] ~= '' then
                count = count + 1
            end
        end
        
        if count > 0 then
            div = html:tag('div'):addClass('item-stat-info')
            for i=1, #stat_list do
                if args[stat_list[i]] ~= nil and args[stat_list[i]] ~= '' then
                    value_name = stat_list[i]
                    if value_name == '能量吸收率' then
                        value_name = '能量吸收'
                    end
                    value_text = args[stat_list[i]]
                    if stat_list[i] == '格挡率' then
                        value_text = args['格挡率']..'%'
                    elseif stat_list[i] == '使用次数' then
                        value_text = args['使用次数']..'次'
                    elseif stat_list[i] == '会心率' then
                        value_text = args['会心率']..'%'
                    elseif stat_list[i] == '能量吸收率' then
                        value_text = args['能量吸收率']..'%'
                    end
                    
                    div:tag('div'):addClass('item-stat')
                        :tag('div'):addClass('item-stat-title'):wikitext(value_name..':'):done()
                        :tag('div'):addClass('item-stat-value'):wikitext(value_text)
                end
            end
        end
    else
    -- 如果不是工具就采取显示整合的综合性能
        if args['基本性能'] ~= nil and args['基本性能'] ~= '' then
            div = html:tag('div'):addClass('item-stat-info')
            div:tag('div'):addClass('item-stat')
               :tag('div'):addClass('item-stat-title'):wikitext('基本性能:'):done()
               :tag('div'):addClass('item-stat-value'):wikitext(args['基本性能'])
            if args['特效'] ~= nil and args['特效'] ~= '' then
                div:tag('div'):addClass('item-stat')
                   :tag('div'):addClass('item-stat-title'):wikitext('基础效果:'):done()
                   :tag('div'):addClass('item-stat-value'):wikitext((mw.ustring.gsub(mw.ustring.gsub(args['特效'], ',', '<MANY>'), '<MANY>', '<br>')))
            end
        end
    end

    -- 如果是饰品的话,还有合成
    if args['饰品合成属性'] ~= nil and args['饰品合成属性'] ~= '' then
        div = html:tag('div'):addClass('item-accessories-info')
        div:tag('div'):addClass('item-stat')
           :tag('div'):addClass('item-stat-title'):wikitext('合成属性:'):done()
           :tag('div'):addClass('item-stat-value'):wikitext(args['饰品合成属性'])
        args['饰品传承'] = args['饰品传承'] or '否'
        div:tag('div'):addClass('item-stat')
           :tag('div'):addClass('item-stat-title'):wikitext('传承:'):done()
           :tag('div'):addClass('item-stat-value'):wikitext(args['饰品传承'])
    end


    -- 附加属性
    -- 先判断是否有任意附加属性
    -- local note_list = {'重量', '时尚度', '购买价格', '出售价格', '可用职业'}
    local note_list = {'购买价格', '出售价格', '可用职业'}

    count = 0
    for i=1, #note_list do
        if args[note_list[i]] ~= nil and args[note_list[i]] ~= '' then
            count = count + 1
        end
    end

    if args['可用职业'] ~= nil and args['可用职业'] ~= '' then
        args['可用职业']= mw.ustring.gsub(args['可用职业'], '<MANY>', ',')
        args['可用职业']= mw.ustring.gsub(args['可用职业'], ',', ',')
    end
    if args['特效'] ~= nil and args['特效'] ~= '' then
        args['特效']= mw.ustring.gsub(args['特效'], '<MANY>', ',')
        args['特效']= mw.ustring.gsub(args['特效'], ',', ',')
    end

    -- 价格文本设置
    local price_list = {'购买价格', '出售价格'}

    for i=1, #price_list do
        if args[price_list[i]] ~= nil and args[price_list[i]] ~= '' then
            args[price_list[i]] = mw.ustring.gsub(args[price_list[i]], 'G', '')
            args[price_list[i]] = mw.text.trim(args[price_list[i]])
            args[price_list[i]] = args[price_list[i]]..' G'
        end
    end

    if count > 0 then
        div = html:tag('div'):addClass('item-note')
        for i=1, #note_list do
            if args[note_list[i]] ~= nil and args[note_list[i]] ~= '' then
                div:tag('div'):addClass('item-stat')
                       :tag('div'):addClass('item-stat-title'):wikitext(note_list[i]..':'):done()
                    :   tag('div'):addClass('item-stat-value'):wikitext(args[note_list[i]])
            end
        end
    end

    -- 获得方法
    -- 不论是否有获得方法,都要生成这行来收尾窗口(左下和右下有圆角)

    local source = '待提供'
    if args['单一获取方式'] ~= nil and args['单一获取方式'] ~= '' then
        source = args['单一获取方式']
    else
        if args['获取方式'] ~= nil and args['获取方式'] ~= '' then
            source = string.gsub(args['获取方式'], '<MANY>', ', ')
        end
    end

    div = html:tag('div'):addClass('item-source')
    div:tag('div'):addClass('item-stat')
        :tag('div'):addClass('item-stat-title'):wikitext('获取方式:'):done()
        :tag('div'):addClass('item-stat-value'):wikitext(source)
    
    if args['备注'] ~= nil and args['备注'] ~= '' then
        div:tag('div'):addClass('item-stat')
            :tag('div'):addClass('item-stat-title'):wikitext('备注:'):done()
            :tag('div'):addClass('item-stat-value'):wikitext(args['备注'])
    end

    -- 结束
    html:done()

    return tostring(html)
end

-----------------------------------------------------------------------------
-- 道具信息盒
-- 用于其他图鉴调用
-----------------------------------------------------------------------------

function _item_box(args)
    name = args[1]
    class = args[2]

    if name == nil or name == '' then
        return 'Error:道具信息错误'
    end

    item_info = _getItemInfo(name)

    if item_info['名称'] == nil or item_info['名称'] == '错误' or item_info['名称'] == '' then
        return 'Error:道具信息错误'
    end

    extra_info = item_info['类型']

    local html = mw.html.create():tag('table')
    tr = html:addClass('item-box'):tag('tr')
    tr:tag('td'):tag('div'):addClass('item-icon icon-img'):wikitext('[[File:icon-'..name..'.png|link='..name..']]')
    tr:tag('td'):css('padding-left', '5px')
          :tag('div'):addClass('item-name'):wikitext('[['..name..']]'):done()
          :tag('div'):addClass('item-extra-info'):wikitext(extra_info):done()
    
--    return _tooltip(tostring(html), _infobox(_getItemInfo(name)), class)
    return tooltip_c(tostring(html), item_info['名称'], class)
end

-----------------------------------------------------------------------------
-- 配方图鉴
-----------------------------------------------------------------------------

function _repice_info_page(args)
    item_info = _getItemInfo(args['成品'])
    args['成品主类型'] = item_info['主类型']
    args['成品类型'] = item_info['类型']
    args['成品等级'] = item_info['等级']
    _set_item_info(args)
end

-----------------------------------------------------------------------------
-- 存储道具、配方数据
-----------------------------------------------------------------------------

function _set_item_info(args)
    -- 导一下变量
    local save_args = args

    -- 用逗号分隔数据
    local split_list = {'可用职业', '可用怪物',  '获取方式','特效'}
    local sep = ','

    for i=1, #split_list do
        if save_args[split_list[i]] ~= nil then
            save_args[split_list[i]] = mw.text.split(save_args[split_list[i]], sep)
        end
    end

    -- 不保存的数据
    local del_list = {'说明', '备注', '相关截图'}

    for i=1, #del_list do
        if save_args[del_list[i]] ~= nil then
            save_args[del_list[i]] = ''
        end
    end

    -- 配方材料数据特别处理
    if save_args['材料'] ~= nil then
        for _, str in ipairs(mw.text.split(save_args['材料'], ',')) do
            reg = mw.ustring.gsub(str, '*', ';')
            smw.set({['材料']=reg}, frame)
        end
        save_args['材料'] = ''
    end
    -- 存入smw数据
    smw.set(save_args, frame)
end

-----------------------------------------------------------------------------
-- 制造信息表
-- 参数为SMW查询条件
-----------------------------------------------------------------------------

function p._craft_table(args)
    local html = {}
    html[#html+1] = '<div class="craft-table container-fluid">'..
    '<div class="row craft-table-header visible-md-block visible-lg-block">'..
    '<div class="col-md-6">成品</div>'..
    '<div class="col-md-6">材料</div></div>'
    
--    if 1 then
--        return mw.dumpObject(args)
--    end

    for i=1, #args do
         _, html[#html+1] = pcall(_craft_table_line, args[i])
    end

    html[#html+1] = '</div>'

    return table.concat(html)
end

function _craft_table_line(arg)
    local html = mw.html.create():tag('div'):addClass('row')
    local div, i

    icon_table_html = mw.html.create():tag('table')
    icon_table_html:tag('tr')
        :tag('td'):wikitext(_item_icon(arg['名称'])):done()
        :tag('td'):css('padding-left', '5px')
            :tag('div'):addClass('item-name'):wikitext('[['..arg['名称']..']]'):done()
            :tag('div'):addClass('repice'):wikitext('[['..arg['学习自']..'|'..arg['生产类型']..' Lv'..arg['生产等级']..']]')

    --html:tag('div'):addClass('col-md-6 craft-table-name'):wikitext(_tooltip(tostring(icon_table_html), _infobox(_getItemInfo(arg['成品']))))
    html:tag('div'):addClass('col-md-6 craft-table-name'):wikitext(tooltip_c(tostring(icon_table_html), arg['名称']))

    div = html:tag('div'):addClass('col-md-6 craft-table-reagents')
    for _, str in ipairs(mw.text.split(arg['材料'], '<MANY>')) do
        kv = mw.text.split(str, '<RCRD>')
        div:wikitext(_item_icon(kv[1], kv[2], true))
    end

    return tostring(html)
end

-- 制造信息表
--function p._craft_table(pageframe, args)
--    local html = mw.html.create():tag('div'):addClass('row')
--    local div, i
--
--    div = html:tag('div'):addClass('col-md-6 craft-table-name')
--    div:tag('table'):tag('tr')
--        :tag('td'):wikitext(_item_icon(args['?成品'])):done()
--        :tag('td'):css('padding-left', '5px')
--            :tag('div'):addClass('item-name'):wikitext('[['..args['?成品']..']]'):done()
--            :tag('div'):addClass('repice'):wikitext('[[配方:'..args['?成品']..'|'..args['?生产类型']..'Lv'..args['?生产等级']..']]')
--
--    div = html:tag('div'):addClass('col-md-6 craft-table-reagents')
--    for reag_name, reag_number in string.gmatch(args['?材料'], '(%S-)%s%((%S-)%)') do
--        div:wikitext(_item_icon(reag_name, reag_number))
--    end
--
--    return tostring(html)
--end

-----------------------------------------------------------------------------
-- 道具信息表
-----------------------------------------------------------------------------
function _item_icon(name, number, tooltip)
    number = tonumber(number) or 1

    icon_file_name = 'icon-'..name..'.png'

    local html = mw.html.create():tag('div'):addClass('item-icon icon-img')

    local link = name
    local number_text = '[['..name..'|'..number..']]'
    if mw.title.getCurrentTitle().text == name then
        link = ''
        number_text = tostring(number)
    end

--    if mw.title.new(icon_file_name, 'File').exists then
        html:wikitext('[[File:'..icon_file_name..'|link='..link..']]')
        if number > 1 then
            html:tag('div'):addClass('item-icon-number'):wikitext('[['..name..'|'..number..']]')
        end
--    else
--        html:addClass('need-icon'):wikitext('['..tostring(mw.uri.fullUrl('特殊:上传文件','wpDestFile='..icon_file_name))..' 上传图标][[分类:需要补充图标的条目]]')
--    end

    if tooltip then
    --    return _tooltip(tostring(html), _infobox(_getItemInfo(name)), 'link-m5')
        return tooltip_c(tostring(html), name)
    end

--    return mw.dumpObject(_getItemInfo(name))
    return tostring(html)
end
------------------------------------------------------------------------------
--宝箱记录
------------------------------------------------------------------------------
function _item_chest(args)
	local _str,_sep,_sl,_bz,_bz2= '',',','','',''
	for _, v in ipairs(args) do
		if v ==',' or  v==',' or v =='~~' or  v=='!!' or v == '|' then
			_sep = v
		elseif string.find(v, '*') == 1 then
			_str = _str..v..'\n'
		else
			local data = mw.text.split(v,_sep)
			if data ~=nil and data[1] ~= nil then
				if data[2] == nil or data[2] =='' then
					data[2] = '红色'
				elseif (data[2] =='红' or data[2] =='紫' or data[2] =='金' or data[2] =='黑' or data[2] =='蓝')  then
					data[2] = data[2]..'色'
				elseif(data[2] ~='红色' and data[2] ~='紫色' and data[2] ~='金色' and data[2] ~='黑色' and data[2] ~='蓝色'  and data[2] ~= '普通' and data[2] ~= '随机')  then
					data[4] = data[2]
					data[2] = '红色'
				end				
				if data[3] ~= nil and (string.find(data[3], '%d+') ==1 or string.find(data[4], '%d+~%d+') ==1 ) then
					_sl = data[3]
				else
					_sl = '1'
				end
				if data[4]~=nil and data[4] ~='' then
					_bz = ';'..data[4]
					_bz2 = '('..data[4]..')'
				else
					data[4] = ''
					_bz  = ';'
					_bz2 = ''
				end
				if data[5] == nil then
					data[5] = ''
				end
				smw.set({['宝箱'] = data[1]..';'..data[2]..';'.._sl.._bz},frame)
				_str = _str..'*'..data[2]..'宝箱:'..item_link_1X(data[1],nil,14)..'【'.._sl..'】'.._bz2..data[5]..'\n'
			end
		end
    end
	--local html = mw.html.create():tag('div'):wikitext(str)
	return tostring(_str)
end
return p