diff --git a/match_collector/champion_stat.ts b/match_collector/champion_stat.ts index 6be3cfa..6a49166 100644 --- a/match_collector/champion_stat.ts +++ b/match_collector/champion_stat.ts @@ -47,6 +47,91 @@ type Champion = { alias: String } +function handleParticipantRunes(participant, runes: Array) { + const primaryStyle = participant.perks.styles[0].style + const secondaryStyle = participant.perks.styles[1].style + const selections : Array = [] + for(let style of participant.perks.styles) { + for(let perk of style.selections) { + selections.push(perk.perk) + } + } + const gameRunes : Rune = {count:1, primaryStyle: primaryStyle, secondaryStyle: secondaryStyle, selections: selections}; + let addRunes = true; + for(let rune of runes) { + if(rune.primaryStyle == gameRunes.primaryStyle + && rune.secondaryStyle == gameRunes.secondaryStyle + && sameArrays(rune.selections, gameRunes.selections)) { + rune.count++; addRunes = false; break; + } + } + if(addRunes) runes.push(gameRunes) +} + +function handleMatchItems(timeline, participantIndex : number, builds: Builds) { + const items : Array = [] + for(let frame of timeline.info.frames) { + for(let event of frame.events) { + if(event.participantId != participantIndex) continue; + if(event.type == "ITEM_UNDO") { + if(items.length > 0 && items[items.length - 1] == event.beforeId) { + items.pop() + } + continue; + } + if(event.type != "ITEM_PURCHASED") continue; + + let itemInfo = itemDict.get(event.itemId) + + // Handle boots differently + if(itemInfo.categories.includes("Boots")){ + if(itemInfo.to.length == 0 || event.itemId == 3006) { + // Check for bootsFirst + if(items.length < 2) { + builds.bootsFirst += 1 + } + + // Add to boots + const already = builds.boots.find((x) => x.data == event.itemId) + if(already == undefined) builds.boots.push({count:1, data:event.itemId}) + else already.count += 1 + } + + continue; + } + + // Check if item should be included + if(itemInfo.categories.includes("Consumable")) continue; + if(itemInfo.categories.includes("Trinket")) continue; + + // Ignore Cull as not-first item + if(event.itemId == 1083 && items.length >= 1) continue; + + // Ignore non-final items, except when first item bought + if(itemInfo.to.length != 0 && items.length >= 1) continue; + + items.push(event.itemId) + } + } + + // Core items + treeMerge(builds.tree, items.slice(1, 4)) + + // Start items + if(items.length >= 1) { + const already = builds.start.find((x) => x.data == items[0]) + if(already == undefined) builds.start.push({count:1, data:items[0]}) + else already.count += 1 + } + + // Late game items + for(let item of items.slice(4)) { + const already = builds.lateGame.find((x) => x.data == item) + if(already == undefined) builds.lateGame.push({count:1, data:item}) + else already.count += 1 + } +} + async function championInfos(client, patch: number, champion: Champion) { const championId = champion.id const database = client.db("matches"); @@ -72,87 +157,10 @@ async function championInfos(client, patch: number, champion: Champion) { losingMatches += 1; // Runes - const primaryStyle = participant.perks.styles[0].style - const secondaryStyle = participant.perks.styles[1].style - const selections : Array = [] - for(let style of participant.perks.styles) { - for(let perk of style.selections) { - selections.push(perk.perk) - } - } - const gameRunes : Rune = {count:1, primaryStyle: primaryStyle, secondaryStyle: secondaryStyle, selections: selections}; - let addRunes = true; - for(let rune of runes) { - if(rune.primaryStyle == gameRunes.primaryStyle - && rune.secondaryStyle == gameRunes.secondaryStyle - && sameArrays(rune.selections, gameRunes.selections)) { - rune.count++; addRunes = false; break; - } - } - if(addRunes) runes.push(gameRunes) + handleParticipantRunes(participant, runes) // Items - const items : Array = [] - for(let frame of match.timeline.info.frames) { - for(let event of frame.events) { - if(event.participantId != participantIndex) continue; - if(event.type == "ITEM_UNDO") { - if(items.length > 0 && items[items.length - 1] == event.beforeId) { - items.pop() - } - continue; - } - if(event.type != "ITEM_PURCHASED") continue; - - let itemInfo = itemDict.get(event.itemId) - - // Handle boots differently - if(itemInfo.categories.includes("Boots")){ - if(itemInfo.to.length == 0 || event.itemId == 3006) { - // Check for bootsFirst - if(items.length < 2) { - builds.bootsFirst += 1 - } - - // Add to boots - const already = builds.boots.find((x) => x.data == event.itemId) - if(already == undefined) builds.boots.push({count:1, data:event.itemId}) - else already.count += 1 - } - - continue; - } - - // Check if item should be included - if(itemInfo.categories.includes("Consumable")) continue; - if(itemInfo.categories.includes("Trinket")) continue; - - // Ignore Cull as not-first item - if(event.itemId == 1083 && items.length >= 1) continue; - - // Ignore non-final items, except when first item bought - if(itemInfo.to.length != 0 && items.length >= 1) continue; - - items.push(event.itemId) - } - } - - // Core items - treeMerge(builds.tree, items.slice(1, 4)) - - // Start items - if(items.length >= 1) { - const already = builds.start.find((x) => x.data == items[0]) - if(already == undefined) builds.start.push({count:1, data:items[0]}) - else already.count += 1 - } - - // Late game items - for(let item of items.slice(4)) { - const already = builds.lateGame.find((x) => x.data == item) - if(already == undefined) builds.lateGame.push({count:1, data:item}) - else already.count += 1 - } + handleMatchItems(match.timeline, participantIndex, builds) break; }