mirror of
https://github.com/mhwikicn/mhdos-armor-set-searcher
synced 2025-12-06 13:39:03 +08:00
150 lines
5.0 KiB
TypeScript
150 lines
5.0 KiB
TypeScript
import UserCharmList from '../../data-provider/models/user/UserCharmList'
|
|
import ArmorSet from '../../searcher/models/ArmorSet'
|
|
import SearchConstraints from '../../searcher/models/SearchConstraints'
|
|
import StaticEquipmentData from '../../data-provider/models/equipment/StaticEquipmentData'
|
|
import StaticSkillData from '../../data-provider/models/skills/StaticSkillData'
|
|
import { search } from '../../searcher/searcher.module'
|
|
import { getGlobalSettings } from './global-settings.component'
|
|
import { getSkillActivations, resetSkillActivations } from './picker.component'
|
|
import { moreSkillsIterator, renderMoreSkills, renderResults } from './search-results.component'
|
|
import SkillActivation from '../../data-provider/models/skills/SkillActivation'
|
|
import UserEquipmentSettings from '../../data-provider/models/user/UserEquipmentSettings'
|
|
import EquipmentMin from '../../data-provider/models/equipment/EquipmentMin'
|
|
|
|
const pinsOrExclusionsActive = (pins: (EquipmentMin | undefined)[], exclusions: EquipmentMin[][]): boolean => {
|
|
return pins.some(p => p !== undefined) || exclusions.some(eL => eL.length > 0)
|
|
}
|
|
|
|
const arrangeSearchData = () => {
|
|
// build params
|
|
const globalSettings = getGlobalSettings()
|
|
const skillActivations = getSkillActivations()
|
|
|
|
// return if no skill selected
|
|
if (skillActivations.length === 0) {
|
|
return
|
|
}
|
|
|
|
// sanitize activation input to only include highest version of each skill
|
|
const sanitizedSkillActivations = skillActivations
|
|
.filter((thisAct, i) => {
|
|
return skillActivations.every((compareAct, j) => {
|
|
if (i === j) return true
|
|
if (thisAct.requiredSkill !== compareAct.requiredSkill) return true
|
|
|
|
return thisAct.requiredPoints >= compareAct.requiredPoints
|
|
})
|
|
})
|
|
|
|
// create search params
|
|
const searchParams: SearchConstraints = {
|
|
weaponSlots: globalSettings.weaponSlots,
|
|
armorType: globalSettings.armorType,
|
|
armorRarity: globalSettings.armorRarity,
|
|
decoRarity: globalSettings.decoRarity,
|
|
limit: Math.min(Math.max(globalSettings.limit, 1), 1000),
|
|
skillActivations: sanitizedSkillActivations,
|
|
pins: UserEquipmentSettings.Instance.pins,
|
|
exclusions: UserEquipmentSettings.Instance.exclusions,
|
|
}
|
|
|
|
return searchParams
|
|
}
|
|
|
|
const searchLogic = (equData: StaticEquipmentData, skillData: StaticSkillData) => {
|
|
const searchParams = arrangeSearchData()
|
|
|
|
if (!searchParams) {
|
|
alert('Please select at least one skill')
|
|
return
|
|
}
|
|
|
|
// search for sets
|
|
const result = search(
|
|
equData.armor,
|
|
equData.decorations,
|
|
UserCharmList.Instance.get(),
|
|
searchParams,
|
|
skillData,
|
|
)
|
|
|
|
// render results
|
|
renderResults(result, skillData, searchParams, pinsOrExclusionsActive(searchParams.pins, searchParams.exclusions))
|
|
}
|
|
|
|
const moreSkillsLogic = async (equData: StaticEquipmentData, skillData: StaticSkillData) => {
|
|
const searchParams = arrangeSearchData()
|
|
|
|
if (!searchParams) {
|
|
alert('Please select at least one skill')
|
|
return
|
|
}
|
|
|
|
const charms = UserCharmList.Instance.get()
|
|
|
|
const aquirableSkills: SkillActivation[] = []
|
|
|
|
const outputIterator = moreSkillsIterator(skillData.skillActivation)
|
|
|
|
for (const actMap of skillData.skillActivation) {
|
|
const sActs = actMap[1]
|
|
|
|
const processedActs = sActs
|
|
.filter(act => act.requiredPoints >= 0)
|
|
.filter(act => !searchParams.skillActivations.map(x => x.id).includes(act.id))
|
|
.filter(act => !searchParams.skillActivations.find(x => act.requiredSkill === x.requiredSkill && act.requiredPoints < x.requiredPoints))
|
|
.sort((a, b) => a.requiredPoints - b.requiredPoints)
|
|
|
|
let breakFlag = false
|
|
for (const act of processedActs) {
|
|
outputIterator.next()
|
|
if (breakFlag) continue
|
|
|
|
const newParams: SearchConstraints = {
|
|
...searchParams,
|
|
limit: 1,
|
|
skillActivations: searchParams.skillActivations.concat(act),
|
|
}
|
|
|
|
const r = await new Promise<ArmorSet[]>((resolve, _reject) => {
|
|
setTimeout(() => {
|
|
const innerR = search(
|
|
equData.armor,
|
|
equData.decorations,
|
|
charms,
|
|
newParams,
|
|
skillData,
|
|
)
|
|
resolve(innerR)
|
|
})
|
|
})
|
|
|
|
if (r.length === 0) breakFlag = true
|
|
else aquirableSkills.push(act)
|
|
}
|
|
}
|
|
|
|
renderMoreSkills(aquirableSkills, pinsOrExclusionsActive(searchParams.pins, searchParams.exclusions))
|
|
}
|
|
|
|
const resetLogic = () => {
|
|
resetSkillActivations()
|
|
}
|
|
|
|
/** attach handlers for control buttons */
|
|
export const attachControlListeners = (equData: StaticEquipmentData, skillData: StaticSkillData) => {
|
|
const searchBtn = document.getElementById('search-btn') as HTMLButtonElement
|
|
const moreSkillsBtn = document.getElementById('more-btn') as HTMLButtonElement
|
|
const resetBtn = document.getElementById('reset-btn') as HTMLButtonElement
|
|
|
|
searchBtn.addEventListener('click', () => {
|
|
searchLogic(equData, skillData)
|
|
})
|
|
moreSkillsBtn.addEventListener('click', () => {
|
|
moreSkillsLogic(equData, skillData)
|
|
})
|
|
resetBtn.addEventListener('click', () => {
|
|
resetLogic()
|
|
})
|
|
}
|