You have some pins or exclusions active, which may be limiting results. You may find some results by removing those pins or exclusions.
`)
const getExpandedView = (set: ArmorSet, skillData: StaticSkillData, searchParams: SearchConstraints) => {
// build header
const header = htmlToElement(`
| Skill |
Weapon |
Head |
Chest |
Arms |
Waist |
Legs |
Deco |
Total |
Active |
`)
// build skills rows
const skillRows = Array.from(set.evaluation!.skills.entries())
.sort(([_a, a], [_b, b]) => b - a)
.map(([sId, sVal]) => {
const r = document.createElement('tr')
const computedDecoValue = set.decos
.map(d => d.skills.get(sId)!)
.reduce((sum, c) => sum + c, 0)
r.appendChild(htmlToElement(`
${skillData.skillName.get(sId) ? skillData.skillName.get(sId)! : ''} | `))
r.appendChild(htmlToElement('
| ')) // weapon
for (const p of set.getPieces()) {
r.append(htmlToElement(`
${p.skills.get(sId) ? p.skills.get(sId)! : ''} | `))
}
r.append(htmlToElement(`
${computedDecoValue || ''} | `))
r.append(htmlToElement(`
${sVal} | `))
const possibleAct = set.evaluation!.activations.find(a => a.requiredSkill === sId)
if (possibleAct) r.append(htmlToElement(`
${possibleAct.name} | `))
return r
})
// build slot list
const slotRow = document.createElement('tr')
slotRow.appendChild(htmlToElement('
Slots | '))
const rawSlowList = [searchParams.weaponSlots, ...set.getPieces().map(x => x.slots)]
rawSlowList.forEach(s => slotRow.appendChild(htmlToElement(`
${s} | `)))
// append elements to table
const skillTable = htmlToElement('
')
skillTable.appendChild(header)
skillRows.forEach(x => skillTable.appendChild(x))
skillTable.appendChild(slotRow)
// build deco list
const decoNameMap: Map
= new Map()
for (const deco of set.decos) {
const name = deco.name
decoNameMap.set(name, 1 + (decoNameMap.get(name) || 0))
}
const decoNameList = Array.from(decoNameMap.entries())
.map(([name, amount]) => `${amount} x ${name}`)
const decoNameString = decoNameList.join(', ')
const decoNameContainer = htmlToElement(`
${decoNameString}
`)
// build piece table
const pieceTable = htmlToElement('')
const pieceTableHeader = htmlToElement('| Def | Piece | Pin | Excl |
')
pieceTable.appendChild(pieceTableHeader)
for (const piece of set.getPieces()) {
const pieceTableEle = document.createElement('tr')
const pieceTableDef = htmlToElement(`${piece.defense.max} | `)
const pieceTableName = htmlToElement(`${piece.name} | `)
const pieceTablePin = (piece.isGeneric
? htmlToElement(' | ')
: htmlToElement('✓ | ')) as HTMLElement
const pieceTableExcl = htmlToElement('X | ') as HTMLElement
if (UserEquipmentSettings.Instance.hasPin(piece)) pieceTablePin.classList.add('pin-highlighted')
if (UserEquipmentSettings.Instance.hasExclusion(piece)) pieceTableExcl.classList.add('excl-highlighted')
pieceTablePin.addEventListener('click', () => {
if (piece.isGeneric) return
if (UserEquipmentSettings.Instance.hasPin(piece)) {
removePin(piece.category)
pieceTablePin.classList.remove('pin-highlighted')
} else {
addPin(piece)
pieceTablePin.classList.add('pin-highlighted')
}
})
pieceTableExcl.addEventListener('click', () => {
if (UserEquipmentSettings.Instance.hasExclusion(piece)) {
removeExlusion(piece)
pieceTableExcl.classList.remove('excl-highlighted')
} else {
addExclusion(piece)
pieceTableExcl.classList.add('excl-highlighted')
}
})
pieceTableEle.appendChild(pieceTableDef)
pieceTableEle.appendChild(pieceTableName)
pieceTableEle.appendChild(pieceTablePin)
pieceTableEle.appendChild(pieceTableExcl)
pieceTable.appendChild(pieceTableEle)
}
// return final div
const tr = htmlToElement('
')
const td = htmlToElement(' | ')
const d = htmlToElement('')
td.appendChild(d)
tr.appendChild(td)
d.appendChild(pieceTable)
d.appendChild(skillTable)
d.appendChild(document.createElement('div')) // dummy for easy grid
d.appendChild(decoNameContainer)
return tr
}
const getSetElement = (set: ArmorSet, skillData: StaticSkillData, searchParams: SearchConstraints) => {
// get bonus and negative skills
const requiredActivations = searchParams.skillActivations
const unrelatedActivations = set.evaluation!.activations.filter((act) => {
return !act.isPositive || // negative skill
!requiredActivations.find(req => req.requiredSkill === act.requiredSkill) || // skill is not in required
requiredActivations.find(req => req.requiredSkill === act.requiredSkill && act.requiredPoints > req.requiredPoints) // skill is upgrade of smth required
})
const unrelatedHtmlStrings = unrelatedActivations
.sort((a, b) => b.requiredPoints - a.requiredPoints)
.map((x) => {
return `${x.name}`
})
// get basic display components
const tb = htmlToElement('')
const row1 = htmlToElement(`
| ${set.head.name} |
${set.chest.name} |
${set.arms.name} |
${set.waist.name} |
${set.legs.name} |
`)
const row2 = htmlToElement(`
|
DEF ${set.evaluation.defense.max}
FIR ${set.evaluation.resistance[0]}
WAT ${set.evaluation.resistance[1]}
ICE ${set.evaluation.resistance[2]}
THN ${set.evaluation.resistance[3]}
DRG ${set.evaluation.resistance[4]}
${unrelatedHtmlStrings.join('')}
|
`)
// append basic display components
const getter = () => { return getExpandedView(set, skillData, searchParams) }
for (const row of [row1, row2]) {
tb.appendChild(row)
row.addEventListener('click', () => onSetClick(tb, getter))
}
return tb
}
const onMoreSkillsActClick = (d: HTMLDivElement) => {
const id = parseInt(d.getAttribute('data-id')!)
for (const ele of Array.from(document.getElementsByClassName('search-picker-activation'))) {
const thisId = parseInt(ele.getAttribute('data-id')!)
if (id === thisId) {
(ele as HTMLDivElement).click()
break
}
}
}
const clearAndGetResultsContainer = () => {
const resultContainer = document.getElementById('search-results')!
for (const c of Array.from(resultContainer.children)) c.remove()
return resultContainer
}
export const renderMoreSkills = (activations: SkillActivation[], pinsOrExclActive: boolean) => {
const resultContainer = clearAndGetResultsContainer()
if (activations.length === 0) {
resultContainer.appendChild(htmlToElement(`
Can't fit more skills
`))
if (pinsOrExclActive) resultContainer.appendChild(PINS_OR_EXCL_ACTIVE_BANNER)
return
}
for (const act of activations) {
const d = htmlToElement(`
`) as HTMLDivElement
d.appendChild(htmlToElement(`
${act.name}`))
d.addEventListener('click', () => { onMoreSkillsActClick(d) })
resultContainer.appendChild(d)
}
}
export const renderResults = (sets: ArmorSet[], skillData: StaticSkillData, searchParams: SearchConstraints, pinsOrExclActive: boolean) => {
const resultContainer = clearAndGetResultsContainer()
// add search param element
resultContainer.appendChild(htmlToElement(`
Results for ${searchParams.skillActivations.map(x => x.name).join(', ')} (${sets.length} matches)
`))
// return if no results
if (sets.length === 0) {
resultContainer.appendChild(htmlToElement(`
No matching armor sets
`))
if (pinsOrExclActive) resultContainer.appendChild(PINS_OR_EXCL_ACTIVE_BANNER)
return
}
// build table and table header
const table = htmlToElement('
')
const header = htmlToElement('
| Head | Torso | Arms | Waist | Legs |
|---|
')
resultContainer.appendChild(table)
table.appendChild(header)
// build and append html elements for each armor set
sets
.sort((a, b) => b.evaluation.defense.max - a.evaluation.defense.max)
.map(set => getSetElement(set, skillData, searchParams))
.forEach(ele => table.appendChild(ele))
}