Pokedex type chart
This commit is contained in:
parent
aa90918434
commit
43c3459364
126
css/styles.css
126
css/styles.css
|
@ -221,10 +221,7 @@ h3 {
|
|||
padding: 10px;
|
||||
overflow-y: scroll;
|
||||
min-width: 260px;
|
||||
}
|
||||
|
||||
#pokemon-display::-webkit-scrollbar {
|
||||
display: none;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#fullscreen #close-button {
|
||||
|
@ -241,6 +238,20 @@ h3 {
|
|||
text-shadow: black 1px 1px 3px;
|
||||
}
|
||||
|
||||
#pokemon-display #type-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
margin-top: 8px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
#pokemon-display .type-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
#pokemon-display #image-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
@ -255,6 +266,12 @@ h3 {
|
|||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
#pokemon-display #dex-and-type-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#pokemon-display img {
|
||||
width: 100%;
|
||||
}
|
||||
|
@ -267,9 +284,11 @@ h3 {
|
|||
padding-left: 28px;
|
||||
padding-right: 28px;
|
||||
margin: 0;
|
||||
margin-bottom: 8px;
|
||||
overflow: hidden;
|
||||
height: fit-content;
|
||||
position: relative;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
#description-carousel .description-carousel-item {
|
||||
|
@ -310,11 +329,13 @@ h3 {
|
|||
#description-carousel .description-text {
|
||||
left: 0;
|
||||
color: #ccc;
|
||||
font-style: italic;
|
||||
font-weight: 250;
|
||||
}
|
||||
|
||||
#description-carousel .description-game {
|
||||
left: 0;
|
||||
font-size: 1em;
|
||||
font-size: 1.2em;
|
||||
font-weight: 400;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
|
@ -335,7 +356,7 @@ h3 {
|
|||
margin: 0;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 10px;
|
||||
text-align: center;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#pokemon-display .pokemon-id {
|
||||
|
@ -421,6 +442,64 @@ h3 {
|
|||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
#type-chart-container {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
|
||||
width: 100%;
|
||||
grid-template-rows: 60px 1fr;
|
||||
background-color: #222;
|
||||
border-radius: 15px;
|
||||
color: #ccc;
|
||||
margin-bottom: 8px;
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
#type-chart-container #type-chart-title {
|
||||
grid-column: 1 / span 5;
|
||||
margin: 0;
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
color: white;
|
||||
font-weight: 400;
|
||||
text-align: center;
|
||||
padding-bottom: 5px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.type-chart-title {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
height: 40px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
justify-content: center;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.type-chart-element {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
color: black;
|
||||
text-align: center;
|
||||
margin: 2px;
|
||||
height: 18px;
|
||||
border-radius: 9px;
|
||||
}
|
||||
|
||||
#noeffect-column, #doubleresist-column, #resist-column, #weak-column {
|
||||
border-right: 1px solid #ccc;
|
||||
}
|
||||
|
||||
#type-chart-container .type-chart-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-size: 0.6em;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
/* POKEDEX STYLES */
|
||||
|
||||
#pokedex {
|
||||
|
@ -738,6 +817,7 @@ h3 {
|
|||
margin: 10px;
|
||||
border-radius: 40px;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.pokemon-card img {
|
||||
|
@ -868,13 +948,18 @@ h3 {
|
|||
padding: 20px;
|
||||
max-height: 600px;
|
||||
max-width: 900px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
#image-and-stats {
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 280px;
|
||||
}
|
||||
|
||||
#pokemon-display #type-container {
|
||||
margin-top: 14px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
#pokemon-display img {
|
||||
|
@ -953,6 +1038,7 @@ h3 {
|
|||
padding: 20px;
|
||||
max-height: 755px;
|
||||
max-width: 1120px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#fullscreen #close-button {
|
||||
|
@ -967,6 +1053,7 @@ h3 {
|
|||
display: grid;
|
||||
grid-template-columns: 475px 1fr;
|
||||
grid-column-gap: 8px;
|
||||
grid-template-rows: auto;
|
||||
}
|
||||
|
||||
#pokemon-display .pokemon-name {
|
||||
|
@ -980,6 +1067,24 @@ h3 {
|
|||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
#pokemon-display #type-container {
|
||||
margin-top: 15px;
|
||||
margin-right: 25px;
|
||||
}
|
||||
|
||||
#pokemon-display .type-icon {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
#image-and-stats {
|
||||
width: 475px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
grid-column: 1;
|
||||
grid-row: 1 / span 2;
|
||||
}
|
||||
|
||||
#pokemon-display img {
|
||||
max-height: 475px;
|
||||
max-width: 475px;
|
||||
|
@ -1006,6 +1111,15 @@ h3 {
|
|||
grid-row: 2;
|
||||
}
|
||||
|
||||
#description-carousel {
|
||||
grid-column: 2;
|
||||
height: 338px;
|
||||
}
|
||||
|
||||
#type-chart-container {
|
||||
height: 337px;
|
||||
}
|
||||
|
||||
/* BELOW LANDING STYLES */
|
||||
|
||||
#below-landing {
|
||||
|
|
|
@ -23,7 +23,8 @@
|
|||
<h2>Pokedex</h2>
|
||||
<form id="generation-selector"></form>
|
||||
<div id="pokemon-container"></div>
|
||||
<div id="type-selector"></div>
|
||||
<div id="type-selector"></div>
|
||||
<p>Select any creature to view its profile. You can use the top buttons to toggle creatures from different generations or use the bottom buttons to toggle creatures with a specific type.</p>
|
||||
</section>
|
||||
|
||||
<section id="features-intro" class="content-column features">
|
||||
|
|
220
js/scripts.js
220
js/scripts.js
|
@ -209,7 +209,11 @@ async function populateGenerations() {
|
|||
genButton.type = "checkbox";
|
||||
genButton.value = generationsURL[i];
|
||||
genButton.id = `gen${gen}`;
|
||||
genButton.checked = true;
|
||||
if (gen === "I") {
|
||||
genButton.checked = true;
|
||||
} else {
|
||||
genButton.checked = false;
|
||||
}
|
||||
container.appendChild(genButton);
|
||||
const genLabel = document.createElement("label");
|
||||
genLabel.htmlFor = `gen${gen}`;
|
||||
|
@ -256,7 +260,11 @@ async function populateTypes() {
|
|||
typeButton.type = "checkbox";
|
||||
typeButton.value = type;
|
||||
typeButton.id = type;
|
||||
typeButton.checked = true;
|
||||
if (type === "normal") {
|
||||
typeButton.checked = true;
|
||||
} else {
|
||||
typeButton.checked = false;
|
||||
}
|
||||
container.appendChild(typeButton);
|
||||
|
||||
const typeImg = document.createElement("img");
|
||||
|
@ -539,6 +547,7 @@ async function createPokemonDisplay(id) {
|
|||
let descriptionFormatted = description;
|
||||
descriptionFormatted = descriptionFormatted.replace("\u000c", " ");
|
||||
descriptionFormatted = descriptionFormatted.replace("\n", " ");
|
||||
descriptionFormatted = descriptionFormatted.replace("POKéMON", "Pokémon");
|
||||
|
||||
const descriptionText = document.createElement("p");
|
||||
descriptionText.className = "description-text";
|
||||
|
@ -570,6 +579,82 @@ async function createPokemonDisplay(id) {
|
|||
pokemonCarousel("right");
|
||||
});
|
||||
|
||||
const types = data.types;
|
||||
const primaryType = types[0].type.name;
|
||||
const primaryIcon = `https://raw.githubusercontent.com/duiker101/pokemon-type-svg-icons/5781623f147f1bf850f426cfe1874ba56a9b75ee/icons/${primaryType}.svg`
|
||||
let secondaryType = "";
|
||||
|
||||
if (types[1]) {
|
||||
secondaryType = types[1].type.name;
|
||||
secondaryIcon = `https://raw.githubusercontent.com/duiker101/pokemon-type-svg-icons/5781623f147f1bf850f426cfe1874ba56a9b75ee/icons/${secondaryType}.svg`
|
||||
} else {
|
||||
secondaryType = "Monotype";
|
||||
}
|
||||
|
||||
const typeChartContainer = document.createElement("div");
|
||||
typeChartContainer.id = "type-chart-container";
|
||||
|
||||
const typeChartTitle = document.createElement("p");
|
||||
typeChartTitle.id = "type-chart-title";
|
||||
typeChartTitle.innerHTML = "Type Chart";
|
||||
|
||||
const noeffectColumn = document.createElement("ul");
|
||||
noeffectColumn.id = "noeffect-column";
|
||||
noeffectColumn.className = "type-chart-column";
|
||||
const noeffectTitle = document.createElement("li");
|
||||
noeffectTitle.innerHTML = "Immune";
|
||||
noeffectTitle.className = "type-chart-title";
|
||||
noeffectColumn.appendChild(noeffectTitle);
|
||||
|
||||
const doubleresistColumn = document.createElement("ul");
|
||||
doubleresistColumn.id = "doubleresist-column";
|
||||
doubleresistColumn.className = "type-chart-column";
|
||||
const doubleresistTitle = document.createElement("li");
|
||||
doubleresistTitle.innerHTML = "Double Resist";
|
||||
doubleresistTitle.className = "type-chart-title";
|
||||
doubleresistColumn.appendChild(doubleresistTitle);
|
||||
|
||||
const resistColumn = document.createElement("ul");
|
||||
resistColumn.id = "resist-column";
|
||||
resistColumn.className = "type-chart-column";
|
||||
const resistTitle = document.createElement("li");
|
||||
resistTitle.innerHTML = "Resist";
|
||||
resistTitle.className = "type-chart-title";
|
||||
resistColumn.appendChild(resistTitle);
|
||||
|
||||
const weakColumn = document.createElement("ul");
|
||||
weakColumn.id = "weak-column";
|
||||
weakColumn.className = "type-chart-column";
|
||||
const weakTitle = document.createElement("li");
|
||||
weakTitle.innerHTML = "Weak";
|
||||
weakTitle.className = "type-chart-title";
|
||||
weakColumn.appendChild(weakTitle);
|
||||
|
||||
const doubleweakColumn = document.createElement("ul");
|
||||
doubleweakColumn.id = "doubleweak-column";
|
||||
doubleweakColumn.className = "type-chart-column";
|
||||
const doubleweakTitle = document.createElement("li");
|
||||
doubleweakTitle.innerHTML = "Double Weak";
|
||||
doubleweakTitle.className = "type-chart-title";
|
||||
doubleweakColumn.appendChild(doubleweakTitle);
|
||||
|
||||
typeChartContainer.appendChild(typeChartTitle);
|
||||
typeChartContainer.appendChild(noeffectColumn);
|
||||
typeChartContainer.appendChild(doubleresistColumn);
|
||||
typeChartContainer.appendChild(resistColumn);
|
||||
typeChartContainer.appendChild(weakColumn);
|
||||
typeChartContainer.appendChild(doubleweakColumn);
|
||||
|
||||
const primaryImg = document.createElement("img");
|
||||
primaryImg.src = primaryIcon;
|
||||
primaryImg.alt = primaryType;
|
||||
primaryImg.className = "type-icon";
|
||||
|
||||
const secondaryImg = document.createElement("img");
|
||||
secondaryImg.src = secondaryIcon;
|
||||
secondaryImg.alt = secondaryType;
|
||||
secondaryImg.className = "type-icon";
|
||||
|
||||
descriptionCarousel.appendChild(leftButton);
|
||||
descriptionCarousel.appendChild(rightButton);
|
||||
|
||||
|
@ -580,16 +665,33 @@ async function createPokemonDisplay(id) {
|
|||
const pokemonContents = document.createElement("div");
|
||||
pokemonContents.id = "pokemon-contents";
|
||||
|
||||
const typeContainer = document.createElement("div");
|
||||
typeContainer.id = "type-container";
|
||||
typeContainer.appendChild(primaryImg);
|
||||
typeContainer.appendChild(secondaryImg);
|
||||
|
||||
// const dexAndTypeContainer = document.createElement("div");
|
||||
// dexAndTypeContainer.id = "dex-and-type-container";
|
||||
// dexAndTypeContainer.appendChild(descriptionCarousel);
|
||||
// dexAndTypeContainer.appendChild(typeChartContainer);
|
||||
|
||||
pokemonDisplay.appendChild(pokemonName);
|
||||
pokemonDisplay.appendChild(pokemonId);
|
||||
pokemonDisplay.appendChild(typeContainer);
|
||||
|
||||
pokemonContents.appendChild(imageAndStats);
|
||||
//pokemonContents.appendChild(dexAndTypeContainer);
|
||||
pokemonContents.appendChild(descriptionCarousel);
|
||||
pokemonContents.appendChild(typeChartContainer);
|
||||
|
||||
|
||||
pokemonDisplay.appendChild(pokemonContents);
|
||||
|
||||
fullscreenContainer.appendChild(pokemonDisplay);
|
||||
fullscreenContainer.appendChild(closeButton);
|
||||
|
||||
const typeChart = await calculateTypeChart(primaryType, secondaryType)
|
||||
displayTypeChart(typeChart);
|
||||
}
|
||||
|
||||
function closePokemonDisplay() {
|
||||
|
@ -651,6 +753,120 @@ function transitionPokemonCarousel(i) {
|
|||
}
|
||||
}
|
||||
|
||||
async function calculateTypeChart(primaryType, secondaryType, stat) {
|
||||
let typeArray = {"normal": 0, "fighting": 0, "flying": 0, "poison": 0, "ground": 0, "rock": 0, "bug": 0, "ghost": 0, "steel": 0, "fire": 0, "water": 0, "grass": 0, "electric": 0, "psychic": 0, "ice": 0, "dragon": 0, "dark": 0, "fairy": 0};
|
||||
|
||||
const primaryURL = `https://pokeapi.co/api/v2/type/${primaryType}`;
|
||||
const primaryResponse = await fetch(primaryURL);
|
||||
const primaryData = await primaryResponse.json();
|
||||
|
||||
primaryData.damage_relations.double_damage_from.forEach((type) => {
|
||||
typeArray[type.name] += 1;
|
||||
});
|
||||
primaryData.damage_relations.half_damage_from.forEach((type) => {
|
||||
typeArray[type.name] -= 1;
|
||||
});
|
||||
primaryData.damage_relations.no_damage_from.forEach((type) => {
|
||||
typeArray[type.name] -= 999;
|
||||
});
|
||||
|
||||
if (secondaryType !== "Monotype") {
|
||||
const secondaryURL = `https://pokeapi.co/api/v2/type/${secondaryType}`;
|
||||
const secondaryResponse = await fetch(secondaryURL);
|
||||
const secondaryData = await secondaryResponse.json();
|
||||
|
||||
secondaryData.damage_relations.double_damage_from.forEach((type) => {
|
||||
typeArray[type.name] += 1;
|
||||
});
|
||||
secondaryData.damage_relations.half_damage_from.forEach((type) => {
|
||||
typeArray[type.name] -= 1;
|
||||
});
|
||||
secondaryData.damage_relations.no_damage_from.forEach((type) => {
|
||||
typeArray[type.name] -= 999;
|
||||
});
|
||||
}
|
||||
|
||||
return typeArray;
|
||||
}
|
||||
|
||||
function displayTypeChart(typeArray) {
|
||||
const resist = [];
|
||||
const doubleresist = [];
|
||||
const weak = [];
|
||||
const doubleweak = [];
|
||||
const noeffect = [];
|
||||
for (const type in typeArray) {
|
||||
if (typeArray[type] === -1) {
|
||||
resist.push(type);
|
||||
} else if (typeArray[type] === -2) {
|
||||
doubleresist.push(type);
|
||||
} else if (typeArray[type] === 1) {
|
||||
weak.push(type);
|
||||
}
|
||||
else if (typeArray[type] === 2) {
|
||||
doubleweak.push(type);
|
||||
} else if (typeArray[type] < -100) {
|
||||
noeffect.push(type);
|
||||
} else {
|
||||
//neutral
|
||||
}
|
||||
}
|
||||
|
||||
const noeffectColumn = document.getElementById("noeffect-column");
|
||||
const doubleresistColumn = document.getElementById("doubleresist-column");
|
||||
const resistColumn = document.getElementById("resist-column");
|
||||
const weakColumn = document.getElementById("weak-column");
|
||||
const doubleweakColumn = document.getElementById("doubleweak-column");
|
||||
|
||||
for (const element of document.getElementsByClassName("type-chart-element")) {
|
||||
element.remove();
|
||||
}
|
||||
|
||||
try {
|
||||
noeffect.forEach((type) => {
|
||||
const typeElement = document.createElement("li");
|
||||
typeElement.innerHTML = type.toUpperCase();
|
||||
typeElement.className = "type-chart-element";
|
||||
typeElement.classList.add(type + "-primary-type");
|
||||
noeffectColumn.appendChild(typeElement);
|
||||
});
|
||||
|
||||
doubleresist.forEach((type) => {
|
||||
const typeElement = document.createElement("li");
|
||||
typeElement.innerHTML = type.toUpperCase();
|
||||
typeElement.className = "type-chart-element";
|
||||
typeElement.classList.add(type + "-primary-type");
|
||||
doubleresistColumn.appendChild(typeElement);
|
||||
});
|
||||
|
||||
resist.forEach((type) => {
|
||||
const typeElement = document.createElement("li");
|
||||
typeElement.innerHTML = type.toUpperCase();
|
||||
typeElement.className = "type-chart-element";
|
||||
typeElement.classList.add(type + "-primary-type");
|
||||
resistColumn.appendChild(typeElement);
|
||||
});
|
||||
|
||||
weak.forEach((type) => {
|
||||
const typeElement = document.createElement("li");
|
||||
typeElement.innerHTML = type.toUpperCase();
|
||||
typeElement.className = "type-chart-element";
|
||||
typeElement.classList.add(type + "-primary-type");
|
||||
weakColumn.appendChild(typeElement);
|
||||
});
|
||||
|
||||
doubleweak.forEach((type) => {
|
||||
const typeElement = document.createElement("li");
|
||||
typeElement.innerHTML = type.toUpperCase();
|
||||
typeElement.className = "type-chart-element";
|
||||
typeElement.classList.add(type + "-primary-type");
|
||||
doubleweakColumn.appendChild(typeElement);
|
||||
});
|
||||
} catch {
|
||||
//type elements not built yet
|
||||
}
|
||||
}
|
||||
|
||||
// ACCORDIAN IMAGES
|
||||
|
||||
function carouselExpand(i) {
|
||||
|
|
Loading…
Reference in New Issue