Compare commits
8 Commits
feature-at
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b60f459cb | ||
|
|
1a7c0d4796 | ||
|
|
4e37f2b0ee | ||
|
|
49754b1394 | ||
|
|
68232403d3 | ||
|
|
b32b317be2 | ||
|
|
791f8aff8b | ||
|
|
52524231aa |
155
app.js
155
app.js
@ -26,6 +26,11 @@ const FACTIONS = {
|
||||
"Thuranni": { xp: 1.0, gold: 1.25, "rep+": 0.5, "rep-": -2 }
|
||||
};
|
||||
|
||||
const DNDBEYOND_MAGIC_ITEM_BASE_URL = "https://dndbeyond.com/magic-items/";
|
||||
const MAGIC_ITEM_PAGE_MAP = typeof MAGIC_ITEMS_DATA !== 'undefined'
|
||||
? new Map(MAGIC_ITEMS_DATA.map(item => [item.name, item.dndbeyondPage]).filter(([, page]) => page))
|
||||
: new Map();
|
||||
|
||||
const OPPOSITIONS = {
|
||||
"Kundarak": ["Deneith", "Tharashk"],
|
||||
"Medani": ["Tharashk", "Thuranni"],
|
||||
@ -307,6 +312,8 @@ function getStockTransitions(rarity) {
|
||||
// Global market data and sort state
|
||||
let marketData = null;
|
||||
let currentSort = { column: 'name', direction: 'asc' };
|
||||
|
||||
|
||||
|
||||
// Calculate price multiplier based on reputation and rarity
|
||||
function getPriceMultiplier(reputation, rarity) {
|
||||
@ -395,7 +402,7 @@ function toggleSection(contentId, iconId) {
|
||||
const icon = document.getElementById(iconId);
|
||||
|
||||
if (content.style.display === 'none') {
|
||||
content.style.display = 'block';
|
||||
content.style.display = '';
|
||||
icon.textContent = '▼';
|
||||
} else {
|
||||
content.style.display = 'none';
|
||||
@ -423,6 +430,7 @@ document.addEventListener('click', (event) => {
|
||||
function renderMarket(marketData, reputationData) {
|
||||
const marketContainer = document.getElementById('market-display');
|
||||
if (!marketContainer || !marketData || !marketData.items) return;
|
||||
captureMarketTableScroll();
|
||||
|
||||
// Filter to only available items (stock > unavailable AND reputation high enough)
|
||||
const availableItems = [];
|
||||
@ -430,12 +438,19 @@ function renderMarket(marketData, reputationData) {
|
||||
marketData.items.forEach(item => {
|
||||
const reputation = reputationData[item.faction] || 0;
|
||||
if (item.stock !== "unavailable" && isItemAvailable(item, reputation)) {
|
||||
const dndbeyondPage = item.dndbeyondPage
|
||||
|| MAGIC_ITEM_PAGE_MAP.get(item.name)
|
||||
|| null;
|
||||
const dndbeyondUrl = dndbeyondPage
|
||||
? `${DNDBEYOND_MAGIC_ITEM_BASE_URL}${dndbeyondPage}`
|
||||
: null;
|
||||
// Add adjusted price to item for sorting
|
||||
const adjustedPrice = getAdjustedPrice(item, reputation);
|
||||
availableItems.push({
|
||||
...item,
|
||||
adjustedPrice,
|
||||
reputation
|
||||
reputation,
|
||||
dndbeyondUrl
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -445,42 +460,47 @@ function renderMarket(marketData, reputationData) {
|
||||
return;
|
||||
}
|
||||
|
||||
const filterValues = getMarketFilterValues(availableItems);
|
||||
const filteredItems = applyMarketFilters(availableItems);
|
||||
|
||||
if (filteredItems.length === 0) {
|
||||
|
||||
const emptyColspan = 5;
|
||||
marketContainer.innerHTML = `
|
||||
<div class="market-table-wrapper">
|
||||
<table class="market-table">
|
||||
<thead>
|
||||
${renderMarketHeader()}
|
||||
${renderMarketFilters(filterValues)}
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="no-items" colspan="${emptyColspan}">No items match the current filters.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
`;
|
||||
restoreMarketFilterFocus();
|
||||
return;
|
||||
}
|
||||
|
||||
// Sort items
|
||||
sortItems(availableItems, currentSort.column, currentSort.direction);
|
||||
sortItems(filteredItems, currentSort.column, currentSort.direction);
|
||||
|
||||
// Build table HTML with scrollable wrapper
|
||||
let html = `
|
||||
<div class="market-table-wrapper">
|
||||
<table class="market-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable ${currentSort.column === 'name' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('name')">
|
||||
Name ${getSortIndicator('name')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'faction' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('faction')">
|
||||
Faction ${getSortIndicator('faction')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'rarity' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('rarity')">
|
||||
Rarity ${getSortIndicator('rarity')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'stock' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('stock')">
|
||||
Stock ${getSortIndicator('stock')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'cost' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('cost')">
|
||||
Cost ${getSortIndicator('cost')}
|
||||
</th>
|
||||
</tr>
|
||||
${renderMarketHeader()}
|
||||
${renderMarketFilters(filterValues)}
|
||||
</thead>
|
||||
<tbody>
|
||||
`;
|
||||
|
||||
// Render each item as table row
|
||||
availableItems.forEach(item => {
|
||||
filteredItems.forEach(item => {
|
||||
const stockClass = item.stock.replace(' ', '-');
|
||||
const factionClass = item.faction.toLowerCase();
|
||||
const rarityClass = item.rarity.toLowerCase().replace(' ', '-');
|
||||
@ -493,10 +513,13 @@ function renderMarket(marketData, reputationData) {
|
||||
: isAdminPage
|
||||
? `${item.adjustedPrice} gp <span class="base-price">(${item.baseCost} gp)</span>`
|
||||
: `${item.adjustedPrice} gp`;
|
||||
|
||||
const nameDisplay = item.dndbeyondUrl
|
||||
? `<a class="item-link" href="${item.dndbeyondUrl}" target="_blank" rel="noopener">${item.name}</a>`
|
||||
: item.name;
|
||||
|
||||
html += `
|
||||
<tr class="market-row">
|
||||
<td class="item-name-cell">${item.name}</td>
|
||||
<td class="item-name-cell">${nameDisplay}</td>
|
||||
<td class="item-faction-cell ${factionClass}">${item.faction}</td>
|
||||
<td class="item-rarity-cell">
|
||||
<span class="rarity-badge rarity-${rarityClass}">${item.rarity}</span>
|
||||
@ -517,9 +540,37 @@ function renderMarket(marketData, reputationData) {
|
||||
`;
|
||||
|
||||
marketContainer.innerHTML = html;
|
||||
restoreMarketFilterFocus();
|
||||
restoreMarketTableScroll();
|
||||
}
|
||||
|
||||
function renderMarketHeader() {
|
||||
return `
|
||||
<tr>
|
||||
<th class="sortable ${currentSort.column === 'name' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('name')">
|
||||
Name ${getSortIndicator('name')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'faction' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('faction')">
|
||||
Faction ${getSortIndicator('faction')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'rarity' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('rarity')">
|
||||
Rarity ${getSortIndicator('rarity')}
|
||||
</th>
|
||||
<th class="sortable ${currentSort.column === 'stock' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('stock')">
|
||||
Stock ${getSortIndicator('stock')}
|
||||
</th>
|
||||
<th class="sortable cost-col ${currentSort.column === 'cost' ? 'sorted-' + currentSort.direction : ''}"
|
||||
onclick="sortMarket('cost')">
|
||||
Cost ${getSortIndicator('cost')}
|
||||
</th>
|
||||
</tr>
|
||||
`;
|
||||
}
|
||||
|
||||
// Sort items by column
|
||||
function sortItems(items, column, direction) {
|
||||
const multiplier = direction === 'asc' ? 1 : -1;
|
||||
|
||||
@ -583,6 +634,14 @@ function getSortIndicator(column) {
|
||||
return currentSort.direction === 'asc' ? '↑' : '↓';
|
||||
}
|
||||
|
||||
function escapeAttribute(value) {
|
||||
return String(value)
|
||||
.replace(/&/g, '&')
|
||||
.replace(/\"/g, '"')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>');
|
||||
}
|
||||
|
||||
// ===== END MAGIC ITEM MARKET SYSTEM =====
|
||||
|
||||
function getNextQuestForFaction(faction, currentIndex) {
|
||||
@ -730,6 +789,41 @@ function toggleBenefitsTooltip(event) {
|
||||
|
||||
// Toggle this tooltip
|
||||
tooltip.classList.toggle('show');
|
||||
|
||||
if (tooltip.classList.contains('show')) {
|
||||
positionBenefitsTooltip(tooltip, icon);
|
||||
}
|
||||
}
|
||||
|
||||
function positionBenefitsTooltip(tooltip, icon) {
|
||||
const margin = 12;
|
||||
const maxWidth = Math.min(400, window.innerWidth - margin * 2);
|
||||
|
||||
tooltip.style.width = `${maxWidth}px`;
|
||||
tooltip.style.left = '50%';
|
||||
tooltip.style.right = 'auto';
|
||||
tooltip.style.transform = 'translateX(-50%)';
|
||||
|
||||
let tooltipRect = tooltip.getBoundingClientRect();
|
||||
const iconRect = icon.getBoundingClientRect();
|
||||
const viewportWidth = window.innerWidth;
|
||||
|
||||
if (tooltipRect.right > viewportWidth - margin) {
|
||||
const shiftLeft = tooltipRect.right - (viewportWidth - margin);
|
||||
tooltip.style.transform = `translateX(calc(-50% - ${shiftLeft}px))`;
|
||||
} else if (tooltipRect.left < margin) {
|
||||
const shiftRight = margin - tooltipRect.left;
|
||||
tooltip.style.transform = `translateX(calc(-50% + ${shiftRight}px))`;
|
||||
}
|
||||
|
||||
// Re-measure after shifting and align arrow to icon center
|
||||
tooltipRect = tooltip.getBoundingClientRect();
|
||||
const iconCenter = iconRect.left + iconRect.width / 2;
|
||||
const arrowLeft = Math.min(
|
||||
Math.max(iconCenter - tooltipRect.left, 16),
|
||||
tooltipRect.width - 16
|
||||
);
|
||||
tooltip.style.setProperty('--tooltip-arrow-left', `${arrowLeft}px`);
|
||||
}
|
||||
|
||||
// Close tooltips when clicking outside
|
||||
@ -739,6 +833,9 @@ document.addEventListener('click', (event) => {
|
||||
tooltip.classList.remove('show');
|
||||
});
|
||||
}
|
||||
if (!event.target.closest('.market-filter-dropdown')) {
|
||||
closeMarketFilterDropdown();
|
||||
}
|
||||
});
|
||||
|
||||
function renderQuestBoard(quests, currentTime) {
|
||||
|
||||
377
filtering.js
Normal file
377
filtering.js
Normal file
@ -0,0 +1,377 @@
|
||||
// Magic Item Market filtering state and helpers
|
||||
let marketFilters = {
|
||||
name: '',
|
||||
faction: [],
|
||||
rarity: [],
|
||||
stock: [],
|
||||
costMin: '',
|
||||
costMax: ''
|
||||
};
|
||||
let marketFilterFocus = null;
|
||||
let marketFilterOpenKey = null;
|
||||
let marketFilterSearch = {
|
||||
faction: '',
|
||||
rarity: '',
|
||||
stock: '',
|
||||
};
|
||||
let marketTableScrollLeft = null;
|
||||
let marketFilterAllValues = {
|
||||
faction: [],
|
||||
rarity: [],
|
||||
stock: [],
|
||||
};
|
||||
let marketFiltersInitialized = false;
|
||||
let marketFilterDebounce = null;
|
||||
function renderMarketFilters(values) {
|
||||
// Build the filter row markup for the market table.
|
||||
const { factions, rarities, stocks, } = values;
|
||||
return `
|
||||
<tr class="market-filter-row">
|
||||
<th>
|
||||
<div class="market-filter-search">
|
||||
<input class="market-filter-input market-filter-search-input" type="text" placeholder="Search"
|
||||
value="${escapeAttribute(marketFilters.name)}"
|
||||
data-filter-key="name"
|
||||
oninput="updateMarketFilter('name', this.value)" />
|
||||
<button class="market-filter-clear${marketFilters.name ? ' active' : ''}"
|
||||
type="button"
|
||||
aria-label="Clear name filter"
|
||||
onclick="clearMarketFilter('name')">×</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
${renderFilterDropdown('faction', 'Faction', factions, marketFilters.faction)}
|
||||
</th>
|
||||
<th>
|
||||
${renderFilterDropdown('rarity', 'Rarity', rarities, marketFilters.rarity)}
|
||||
</th>
|
||||
<th>
|
||||
${renderFilterDropdown('stock', 'Stock', stocks, marketFilters.stock, toTitleCase)}
|
||||
</th>
|
||||
<th class="cost-col">
|
||||
<div class="market-filter-range">
|
||||
<div class="market-filter-search">
|
||||
<input class="market-filter-input cost-filter" type="text" inputmode="numeric" pattern="[0-9]*" placeholder="Min"
|
||||
value="${escapeAttribute(marketFilters.costMin)}"
|
||||
data-filter-key="costMin"
|
||||
oninput="updateMarketFilter('costMin', this.value)" />
|
||||
<button class="market-filter-clear${marketFilters.costMin ? ' active' : ''}"
|
||||
type="button"
|
||||
aria-label="Clear minimum cost"
|
||||
onclick="clearMarketFilter('costMin')">×</button>
|
||||
</div>
|
||||
<div class="market-filter-search">
|
||||
<input class="market-filter-input cost-filter" type="text" inputmode="numeric" pattern="[0-9]*" placeholder="Max"
|
||||
value="${escapeAttribute(marketFilters.costMax)}"
|
||||
data-filter-key="costMax"
|
||||
oninput="updateMarketFilter('costMax', this.value)" />
|
||||
<button class="market-filter-clear${marketFilters.costMax ? ' active' : ''}"
|
||||
type="button"
|
||||
aria-label="Clear maximum cost"
|
||||
onclick="clearMarketFilter('costMax')">×</button>
|
||||
</div>
|
||||
</div>
|
||||
</th>
|
||||
</tr>
|
||||
`;
|
||||
}
|
||||
|
||||
function getMarketFilterValues(items) {
|
||||
// Derive filter options once per render, seeding defaults on first load.
|
||||
const factions = getUniqueValues(items, item => item.faction);
|
||||
const rarities = getRarityValues();
|
||||
const stocks = getUniqueValues(items, item => item.stock, stockSort);
|
||||
marketFilterAllValues = {
|
||||
faction: factions,
|
||||
rarity: rarities,
|
||||
stock: stocks,
|
||||
};
|
||||
if (!marketFiltersInitialized) {
|
||||
marketFilters.faction = [...factions];
|
||||
marketFilters.rarity = [...rarities];
|
||||
marketFilters.stock = [...stocks];
|
||||
marketFiltersInitialized = true;
|
||||
}
|
||||
return { factions, rarities, stocks };
|
||||
}
|
||||
|
||||
function getUniqueValues(items, getter, sorter) {
|
||||
// Collect unique values and apply optional custom sort.
|
||||
const values = new Set();
|
||||
items.forEach(item => {
|
||||
const value = getter(item);
|
||||
if (value) values.add(value);
|
||||
});
|
||||
const list = Array.from(values);
|
||||
if (sorter) {
|
||||
return list.sort(sorter);
|
||||
}
|
||||
return list.sort((a, b) => a.localeCompare(b));
|
||||
}
|
||||
|
||||
function renderFilterDropdown(key, label, values, selected, labelFormatter) {
|
||||
// Compact filter UI with search and multi-select checkboxes.
|
||||
const formatted = labelFormatter || (value => value);
|
||||
const search = marketFilterSearch[key] || '';
|
||||
const filteredValues = values.filter(value =>
|
||||
value.toLowerCase().includes(search.toLowerCase())
|
||||
);
|
||||
// "All" is shown only when every value is selected; "NONE" means zero selected.
|
||||
const isAllSelected = selected.length === values.length && values.length > 0;
|
||||
const isNoneSelected = selected.length === 0;
|
||||
const summary = isAllSelected
|
||||
? 'All'
|
||||
: isNoneSelected
|
||||
? 'NONE'
|
||||
: selected.length === 1
|
||||
? formatted(selected[0])
|
||||
: `${selected.length} selected`;
|
||||
const options = filteredValues.map(value => {
|
||||
const isChecked = selected.includes(value) ? ' checked' : '';
|
||||
const display = escapeAttribute(formatted(value));
|
||||
return `
|
||||
<label class="market-filter-option">
|
||||
<input type="checkbox" value="${escapeAttribute(value)}"${isChecked}
|
||||
onchange="toggleMarketFilterValue('${key}', this.value, this.checked)" />
|
||||
<span>${display}</span>
|
||||
</label>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
const openClass = marketFilterOpenKey === key ? ' show' : '';
|
||||
return `
|
||||
<div class="market-filter-dropdown" data-filter-key="${key}">
|
||||
<button type="button" class="market-filter-trigger${isNoneSelected ? ' is-empty' : ''}" onclick="toggleMarketFilterDropdown('${key}')">
|
||||
${label}: <span class="market-filter-summary">${escapeAttribute(summary)}</span>
|
||||
</button>
|
||||
<div class="market-filter-popover${openClass}" onclick="event.stopPropagation()">
|
||||
<div class="market-filter-popover-header">
|
||||
<input class="market-filter-input market-filter-popover-search" type="text" placeholder="Search"
|
||||
value="${escapeAttribute(search)}"
|
||||
data-filter-search-key="${key}"
|
||||
oninput="updateMarketFilterSearch('${key}', this.value)" />
|
||||
<div class="market-filter-popover-actions">
|
||||
<button type="button" onclick="selectAllMarketFilter('${key}')">All</button>
|
||||
<button type="button" onclick="clearMarketFilter('${key}')">Clear</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="market-filter-options">
|
||||
${options || '<div class="market-filter-empty">No matches</div>'}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
function toTitleCase(value) {
|
||||
// Title-case display helper for stock labels.
|
||||
return value.replace(/\b\w/g, (char) => char.toUpperCase());
|
||||
}
|
||||
|
||||
function stockSort(a, b) {
|
||||
// Enforce stock order from most scarce to most available.
|
||||
const order = ["Very Limited", "Limited", "Modest", "Abundant", "Very Abundant"];
|
||||
return order.indexOf(toTitleCase(a)) - order.indexOf(toTitleCase(b));
|
||||
}
|
||||
|
||||
function raritySort(a, b) {
|
||||
// Enforce rarity order from rarest to most common.
|
||||
const order = ["Unique", "Artifact", "Legendary", "Very Rare", "Rare", "Uncommon", "Common"];
|
||||
const indexA = order.indexOf(a);
|
||||
const indexB = order.indexOf(b);
|
||||
if (indexA === -1 && indexB === -1) return a.localeCompare(b);
|
||||
if (indexA === -1) return 1;
|
||||
if (indexB === -1) return -1;
|
||||
return indexA - indexB;
|
||||
}
|
||||
|
||||
function getRarityValues() {
|
||||
// Use full dataset so rarities aren't limited by current visibility.
|
||||
if (typeof MAGIC_ITEMS_DATA === 'undefined') return [];
|
||||
const values = new Set();
|
||||
MAGIC_ITEMS_DATA.forEach(item => {
|
||||
if (item.rarity) values.add(item.rarity);
|
||||
});
|
||||
const list = Array.from(values);
|
||||
return list.sort(raritySort);
|
||||
}
|
||||
|
||||
function applyMarketFilters(items) {
|
||||
// Empty selections mean "show none" for that filter (intentional for clear state).
|
||||
const name = marketFilters.name.trim().toLowerCase();
|
||||
const faction = marketFilters.faction;
|
||||
const rarity = marketFilters.rarity;
|
||||
const stock = marketFilters.stock;
|
||||
const costMin = marketFilters.costMin === '' ? null : Number(marketFilters.costMin);
|
||||
const costMax = marketFilters.costMax === '' ? null : Number(marketFilters.costMax);
|
||||
|
||||
return items.filter(item => {
|
||||
if (name && !item.name.toLowerCase().includes(name)) return false;
|
||||
if (faction.length === 0 || !faction.includes(item.faction)) return false;
|
||||
if (rarity.length === 0 || !rarity.includes(item.rarity)) return false;
|
||||
if (stock.length === 0 || !stock.includes(item.stock)) return false;
|
||||
if (costMin !== null && item.adjustedPrice < costMin) return false;
|
||||
if (costMax !== null && item.adjustedPrice > costMax) return false;
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
function updateMarketFilter(key, value) {
|
||||
// Preserve focus while re-rendering.
|
||||
captureMarketFilterFocus();
|
||||
marketFilters[key] = value;
|
||||
scheduleMarketFilterRender();
|
||||
}
|
||||
|
||||
function toggleMarketFilterValue(key, value, isChecked) {
|
||||
// Toggle a checkbox value within the active selection array.
|
||||
const values = marketFilters[key];
|
||||
if (!Array.isArray(values)) return;
|
||||
const index = values.indexOf(value);
|
||||
if (isChecked && index === -1) {
|
||||
values.push(value);
|
||||
} else if (!isChecked && index >= 0) {
|
||||
values.splice(index, 1);
|
||||
}
|
||||
scheduleMarketFilterRender();
|
||||
}
|
||||
|
||||
function clearMarketFilter(key) {
|
||||
// Clear selection or input for the given filter key.
|
||||
captureMarketFilterFocus();
|
||||
if (Array.isArray(marketFilters[key])) {
|
||||
marketFilters[key] = [];
|
||||
} else {
|
||||
marketFilters[key] = '';
|
||||
}
|
||||
if (key === 'costMin' || key === 'costMax' || key === 'name') {
|
||||
marketFilterFocus = {
|
||||
key,
|
||||
selectionStart: 0,
|
||||
selectionEnd: 0
|
||||
};
|
||||
}
|
||||
scheduleMarketFilterRender();
|
||||
}
|
||||
|
||||
function selectAllMarketFilter(key) {
|
||||
// Select all values for the given filter.
|
||||
const values = marketFilters[key];
|
||||
if (!Array.isArray(values)) return;
|
||||
marketFilters[key] = [...(marketFilterAllValues[key] || [])];
|
||||
scheduleMarketFilterRender();
|
||||
}
|
||||
|
||||
function toggleMarketFilterDropdown(key) {
|
||||
// Open/close the filter popover for the given column.
|
||||
marketFilterOpenKey = marketFilterOpenKey === key ? null : key;
|
||||
scheduleMarketFilterRender();
|
||||
if (marketFilterOpenKey) {
|
||||
requestAnimationFrame(() => positionMarketFilterPopover(marketFilterOpenKey));
|
||||
}
|
||||
}
|
||||
|
||||
function updateMarketFilterSearch(key, value) {
|
||||
// Update popover search text and refresh the list.
|
||||
captureMarketFilterFocus();
|
||||
marketFilterSearch[key] = value;
|
||||
scheduleMarketFilterRender();
|
||||
}
|
||||
|
||||
function closeMarketFilterDropdown() {
|
||||
// Close any open popover when clicking outside.
|
||||
if (marketFilterOpenKey !== null) {
|
||||
captureMarketFilterFocus();
|
||||
marketFilterOpenKey = null;
|
||||
scheduleMarketFilterRender();
|
||||
}
|
||||
}
|
||||
|
||||
function positionMarketFilterPopover(key) {
|
||||
// Keep the popover within the viewport on narrow screens.
|
||||
const dropdown = document.querySelector(`.market-filter-dropdown[data-filter-key="${key}"]`);
|
||||
if (!dropdown) return;
|
||||
const trigger = dropdown.querySelector('.market-filter-trigger');
|
||||
const popover = dropdown.querySelector('.market-filter-popover');
|
||||
if (!popover || !trigger) return;
|
||||
|
||||
const margin = 12;
|
||||
const viewportWidth = window.innerWidth;
|
||||
const triggerRect = trigger.getBoundingClientRect();
|
||||
|
||||
popover.style.position = 'absolute';
|
||||
popover.style.left = '0';
|
||||
popover.style.right = 'auto';
|
||||
popover.style.transform = 'none';
|
||||
|
||||
const popoverRect = popover.getBoundingClientRect();
|
||||
const popoverWidth = popoverRect.width;
|
||||
|
||||
const maxLeft = Math.max(margin, viewportWidth - popoverWidth - margin);
|
||||
const left = Math.min(Math.max(triggerRect.left, margin), maxLeft);
|
||||
const shiftLeft = triggerRect.left - left;
|
||||
if (shiftLeft !== 0) {
|
||||
popover.style.transform = `translateX(-${shiftLeft}px)`;
|
||||
}
|
||||
}
|
||||
|
||||
function captureMarketFilterFocus() {
|
||||
// Track cursor placement to avoid input blur on re-render.
|
||||
const el = document.activeElement;
|
||||
if (!el || !el.dataset) return;
|
||||
if (el.dataset.filterKey) {
|
||||
marketFilterFocus = {
|
||||
type: 'filter',
|
||||
key: el.dataset.filterKey,
|
||||
selectionStart: el.selectionStart,
|
||||
selectionEnd: el.selectionEnd
|
||||
};
|
||||
} else if (el.dataset.filterSearchKey) {
|
||||
marketFilterFocus = {
|
||||
type: 'search',
|
||||
key: el.dataset.filterSearchKey,
|
||||
selectionStart: el.selectionStart,
|
||||
selectionEnd: el.selectionEnd
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function restoreMarketFilterFocus() {
|
||||
// Restore focus and caret to the active filter input.
|
||||
if (!marketFilterFocus) return;
|
||||
const selector = marketFilterFocus.type === 'search'
|
||||
? `[data-filter-search-key="${marketFilterFocus.key}"]`
|
||||
: `[data-filter-key="${marketFilterFocus.key}"]`;
|
||||
const el = document.querySelector(selector);
|
||||
if (!el) return;
|
||||
el.focus();
|
||||
if (typeof el.selectionStart === 'number') {
|
||||
el.setSelectionRange(marketFilterFocus.selectionStart, marketFilterFocus.selectionEnd);
|
||||
}
|
||||
marketFilterFocus = null;
|
||||
}
|
||||
|
||||
function captureMarketTableScroll() {
|
||||
// Preserve horizontal scroll when re-rendering on mobile.
|
||||
const wrapper = document.querySelector('.market-table-wrapper');
|
||||
if (!wrapper) return;
|
||||
marketTableScrollLeft = wrapper.scrollLeft;
|
||||
}
|
||||
|
||||
function restoreMarketTableScroll() {
|
||||
// Restore horizontal scroll position after re-render.
|
||||
if (marketTableScrollLeft === null) return;
|
||||
const wrapper = document.querySelector('.market-table-wrapper');
|
||||
if (!wrapper) return;
|
||||
wrapper.scrollLeft = marketTableScrollLeft;
|
||||
marketTableScrollLeft = null;
|
||||
}
|
||||
|
||||
function scheduleMarketFilterRender() {
|
||||
clearTimeout(marketFilterDebounce);
|
||||
marketFilterDebounce = setTimeout(() => {
|
||||
if (marketData && campaignData) {
|
||||
renderMarket(marketData, campaignData.reputation);
|
||||
}
|
||||
}, 250);
|
||||
}
|
||||
@ -75,6 +75,9 @@
|
||||
<!-- Magic Items Data -->
|
||||
<script src="magic-items-data.js"></script>
|
||||
|
||||
<!-- Market Filtering -->
|
||||
<script src="filtering.js"></script>
|
||||
|
||||
<!-- App Logic -->
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
|
||||
@ -1,332 +1,332 @@
|
||||
// Magic Items Database
|
||||
// Converted from MagicItems.csv
|
||||
const MAGIC_ITEMS_DATA = [
|
||||
{ id: "item_001", name: "Adamantine Armor", rarity: "Uncommon", faction: "Deneith", baseCost: 500 },
|
||||
{ id: "item_002", name: "Adamantine Weapon", rarity: "Uncommon", faction: "Deneith", baseCost: 500 },
|
||||
{ id: "item_003", name: "Alchemy Jug", rarity: "Uncommon", faction: "Morgrave", baseCost: 100 },
|
||||
{ id: "item_004", name: "Ammunition of Slaying", rarity: "Very Rare", faction: "Thuranni", baseCost: 1000 },
|
||||
{ id: "item_005", name: "Ammunition, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 50 },
|
||||
{ id: "item_006", name: "Ammunition, +2", rarity: "Rare", faction: "Deneith", baseCost: 250 },
|
||||
{ id: "item_007", name: "Ammunition, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 1250 },
|
||||
{ id: "item_008", name: "Amulet of Health", rarity: "Rare", faction: "Morgrave", baseCost: 4000 },
|
||||
{ id: "item_009", name: "Amulet of Proof against Detection and Location", rarity: "Uncommon", faction: "Kundarak", baseCost: 400 },
|
||||
{ id: "item_010", name: "Amulet of the Planes", rarity: "Very Rare", faction: "Morgrave", baseCost: 43000 },
|
||||
{ id: "item_011", name: "Animated Shield", rarity: "Very Rare", faction: "Deneith", baseCost: 6000 },
|
||||
{ id: "item_012", name: "Arcane Propulsion Arm", rarity: "Very Rare", faction: "Deneith", baseCost: 5100 },
|
||||
{ id: "item_013", name: "Armor of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3000 },
|
||||
{ id: "item_014", name: "Armor of Safeguarding", rarity: "Very Rare", faction: "Deneith", baseCost: 10000 },
|
||||
{ id: "item_015", name: "Armor of the White Rose", rarity: "Very Rare", faction: "Ashbound", baseCost: 7000 },
|
||||
{ id: "item_016", name: "Armor, +1", rarity: "Rare", faction: "Deneith", baseCost: 3500 },
|
||||
{ id: "item_017", name: "Armor, +2", rarity: "Very Rare", faction: "Deneith", baseCost: 20000 },
|
||||
{ id: "item_018", name: "Arrow-Catching Shield", rarity: "Rare", faction: "Medani", baseCost: 4500 },
|
||||
{ id: "item_019", name: "Bag of Beans", rarity: "Rare", faction: "Ashbound", baseCost: 4200 },
|
||||
{ id: "item_020", name: "Bag of Devouring", rarity: "Very Rare", faction: "Tarkanan", baseCost: 12000 },
|
||||
{ id: "item_021", name: "Bag of Holding", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 },
|
||||
{ id: "item_022", name: "Bag of Tricks", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 },
|
||||
{ id: "item_023", name: "Bead of Force", rarity: "Rare", faction: "Kundarak", baseCost: 3000 },
|
||||
{ id: "item_024", name: "Belt of Dwarvenkind", rarity: "Rare", faction: "Kundarak", baseCost: 5000 },
|
||||
{ id: "item_025", name: "Belt of Giant Strength (fire)", rarity: "Very Rare", faction: "Deneith", baseCost: 36000 },
|
||||
{ id: "item_026", name: "Belt of Giant Strength (frost or stone)", rarity: "Very Rare", faction: "Deneith", baseCost: 12000 },
|
||||
{ id: "item_027", name: "Belt of Giant Strength (hill)", rarity: "Rare", faction: "Deneith", baseCost: 4000 },
|
||||
{ id: "item_028", name: "Berserker Axe", rarity: "Rare", faction: "Deneith", baseCost: 2000 },
|
||||
{ id: "item_029", name: "Bloodshed Blade", rarity: "Very Rare", faction: "Tarkanan", baseCost: 8000 },
|
||||
{ id: "item_030", name: "Boots of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 400 },
|
||||
{ id: "item_031", name: "Boots of Levitation", rarity: "Rare", faction: "Tarkanan", baseCost: 4500 },
|
||||
{ id: "item_032", name: "Boots of Speed", rarity: "Rare", faction: "Tarkanan", baseCost: 3000 },
|
||||
{ id: "item_033", name: "Boots of Striding and Springing", rarity: "Uncommon", faction: "Tharashk", baseCost: 200 },
|
||||
{ id: "item_034", name: "Boots of the Winding Path", rarity: "Uncommon", faction: "Tharashk", baseCost: 400 },
|
||||
{ id: "item_035", name: "Boots of the Winterlands", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 },
|
||||
{ id: "item_036", name: "Bowl of Commanding Water Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 },
|
||||
{ id: "item_037", name: "Bracers of Archery", rarity: "Uncommon", faction: "Deneith", baseCost: 350 },
|
||||
{ id: "item_038", name: "Bracers of Defense", rarity: "Rare", faction: "Kundarak", baseCost: 4000 },
|
||||
{ id: "item_039", name: "Brazier of Commanding Fire Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 },
|
||||
{ id: "item_040", name: "Brooch of Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 375 },
|
||||
{ id: "item_041", name: "Broom of Flying", rarity: "Uncommon", faction: "Ashbound", baseCost: 4500 },
|
||||
{ id: "item_042", name: "Candle of Invocation", rarity: "Very Rare", faction: "Morgrave", baseCost: 8400 },
|
||||
{ id: "item_043", name: "Cap of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 450 },
|
||||
{ id: "item_044", name: "Cape of the Mountebank", rarity: "Rare", faction: "Thuranni", baseCost: 3900 },
|
||||
{ id: "item_045", name: "Carpet of Flying", rarity: "Very Rare", faction: "Morgrave", baseCost: 44000 },
|
||||
{ id: "item_046", name: "Cauldron of Rebirth", rarity: "Very Rare", faction: "Ashbound", baseCost: 10000 },
|
||||
{ id: "item_047", name: "Censer of Controlling Air Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 },
|
||||
{ id: "item_048", name: "Chime of Opening", rarity: "Rare", faction: "Tarkanan", baseCost: 3000 },
|
||||
{ id: "item_049", name: "Circlet of Blasting", rarity: "Uncommon", faction: "Morgrave", baseCost: 350 },
|
||||
{ id: "item_050", name: "Cloak of Arachnida", rarity: "Very Rare", faction: "Tarkanan", baseCost: 14000 },
|
||||
{ id: "item_051", name: "Cloak of Displacement", rarity: "Rare", faction: "Tarkanan", baseCost: 3600 },
|
||||
{ id: "item_052", name: "Cloak of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250 },
|
||||
{ id: "item_053", name: "Cloak of Protection", rarity: "Uncommon", faction: "Kundarak", baseCost: 400 },
|
||||
{ id: "item_054", name: "Cloak of the Bat", rarity: "Rare", faction: "Thuranni", baseCost: 4600 },
|
||||
{ id: "item_055", name: "Cloak of the Manta Ray", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 },
|
||||
{ id: "item_056", name: "Coat of the Crest", rarity: "Rare", faction: "Medani", baseCost: 4000 },
|
||||
{ id: "item_057", name: "Crown of the Wrath Bringer", rarity: "Rare", faction: "Thuranni", baseCost: 3750 },
|
||||
{ id: "item_058", name: "Crystal Ball", rarity: "Very Rare", faction: "Medani", baseCost: 42000 },
|
||||
{ id: "item_059", name: "Cube of Force", rarity: "Rare", faction: "Kundarak", baseCost: 5000 },
|
||||
{ id: "item_060", name: "Daern's Instant Fortress", rarity: "Rare", faction: "Kundarak", baseCost: 5000 },
|
||||
{ id: "item_061", name: "Dagger of Denial", rarity: "Rare", faction: "Kundarak", baseCost: 2750 },
|
||||
{ id: "item_062", name: "Dagger of Venom", rarity: "Rare", faction: "Thuranni", baseCost: 1500 },
|
||||
{ id: "item_063", name: "Dancing Sword", rarity: "Very Rare", faction: "Deneith", baseCost: 10000 },
|
||||
{ id: "item_064", name: "Dazzling Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 3500 },
|
||||
{ id: "item_065", name: "Decanter of Endless Water", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 },
|
||||
{ id: "item_066", name: "Deck of Illusions", rarity: "Uncommon", faction: "Thuranni", baseCost: 450 },
|
||||
{ id: "item_067", name: "Demon Armor", rarity: "Very Rare", faction: "Thuranni", baseCost: 7500 },
|
||||
{ id: "item_068", name: "Demon Skin", rarity: "Rare", faction: "Tarkanan", baseCost: 1300 },
|
||||
{ id: "item_069", name: "Dimensional Shackles", rarity: "Rare", faction: "Kundarak", baseCost: 2800 },
|
||||
{ id: "item_070", name: "Dispelling Stone", rarity: "Very Rare", faction: "Tarkanan", baseCost: 7000 },
|
||||
{ id: "item_071", name: "Dragon Scale Mail", rarity: "Very Rare", faction: "Deneith", baseCost: 15000 },
|
||||
{ id: "item_072", name: "Dragon Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4800 },
|
||||
{ id: "item_073", name: "Driftglobe", rarity: "Uncommon", faction: "Tharashk", baseCost: 100 },
|
||||
{ id: "item_074", name: "Dust of Disappearance", rarity: "Uncommon", faction: "Tarkanan", baseCost: 200 },
|
||||
{ id: "item_075", name: "Dust of Dryness", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 },
|
||||
{ id: "item_076", name: "Dust of Sneezing and Choking", rarity: "Uncommon", faction: "Thuranni", baseCost: 150 },
|
||||
{ id: "item_077", name: "Dwarven Plate", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000 },
|
||||
{ id: "item_078", name: "Dwarven Thrower", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000 },
|
||||
{ id: "item_079", name: "Dyrrn's Tentacle Whip", rarity: "Very Rare", faction: "Kundarak", baseCost: 17000 },
|
||||
{ id: "item_080", name: "Earworm", rarity: "Uncommon", faction: "Kundarak", baseCost: 225 },
|
||||
{ id: "item_081", name: "Efreeti Bottle", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000 },
|
||||
{ id: "item_082", name: "Elemental Gem", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 },
|
||||
{ id: "item_083", name: "Elixir of Health", rarity: "Rare", faction: "Morgrave", baseCost: 2000 },
|
||||
{ id: "item_084", name: "Elven Chain", rarity: "Rare", faction: "Kundarak", baseCost: 4500 },
|
||||
{ id: "item_085", name: "Eversmoking Bottle", rarity: "Uncommon", faction: "Thuranni", baseCost: 270 },
|
||||
{ id: "item_086", name: "Eyes of Charming", rarity: "Uncommon", faction: "Medani", baseCost: 300 },
|
||||
{ id: "item_087", name: "Eyes of Minute Seeing", rarity: "Uncommon", faction: "Medani", baseCost: 150 },
|
||||
{ id: "item_088", name: "Eyes of the Eagle", rarity: "Uncommon", faction: "Medani", baseCost: 400 },
|
||||
{ id: "item_089", name: "Fate Cutter Shears", rarity: "Very Rare", faction: "Thuranni", baseCost: 9000 },
|
||||
{ id: "item_090", name: "Figurine of Wondrous Power (bronze griffon)", rarity: "Rare", faction: "Ashbound", baseCost: 3600 },
|
||||
{ id: "item_091", name: "Figurine of Wondrous Power (ebony fly)", rarity: "Rare", faction: "Ashbound", baseCost: 3600 },
|
||||
{ id: "item_092", name: "Figurine of Wondrous Power (golden lions)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 },
|
||||
{ id: "item_093", name: "Figurine of Wondrous Power (ivory goats)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 },
|
||||
{ id: "item_094", name: "Figurine of Wondrous Power (marble elephant)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 },
|
||||
{ id: "item_095", name: "Figurine of Wondrous Power (obsidian steed)", rarity: "Very Rare", faction: "Thuranni", baseCost: 28500 },
|
||||
{ id: "item_096", name: "Figurine of Wondrous Power (onyx dog)", rarity: "Rare", faction: "Ashbound", baseCost: 3200 },
|
||||
{ id: "item_097", name: "Figurine of Wondrous Power (serpentine owl)", rarity: "Rare", faction: "Ashbound", baseCost: 3000 },
|
||||
{ id: "item_098", name: "Figurine of Wondrous Power (silver raven)", rarity: "Uncommon", faction: "Medani", baseCost: 380 },
|
||||
{ id: "item_099", name: "Finder's Goggles", rarity: "Uncommon", faction: "Tharashk", baseCost: 500 },
|
||||
{ id: "item_100", name: "Flame Tongue", rarity: "Rare", faction: "Deneith", baseCost: 5000 },
|
||||
{ id: "item_101", name: "Folding Boat", rarity: "Rare", faction: "Tharashk", baseCost: 4750 },
|
||||
{ id: "item_102", name: "Frost Brand", rarity: "Very Rare", faction: "Deneith", baseCost: 11000 },
|
||||
{ id: "item_103", name: "Gauntlets of Ogre Power", rarity: "Uncommon", faction: "Deneith", baseCost: 450 },
|
||||
{ id: "item_104", name: "Gavel of the Venn Rune", rarity: "Rare", faction: "Medani", baseCost: 2800 },
|
||||
{ id: "item_105", name: "Gem of Brightness", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 },
|
||||
{ id: "item_106", name: "Gem of Seeing", rarity: "Rare", faction: "Medani", baseCost: 5000 },
|
||||
{ id: "item_107", name: "Giant Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4600 },
|
||||
{ id: "item_108", name: "Glamerweave", rarity: "Uncommon", faction: "Thuranni", baseCost: 150 },
|
||||
{ id: "item_109", name: "Glamoured Studded Leather", rarity: "Rare", faction: "Tarkanan", baseCost: 4800 },
|
||||
{ id: "item_110", name: "Gloves of Missile Snaring", rarity: "Uncommon", faction: "Tarkanan", baseCost: 325 },
|
||||
{ id: "item_111", name: "Gloves of Swimming and Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 },
|
||||
{ id: "item_112", name: "Gloves of Thievery", rarity: "Uncommon", faction: "Tarkanan", baseCost: 300 },
|
||||
{ id: "item_113", name: "Goggles of Night", rarity: "Uncommon", faction: "Medani", baseCost: 300 },
|
||||
{ id: "item_114", name: "Grasping Whip", rarity: "Rare", faction: "Morgrave", baseCost: 750 },
|
||||
{ id: "item_115", name: "Gulthias Staff", rarity: "Rare", faction: "Ashbound", baseCost: 2200 },
|
||||
{ id: "item_116", name: "Hat of Disguise", rarity: "Uncommon", faction: "Tarkanan", baseCost: 475 },
|
||||
{ id: "item_117", name: "Headband of Intellect", rarity: "Uncommon", faction: "Morgrave", baseCost: 450 },
|
||||
{ id: "item_118", name: "Helm of Awareness", rarity: "Uncommon", faction: "Medani", baseCost: 500 },
|
||||
{ id: "item_119", name: "Helm of Brilliance", rarity: "Very Rare", faction: "Tharashk", baseCost: 32000 },
|
||||
{ id: "item_120", name: "Helm of Comprehending Languages", rarity: "Uncommon", faction: "Medani", baseCost: 200 },
|
||||
{ id: "item_121", name: "Helm of Telepathy", rarity: "Uncommon", faction: "Medani", baseCost: 300 },
|
||||
{ id: "item_122", name: "Helm of Teleportation", rarity: "Rare", faction: "Morgrave", baseCost: 4250 },
|
||||
{ id: "item_123", name: "Heward's Handy Haversack", rarity: "Rare", faction: "Morgrave", baseCost: 2000 },
|
||||
{ id: "item_124", name: "Horn of Blasting", rarity: "Rare", faction: "Ashbound", baseCost: 2500 },
|
||||
{ id: "item_125", name: "Horn of Valhalla (brass or silver)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 },
|
||||
{ id: "item_126", name: "Horn of Valhalla (bronze)", rarity: "Very Rare", faction: "Ashbound", baseCost: 20000 },
|
||||
{ id: "item_127", name: "Horseshoes of a Zephyr", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000 },
|
||||
{ id: "item_128", name: "Horseshoes of Speed", rarity: "Rare", faction: "Tharashk", baseCost: 3000 },
|
||||
{ id: "item_129", name: "Immovable Rod", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 },
|
||||
{ id: "item_130", name: "Instrument of the Bards (Anstruth harp)", rarity: "Very Rare", faction: "Morgrave", baseCost: 17500 },
|
||||
{ id: "item_131", name: "Instrument of the Bards (Canaith mandolin)", rarity: "Rare", faction: "Morgrave", baseCost: 3750 },
|
||||
{ id: "item_132", name: "Instrument of the Bards (Cli lyre)", rarity: "Rare", faction: "Morgrave", baseCost: 4250 },
|
||||
{ id: "item_133", name: "Instrument of the Bards (Doss lute)", rarity: "Uncommon", faction: "Morgrave", baseCost: 250 },
|
||||
{ id: "item_134", name: "Instrument of the Bards (Fochlucan bandore)", rarity: "Uncommon", faction: "Morgrave", baseCost: 350 },
|
||||
{ id: "item_135", name: "Instrument of the Bards (Mac-Fuirmidh cittern)", rarity: "Uncommon", faction: "Morgrave", baseCost: 450 },
|
||||
{ id: "item_136", name: "Ioun Stone (absorption)", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000 },
|
||||
{ id: "item_137", name: "Ioun Stone (agility)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000 },
|
||||
{ id: "item_138", name: "Ioun Stone (awareness)", rarity: "Rare", faction: "Medani", baseCost: 4000 },
|
||||
{ id: "item_139", name: "Ioun Stone (fortitude)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000 },
|
||||
{ id: "item_140", name: "Ioun Stone (insight)", rarity: "Very Rare", faction: "Medani", baseCost: 8000 },
|
||||
{ id: "item_141", name: "Ioun Stone (intellect)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000 },
|
||||
{ id: "item_142", name: "Ioun Stone (leadership)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000 },
|
||||
{ id: "item_143", name: "Ioun Stone (protection)", rarity: "Rare", faction: "Kundarak", baseCost: 3600 },
|
||||
{ id: "item_144", name: "Ioun Stone (reserve)", rarity: "Rare", faction: "Morgrave", baseCost: 4500 },
|
||||
{ id: "item_145", name: "Ioun Stone (strength)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000 },
|
||||
{ id: "item_146", name: "Ioun Stone (sustenance)", rarity: "Rare", faction: "Morgrave", baseCost: 3000 },
|
||||
{ id: "item_147", name: "Iron Bands of Bilarro", rarity: "Rare", faction: "Tharashk", baseCost: 2600 },
|
||||
{ id: "item_148", name: "Javelin of Lightning", rarity: "Uncommon", faction: "Deneith", baseCost: 350 },
|
||||
{ id: "item_149", name: "Keoghtom's Ointment", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_150", name: "Kyrzin's Ooze", rarity: "Very Rare", faction: "Kundarak", baseCost: 21000 },
|
||||
{ id: "item_151", name: "Lantern of Revealing", rarity: "Uncommon", faction: "Medani", baseCost: 500 },
|
||||
{ id: "item_152", name: "Living Armor", rarity: "Very Rare", faction: "Kundarak", baseCost: 9500 },
|
||||
{ id: "item_153", name: "Living Gloves", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 },
|
||||
{ id: "item_154", name: "Mace of Disruption", rarity: "Rare", faction: "Deneith", baseCost: 1750 },
|
||||
{ id: "item_155", name: "Mace of Smiting", rarity: "Rare", faction: "Deneith", baseCost: 2000 },
|
||||
{ id: "item_156", name: "Mace of Terror", rarity: "Rare", faction: "Deneith", baseCost: 3500 },
|
||||
{ id: "item_157", name: "Magician's Judge", rarity: "Rare", faction: "Deneith", baseCost: 1125 },
|
||||
{ id: "item_158", name: "Mantle of Spell Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 4200 },
|
||||
{ id: "item_159", name: "Manual of Bodily Health", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_160", name: "Manual of Gainful Exercise", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_161", name: "Manual of Golems (clay, flesh, iron, or stone)", rarity: "Very Rare", faction: "Morgrave", baseCost: 22000 },
|
||||
{ id: "item_162", name: "Manual of Quickness of Action", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_163", name: "Mariner's Armor", rarity: "Uncommon", faction: "Tharashk", baseCost: 400 },
|
||||
{ id: "item_164", name: "Medallion of Thoughts", rarity: "Uncommon", faction: "Medani", baseCost: 300 },
|
||||
{ id: "item_165", name: "Mind Sharpener", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_166", name: "Mindguard Crown", rarity: "Very Rare", faction: "Deneith", baseCost: 11000 },
|
||||
{ id: "item_167", name: "Mirror of Life Trapping", rarity: "Very Rare", faction: "Tharashk", baseCost: 50000 },
|
||||
{ id: "item_168", name: "Mithral Armor", rarity: "Uncommon", faction: "Kundarak", baseCost: 450 },
|
||||
{ id: "item_169", name: "Nature's Mantle", rarity: "Uncommon", faction: "Ashbound", baseCost: 325 },
|
||||
{ id: "item_170", name: "Necklace of Adaptation", rarity: "Uncommon", faction: "Ashbound", baseCost: 450 },
|
||||
{ id: "item_171", name: "Necklace of Fireballs", rarity: "Rare", faction: "Deneith", baseCost: 4350 },
|
||||
{ id: "item_172", name: "Necklace of Prayer Beads", rarity: "Rare", faction: "Morgrave", baseCost: 5000 },
|
||||
{ id: "item_173", name: "Nimbus Coronet", rarity: "Very Rare", faction: "Tharashk", baseCost: 10500 },
|
||||
{ id: "item_174", name: "Nine Lives Stealer", rarity: "Very Rare", faction: "Thuranni", baseCost: 36000 },
|
||||
{ id: "item_175", name: "Nolzur's Marvelous Pigments", rarity: "Very Rare", faction: "Morgrave", baseCost: 16000 },
|
||||
{ id: "item_176", name: "Oathbow", rarity: "Very Rare", faction: "Deneith", baseCost: 13000 },
|
||||
{ id: "item_177", name: "Oil of Etherealness", rarity: "Rare", faction: "Thuranni", baseCost: 2000 },
|
||||
{ id: "item_178", name: "Oil of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 2200 },
|
||||
{ id: "item_179", name: "Oil of Slipperiness", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250 },
|
||||
{ id: "item_180", name: "Pariah's Shield", rarity: "Rare", faction: "Deneith", baseCost: 1500 },
|
||||
{ id: "item_181", name: "Pearl of Power", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_182", name: "Periapt of Health", rarity: "Uncommon", faction: "Morgrave", baseCost: 250 },
|
||||
{ id: "item_183", name: "Periapt of Proof against Poison", rarity: "Rare", faction: "Kundarak", baseCost: 4700 },
|
||||
{ id: "item_184", name: "Periapt of Wound Closure", rarity: "Uncommon", faction: "Morgrave", baseCost: 375 },
|
||||
{ id: "item_185", name: "Philter of Love", rarity: "Uncommon", faction: "Tarkanan", baseCost: 150 },
|
||||
{ id: "item_186", name: "Pipes of Haunting", rarity: "Uncommon", faction: "Thuranni", baseCost: 300 },
|
||||
{ id: "item_187", name: "Pipes of the Sewers", rarity: "Uncommon", faction: "Ashbound", baseCost: 150 },
|
||||
{ id: "item_188", name: "Portable Hole", rarity: "Rare", faction: "Kundarak", baseCost: 5000 },
|
||||
{ id: "item_189", name: "Potion of Animal Friendship", rarity: "Uncommon", faction: "Ashbound", baseCost: 200 },
|
||||
{ id: "item_190", name: "Potion of Clairvoyance", rarity: "Rare", faction: "Medani", baseCost: 900 },
|
||||
{ id: "item_191", name: "Potion of Diminution", rarity: "Rare", faction: "Tarkanan", baseCost: 500 },
|
||||
{ id: "item_192", name: "Potion of Fire Breath", rarity: "Uncommon", faction: "Deneith", baseCost: 350 },
|
||||
{ id: "item_193", name: "Potion of Flying", rarity: "Very Rare", faction: "Tharashk", baseCost: 2500 },
|
||||
{ id: "item_194", name: "Potion of Gaseous Form", rarity: "Rare", faction: "Thuranni", baseCost: 1500 },
|
||||
{ id: "item_195", name: "Potion of Giant Strength (cloud)", rarity: "Very Rare", faction: "Deneith", baseCost: 1800 },
|
||||
{ id: "item_196", name: "Potion of Giant Strength (fire)", rarity: "Rare", faction: "Deneith", baseCost: 1200 },
|
||||
{ id: "item_197", name: "Potion of Giant Strength (frost or stone)", rarity: "Rare", faction: "Deneith", baseCost: 650 },
|
||||
{ id: "item_198", name: "Potion of Giant Strength (hill)", rarity: "Uncommon", faction: "Deneith", baseCost: 125 },
|
||||
{ id: "item_199", name: "Potion of Greater Invisibility", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000 },
|
||||
{ id: "item_200", name: "Potion of Growth", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 },
|
||||
{ id: "item_201", name: "Potion of Healing (greater)", rarity: "Uncommon", faction: "Morgrave", baseCost: 300 },
|
||||
{ id: "item_202", name: "Potion of Healing (superior)", rarity: "Rare", faction: "Morgrave", baseCost: 750 },
|
||||
{ id: "item_203", name: "Potion of Healing (supreme)", rarity: "Very Rare", faction: "Morgrave", baseCost: 1500 },
|
||||
{ id: "item_204", name: "Potion of Heroism", rarity: "Rare", faction: "Deneith", baseCost: 800 },
|
||||
{ id: "item_205", name: "Potion of Invisibility", rarity: "Rare", faction: "Tarkanan", baseCost: 2000 },
|
||||
{ id: "item_206", name: "Potion of Invulnerability", rarity: "Rare", faction: "Deneith", baseCost: 1500 },
|
||||
{ id: "item_207", name: "Potion of Longevity", rarity: "Very Rare", faction: "Kundarak", baseCost: 3000 },
|
||||
{ id: "item_208", name: "Potion of Mind Reading", rarity: "Rare", faction: "Medani", baseCost: 1100 },
|
||||
{ id: "item_209", name: "Potion of Poison", rarity: "Uncommon", faction: "Thuranni", baseCost: 500 },
|
||||
{ id: "item_210", name: "Potion of Resistance", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 },
|
||||
{ id: "item_211", name: "Potion of Speed", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000 },
|
||||
{ id: "item_212", name: "Potion of Vitality", rarity: "Very Rare", faction: "Morgrave", baseCost: 1800 },
|
||||
{ id: "item_213", name: "Potion of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 400 },
|
||||
{ id: "item_214", name: "Quaal's Feather Token (anchor, fan, or tree)", rarity: "Uncommon", faction: "Tharashk", baseCost: 25 },
|
||||
{ id: "item_215", name: "Quiver of Ehlonna", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 },
|
||||
{ id: "item_216", name: "Raven's Slumber", rarity: "Very Rare", faction: "Tarkanan", baseCost: 15000 },
|
||||
{ id: "item_217", name: "Repeating Shot", rarity: "Uncommon", faction: "Tarkanan", baseCost: 550 },
|
||||
{ id: "item_218", name: "Repulsion Shield", rarity: "Uncommon", faction: "Deneith", baseCost: 600 },
|
||||
{ id: "item_219", name: "Returning Weapon", rarity: "Uncommon", faction: "Medani", baseCost: 550 },
|
||||
{ id: "item_220", name: "Reveler's Concertina", rarity: "Rare", faction: "Thuranni", baseCost: 4250 },
|
||||
{ id: "item_221", name: "Ring of Animal Influence", rarity: "Rare", faction: "Ashbound", baseCost: 1000 },
|
||||
{ id: "item_222", name: "Ring of Evasion", rarity: "Rare", faction: "Thuranni", baseCost: 4900 },
|
||||
{ id: "item_223", name: "Ring of Feather Falling", rarity: "Rare", faction: "Tarkanan", baseCost: 2200 },
|
||||
{ id: "item_224", name: "Ring of Free Action", rarity: "Rare", faction: "Tarkanan", baseCost: 4500 },
|
||||
{ id: "item_225", name: "Ring of Jumping", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 },
|
||||
{ id: "item_226", name: "Ring of Mind Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 450 },
|
||||
{ id: "item_227", name: "Ring of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3000 },
|
||||
{ id: "item_228", name: "Ring of Regeneration", rarity: "Very Rare", faction: "Ashbound", baseCost: 40000 },
|
||||
{ id: "item_229", name: "Ring of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3500 },
|
||||
{ id: "item_230", name: "Ring of Shooting Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000 },
|
||||
{ id: "item_231", name: "Ring of Spell Storing", rarity: "Rare", faction: "Morgrave", baseCost: 3600 },
|
||||
{ id: "item_232", name: "Ring of Swimming", rarity: "Uncommon", faction: "Tharashk", baseCost: 300 },
|
||||
{ id: "item_233", name: "Ring of Telekinesis", rarity: "Very Rare", faction: "Tarkanan", baseCost: 25000 },
|
||||
{ id: "item_234", name: "Ring of Temporal Salvation", rarity: "Rare", faction: "Deneith", baseCost: 2250 },
|
||||
{ id: "item_235", name: "Ring of the Ram", rarity: "Rare", faction: "Ashbound", baseCost: 4000 },
|
||||
{ id: "item_236", name: "Ring of Warmth", rarity: "Uncommon", faction: "Tharashk", baseCost: 480 },
|
||||
{ id: "item_237", name: "Ring of Water Walking", rarity: "Uncommon", faction: "Tharashk", baseCost: 500 },
|
||||
{ id: "item_238", name: "Ring of X-ray Vision", rarity: "Rare", faction: "Medani", baseCost: 3500 },
|
||||
{ id: "item_239", name: "Robe of Eyes", rarity: "Rare", faction: "Medani", baseCost: 5000 },
|
||||
{ id: "item_240", name: "Robe of Scintillating Colors", rarity: "Very Rare", faction: "Thuranni", baseCost: 27000 },
|
||||
{ id: "item_241", name: "Robe of Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000 },
|
||||
{ id: "item_242", name: "Robe of Useful Items", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_243", name: "Rod of Absorption", rarity: "Very Rare", faction: "Morgrave", baseCost: 48000 },
|
||||
{ id: "item_244", name: "Rod of Alertness", rarity: "Very Rare", faction: "Kundarak", baseCost: 11000 },
|
||||
{ id: "item_245", name: "Rod of Hellish Flames", rarity: "Very Rare", faction: "Ashbound", baseCost: 10250 },
|
||||
{ id: "item_246", name: "Rod of Rulership", rarity: "Rare", faction: "Tarkanan", baseCost: 3600 },
|
||||
{ id: "item_247", name: "Rod of Security", rarity: "Very Rare", faction: "Kundarak", baseCost: 45000 },
|
||||
{ id: "item_248", name: "Rod of the Pact Keeper (+1)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_249", name: "Rod of the Pact Keeper, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000 },
|
||||
{ id: "item_250", name: "Rod of the Pact Keeper, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000 },
|
||||
{ id: "item_251", name: "Rogue's Mantle", rarity: "Rare", faction: "Tarkanan", baseCost: 5000 },
|
||||
{ id: "item_252", name: "Rope of Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 350 },
|
||||
{ id: "item_253", name: "Rope of Entanglement", rarity: "Rare", faction: "Kundarak", baseCost: 1000 },
|
||||
{ id: "item_254", name: "Saddle of the Cavalier", rarity: "Uncommon", faction: "Deneith", baseCost: 250 },
|
||||
{ id: "item_255", name: "Sanctum Amulet", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000 },
|
||||
{ id: "item_256", name: "Scimitar of Speed", rarity: "Very Rare", faction: "Deneith", baseCost: 7500 },
|
||||
{ id: "item_257", name: "Scroll of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3500 },
|
||||
{ id: "item_258", name: "Sending Stones", rarity: "Uncommon", faction: "Morgrave", baseCost: 500 },
|
||||
{ id: "item_259", name: "Sentinel Shield", rarity: "Uncommon", faction: "Kundarak", baseCost: 300 },
|
||||
{ id: "item_260", name: "Shield of Missile Attraction", rarity: "Rare", faction: "Tarkanan", baseCost: 1000 },
|
||||
{ id: "item_261", name: "Shield of the Cavalier", rarity: "Very Rare", faction: "Kundarak", baseCost: 12500 },
|
||||
{ id: "item_262", name: "Shield, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 450 },
|
||||
{ id: "item_263", name: "Shield, +2", rarity: "Rare", faction: "Deneith", baseCost: 4000 },
|
||||
{ id: "item_264", name: "Shield, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 22000 },
|
||||
{ id: "item_265", name: "Slippers of Spider Climbing", rarity: "Uncommon", faction: "Tarkanan", baseCost: 500 },
|
||||
{ id: "item_266", name: "Speaking Stone", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000 },
|
||||
{ id: "item_267", name: "Spell Scroll (level 2 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 150 },
|
||||
{ id: "item_268", name: "Spell Scroll (level 3 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_269", name: "Spell Scroll (level 4 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 800 },
|
||||
{ id: "item_270", name: "Spell Scroll (level 5 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 1500 },
|
||||
{ id: "item_271", name: "Spell Scroll (level 6 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 2000 },
|
||||
{ id: "item_272", name: "Spell Scroll (level 7 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 3500 },
|
||||
{ id: "item_273", name: "Spell Scroll (level 8 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000 },
|
||||
{ id: "item_274", name: "Spellguard Shield", rarity: "Very Rare", faction: "Kundarak", baseCost: 36000 },
|
||||
{ id: "item_275", name: "Spell-refueling Ring", rarity: "Uncommon", faction: "Morgrave", baseCost: 600 },
|
||||
{ id: "item_276", name: "Staff of Charming", rarity: "Rare", faction: "Tarkanan", baseCost: 3750 },
|
||||
{ id: "item_277", name: "Staff of Fire", rarity: "Very Rare", faction: "Ashbound", baseCost: 18000 },
|
||||
{ id: "item_278", name: "Staff of Frost", rarity: "Very Rare", faction: "Morgrave", baseCost: 18000 },
|
||||
{ id: "item_279", name: "Staff of Healing", rarity: "Rare", faction: "Morgrave", baseCost: 4800 },
|
||||
{ id: "item_280", name: "Staff of Power", rarity: "Very Rare", faction: "Morgrave", baseCost: 46000 },
|
||||
{ id: "item_281", name: "Staff of Striking", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_282", name: "Staff of Swarming Insects", rarity: "Rare", faction: "Ashbound", baseCost: 4500 },
|
||||
{ id: "item_283", name: "Staff of the Adder", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 },
|
||||
{ id: "item_284", name: "Staff of the Python", rarity: "Uncommon", faction: "Ashbound", baseCost: 250 },
|
||||
{ id: "item_285", name: "Staff of the Woodlands", rarity: "Rare", faction: "Ashbound", baseCost: 4500 },
|
||||
{ id: "item_286", name: "Staff of Thunder and Lightning", rarity: "Very Rare", faction: "Morgrave", baseCost: 30000 },
|
||||
{ id: "item_287", name: "Staff of Withering", rarity: "Rare", faction: "Ashbound", baseCost: 2100 },
|
||||
{ id: "item_288", name: "Stone of Controlling Earth Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 },
|
||||
{ id: "item_289", name: "Stone of Good Luck", rarity: "Uncommon", faction: "Tharashk", baseCost: 400 },
|
||||
{ id: "item_290", name: "Sun Blade", rarity: "Rare", faction: "Deneith", baseCost: 2000 },
|
||||
{ id: "item_291", name: "Sword of Life Stealing", rarity: "Rare", faction: "Thuranni", baseCost: 2200 },
|
||||
{ id: "item_292", name: "Sword of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 42000 },
|
||||
{ id: "item_293", name: "Sword of Vengeance", rarity: "Uncommon", faction: "Thuranni", baseCost: 400 },
|
||||
{ id: "item_294", name: "Sword of Wounding", rarity: "Rare", faction: "Thuranni", baseCost: 1200 },
|
||||
{ id: "item_295", name: "Tentacle Rod", rarity: "Rare", faction: "Kundarak", baseCost: 2000 },
|
||||
{ id: "item_296", name: "Tome of Clear Thought", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_297", name: "Tome of Leadership and Influence", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_298", name: "Tome of Understanding", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 },
|
||||
{ id: "item_299", name: "Trident of Fish Command", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 },
|
||||
{ id: "item_300", name: "Ventilating Lungs", rarity: "Rare", faction: "Morgrave", baseCost: 1000 },
|
||||
{ id: "item_301", name: "Vicious Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 4000 },
|
||||
{ id: "item_302", name: "Wand of Binding", rarity: "Rare", faction: "Thuranni", baseCost: 2500 },
|
||||
{ id: "item_303", name: "Wand of Enemy Detection", rarity: "Rare", faction: "Medani", baseCost: 3750 },
|
||||
{ id: "item_304", name: "Wand of Fear", rarity: "Rare", faction: "Thuranni", baseCost: 3250 },
|
||||
{ id: "item_305", name: "Wand of Fireballs", rarity: "Rare", faction: "Ashbound", baseCost: 4800 },
|
||||
{ id: "item_306", name: "Wand of Lightning Bolts", rarity: "Rare", faction: "Tarkanan", baseCost: 4800 },
|
||||
{ id: "item_307", name: "Wand of Magic Detection", rarity: "Uncommon", faction: "Medani", baseCost: 150 },
|
||||
{ id: "item_308", name: "Wand of Magic Missiles", rarity: "Uncommon", faction: "Tharashk", baseCost: 300 },
|
||||
{ id: "item_309", name: "Wand of Paralysis", rarity: "Rare", faction: "Thuranni", baseCost: 4250 },
|
||||
{ id: "item_310", name: "Wand of Polymorph", rarity: "Very Rare", faction: "Tharashk", baseCost: 21000 },
|
||||
{ id: "item_311", name: "Wand of Secrets", rarity: "Uncommon", faction: "Medani", baseCost: 125 },
|
||||
{ id: "item_312", name: "Wand of the War Mage, +1", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 },
|
||||
{ id: "item_313", name: "Wand of the War Mage, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000 },
|
||||
{ id: "item_314", name: "Wand of the War Mage, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000 },
|
||||
{ id: "item_315", name: "Wand of Web", rarity: "Uncommon", faction: "Thuranni", baseCost: 250 },
|
||||
{ id: "item_316", name: "Wand of Wonder", rarity: "Rare", faction: "Morgrave", baseCost: 2250 },
|
||||
{ id: "item_317", name: "Warrior's Passkey", rarity: "Rare", faction: "Tharashk", baseCost: 5000 },
|
||||
{ id: "item_318", name: "Watchful Helm", rarity: "Very Rare", faction: "Medani", baseCost: 8500 },
|
||||
{ id: "item_319", name: "Wayfarer's Boots", rarity: "Rare", faction: "Morgrave", baseCost: 4750 },
|
||||
{ id: "item_320", name: "Weapon of Throne's Command", rarity: "Very Rare", faction: "Medani", baseCost: 16000 },
|
||||
{ id: "item_321", name: "Weapon of Warning", rarity: "Uncommon", faction: "Kundarak", baseCost: 400 },
|
||||
{ id: "item_322", name: "Weapon, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 500 },
|
||||
{ id: "item_323", name: "Weapon, +2", rarity: "Rare", faction: "Deneith", baseCost: 2500 },
|
||||
{ id: "item_324", name: "Weapon, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 15000 },
|
||||
{ id: "item_325", name: "Whispering Cloak", rarity: "Rare", faction: "Tharashk", baseCost: 4500 },
|
||||
{ id: "item_326", name: "Wind Fan", rarity: "Uncommon", faction: "Ashbound", baseCost: 150 },
|
||||
{ id: "item_327", name: "Winged Boots", rarity: "Uncommon", faction: "Tarkanan", baseCost: 5000 },
|
||||
{ id: "item_328", name: "Wings of Flying", rarity: "Rare", faction: "Tarkanan", baseCost: 3600 }
|
||||
{ id: "item_001", name: "Adamantine Armor", rarity: "Uncommon", faction: "Deneith", baseCost: 500, dndbeyondPage: "5370-adamantine-armor" },
|
||||
{ id: "item_002", name: "Adamantine Weapon", rarity: "Uncommon", faction: "Deneith", baseCost: 500, dndbeyondPage: "9228341-adamantine-weapon" },
|
||||
{ id: "item_003", name: "Alchemy Jug", rarity: "Uncommon", faction: "Morgrave", baseCost: 100, dndbeyondPage: "9228343-alchemy-jug" },
|
||||
{ id: "item_004", name: "Ammunition of Slaying", rarity: "Very Rare", faction: "Thuranni", baseCost: 1000, dndbeyondPage: "9228344-ammunition-of-slaying" },
|
||||
{ id: "item_005", name: "Ammunition, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 50, dndbeyondPage: "5407-ammunition-1" },
|
||||
{ id: "item_006", name: "Ammunition, +2", rarity: "Rare", faction: "Deneith", baseCost: 250, dndbeyondPage: "5410-ammunition-2" },
|
||||
{ id: "item_007", name: "Ammunition, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 1250, dndbeyondPage: "5411-ammunition-3" },
|
||||
{ id: "item_008", name: "Amulet of Health", rarity: "Rare", faction: "Morgrave", baseCost: 4000, dndbeyondPage: "4568-amulet-of-health" },
|
||||
{ id: "item_009", name: "Amulet of Proof against Detection and Location", rarity: "Uncommon", faction: "Kundarak", baseCost: 400, dndbeyondPage: "4569-amulet-of-proof-against-detection-and-location" },
|
||||
{ id: "item_010", name: "Amulet of the Planes", rarity: "Very Rare", faction: "Morgrave", baseCost: 43000, dndbeyondPage: "9228345-amulet-of-the-planes" },
|
||||
{ id: "item_011", name: "Animated Shield", rarity: "Very Rare", faction: "Deneith", baseCost: 6000, dndbeyondPage: "4571-animated-shield" },
|
||||
{ id: "item_012", name: "Arcane Propulsion Arm", rarity: "Very Rare", faction: "Deneith", baseCost: 5100, dndbeyondPage: "976932-arcane-propulsion-arm" },
|
||||
{ id: "item_013", name: "Armor of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "5371-armor-of-resistance" },
|
||||
{ id: "item_014", name: "Armor of Safeguarding", rarity: "Very Rare", faction: "Deneith", baseCost: 10000, dndbeyondPage: "7102410-armor-of-safeguarding" },
|
||||
{ id: "item_015", name: "Armor of the White Rose", rarity: "Very Rare", faction: "Ashbound", baseCost: 7000, dndbeyondPage: "8806813-armor-of-the-white-rose" },
|
||||
{ id: "item_016", name: "Armor, +1", rarity: "Rare", faction: "Deneith", baseCost: 3500, dndbeyondPage: "5377-armor-1" },
|
||||
{ id: "item_017", name: "Armor, +2", rarity: "Very Rare", faction: "Deneith", baseCost: 20000, dndbeyondPage: "5378-armor-2" },
|
||||
{ id: "item_018", name: "Arrow-Catching Shield", rarity: "Rare", faction: "Medani", baseCost: 4500, dndbeyondPage: "4577-arrow-catching-shield" },
|
||||
{ id: "item_019", name: "Bag of Beans", rarity: "Rare", faction: "Ashbound", baseCost: 4200, dndbeyondPage: "9228355-bag-of-beans" },
|
||||
{ id: "item_020", name: "Bag of Devouring", rarity: "Very Rare", faction: "Tarkanan", baseCost: 12000, dndbeyondPage: "4580-bag-of-devouring" },
|
||||
{ id: "item_021", name: "Bag of Holding", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "9228356-bag-of-holding" },
|
||||
{ id: "item_022", name: "Bag of Tricks", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9228357-bag-of-tricks" },
|
||||
{ id: "item_023", name: "Bead of Force", rarity: "Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "9180132-bead-of-force" },
|
||||
{ id: "item_024", name: "Belt of Dwarvenkind", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "4584-belt-of-dwarvenkind" },
|
||||
{ id: "item_025", name: "Belt of Giant Strength (fire)", rarity: "Very Rare", faction: "Deneith", baseCost: 36000, dndbeyondPage: "5372-belt-of-giant-strength" },
|
||||
{ id: "item_026", name: "Belt of Giant Strength (frost or stone)", rarity: "Very Rare", faction: "Deneith", baseCost: 12000, dndbeyondPage: "5372-belt-of-giant-strength" },
|
||||
{ id: "item_027", name: "Belt of Giant Strength (hill)", rarity: "Rare", faction: "Deneith", baseCost: 4000, dndbeyondPage: "5372-belt-of-giant-strength" },
|
||||
{ id: "item_028", name: "Berserker Axe", rarity: "Rare", faction: "Deneith", baseCost: 2000, dndbeyondPage: "5382-berserker-axe" },
|
||||
{ id: "item_029", name: "Bloodshed Blade", rarity: "Very Rare", faction: "Tarkanan", baseCost: 8000, dndbeyondPage: "7102412-bloodshed-blade" },
|
||||
{ id: "item_030", name: "Boots of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 400, dndbeyondPage: "4587-boots-of-elvenkind" },
|
||||
{ id: "item_031", name: "Boots of Levitation", rarity: "Rare", faction: "Tarkanan", baseCost: 4500, dndbeyondPage: "4588-boots-of-levitation" },
|
||||
{ id: "item_032", name: "Boots of Speed", rarity: "Rare", faction: "Tarkanan", baseCost: 3000, dndbeyondPage: "4589-boots-of-speed" },
|
||||
{ id: "item_033", name: "Boots of Striding and Springing", rarity: "Uncommon", faction: "Tharashk", baseCost: 200, dndbeyondPage: "9228365-boots-of-striding-and-springing" },
|
||||
{ id: "item_034", name: "Boots of the Winding Path", rarity: "Uncommon", faction: "Tharashk", baseCost: 400, dndbeyondPage: "10886002-boots-of-the-winding-path" },
|
||||
{ id: "item_035", name: "Boots of the Winterlands", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "4591-boots-of-the-winterlands" },
|
||||
{ id: "item_036", name: "Bowl of Commanding Water Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9228366-bowl-of-commanding-water-elementals" },
|
||||
{ id: "item_037", name: "Bracers of Archery", rarity: "Uncommon", faction: "Deneith", baseCost: 350, dndbeyondPage: "4593-bracers-of-archery" },
|
||||
{ id: "item_038", name: "Bracers of Defense", rarity: "Rare", faction: "Kundarak", baseCost: 4000, dndbeyondPage: "4594-bracers-of-defense" },
|
||||
{ id: "item_039", name: "Brazier of Commanding Fire Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9228367-brazier-of-commanding-fire-elementals" },
|
||||
{ id: "item_040", name: "Brooch of Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 375, dndbeyondPage: "4596-brooch-of-shielding" },
|
||||
{ id: "item_041", name: "Broom of Flying", rarity: "Uncommon", faction: "Ashbound", baseCost: 4500, dndbeyondPage: "9228372-broom-of-flying" },
|
||||
{ id: "item_042", name: "Candle of Invocation", rarity: "Very Rare", faction: "Morgrave", baseCost: 8400, dndbeyondPage: "9228374-candle-of-invocation" },
|
||||
{ id: "item_043", name: "Cap of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 450, dndbeyondPage: "9228375-cap-of-water-breathing" },
|
||||
{ id: "item_044", name: "Cape of the Mountebank", rarity: "Rare", faction: "Thuranni", baseCost: 3900, dndbeyondPage: "9228376-cape-of-the-mountebank" },
|
||||
{ id: "item_045", name: "Carpet of Flying", rarity: "Very Rare", faction: "Morgrave", baseCost: 44000, dndbeyondPage: "9228381-carpet-of-flying" },
|
||||
{ id: "item_046", name: "Cauldron of Rebirth", rarity: "Very Rare", faction: "Ashbound", baseCost: 10000, dndbeyondPage: "9228395-cauldron-of-rebirth" },
|
||||
{ id: "item_047", name: "Censer of Controlling Air Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9228396-censer-of-controlling-air-elementals" },
|
||||
{ id: "item_048", name: "Chime of Opening", rarity: "Rare", faction: "Tarkanan", baseCost: 3000, dndbeyondPage: "9228405-chime-of-opening" },
|
||||
{ id: "item_049", name: "Circlet of Blasting", rarity: "Uncommon", faction: "Morgrave", baseCost: 350, dndbeyondPage: "4603-circlet-of-blasting" },
|
||||
{ id: "item_050", name: "Cloak of Arachnida", rarity: "Very Rare", faction: "Tarkanan", baseCost: 14000, dndbeyondPage: "4604-cloak-of-arachnida" },
|
||||
{ id: "item_051", name: "Cloak of Displacement", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9228407-cloak-of-displacement" },
|
||||
{ id: "item_052", name: "Cloak of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250, dndbeyondPage: "9228408-cloak-of-elvenkind" },
|
||||
{ id: "item_053", name: "Cloak of Protection", rarity: "Uncommon", faction: "Kundarak", baseCost: 400, dndbeyondPage: "4607-cloak-of-protection" },
|
||||
{ id: "item_054", name: "Cloak of the Bat", rarity: "Rare", faction: "Thuranni", baseCost: 4600, dndbeyondPage: "4608-cloak-of-the-bat" },
|
||||
{ id: "item_055", name: "Cloak of the Manta Ray", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9228409-cloak-of-the-manta-ray" },
|
||||
{ id: "item_056", name: "Coat of the Crest", rarity: "Rare", faction: "Medani", baseCost: 4000, dndbeyondPage: "7170921-coat-of-the-crest" },
|
||||
{ id: "item_057", name: "Crown of the Wrath Bringer", rarity: "Rare", faction: "Thuranni", baseCost: 3750, dndbeyondPage: "7102418-crown-of-the-wrath-bringer" },
|
||||
{ id: "item_058", name: "Crystal Ball", rarity: "Very Rare", faction: "Medani", baseCost: 42000, dndbeyondPage: "4610-crystal-ball" },
|
||||
{ id: "item_059", name: "Cube of Force", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "9228411-cube-of-force" },
|
||||
{ id: "item_060", name: "Daern's Instant Fortress", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "9228414-daerns-instant-fortress" },
|
||||
{ id: "item_061", name: "Dagger of Denial", rarity: "Rare", faction: "Kundarak", baseCost: 2750, dndbeyondPage: "7170927-dagger-of-denial" },
|
||||
{ id: "item_062", name: "Dagger of Venom", rarity: "Rare", faction: "Thuranni", baseCost: 1500, dndbeyondPage: "9228415-dagger-of-venom" },
|
||||
{ id: "item_063", name: "Dancing Sword", rarity: "Very Rare", faction: "Deneith", baseCost: 10000, dndbeyondPage: "5383-dancing-sword" },
|
||||
{ id: "item_064", name: "Dazzling Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 3500, dndbeyondPage: "10886041-dazzling-weapon" },
|
||||
{ id: "item_065", name: "Decanter of Endless Water", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "9228419-decanter-of-endless-water" },
|
||||
{ id: "item_066", name: "Deck of Illusions", rarity: "Uncommon", faction: "Thuranni", baseCost: 450, dndbeyondPage: "9228420-deck-of-illusions" },
|
||||
{ id: "item_067", name: "Demon Armor", rarity: "Very Rare", faction: "Thuranni", baseCost: 7500, dndbeyondPage: "9228451-demon-armor" },
|
||||
{ id: "item_068", name: "Demon Skin", rarity: "Rare", faction: "Tarkanan", baseCost: 1300, dndbeyondPage: "8225886-demon-skin" },
|
||||
{ id: "item_069", name: "Dimensional Shackles", rarity: "Rare", faction: "Kundarak", baseCost: 2800, dndbeyondPage: "9228465-dimensional-shackles" },
|
||||
{ id: "item_070", name: "Dispelling Stone", rarity: "Very Rare", faction: "Tarkanan", baseCost: 7000, dndbeyondPage: "1434307-dispelling-stone" },
|
||||
{ id: "item_071", name: "Dragon Scale Mail", rarity: "Very Rare", faction: "Deneith", baseCost: 15000, dndbeyondPage: "9228477-dragon-scale-mail" },
|
||||
{ id: "item_072", name: "Dragon Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4800, dndbeyondPage: "9228520-dragon-slayer" },
|
||||
{ id: "item_073", name: "Driftglobe", rarity: "Uncommon", faction: "Tharashk", baseCost: 100, dndbeyondPage: "9228521-driftglobe" },
|
||||
{ id: "item_074", name: "Dust of Disappearance", rarity: "Uncommon", faction: "Tarkanan", baseCost: 200, dndbeyondPage: "9228522-dust-of-disappearance" },
|
||||
{ id: "item_075", name: "Dust of Dryness", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9228523-dust-of-dryness" },
|
||||
{ id: "item_076", name: "Dust of Sneezing and Choking", rarity: "Uncommon", faction: "Thuranni", baseCost: 150, dndbeyondPage: "9228524-dust-of-sneezing-and-choking" },
|
||||
{ id: "item_077", name: "Dwarven Plate", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000, dndbeyondPage: "9228527-dwarven-plate" },
|
||||
{ id: "item_078", name: "Dwarven Thrower", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000, dndbeyondPage: "4627-dwarven-thrower" },
|
||||
{ id: "item_079", name: "Dyrrn's Tentacle Whip", rarity: "Very Rare", faction: "Kundarak", baseCost: 17000, dndbeyondPage: "1000370-dyrrns-tentacle-whip" },
|
||||
{ id: "item_080", name: "Earworm", rarity: "Uncommon", faction: "Kundarak", baseCost: 225, dndbeyondPage: "1000466-earworm" },
|
||||
{ id: "item_081", name: "Efreeti Bottle", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000, dndbeyondPage: "9228528-efreeti-bottle" },
|
||||
{ id: "item_082", name: "Elemental Gem", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "9228536-elemental-gem" },
|
||||
{ id: "item_083", name: "Elixir of Health", rarity: "Rare", faction: "Morgrave", baseCost: 2000, dndbeyondPage: "5351-elixir-of-health" },
|
||||
{ id: "item_084", name: "Elven Chain", rarity: "Rare", faction: "Kundarak", baseCost: 4500, dndbeyondPage: "9228539-elven-chain" },
|
||||
{ id: "item_085", name: "Eversmoking Bottle", rarity: "Uncommon", faction: "Thuranni", baseCost: 270, dndbeyondPage: "9228602-eversmoking-bottle" },
|
||||
{ id: "item_086", name: "Eyes of Charming", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "9228610-eyes-of-charming" },
|
||||
{ id: "item_087", name: "Eyes of Minute Seeing", rarity: "Uncommon", faction: "Medani", baseCost: 150, dndbeyondPage: "9228611-eyes-of-minute-seeing" },
|
||||
{ id: "item_088", name: "Eyes of the Eagle", rarity: "Uncommon", faction: "Medani", baseCost: 400, dndbeyondPage: "9276755-eyes-of-the-eagle" },
|
||||
{ id: "item_089", name: "Fate Cutter Shears", rarity: "Very Rare", faction: "Thuranni", baseCost: 9000, dndbeyondPage: "7526657-fate-cutter-shears" },
|
||||
{ id: "item_090", name: "Figurine of Wondrous Power (bronze griffon)", rarity: "Rare", faction: "Ashbound", baseCost: 3600, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_091", name: "Figurine of Wondrous Power (ebony fly)", rarity: "Rare", faction: "Ashbound", baseCost: 3600, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_092", name: "Figurine of Wondrous Power (golden lions)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_093", name: "Figurine of Wondrous Power (ivory goats)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_094", name: "Figurine of Wondrous Power (marble elephant)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_095", name: "Figurine of Wondrous Power (obsidian steed)", rarity: "Very Rare", faction: "Thuranni", baseCost: 28500, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_096", name: "Figurine of Wondrous Power (onyx dog)", rarity: "Rare", faction: "Ashbound", baseCost: 3200, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_097", name: "Figurine of Wondrous Power (serpentine owl)", rarity: "Rare", faction: "Ashbound", baseCost: 3000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_098", name: "Figurine of Wondrous Power (silver raven)", rarity: "Uncommon", faction: "Medani", baseCost: 380, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
|
||||
{ id: "item_099", name: "Finder's Goggles", rarity: "Uncommon", faction: "Tharashk", baseCost: 500, dndbeyondPage: "977633-finders-goggles" },
|
||||
{ id: "item_100", name: "Flame Tongue", rarity: "Rare", faction: "Deneith", baseCost: 5000, dndbeyondPage: "9228647-flame-tongue" },
|
||||
{ id: "item_101", name: "Folding Boat", rarity: "Rare", faction: "Tharashk", baseCost: 4750, dndbeyondPage: "9228649-folding-boat" },
|
||||
{ id: "item_102", name: "Frost Brand", rarity: "Very Rare", faction: "Deneith", baseCost: 11000, dndbeyondPage: "9228651-frost-brand" },
|
||||
{ id: "item_103", name: "Gauntlets of Ogre Power", rarity: "Uncommon", faction: "Deneith", baseCost: 450, dndbeyondPage: "4641-gauntlets-of-ogre-power" },
|
||||
{ id: "item_104", name: "Gavel of the Venn Rune", rarity: "Rare", faction: "Medani", baseCost: 2800, dndbeyondPage: "5514-gavel-of-the-venn-rune" },
|
||||
{ id: "item_105", name: "Gem of Brightness", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "9228652-gem-of-brightness" },
|
||||
{ id: "item_106", name: "Gem of Seeing", rarity: "Rare", faction: "Medani", baseCost: 5000, dndbeyondPage: "9228653-gem-of-seeing" },
|
||||
{ id: "item_107", name: "Giant Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4600, dndbeyondPage: "5388-giant-slayer" },
|
||||
{ id: "item_108", name: "Glamerweave", rarity: "Uncommon", faction: "Thuranni", baseCost: 150, dndbeyondPage: "215556-glamerweave" },
|
||||
{ id: "item_109", name: "Glamoured Studded Leather", rarity: "Rare", faction: "Tarkanan", baseCost: 4800, dndbeyondPage: "4645-glamoured-studded-leather" },
|
||||
{ id: "item_110", name: "Gloves of Missile Snaring", rarity: "Uncommon", faction: "Tarkanan", baseCost: 325, dndbeyondPage: "9228697-gloves-of-missile-snaring" },
|
||||
{ id: "item_111", name: "Gloves of Swimming and Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "4647-gloves-of-swimming-and-climbing" },
|
||||
{ id: "item_112", name: "Gloves of Thievery", rarity: "Uncommon", faction: "Tarkanan", baseCost: 300, dndbeyondPage: "5352-gloves-of-thievery" },
|
||||
{ id: "item_113", name: "Goggles of Night", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "4648-goggles-of-night" },
|
||||
{ id: "item_114", name: "Grasping Whip", rarity: "Rare", faction: "Morgrave", baseCost: 750, dndbeyondPage: "7526717-grasping-whip" },
|
||||
{ id: "item_115", name: "Gulthias Staff", rarity: "Rare", faction: "Ashbound", baseCost: 2200, dndbeyondPage: "5528-gulthias-staff" },
|
||||
{ id: "item_116", name: "Hat of Disguise", rarity: "Uncommon", faction: "Tarkanan", baseCost: 475, dndbeyondPage: "4651-hat-of-disguise" },
|
||||
{ id: "item_117", name: "Headband of Intellect", rarity: "Uncommon", faction: "Morgrave", baseCost: 450, dndbeyondPage: "4652-headband-of-intellect" },
|
||||
{ id: "item_118", name: "Helm of Awareness", rarity: "Uncommon", faction: "Medani", baseCost: 500, dndbeyondPage: "10886043-helm-of-awareness" },
|
||||
{ id: "item_119", name: "Helm of Brilliance", rarity: "Very Rare", faction: "Tharashk", baseCost: 32000, dndbeyondPage: "9228720-helm-of-brilliance" },
|
||||
{ id: "item_120", name: "Helm of Comprehending Languages", rarity: "Uncommon", faction: "Medani", baseCost: 200, dndbeyondPage: "4654-helm-of-comprehending-languages" },
|
||||
{ id: "item_121", name: "Helm of Telepathy", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "9228721-helm-of-telepathy" },
|
||||
{ id: "item_122", name: "Helm of Teleportation", rarity: "Rare", faction: "Morgrave", baseCost: 4250, dndbeyondPage: "4656-helm-of-teleportation" },
|
||||
{ id: "item_123", name: "Heward's Handy Haversack", rarity: "Rare", faction: "Morgrave", baseCost: 2000, dndbeyondPage: "9228722-hewards-handy-haversack" },
|
||||
{ id: "item_124", name: "Horn of Blasting", rarity: "Rare", faction: "Ashbound", baseCost: 2500, dndbeyondPage: "9228775-horn-of-blasting" },
|
||||
{ id: "item_125", name: "Horn of Valhalla (brass or silver)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228781-horn-of-valhalla" },
|
||||
{ id: "item_126", name: "Horn of Valhalla (bronze)", rarity: "Very Rare", faction: "Ashbound", baseCost: 20000, dndbeyondPage: "9228781-horn-of-valhalla" },
|
||||
{ id: "item_127", name: "Horseshoes of a Zephyr", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000, dndbeyondPage: "9228782-horseshoes-of-a-zephyr" },
|
||||
{ id: "item_128", name: "Horseshoes of Speed", rarity: "Rare", faction: "Tharashk", baseCost: 3000, dndbeyondPage: "9228783-horseshoes-of-speed" },
|
||||
{ id: "item_129", name: "Immovable Rod", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "9228785-immovable-rod" },
|
||||
{ id: "item_130", name: "Instrument of the Bards (Anstruth harp)", rarity: "Very Rare", faction: "Morgrave", baseCost: 17500, dndbeyondPage: "9228788-instrument-of-the-bards" },
|
||||
{ id: "item_131", name: "Instrument of the Bards (Canaith mandolin)", rarity: "Rare", faction: "Morgrave", baseCost: 3750, dndbeyondPage: "9228788-instrument-of-the-bards" },
|
||||
{ id: "item_132", name: "Instrument of the Bards (Cli lyre)", rarity: "Rare", faction: "Morgrave", baseCost: 4250, dndbeyondPage: "9228788-instrument-of-the-bards" },
|
||||
{ id: "item_133", name: "Instrument of the Bards (Doss lute)", rarity: "Uncommon", faction: "Morgrave", baseCost: 250, dndbeyondPage: "9228788-instrument-of-the-bards" },
|
||||
{ id: "item_134", name: "Instrument of the Bards (Fochlucan bandore)", rarity: "Uncommon", faction: "Morgrave", baseCost: 350, dndbeyondPage: "9228788-instrument-of-the-bards" },
|
||||
{ id: "item_135", name: "Instrument of the Bards (Mac-Fuirmidh cittern)", rarity: "Uncommon", faction: "Morgrave", baseCost: 450, dndbeyondPage: "9228788-instrument-of-the-bards" },
|
||||
{ id: "item_136", name: "Ioun Stone (absorption)", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_137", name: "Ioun Stone (agility)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_138", name: "Ioun Stone (awareness)", rarity: "Rare", faction: "Medani", baseCost: 4000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_139", name: "Ioun Stone (fortitude)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_140", name: "Ioun Stone (insight)", rarity: "Very Rare", faction: "Medani", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_141", name: "Ioun Stone (intellect)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_142", name: "Ioun Stone (leadership)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_143", name: "Ioun Stone (protection)", rarity: "Rare", faction: "Kundarak", baseCost: 3600, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_144", name: "Ioun Stone (reserve)", rarity: "Rare", faction: "Morgrave", baseCost: 4500, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_145", name: "Ioun Stone (strength)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_146", name: "Ioun Stone (sustenance)", rarity: "Rare", faction: "Morgrave", baseCost: 3000, dndbeyondPage: "9228804-ioun-stone" },
|
||||
{ id: "item_147", name: "Iron Bands of Bilarro", rarity: "Rare", faction: "Tharashk", baseCost: 2600, dndbeyondPage: "9228805-iron-bands-of-bilarro" },
|
||||
{ id: "item_148", name: "Javelin of Lightning", rarity: "Uncommon", faction: "Deneith", baseCost: 350, dndbeyondPage: "9228807-javelin-of-lightning" },
|
||||
{ id: "item_149", name: "Keoghtom's Ointment", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228809-keoghtoms-ointment" },
|
||||
{ id: "item_150", name: "Kyrzin's Ooze", rarity: "Very Rare", faction: "Kundarak", baseCost: 21000, dndbeyondPage: "977672-kyrzins-ooze" },
|
||||
{ id: "item_151", name: "Lantern of Revealing", rarity: "Uncommon", faction: "Medani", baseCost: 500, dndbeyondPage: "9228811-lantern-of-revealing" },
|
||||
{ id: "item_152", name: "Living Armor", rarity: "Very Rare", faction: "Kundarak", baseCost: 9500, dndbeyondPage: "982693-living-armor" },
|
||||
{ id: "item_153", name: "Living Gloves", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "1085653-living-gloves" },
|
||||
{ id: "item_154", name: "Mace of Disruption", rarity: "Rare", faction: "Deneith", baseCost: 1750, dndbeyondPage: "4670-mace-of-disruption" },
|
||||
{ id: "item_155", name: "Mace of Smiting", rarity: "Rare", faction: "Deneith", baseCost: 2000, dndbeyondPage: "4671-mace-of-smiting" },
|
||||
{ id: "item_156", name: "Mace of Terror", rarity: "Rare", faction: "Deneith", baseCost: 3500, dndbeyondPage: "9228835-mace-of-terror" },
|
||||
{ id: "item_157", name: "Magician's Judge", rarity: "Rare", faction: "Deneith", baseCost: 1125, dndbeyondPage: "7170951-magicians-judge" },
|
||||
{ id: "item_158", name: "Mantle of Spell Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 4200, dndbeyondPage: "4673-mantle-of-spell-resistance" },
|
||||
{ id: "item_159", name: "Manual of Bodily Health", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4674-manual-of-bodily-health" },
|
||||
{ id: "item_160", name: "Manual of Gainful Exercise", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4675-manual-of-gainful-exercise" },
|
||||
{ id: "item_161", name: "Manual of Golems (clay, flesh, iron, or stone)", rarity: "Very Rare", faction: "Morgrave", baseCost: 22000, dndbeyondPage: "5416-manual-of-golems" },
|
||||
{ id: "item_162", name: "Manual of Quickness of Action", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4677-manual-of-quickness-of-action" },
|
||||
{ id: "item_163", name: "Mariner's Armor", rarity: "Uncommon", faction: "Tharashk", baseCost: 400, dndbeyondPage: "9228837-mariners-armor" },
|
||||
{ id: "item_164", name: "Medallion of Thoughts", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "9781866-medallion-of-thoughts" },
|
||||
{ id: "item_165", name: "Mind Sharpener", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "10886045-mind-sharpener" },
|
||||
{ id: "item_166", name: "Mindguard Crown", rarity: "Very Rare", faction: "Deneith", baseCost: 11000, dndbeyondPage: "7247083-mindguard-crown" },
|
||||
{ id: "item_167", name: "Mirror of Life Trapping", rarity: "Very Rare", faction: "Tharashk", baseCost: 50000, dndbeyondPage: "9228851-mirror-of-life-trapping" },
|
||||
{ id: "item_168", name: "Mithral Armor", rarity: "Uncommon", faction: "Kundarak", baseCost: 450, dndbeyondPage: "5381-mithral-armor" },
|
||||
{ id: "item_169", name: "Nature's Mantle", rarity: "Uncommon", faction: "Ashbound", baseCost: 325, dndbeyondPage: "2405507-natures-mantle" },
|
||||
{ id: "item_170", name: "Necklace of Adaptation", rarity: "Uncommon", faction: "Ashbound", baseCost: 450, dndbeyondPage: "4682-necklace-of-adaptation" },
|
||||
{ id: "item_171", name: "Necklace of Fireballs", rarity: "Rare", faction: "Deneith", baseCost: 4350, dndbeyondPage: "9228861-necklace-of-fireballs" },
|
||||
{ id: "item_172", name: "Necklace of Prayer Beads", rarity: "Rare", faction: "Morgrave", baseCost: 5000, dndbeyondPage: "9228862-necklace-of-prayer-beads" },
|
||||
{ id: "item_173", name: "Nimbus Coronet", rarity: "Very Rare", faction: "Tharashk", baseCost: 10500, dndbeyondPage: "7102429-nimbus-coronet" },
|
||||
{ id: "item_174", name: "Nine Lives Stealer", rarity: "Very Rare", faction: "Thuranni", baseCost: 36000, dndbeyondPage: "5394-nine-lives-stealer" },
|
||||
{ id: "item_175", name: "Nolzur's Marvelous Pigments", rarity: "Very Rare", faction: "Morgrave", baseCost: 16000, dndbeyondPage: "9228905-nolzurs-marvelous-pigments" },
|
||||
{ id: "item_176", name: "Oathbow", rarity: "Very Rare", faction: "Deneith", baseCost: 13000, dndbeyondPage: "9228907-oathbow" },
|
||||
{ id: "item_177", name: "Oil of Etherealness", rarity: "Rare", faction: "Thuranni", baseCost: 2000, dndbeyondPage: "4687-oil-of-etherealness" },
|
||||
{ id: "item_178", name: "Oil of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 2200, dndbeyondPage: "9228908-oil-of-sharpness" },
|
||||
{ id: "item_179", name: "Oil of Slipperiness", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250, dndbeyondPage: "9228909-oil-of-slipperiness" },
|
||||
{ id: "item_180", name: "Pariah's Shield", rarity: "Rare", faction: "Deneith", baseCost: 1500, dndbeyondPage: "316763-pariahs-shield" },
|
||||
{ id: "item_181", name: "Pearl of Power", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228918-pearl-of-power" },
|
||||
{ id: "item_182", name: "Periapt of Health", rarity: "Uncommon", faction: "Morgrave", baseCost: 250, dndbeyondPage: "9228920-periapt-of-health" },
|
||||
{ id: "item_183", name: "Periapt of Proof against Poison", rarity: "Rare", faction: "Kundarak", baseCost: 4700, dndbeyondPage: "9276658-periapt-of-proof-against-poison" },
|
||||
{ id: "item_184", name: "Periapt of Wound Closure", rarity: "Uncommon", faction: "Morgrave", baseCost: 375, dndbeyondPage: "9228921-periapt-of-wound-closure" },
|
||||
{ id: "item_185", name: "Philter of Love", rarity: "Uncommon", faction: "Tarkanan", baseCost: 150, dndbeyondPage: "9228922-philter-of-love" },
|
||||
{ id: "item_186", name: "Pipes of Haunting", rarity: "Uncommon", faction: "Thuranni", baseCost: 300, dndbeyondPage: "9228925-pipes-of-haunting" },
|
||||
{ id: "item_187", name: "Pipes of the Sewers", rarity: "Uncommon", faction: "Ashbound", baseCost: 150, dndbeyondPage: "9228926-pipes-of-the-sewers" },
|
||||
{ id: "item_188", name: "Portable Hole", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "9228932-portable-hole" },
|
||||
{ id: "item_189", name: "Potion of Animal Friendship", rarity: "Uncommon", faction: "Ashbound", baseCost: 200, dndbeyondPage: "9228933-potion-of-animal-friendship" },
|
||||
{ id: "item_190", name: "Potion of Clairvoyance", rarity: "Rare", faction: "Medani", baseCost: 900, dndbeyondPage: "4701-potion-of-clairvoyance" },
|
||||
{ id: "item_191", name: "Potion of Diminution", rarity: "Rare", faction: "Tarkanan", baseCost: 500, dndbeyondPage: "4703-potion-of-diminution" },
|
||||
{ id: "item_192", name: "Potion of Fire Breath", rarity: "Uncommon", faction: "Deneith", baseCost: 350, dndbeyondPage: "5357-potion-of-fire-breath" },
|
||||
{ id: "item_193", name: "Potion of Flying", rarity: "Very Rare", faction: "Tharashk", baseCost: 2500, dndbeyondPage: "4704-potion-of-flying" },
|
||||
{ id: "item_194", name: "Potion of Gaseous Form", rarity: "Rare", faction: "Thuranni", baseCost: 1500, dndbeyondPage: "4705-potion-of-gaseous-form" },
|
||||
{ id: "item_195", name: "Potion of Giant Strength (cloud)", rarity: "Very Rare", faction: "Deneith", baseCost: 1800, dndbeyondPage: "5417-potion-of-giant-strength" },
|
||||
{ id: "item_196", name: "Potion of Giant Strength (fire)", rarity: "Rare", faction: "Deneith", baseCost: 1200, dndbeyondPage: "5417-potion-of-giant-strength" },
|
||||
{ id: "item_197", name: "Potion of Giant Strength (frost or stone)", rarity: "Rare", faction: "Deneith", baseCost: 650, dndbeyondPage: "5417-potion-of-giant-strength" },
|
||||
{ id: "item_198", name: "Potion of Giant Strength (hill)", rarity: "Uncommon", faction: "Deneith", baseCost: 125, dndbeyondPage: "5417-potion-of-giant-strength" },
|
||||
{ id: "item_199", name: "Potion of Greater Invisibility", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000, dndbeyondPage: "9228934-potion-of-greater-invisibility" },
|
||||
{ id: "item_200", name: "Potion of Growth", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "9805016-potion-of-growth" },
|
||||
{ id: "item_201", name: "Potion of Healing (greater)", rarity: "Uncommon", faction: "Morgrave", baseCost: 300, dndbeyondPage: "4708-potions-of-healing" },
|
||||
{ id: "item_202", name: "Potion of Healing (superior)", rarity: "Rare", faction: "Morgrave", baseCost: 750, dndbeyondPage: "4708-potions-of-healing" },
|
||||
{ id: "item_203", name: "Potion of Healing (supreme)", rarity: "Very Rare", faction: "Morgrave", baseCost: 1500, dndbeyondPage: "4708-potions-of-healing" },
|
||||
{ id: "item_204", name: "Potion of Heroism", rarity: "Rare", faction: "Deneith", baseCost: 800, dndbeyondPage: "4709-potion-of-heroism" },
|
||||
{ id: "item_205", name: "Potion of Invisibility", rarity: "Rare", faction: "Tarkanan", baseCost: 2000, dndbeyondPage: "9228935-potion-of-invisibility" },
|
||||
{ id: "item_206", name: "Potion of Invulnerability", rarity: "Rare", faction: "Deneith", baseCost: 1500, dndbeyondPage: "5358-potion-of-invulnerability" },
|
||||
{ id: "item_207", name: "Potion of Longevity", rarity: "Very Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "5359-potion-of-longevity" },
|
||||
{ id: "item_208", name: "Potion of Mind Reading", rarity: "Rare", faction: "Medani", baseCost: 1100, dndbeyondPage: "9228936-potion-of-mind-reading" },
|
||||
{ id: "item_209", name: "Potion of Poison", rarity: "Uncommon", faction: "Thuranni", baseCost: 500, dndbeyondPage: "9228937-potion-of-poison" },
|
||||
{ id: "item_210", name: "Potion of Resistance", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "5419-potion-of-resistance" },
|
||||
{ id: "item_211", name: "Potion of Speed", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000, dndbeyondPage: "9228939-potion-of-speed" },
|
||||
{ id: "item_212", name: "Potion of Vitality", rarity: "Very Rare", faction: "Morgrave", baseCost: 1800, dndbeyondPage: "5360-potion-of-vitality" },
|
||||
{ id: "item_213", name: "Potion of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 400, dndbeyondPage: "9228940-potion-of-water-breathing" },
|
||||
{ id: "item_214", name: "Quaal's Feather Token (anchor, fan, or tree)", rarity: "Uncommon", faction: "Tharashk", baseCost: 25, dndbeyondPage: "9228948-quaals-feather-token" },
|
||||
{ id: "item_215", name: "Quiver of Ehlonna", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "5367-quiver-of-ehlonna" },
|
||||
{ id: "item_216", name: "Raven's Slumber", rarity: "Very Rare", faction: "Tarkanan", baseCost: 15000, dndbeyondPage: "7171001-ravens-slumber" },
|
||||
{ id: "item_217", name: "Repeating Shot", rarity: "Uncommon", faction: "Tarkanan", baseCost: 550, dndbeyondPage: "10886055-repeating-shot" },
|
||||
{ id: "item_218", name: "Repulsion Shield", rarity: "Uncommon", faction: "Deneith", baseCost: 600, dndbeyondPage: "10886056-repulsion-shield" },
|
||||
{ id: "item_219", name: "Returning Weapon", rarity: "Uncommon", faction: "Medani", baseCost: 550, dndbeyondPage: "10886064-returning-weapon" },
|
||||
{ id: "item_220", name: "Reveler's Concertina", rarity: "Rare", faction: "Thuranni", baseCost: 4250, dndbeyondPage: "2405691-revelers-concertina" },
|
||||
{ id: "item_221", name: "Ring of Animal Influence", rarity: "Rare", faction: "Ashbound", baseCost: 1000, dndbeyondPage: "9228958-ring-of-animal-influence" },
|
||||
{ id: "item_222", name: "Ring of Evasion", rarity: "Rare", faction: "Thuranni", baseCost: 4900, dndbeyondPage: "4720-ring-of-evasion" },
|
||||
{ id: "item_223", name: "Ring of Feather Falling", rarity: "Rare", faction: "Tarkanan", baseCost: 2200, dndbeyondPage: "4721-ring-of-feather-falling" },
|
||||
{ id: "item_224", name: "Ring of Free Action", rarity: "Rare", faction: "Tarkanan", baseCost: 4500, dndbeyondPage: "4722-ring-of-free-action" },
|
||||
{ id: "item_225", name: "Ring of Jumping", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "9228966-ring-of-jumping" },
|
||||
{ id: "item_226", name: "Ring of Mind Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 450, dndbeyondPage: "9228967-ring-of-mind-shielding" },
|
||||
{ id: "item_227", name: "Ring of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "4726-ring-of-protection" },
|
||||
{ id: "item_228", name: "Ring of Regeneration", rarity: "Very Rare", faction: "Ashbound", baseCost: 40000, dndbeyondPage: "4727-ring-of-regeneration" },
|
||||
{ id: "item_229", name: "Ring of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3500, dndbeyondPage: "9341408-ring-of-resistance" },
|
||||
{ id: "item_230", name: "Ring of Shooting Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000, dndbeyondPage: "9228968-ring-of-shooting-stars" },
|
||||
{ id: "item_231", name: "Ring of Spell Storing", rarity: "Rare", faction: "Morgrave", baseCost: 3600, dndbeyondPage: "4730-ring-of-spell-storing" },
|
||||
{ id: "item_232", name: "Ring of Swimming", rarity: "Uncommon", faction: "Tharashk", baseCost: 300, dndbeyondPage: "4732-ring-of-swimming" },
|
||||
{ id: "item_233", name: "Ring of Telekinesis", rarity: "Very Rare", faction: "Tarkanan", baseCost: 25000, dndbeyondPage: "9228970-ring-of-telekinesis" },
|
||||
{ id: "item_234", name: "Ring of Temporal Salvation", rarity: "Rare", faction: "Deneith", baseCost: 2250, dndbeyondPage: "1434358-ring-of-temporal-salvation" },
|
||||
{ id: "item_235", name: "Ring of the Ram", rarity: "Rare", faction: "Ashbound", baseCost: 4000, dndbeyondPage: "9228971-ring-of-the-ram" },
|
||||
{ id: "item_236", name: "Ring of Warmth", rarity: "Uncommon", faction: "Tharashk", baseCost: 480, dndbeyondPage: "9228972-ring-of-warmth" },
|
||||
{ id: "item_237", name: "Ring of Water Walking", rarity: "Uncommon", faction: "Tharashk", baseCost: 500, dndbeyondPage: "9228973-ring-of-water-walking" },
|
||||
{ id: "item_238", name: "Ring of X-ray Vision", rarity: "Rare", faction: "Medani", baseCost: 3500, dndbeyondPage: "9228974-ring-of-x-ray-vision" },
|
||||
{ id: "item_239", name: "Robe of Eyes", rarity: "Rare", faction: "Medani", baseCost: 5000, dndbeyondPage: "9228976-robe-of-eyes" },
|
||||
{ id: "item_240", name: "Robe of Scintillating Colors", rarity: "Very Rare", faction: "Thuranni", baseCost: 27000, dndbeyondPage: "9228977-robe-of-scintillating-colors" },
|
||||
{ id: "item_241", name: "Robe of Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000, dndbeyondPage: "9228978-robe-of-stars" },
|
||||
{ id: "item_242", name: "Robe of Useful Items", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228979-robe-of-useful-items" },
|
||||
{ id: "item_243", name: "Rod of Absorption", rarity: "Very Rare", faction: "Morgrave", baseCost: 48000, dndbeyondPage: "4744-rod-of-absorption" },
|
||||
{ id: "item_244", name: "Rod of Alertness", rarity: "Very Rare", faction: "Kundarak", baseCost: 11000, dndbeyondPage: "9228980-rod-of-alertness" },
|
||||
{ id: "item_245", name: "Rod of Hellish Flames", rarity: "Very Rare", faction: "Ashbound", baseCost: 10250, dndbeyondPage: "7526749-rod-of-hellish-flames" },
|
||||
{ id: "item_246", name: "Rod of Rulership", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9228982-rod-of-rulership" },
|
||||
{ id: "item_247", name: "Rod of Security", rarity: "Very Rare", faction: "Kundarak", baseCost: 45000, dndbeyondPage: "9228983-rod-of-security" },
|
||||
{ id: "item_248", name: "Rod of the Pact Keeper (+1)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228987-rod-of-the-pact-keeper" },
|
||||
{ id: "item_249", name: "Rod of the Pact Keeper, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000, dndbeyondPage: "9228987-rod-of-the-pact-keeper" },
|
||||
{ id: "item_250", name: "Rod of the Pact Keeper, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000, dndbeyondPage: "9228987-rod-of-the-pact-keeper" },
|
||||
{ id: "item_251", name: "Rogue's Mantle", rarity: "Rare", faction: "Tarkanan", baseCost: 5000, dndbeyondPage: "7526750-rogues-mantle" },
|
||||
{ id: "item_252", name: "Rope of Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 350, dndbeyondPage: "9228988-rope-of-climbing" },
|
||||
{ id: "item_253", name: "Rope of Entanglement", rarity: "Rare", faction: "Kundarak", baseCost: 1000, dndbeyondPage: "9228989-rope-of-entanglement" },
|
||||
{ id: "item_254", name: "Saddle of the Cavalier", rarity: "Uncommon", faction: "Deneith", baseCost: 250, dndbeyondPage: "5396-saddle-of-the-cavalier" },
|
||||
{ id: "item_255", name: "Sanctum Amulet", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000, dndbeyondPage: "7102438-sanctum-amulet" },
|
||||
{ id: "item_256", name: "Scimitar of Speed", rarity: "Very Rare", faction: "Deneith", baseCost: 7500, dndbeyondPage: "4752-scimitar-of-speed" },
|
||||
{ id: "item_257", name: "Scroll of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3500, dndbeyondPage: "9229016-scroll-of-protection" },
|
||||
{ id: "item_258", name: "Sending Stones", rarity: "Uncommon", faction: "Morgrave", baseCost: 500, dndbeyondPage: "9180147-sending-stones" },
|
||||
{ id: "item_259", name: "Sentinel Shield", rarity: "Uncommon", faction: "Kundarak", baseCost: 300, dndbeyondPage: "5403-sentinel-shield" },
|
||||
{ id: "item_260", name: "Shield of Missile Attraction", rarity: "Rare", faction: "Tarkanan", baseCost: 1000, dndbeyondPage: "4754-shield-of-missile-attraction" },
|
||||
{ id: "item_261", name: "Shield of the Cavalier", rarity: "Very Rare", faction: "Kundarak", baseCost: 12500, dndbeyondPage: "9058943-shield-of-the-cavalier" },
|
||||
{ id: "item_262", name: "Shield, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 450, dndbeyondPage: "4753-shield-1" },
|
||||
{ id: "item_263", name: "Shield, +2", rarity: "Rare", faction: "Deneith", baseCost: 4000, dndbeyondPage: "5157-shield-2" },
|
||||
{ id: "item_264", name: "Shield, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 22000, dndbeyondPage: "5158-shield-3" },
|
||||
{ id: "item_265", name: "Slippers of Spider Climbing", rarity: "Uncommon", faction: "Tarkanan", baseCost: 500, dndbeyondPage: "4755-slippers-of-spider-climbing" },
|
||||
{ id: "item_266", name: "Speaking Stone", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000, dndbeyondPage: "221458-speaking-stone" },
|
||||
{ id: "item_267", name: "Spell Scroll (level 2 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 150, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_268", name: "Spell Scroll (level 3 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_269", name: "Spell Scroll (level 4 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 800, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_270", name: "Spell Scroll (level 5 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 1500, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_271", name: "Spell Scroll (level 6 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 2000, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_272", name: "Spell Scroll (level 7 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 3500, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_273", name: "Spell Scroll (level 8 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000, dndbeyondPage: "9229085-spell-scroll" },
|
||||
{ id: "item_274", name: "Spellguard Shield", rarity: "Very Rare", faction: "Kundarak", baseCost: 36000, dndbeyondPage: "4757-spellguard-shield" },
|
||||
{ id: "item_275", name: "Spell-refueling Ring", rarity: "Uncommon", faction: "Morgrave", baseCost: 600, dndbeyondPage: "10886065-spell-refueling-ring" },
|
||||
{ id: "item_276", name: "Staff of Charming", rarity: "Rare", faction: "Tarkanan", baseCost: 3750, dndbeyondPage: "9229093-staff-of-charming" },
|
||||
{ id: "item_277", name: "Staff of Fire", rarity: "Very Rare", faction: "Ashbound", baseCost: 18000, dndbeyondPage: "9229094-staff-of-fire" },
|
||||
{ id: "item_278", name: "Staff of Frost", rarity: "Very Rare", faction: "Morgrave", baseCost: 18000, dndbeyondPage: "9229096-staff-of-frost" },
|
||||
{ id: "item_279", name: "Staff of Healing", rarity: "Rare", faction: "Morgrave", baseCost: 4800, dndbeyondPage: "9229097-staff-of-healing" },
|
||||
{ id: "item_280", name: "Staff of Power", rarity: "Very Rare", faction: "Morgrave", baseCost: 46000, dndbeyondPage: "9229098-staff-of-power" },
|
||||
{ id: "item_281", name: "Staff of Striking", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4765-staff-of-striking" },
|
||||
{ id: "item_282", name: "Staff of Swarming Insects", rarity: "Rare", faction: "Ashbound", baseCost: 4500, dndbeyondPage: "9229099-staff-of-swarming-insects" },
|
||||
{ id: "item_283", name: "Staff of the Adder", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9229100-staff-of-the-adder" },
|
||||
{ id: "item_284", name: "Staff of the Python", rarity: "Uncommon", faction: "Ashbound", baseCost: 250, dndbeyondPage: "9229102-staff-of-the-python" },
|
||||
{ id: "item_285", name: "Staff of the Woodlands", rarity: "Rare", faction: "Ashbound", baseCost: 4500, dndbeyondPage: "9229103-staff-of-the-woodlands" },
|
||||
{ id: "item_286", name: "Staff of Thunder and Lightning", rarity: "Very Rare", faction: "Morgrave", baseCost: 30000, dndbeyondPage: "9229104-staff-of-thunder-and-lightning" },
|
||||
{ id: "item_287", name: "Staff of Withering", rarity: "Rare", faction: "Ashbound", baseCost: 2100, dndbeyondPage: "4771-staff-of-withering" },
|
||||
{ id: "item_288", name: "Stone of Controlling Earth Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9229105-stone-of-controlling-earth-elementals" },
|
||||
{ id: "item_289", name: "Stone of Good Luck", rarity: "Uncommon", faction: "Tharashk", baseCost: 400, dndbeyondPage: "4773-stone-of-good-luck-luckstone" },
|
||||
{ id: "item_290", name: "Sun Blade", rarity: "Rare", faction: "Deneith", baseCost: 2000, dndbeyondPage: "9229110-sun-blade" },
|
||||
{ id: "item_291", name: "Sword of Life Stealing", rarity: "Rare", faction: "Thuranni", baseCost: 2200, dndbeyondPage: "9229113-sword-of-life-stealing" },
|
||||
{ id: "item_292", name: "Sword of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 42000, dndbeyondPage: "9229114-sword-of-sharpness" },
|
||||
{ id: "item_293", name: "Sword of Vengeance", rarity: "Uncommon", faction: "Thuranni", baseCost: 400, dndbeyondPage: "5505-sword-of-vengeance" },
|
||||
{ id: "item_294", name: "Sword of Wounding", rarity: "Rare", faction: "Thuranni", baseCost: 1200, dndbeyondPage: "9229115-sword-of-wounding" },
|
||||
{ id: "item_295", name: "Tentacle Rod", rarity: "Rare", faction: "Kundarak", baseCost: 2000, dndbeyondPage: "9229127-tentacle-rod" },
|
||||
{ id: "item_296", name: "Tome of Clear Thought", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4781-tome-of-clear-thought" },
|
||||
{ id: "item_297", name: "Tome of Leadership and Influence", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4782-tome-of-leadership-and-influence" },
|
||||
{ id: "item_298", name: "Tome of Understanding", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4783-tome-of-understanding" },
|
||||
{ id: "item_299", name: "Trident of Fish Command", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "4784-trident-of-fish-command" },
|
||||
{ id: "item_300", name: "Ventilating Lungs", rarity: "Rare", faction: "Morgrave", baseCost: 1000, dndbeyondPage: "1091623-ventilating-lungs" },
|
||||
{ id: "item_301", name: "Vicious Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 4000, dndbeyondPage: "9229175-vicious-weapon" },
|
||||
{ id: "item_302", name: "Wand of Binding", rarity: "Rare", faction: "Thuranni", baseCost: 2500, dndbeyondPage: "9229182-wand-of-binding" },
|
||||
{ id: "item_303", name: "Wand of Enemy Detection", rarity: "Rare", faction: "Medani", baseCost: 3750, dndbeyondPage: "9229184-wand-of-enemy-detection" },
|
||||
{ id: "item_304", name: "Wand of Fear", rarity: "Rare", faction: "Thuranni", baseCost: 3250, dndbeyondPage: "9229185-wand-of-fear" },
|
||||
{ id: "item_305", name: "Wand of Fireballs", rarity: "Rare", faction: "Ashbound", baseCost: 4800, dndbeyondPage: "9229186-wand-of-fireballs" },
|
||||
{ id: "item_306", name: "Wand of Lightning Bolts", rarity: "Rare", faction: "Tarkanan", baseCost: 4800, dndbeyondPage: "9229187-wand-of-lightning-bolts" },
|
||||
{ id: "item_307", name: "Wand of Magic Detection", rarity: "Uncommon", faction: "Medani", baseCost: 150, dndbeyondPage: "9229188-wand-of-magic-detection" },
|
||||
{ id: "item_308", name: "Wand of Magic Missiles", rarity: "Uncommon", faction: "Tharashk", baseCost: 300, dndbeyondPage: "9237129-wand-of-magic-missiles" },
|
||||
{ id: "item_309", name: "Wand of Paralysis", rarity: "Rare", faction: "Thuranni", baseCost: 4250, dndbeyondPage: "9229190-wand-of-paralysis" },
|
||||
{ id: "item_310", name: "Wand of Polymorph", rarity: "Very Rare", faction: "Tharashk", baseCost: 21000, dndbeyondPage: "9229191-wand-of-polymorph" },
|
||||
{ id: "item_311", name: "Wand of Secrets", rarity: "Uncommon", faction: "Medani", baseCost: 125, dndbeyondPage: "9229193-wand-of-secrets" },
|
||||
{ id: "item_312", name: "Wand of the War Mage, +1", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "34712-wand-of-the-war-mage" },
|
||||
{ id: "item_313", name: "Wand of the War Mage, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000, dndbeyondPage: "34712-wand-of-the-war-mage" },
|
||||
{ id: "item_314", name: "Wand of the War Mage, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000, dndbeyondPage: "34712-wand-of-the-war-mage" },
|
||||
{ id: "item_315", name: "Wand of Web", rarity: "Uncommon", faction: "Thuranni", baseCost: 250, dndbeyondPage: "9229194-wand-of-web" },
|
||||
{ id: "item_316", name: "Wand of Wonder", rarity: "Rare", faction: "Morgrave", baseCost: 2250, dndbeyondPage: "9229195-wand-of-wonder" },
|
||||
{ id: "item_317", name: "Warrior's Passkey", rarity: "Rare", faction: "Tharashk", baseCost: 5000, dndbeyondPage: "7526784-warriors-passkey" },
|
||||
{ id: "item_318", name: "Watchful Helm", rarity: "Very Rare", faction: "Medani", baseCost: 8500, dndbeyondPage: "3001264-watchful-helm" },
|
||||
{ id: "item_319", name: "Wayfarer's Boots", rarity: "Rare", faction: "Morgrave", baseCost: 4750, dndbeyondPage: "7102444-wayfarers-boots" },
|
||||
{ id: "item_320", name: "Weapon of Throne's Command", rarity: "Very Rare", faction: "Medani", baseCost: 16000, dndbeyondPage: "7526785-weapon-of-thrones-command" },
|
||||
{ id: "item_321", name: "Weapon of Warning", rarity: "Uncommon", faction: "Kundarak", baseCost: 400, dndbeyondPage: "9229199-weapon-of-warning" },
|
||||
{ id: "item_322", name: "Weapon, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 500, dndbeyondPage: "5400-weapon-1" },
|
||||
{ id: "item_323", name: "Weapon, +2", rarity: "Rare", faction: "Deneith", baseCost: 2500, dndbeyondPage: "5401-weapon-2" },
|
||||
{ id: "item_324", name: "Weapon, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 15000, dndbeyondPage: "5404-weapon-3" },
|
||||
{ id: "item_325", name: "Whispering Cloak", rarity: "Rare", faction: "Tharashk", baseCost: 4500, dndbeyondPage: "8806956-whispering-cloak" },
|
||||
{ id: "item_326", name: "Wind Fan", rarity: "Uncommon", faction: "Ashbound", baseCost: 150, dndbeyondPage: "4803-wind-fan" },
|
||||
{ id: "item_327", name: "Winged Boots", rarity: "Uncommon", faction: "Tarkanan", baseCost: 5000, dndbeyondPage: "9229203-winged-boots" },
|
||||
{ id: "item_328", name: "Wings of Flying", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9229204-wings-of-flying" }
|
||||
];
|
||||
|
||||
218
styles.css
218
styles.css
@ -440,7 +440,7 @@ body {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
left: var(--tooltip-arrow-left, 50%);
|
||||
transform: translateX(-50%);
|
||||
border: 8px solid transparent;
|
||||
border-bottom-color: #8b4513;
|
||||
@ -450,7 +450,7 @@ body {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
left: var(--tooltip-arrow-left, 50%);
|
||||
transform: translateX(-50%);
|
||||
border: 6px solid transparent;
|
||||
border-bottom-color: #fff;
|
||||
@ -576,14 +576,14 @@ body {
|
||||
.ashbound { border-left-color: #228b22; }
|
||||
.morgrave { border-left-color: #ff8c00; }
|
||||
|
||||
.kundarak .faction-name, .faction-name.kundarak { color: #8b7355; }
|
||||
.medani .faction-name, .faction-name.medani { color: #4682b4; }
|
||||
.deneith .faction-name, .faction-name.deneith { color: #b22222; }
|
||||
.tharashk .faction-name, .faction-name.tharashk { color: #8b6914; }
|
||||
.thuranni .faction-name, .faction-name.thuranni { color: #4b0082; }
|
||||
.tarkanan .faction-name, .faction-name.tarkanan { color: #dc143c; }
|
||||
.ashbound .faction-name, .faction-name.ashbound { color: #228b22; }
|
||||
.morgrave .faction-name, .faction-name.morgrave { color: #ff8c00; }
|
||||
.kundarak div[class*="header"] .faction-name, .faction-name.kundarak { color: #8b7355; }
|
||||
.medani div[class*="header"] .faction-name, .faction-name.medani { color: #4682b4; }
|
||||
.deneith div[class*="header"] .faction-name, .faction-name.deneith { color: #b22222; }
|
||||
.tharashk div[class*="header"] .faction-name, .faction-name.tharashk { color: #8b6914; }
|
||||
.thuranni div[class*="header"] .faction-name, .faction-name.thuranni { color: #4b0082; }
|
||||
.tarkanan div[class*="header"] .faction-name, .faction-name.tarkanan { color: #dc143c; }
|
||||
.ashbound div[class*="header"] .faction-name, .faction-name.ashbound { color: #228b22; }
|
||||
.morgrave div[class*="header"] .faction-name, .faction-name.morgrave { color: #ff8c00; }
|
||||
|
||||
/* Loading & Empty States */
|
||||
.loading, .no-quests {
|
||||
@ -979,6 +979,7 @@ button {
|
||||
|
||||
.no-items {
|
||||
text-align: center;
|
||||
vertical-align: top;
|
||||
padding: 2rem;
|
||||
color: #b8a992;
|
||||
font-style: italic;
|
||||
@ -1017,13 +1018,185 @@ button {
|
||||
background: rgba(139, 115, 85, 0.5);
|
||||
}
|
||||
|
||||
.market-table thead tr:first-child th {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.market-filter-row th {
|
||||
background: rgba(245, 222, 179, 0.5);
|
||||
padding: 0.5rem 0.75rem;
|
||||
vertical-align: top;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
|
||||
.market-filter-input,
|
||||
.market-filter-select {
|
||||
width: 100%;
|
||||
padding: 0.35rem 0.5rem;
|
||||
border: 1px solid rgba(139, 115, 85, 0.5);
|
||||
border-radius: 4px;
|
||||
font-size: 0.85rem;
|
||||
background: #fff;
|
||||
color: #2c1810;
|
||||
}
|
||||
|
||||
.market-filter-input::placeholder {
|
||||
color: #8b7355;
|
||||
}
|
||||
|
||||
.market-filter-search {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.market-filter-search-input {
|
||||
padding-right: 1.6rem;
|
||||
}
|
||||
|
||||
.market-filter-clear {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 6px;
|
||||
transform: translateY(-50%);
|
||||
border: none;
|
||||
padding: 0 0.5vw;
|
||||
background: transparent;
|
||||
color: #8b7355;
|
||||
cursor: pointer;
|
||||
font-size: 1.5rem;
|
||||
line-height: 1;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: opacity 0.15s ease;
|
||||
}
|
||||
|
||||
.market-filter-clear.active {
|
||||
opacity: 0.9;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.market-filter-range {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.35rem;
|
||||
}
|
||||
|
||||
.cost-col {
|
||||
width: 150px;
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
.market-filter-input.cost-filter {
|
||||
flex: 1 1 70px;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.market-filter-dropdown {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.market-filter-trigger {
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
border: 1px solid rgba(139, 115, 85, 0.5);
|
||||
border-radius: 4px;
|
||||
background: #fff;
|
||||
color: #2c1810;
|
||||
padding: 0.35rem 0.5rem;
|
||||
font-size: 0.85rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.market-filter-trigger.is-empty {
|
||||
border-color: #b22222;
|
||||
color: #b22222;
|
||||
}
|
||||
|
||||
.market-filter-summary {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.market-filter-popover {
|
||||
position: absolute;
|
||||
top: calc(100% + 6px);
|
||||
left: 0;
|
||||
z-index: 20;
|
||||
width: 125px;
|
||||
max-width: 80vw;
|
||||
background: #fff;
|
||||
border: 1px solid rgba(139, 115, 85, 0.5);
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 8px 18px rgba(0,0,0,0.2);
|
||||
padding: 0.5rem;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.market-filter-popover.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.market-filter-popover-header {
|
||||
display: grid;
|
||||
gap: 0.35rem;
|
||||
}
|
||||
|
||||
.market-filter-popover-search {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.market-filter-popover-actions {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 0.35rem;
|
||||
}
|
||||
|
||||
.market-filter-popover-actions button {
|
||||
border: 1px solid rgba(139, 115, 85, 0.4);
|
||||
background: rgba(245, 222, 179, 0.6);
|
||||
color: #2c1810;
|
||||
border-radius: 4px;
|
||||
padding: 0.2rem 0.4rem;
|
||||
font-size: 0.75rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.market-filter-options {
|
||||
margin-top: 0.5rem;
|
||||
max-height: 180px;
|
||||
overflow-y: auto;
|
||||
display: grid;
|
||||
gap: 0.25rem;
|
||||
}
|
||||
|
||||
.market-filter-option {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.35rem;
|
||||
font-size: 0.8rem;
|
||||
color: #2c1810;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.market-filter-option input {
|
||||
accent-color: #8b4513;
|
||||
}
|
||||
|
||||
.market-filter-empty {
|
||||
font-size: 0.75rem;
|
||||
color: #8b7355;
|
||||
}
|
||||
|
||||
.market-table tbody tr {
|
||||
border-bottom: 1px solid rgba(139, 115, 85, 0.2);
|
||||
transition: background 0.2s ease;
|
||||
}
|
||||
|
||||
.market-table tbody tr:hover {
|
||||
background: rgba(139, 115, 85, 0.1);
|
||||
.market-table tbody tr:nth-child(even) {
|
||||
background-color: rgba(245, 222, 179, 0.3);
|
||||
}
|
||||
|
||||
.market-table tbody tr:hover td {
|
||||
background-color: rgba(139, 115, 85, 0.3);
|
||||
}
|
||||
|
||||
.market-table td {
|
||||
@ -1053,32 +1226,34 @@ button {
|
||||
.item-faction-cell.ashbound { color: #228b22; }
|
||||
.item-faction-cell.morgrave { color: #ff8c00; }
|
||||
|
||||
.item-rarity-cell {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.rarity-badge {
|
||||
/* Restrict scope of badge formatting to .market-table in case other badges exist */
|
||||
.market-table span[class*='badge'] {
|
||||
display: inline-block;
|
||||
padding: 0.25rem 0.6rem;
|
||||
border-radius: 4px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.item-rarity-cell {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.rarity-badge {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.rarity-uncommon {
|
||||
background: #1e7b1e;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.rarity-rare {
|
||||
background: #4169e1;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.rarity-very-rare {
|
||||
background: #9370db;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.item-stock-cell {
|
||||
@ -1143,10 +1318,13 @@ button {
|
||||
/* Market table wrapper for horizontal scroll */
|
||||
.market-table-wrapper {
|
||||
overflow-x: auto;
|
||||
overflow-y: visible;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
margin: 0 -10px;
|
||||
padding: 0 10px;
|
||||
position: relative;
|
||||
min-height: 320px;
|
||||
min-height: 60vh;
|
||||
}
|
||||
|
||||
/* Scroll hint shadow on mobile */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user