Модуль:Iteminfo

Матеріал з Terraria Wiki
Перейти до навігації Перейти до пошуку
Lua.svg Документація Наведена нижче документація включена з Модуль:Iteminfo/документація. (редагувати | історія)
Дивіться також цей модуль англійською: Module:Iteminfo. Він може містити більш повну чи актуальну інформацію.

Цей модуль використовується для отримання динамічних та достовірних характеристик предметів. Він бере дані безпосередньо з вихідного коду, спрощуючи відображення характеристик без необхідності зміни при наступних оновленнях гри.

Він також використовується для роботи шаблону {{iteminfo}}. Як правило, у статтях замість модуля має використовуватись саме цей шаблон. У ньому містяться додаткові утиліти, такі як форматування виведення та аліасів параметрів.

Код модуля на даний момент синхронізований з версією Terraria 1.4.1.2(Видання для ПК, консолей та мобільних пристроїв).

Використання

Усі характеристики

{{#invoke:iteminfo|getInfo| id = <id предмета> | prefix = <префікс імен змінних для виведення> }}

або

{{#invoke:iteminfo|getInfo| <id предмета> | <префікс імен змінних для виведення> }}

id

ID предмета, має бути в діапазоні від 1 до 5455. Зверніть увагу, що наступні ID застаріли і, отже, недійсні: від 2772 до 2775, від 2777 до 2780, від 2782 до 2785, 2881, 3273, від 3340 до 3346, від 3462 до 3465, 3750, від 3847 до 3851, 3861 та 3862.

prefix (необов’язковий)

Префікс для вихідної змінної, за замовчуванням це _iteminfo_. Наприклад, назва змінної значення за замовчуванням це _iteminfo_value. Якщо використовуєте prefix=my_, то ім’я змінної має бути my_value. При використанні цього методу модуль визначає кількість змінних DPL, які потім, наприклад, можна буде отримати за допомогою {{#dplvar:_iteminfo_value}}. Цей метод переважно використовувати для Lua-скриптів через швидкість DPL.

Одна характеристика

{{#invoke:iteminfo|getStat| id = <id предмета> | stat = <назва характеристики> }}

або

{{#invoke:iteminfo|getStat| <id предмета> | <назва характеристики> }}

id

ID предмета, має бути в діапазоні від 1 до 5455. Зверніть увагу, що наступні ID застаріли і, отже, недійсні: від 2772 до 2775, від 2777 до 2780, від 2782 до 2785, 2881, 3273, від 3340 до 3346, від 3462 до 3465, 3750, від 3847 до 3851, 3861 та 3862.

stat (необов’язковий)

Назва характеристики, див. таблицю нижче для можливих значень.


Якщо ви не впевнені, що вказаний вами ID коректний, перевірте його через {{#dplvar:_iteminfo_type}}. ID відображається, якщо воно коректне, інакше значення буде порожнім.

Усі поля виведення перераховані нижче. Зверніть увагу, що не всі використовуються; див. примітку до кожного рядка. І, будь ласка, також звертайтеся до документацій з tModLoader і tConfig.

Примітка: Ви можете отримати назву предмета з ідентифікатора за допомогою {{ItemNameFromId}}.

dplvar
(без префіксу)
Значення за замовчуванням Приклад
(тут: ID = 757)
Примітка
type 0 757 ID предмета. Якщо ID як аргумент заданий коректно, значення буде виведено числом. Інакше значення буде порожнім.
internalName TerraBlade Внутрішня назва предмета.
name Terra Blade Назва предмета англійською.
DD2Summon Якщо є, то це означає, що це зброя, що закликає сторожів, від шинкаря(Видання для ПК, консолей та мобільних пристроїв).
ToolTip Наразі завжди порожньо. Збережено для використання у майбутньому. Можете використовувати {{itemTooltip}} для виведення підказок.
material 1 Якщо є, то цей предмет — матеріал. Ви також можете використовувати {{#invoke:Recipes|exist|ingredient=<назва предмета>}}, щоб відобразити цю інформацію.
accessory Якщо є, то цей предмет — аксесуар.
alpha 0 0
ammo 0 0 ID боєприпасу (використовується в полі useAmmo) і не тільки, наприклад 353, 154
autoReuse 1 Якщо є, то цей предмет має автозмах.
axe 0 0 Потужність сокири. 1 ≙ 5%, наприклад, axe = 23 означає, що потужність сокири цього предмета дорівнює 115%.
backSlot -1 -1 ID осередку зі спини. Див. «Ідентифікатори броні» § «Аксесуари».
bait 0 0 Якість наживки (у відсотках), наприклад, bait = 50 означає, що якість наживки цього предмета дорівнює 50%.
balloonSlot -1 -1 ID осередку кульки. Див. «Ідентифікатори броні» § «Аксесуари».
bodySlot -1 -1 ID осередку тіла (груди). Див. «Ідентифікатори броні».
buffTime 0 0 Час дії бафа, який дає цей предмет, у тиках (1 тик = 1/60 секунди та 1/3600 хвилини). Наприклад, якщо buffTime = 14400, то це означає, що баф діятиме протягом 240 секунд (14400/60 = 240), що дорівнює чотирьом хвилинам (14400/3600 = 4).
buffType 0 0 ID бафа, що накладається цим предметом.
canBePlacedInVanityRegardlessOfConditions
cartTrack Задається для рейок.
channel Якщо є, це означає, що предмет можна/потрібно використовувати постійно (тут мається на увазі не автозмах, а саме можливість утримання предмета!). Задається для кистіней та йо-йо, бензопил та бурів, чарівної ракети та її аналогів, жезла землі, піраньєвої пушкі, хлорофітового відбійного молотка, лазерного кулемету, зарядної бластер-пушкі, літаючого ножа, голови Медузи, Архалісу, портальної пушкі, «Вихрового загонича», «Фантома», «Вищого задуму», останньої призми, сонного восьмижезлу, моторошної глефи, «Примарного фенікса», «Люті небесного дракона». Також задається для деяких предметів, що закликають вихованців/для висвітлюючих вихованців/засоби пересування, тому що вони діють постійно.
consumable Задається для предметів, що витрачаються (всі вони перераховані в категорії «Витрачені предмети»). Зверніть увагу, що вони відрізняються від внутрішньоігрового поняття слова «витрачені»! Див. ясності категорію «Витрачені предмети» . Якщо цей атрибут має значення True, то один предмет зі стопки буде видалений під час використання.
craftable 1 Якщо є, цей предмет може бути створений. Ви також можете використовувати {{#invoke:Recipes|exist|result=<назва предмета>}}, щоб відобразити цю інформацію.
createTile -1 -1 ID тайла цього предмета, який створюється під час розміщення. placeStyle — це підкатегорія ID тайла.
placeStyle 0 0
createWall -1 -1 ID стіни цього предмета, який створюється під час розміщення.
crit 0 0 Шанс критичного удару (у відсотках), який додається до основного шансу на 4%, наприклад, crit = 2 означає, що шанс критичного удару цього предмета дорівнює 6%; crit = 4 означає, що шанс критичного удару цього предмета дорівнює 8%.
damage -1 85 Базова шкода предмета.
defense 0 0 Рівень захисту, який цей предмет дає.
dye 0 0 Якщо значення не дорівнює нулю, то цей предмет — барвник.
expert Якщо є, цей предмет буде відображатися з рівнем рідкості Рівень рідкості: Райдужна.
faceSlot -1 -1 ID комірки на обличчі. Див. «Ідентифікатори броні» § «Аксесуари».
fishingPole 0 0 Навичка риболовлі предмета (у відсотках), наприклад, fishingPole = 27 означає, що навичка риболовлі цього предмета дорівнює 27%.
flame Задається для кожного виду смолоскипа, а також для водяної, мирної, платинової та звичайної свічки. Що цікаво, воно також задається для пекельного меча.
frontSlot -1 -1 ID комірки спереду. Див. «Ідентифікатори броні» § «Аксесуари».
glowMask -1 -1
hairDye -1 -1 Значення рівне нулю задається для змивача фарби для волосся, а позитивні числа — для фарб для волосся.
hammer 0 0 Потужність молота (у відсотках), наприклад, hammer = 90 означає, що потужність молота предмета дорівнює 90%.
handOffSlot -1 -1 ID осередку вільної руки. Див. «Ідентифікатори броні» § «Аксесуари».
handOnSlot -1 -1 ID осередку зайнятої руки. Див. «Ідентифікатори броні» § «Аксесуари».
headSlot -1 -1 ID комірки голови. Див. Ідентифікатори броні.
healLife 0 0 Кількість очок здоров’я, яку відновлює предмет під час використання.
healMana 0 0 Кількість очок мани, яку відновлює предмет під час використання.
holdStyle 0 0 Можливо лише у вигляді значення від 0 до 3. Значення 1 задається для кожного виду смолоскипа, а також для водяної, мирної, платинової та звичайної свічки, липкої світлопалички, стрибучої світлопалички, світлопалички спелеолога та звичайної світлопалички, елю, єдинорога на паличці, сигнальної ракетниці, маршмелоу на паличці, таїнства туманності. Значення 2 задається для дихальної трубки, парасольки. Значення 3 задається для чарівної арфи.
knockBack 0 6.5 Значення відкидання предмета.
legSlot -1 -1 ID комірки ноги. Див. Ідентифікатори броні.
lifeRegen 0 0 Може бути тільки 0 або 1. Значення 1 задається для браслета відновлення та амулету міфів.
makeNPC 0 0 Якщо значення не дорівнює нулю, це означає, що предмет використовується для призову істот (NPC). Значення відповідає ID істоти, що призивається.
mana 0 0 Кількість мани, яке предмет споживає під час використання.
maxStack 1 1 Максимальна кількість у стопці.
mech Якщо є, то цей предмет є механізмом, що також означає, що він відображає дроти та активізатори, якщо у руці.
melee 1 Якщо є, то цей предмет завдає шкоди у ближньому бою.
magic Якщо є, то цей предмет завдає магічну шкоду.
ranged Якщо є, то цей предмет завдає шкоди у дальньому бою.
summon Якщо є, то цей предмет завдає шкоди від призваної істоти.
thrown Якщо є, то цей предмет завдає шкоди при кидку.
mountType -1 -1 ID засобу пересування, яке закликає цей предмет під час використання.
netID 0 757
neckSlot -1 -1 ID осередку на шиї. Див. «Ідентифікатори броні» § «Аксесуари».
noMelee 1 Чи дозволено цьому предмету завдавати шкоди своїм спрайтом. Зазвичай ставиться значення true для зброї дальнього бою, яка натомість покладатиметься на свої снаряди для завдання шкоди.
noUseGraphic Чи малюється спрайт цього елемента, коли він використовується. Використовується в такій метальній зброї, як динаміт, тому що його одразу кидають на землю, щоб створити ілюзію того, що його використовують.
noWet Якщо є, то предмет не можна тримати в руках/розміщувати під водою: єдиноріг на паличці, кожен вид свічки та кожен вид смолоскипа (крім проклятого та іхорного). Тим не менш, він також задається для таймерів, які можуть бути розміщені під водою.
notAmmo Задається лише для монет, елю, дротів. Крім дротів, їх поєднує ще те, що їх не можна розміщувати в осередку боєприпасів інвентарю, навіть якщо вони використовуються як боєприпаси. Однак у цей осередок можна розмістити дроти.
paint 0 0 Якщо значення не дорівнює нулю, цей предмет — фарба. Це значення є чимось на зразок «ID фарби», яке знаходиться в діапазоні від 1 (червона фарба) до 30 (негативна фарба).
pick 0 0 Потужність кирки (у відсотках), наприклад, pick = 150 означає, що потужність кирки предмета дорівнює 150%.
potion Якщо є, жодні інші предмети з цим атрибутом не можна використовувати доти, доки не закінчиться час відновлення. Воно використовується для лікуючих предметів та грибів.
rare 0 8 Рідкість предмета. Значення буде некоректним, якщо задано expert, оскільки це означає, що предмет має рідкість рівня Рівень рідкості: Райдужна.
reuseDelay 0 0 Час у тиках (1 тик = 1/60 секунди та 1/3600 хвилини) доки предмет можна буде використовувати знову, зазвичай зване «затримкою використання». На даний момент задається тільки для заводної штурмової гвинтівки, голови Медузи, останньої призми, «розсікача небес» та прокляття Бетсі.
sacrifices 0 1 Необхідна кількість предметів для дослідження.
scale 1 1
sentry Якщо є, то цей предмет є закликаючим вартових.
shieldSlot -1 -1 ID осередку щита. Див. «Ідентифікатори броні» § «Аксесуари».
shoeSlot -1 -1 ID осередку взуття. Див. «Ідентифікатори броні» § «Аксесуари».
shopCustomPrice -1 Вартість предметів армії Древніх(Видання для ПК, консолей та мобільних пристроїв), у медалях захисника.
shoot 0 985 Якщо значення не дорівнює нулю, то це ID снаряду, що випускається предметом.
shootSpeed 0 12 Швидкість снаряда, що випускається предметом.
stringColor Колір мотузочки.
tileBoost 0 0 Бонус дальності, наприклад, tileBoost = 4 означає, що дальність цього предмета збільшена до 4. Також згадується у підказках предмета як, наприклад, «+4 до дальності».
tileWand -1 -1 ID предмета блоку, який розміщує паличка.
questItem Задається тільки для квестових риб.
uniqueStack Задаётся только для квестових риб. Див. Риболовля#Завдання рибалки для більш детальної інформації щодо якості цих предметів.
useAmmo 0 0 Тип боєприпасів, які використовуються цим предметом. 23 для гелю, 40 для стріли, 71 для монети, 75 для впалої зірки, 97 для кулі, 169 для піску, 283 для дротика, 771 для ракети, 780 для розчину, 931 для сигнальної ракети, 949 для сніжку, 1261 для болта «Стінгера», 1783 для Кенді-корну, 1785 для світильника Джека, 1836 для кілка, 3108 для цвяха.
useAnimation 100 18 Як довго програється анімація предмета, в тиках (1 тик = 1/60 секунди та 1/3600 хвилини). Цікава особливість полягає в тому, що якщо значення useTime нижче, ніж у useAnimation, то вона програватиметься один або кілька разів за використання (наприклад, як «Золотий дощ»). Якщо предмет є меч із автозмахом, то час використання предмета (яке відображається у грі та на вікі) буде поставлено як useAnimation = -1.
UseSound Item_1 Назва файлу (без розширення файлу, ніж зазвичай є .wav) звукового ефекту, який відтворюється цим предметом під час використання. Зверніть увагу, що вказаний звук є лише основним; він може бути програний зі зміненою висотою тону та гучністю у грі.
useStyle 0 1 1 = загальний помах/кидок, 2 = поїдання/використання, 3 = колотий удар, 4 = утримання, 5 = прибирання. Також див. список tConfig.
useTime 100 18 Швидкість інструменту, (внутрішній) час використання для інших. Скільки часу потрібно для використання предмета у кадрах. Поки предмет перебуває у стані використання, ви не можете виконувати інші дії.
useTurn Чи гравець повертатиметься обличчям у напрямку свого руху при використанні предмета. Наприклад, меч повертає вас обличчям вліво або вправо, а от спис — немає. Якщо задати значення як useTurn = false, то це дозволить гравцеві не повертатися у бік свого руху під час використання.
value 0 1000000 Значення вартості, у мідних монетах. Вартість продажу = вартість покупки / 5. Шаблон {{Coin}} допомагає з форматуванням цього значення для коректного відображення.
vanity Якщо є, то цей предмет — предмет стилю.
waistSlot -1 -1 ID осередку тулуба. Див. «Ідентифікатори броні» § «Аксесуари».
wingSlot -1 -1 ID осередку крил. Див. «Ідентифікатори броні» § «Аксесуари».

---Item info database
---luacache.get() is relative slow, therefore we load data from luacache only once per page.
local data = mw.loadData('Module:Iteminfo/loaddata')

local trim = mw.text.trim
local idSets = require('Module:Iteminfo/idSets')

local info = {
	version = data['_terrariaversion'],
	IDs = { -- min and max are both inclusive
		min = 1,
		max = 5455,
	},
}
info.IDs.isValidWithUnused = function(id)
	-- IDs marked as "unused" are still considered valid by this function
	return id ~= nil and type(id) == 'number' and id >= info.IDs.min and id <= info.IDs.max
end
info.IDs.isValid = function(id)
	-- IDs marked as "unused" are considered invalid by this function
	return info.IDs.isValidWithUnused(id) and idSets.getValue('Unused', id) ~= true
end

-- cache
local currentFrame

-- helper function
local getArg = function(key)
	local value = currentFrame.args[key]
	if not value then
		return nil
	end
	value = trim(value)
	if value == '' then
		return nil
	else
		return value
	end
end

-- credit: http://richard.warburton.it
-- this version is with trim.
local function explode(div,str) 
	if (div=='') then return false end
	local pos,arr = 0,{}
	-- for each divider found
	for st,sp in function() return string.find(str,div,pos,true) end do
		arr[#arr + 1] = trim(string.sub(str,pos,st-1)) -- Attach chars left of current divider
		pos = sp + 1 -- Jump past current divider
	end
	arr[#arr + 1] = trim(string.sub(str,pos)) -- Attach chars right of last divider
	return arr
end

local getStat = function(itemid, stat)
	return data[itemid][stat] or data[0][stat] or nil -- "or nil" will convert "false" to "nil"
end

local statname = {
	["acc"] = "accessory",
	["autoreuse"] = "autoReuse",
	["autoswing"] = "autoReuse",
	["auto"] = "autoReuse",
	["axe power"] = "axe",
	["axepower"] = "axe",
	["bait power"] = "bait",
	["baitpower"] = "bait",
	["body slot"] = "bodySlot",
	["bodyslot"] = "bodySlot",
	["buff duration"] = "buffTime",
	["buff id"] = "buffType",
	["buffduration"] = "buffTime",
	["buffid"] = "buffType",
	["bufftime"] = "buffTime",
	["bufftype"] = "buffType",
	["carttrack"] = "cartTrack",
	["createtile"] = "createTile",
	["createwall"] = "createWall",
	["critical"] = "crit",
	["dd2summon"] = "DD2Summon",
	["dmg"] = "damage",
	["fishing power"] = "fishingPole",
	["fishingpole"] = "fishingPole",
	["fishingpower"] = "fishingPole",
	["fishing"] = "fishingPole",
	["hair dye"] = "hairDye",
	["hairdye"] = "hairDye",
	["hammer power"] = "hammer",
	["hammerpower"] = "hammer",
	["head slot"] = "headSlot",
	["headslot"] = "headSlot",
	["heallife"] = "healLife",
	["healmana"] = "healMana",
	["holdstyle"] = "holdStyle",
	["id"] = "type",
	["internal name"] = "internalName",
	["internalname"] = "internalName",
	["item id"] = "type",
	["itemid"] = "type",
	["kb"] = "knockBack",
	["knockback"] = "knockBack",
	["leg slot"] = "legSlot",
	["legslot"] = "legSlot",
	["liferegen"] = "lifeRegen",
	["makenpc"] = "makeNPC",
	["maxstack"] = "maxStack",
	["mount id"] = "mountType",
	["mountid"] = "mountType",
	["mounttype"] = "mountType",
	["mount"] = "mountType",
	["nomelee"] = "noMelee",
	["notammo"] = "notAmmo",
	["nousegraphic"] = "noUseGraphic",
	["nowet"] = "noWet",
	["pick power"] = "pick",
	["pickpower"] = "pick",
	["pickaxe power"] = "pick",
	["pickaxepower"] = "pick",
	["pickaxe"] = "pick",
	["placestyle"] = "placeStyle",
	["projectileid"] = "shoot",
	["projectile id"] = "shoot",
	["questitem"] = "questItem",
	["range bonus"] = "tileBoost",
	["rangebonus"] = "tileBoost",
	["rarity"] = "rare",
	["reusedelay"] = "reuseDelay",
	["shootspeed"] = "shootSpeed",
	["sound"] = "UseSound",
	["sounduse"] = "UseSound",
	["stack"] = "maxStack",
	["stringcolor"] = "stringColor",
	["tile id"] = "createTile",
	["tile sub id"] = "placeStyle",
	["tile subid"] = "placeStyle",
	["tilesubid"] = "placeStyle",
	["tile wand"] = "tileWand",
	["tileboost"] = "tileBoost",
	["tileid"] = "createTile",
	["tilewand"] = "tileWand",
	["tile"] = "createTile",
	["tool speed"] = "useTime",
	["toolspeed"] = "useTime",
	["tooltip"] = "ToolTip",
	["uniquestack"] = "uniqueStack",
	["use delay"] = "reuseDelay",
	["use sound"] = "UseSound",
	["use style"] = "useStyle",
	["use time"] = "useAnimation",
	["useammo"] = "useAmmo",
	["useanimation"] = "useAnimation",
	["usedelay"] = "reuseDelay",
	["usesound"] = "UseSound",
	["usestyle"] = "useStyle",
	["usetime"] = "useAnimation",
	["useturn"] = "useTurn",
	["use"] = "useAnimation",
	["velocity"] = "shootSpeed",
	["wall id"] = "createWall",
	["wallid"] = "createWall",
	["wall"] = "createWall",
	["sell"] = "value",
	--non-native stats:
	["buy"] = "buyValue",
	["price"] = "buyValue",
	["buffname"] = "buffName",
	["buff name"] = "buffName",
	["buff"] = "buffName",
	["research"] = "sacrifices"
}

local proc = {}
proc.axe = function(value)
	return currentFrame:expandTemplate{ title = 'percent', args = { tostring((value or 0) * 5) .. '%' } }
end
proc.bodySlot = function(value)
	return (value == -1) and "" or value
end
proc.createTile = proc.bodySlot
proc.createWall = proc.bodySlot
proc.damage = proc.bodySlot
proc.hairDye = proc.bodySlot
proc.headSlot = proc.bodySlot
proc.legSlot = proc.bodySlot
proc.mountType = proc.bodySlot
proc.tileWand = proc.bodySlot
proc.bait = function(value)
	return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value) .. '%' } }
end
proc.fishingPole = proc.bait
proc.hammer = proc.bait
proc.pick = proc.bait
proc.buffTime = function(value)
	return currentFrame:expandTemplate{ title = 'duration', args = { (value or 0)/60 } }
end
proc.buffName = function(value, id)
	return currentFrame:expandTemplate{ title = 'GetBuffInfo', args = { getStat(id, 'buffType'), 'ename' } }
end
proc.crit = function(value, id)
	if getStat(id, 'damage') == -1 then
		return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value) .. '%' } } -- no damage value
	else
		return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value+4) .. '%' } }  -- has damage value
	end
end
proc.damagetype = function(value, id)
	if getStat(id, 'melee') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_melee' } }
	end
	if getStat(id, 'ranged') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_ranged' } }
	end
	if getStat(id, 'magic') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_magic' } }
	end
	if getStat(id, 'summon') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_summon' } }
	end
	if getStat(id, 'thrown') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_thrown' } }
	end
end
proc.rare = function(value)
	return currentFrame:expandTemplate{ title = 'rare', args = { (value or 0), cate=getArg('cate') or getArg('category') or getArg('cat') or 'no' } }
end
proc.tileBoost= function(value)
	if value ~= 0 then
		if value > 0 then
			value = '+' .. tostring(value)
		else
			value = tostring(value)
		end
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'tileBoost', ['$tiles$'] = value } }
	end
end
proc.useAmmo = function(value)
	if value == 40 or value == 71 or value == 97 or value == 283 or value == 771 or value == 931 then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'ammo'..tostring(value) } }
	end
	return currentFrame:expandTemplate{ title = 'itemNameFromId', args = { value } }
end
proc.UseSound = function(value)
	local str = ''
	for _,v in pairs(explode(',', value)) do
		str = str .. currentFrame:expandTemplate{ title = 'sound', args = { '', v..'.wav' } }
	end
	return str
end
proc.useStyle = function(value)
	if value == 0 then
		return
	end
	if value >= 1 and value <= 5 then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'usestyle'..tostring(value) } }
	end
	return value
end
proc.buyValue = function(value, id)
	local t=getStat(id, 'shopCustomPrice')
	if t then
		return currentFrame:expandTemplate{ title = 'dm', args = { t } }
	else
		return currentFrame:expandTemplate{ title = 'coin', args = { tostring(getStat(id, 'value'))..'cc' } }
	end
end
proc.value = function(value)
	value = tonumber(value or 0)
	if value > 0 then
		if value < 5 then
			-- items with value<5 have a sell value of 1, not 0 (contrary to regular rounding)
			return currentFrame:expandTemplate{ title = 'coin', args = { '1cc' } }  
		else
			return currentFrame:expandTemplate{ title = 'coin', args = { tostring(math.floor(value/5))..'cc' } }  
		end
	else
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'noValue' } }
	end
end


---------------------------

local p = {
	-- info table for other modules
	info = info,
	
	-- info table data for templates
	v = function(frame)
		return info.version
	end,
	maxId = function(frame)
		return info.IDs.max
	end,
	isValidId = function(frame)
		currentFrame = frame -- cache
		if getArg('includeUnused') then
			return info.IDs.isValidWithUnused(tonumber(getArg(1)) or 0) and 1 or 0
		end
		return info.IDs.isValid(tonumber(getArg(1)) or 0) and 1 or 0
	end,

	-- for other modules: get all stats, return them as a table
	getItemInfo = function(itemid)
		if not data[itemid] then
			itemid = 0
		end
		local result = {['type'] = itemid}
		for k,v in pairs(data[0]) do
			result[k] = v
		end
		for k,v in pairs(data[itemid]) do
			result[k] = v
		end
		return result
	end,

	-- for templates: get all stats, set them in dplvars
	getInfo = function(frame)
		currentFrame = frame -- cache

		local itemid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0
		local prefix = getArg('prefix') or getArg(2) or '_iteminfo_'

		if not data[itemid] then
			itemid = 0
		end
		
		local result = {['type'] = itemid}
		for k,v in pairs(data[0]) do
			result[k] = v
		end
		for k,v in pairs(data[itemid]) do
			result[k] = v
		end

		local args = {}
		local fields = {}
		for k,v in pairs(result) do
			args[#args + 1] = prefix .. k
			args[#args + 1] = v
			fields[#fields + 1] = k
		end
		
		args[#args + 1] = prefix .. '_fields'
		args[#args + 1] = table.concat(fields, '/')

		frame:callParserFunction{ name = '#dplvar:set', args = args }
	end,

	-- for other modules: get a single stat, return it directly
	getItemStat = function(itemid, stat)
		if stat == 'count' then
			-- this is deprecated, p.info.IDs.max should be used directly
			return info.IDs.max
		end
		if not data[itemid] then
			itemid = 0
		end
		if stat == 'type' then
			return itemid
		end
		return data[itemid][stat] or data[0][stat]
	end,

	-- for templates: get a single stat, return it directly
	getStat = function(frame)
		currentFrame = frame -- cache

		local itemid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0
		local stat = getArg('stat') or getArg(2)
		stat = statname[stat] or stat

		if not stat then
			return
		end

		if not data[itemid] then
			itemid = 0
		end

		local result
		if stat == 'type' then
			return itemid
		end
		if stat == 'count' then
			-- this is deprecated, {{iteminfo/maxId}} should be used
			return info.IDs.max
		end
		result = getStat(itemid, stat) 
		if not getArg('raw') and proc[stat] then
			result = proc[stat](result, itemid)
		end

		if getArg('format') then
			result = frame:callParserFunction('formatnum', result)
		end

		return result
	end,
}

--alias
p.getinfo = p.getInfo
p.GetInfo = p.getInfo
p.getstat = p.getStat
p.GetStat = p.getStat

return p