change json format & add diablo4
All checks were successful
Deploy Sokko G / deploy (push) Successful in 7s
All checks were successful
Deploy Sokko G / deploy (push) Successful in 7s
This commit is contained in:
parent
e65c74ea0a
commit
34523e78b1
33 changed files with 5849 additions and 3431 deletions
|
|
@ -2,6 +2,10 @@ import { readFile } from "node:fs/promises";
|
||||||
import { test } from "node:test";
|
import { test } from "node:test";
|
||||||
import assert from "node:assert/strict";
|
import assert from "node:assert/strict";
|
||||||
|
|
||||||
|
const SNAKE_CASE_RE = /^[a-z0-9]+(?:_[a-z0-9]+)*$/;
|
||||||
|
const PHYSICAL_HITZONE_KEYS = ["cut", "blunt", "ammo"];
|
||||||
|
const ELEMENTAL_HITZONE_KEYS = ["fire", "water", "thunder", "ice", "dragon"];
|
||||||
|
|
||||||
function valueAt(object, path) {
|
function valueAt(object, path) {
|
||||||
return path.split(".").reduce((value, key) => value?.[key], object);
|
return path.split(".").reduce((value, key) => value?.[key], object);
|
||||||
}
|
}
|
||||||
|
|
@ -81,6 +85,99 @@ function validateSiteContent(site) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function assertSnakeCase(value, path) {
|
||||||
|
assert.equal(typeof value, "string", `${path} must be a string`);
|
||||||
|
assert.match(value, SNAKE_CASE_RE, `${path} must be snake_case`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateConditionValues(items, path) {
|
||||||
|
assert.ok(Array.isArray(items), `${path} must be an array`);
|
||||||
|
items.forEach((item, index) => {
|
||||||
|
assertSnakeCase(item?.condition, `${path}[${index}].condition`);
|
||||||
|
assert.ok(Array.isArray(item?.values), `${path}[${index}].values must be an array`);
|
||||||
|
item.values.forEach((value, valueIndex) => assertSnakeCase(value, `${path}[${index}].values[${valueIndex}]`));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateMonsterData(monsters) {
|
||||||
|
assert.ok(Array.isArray(monsters), "monsters must be an array");
|
||||||
|
const ids = new Set();
|
||||||
|
const names = new Set();
|
||||||
|
|
||||||
|
monsters.forEach((monster, monsterIndex) => {
|
||||||
|
const path = `monsters[${monsterIndex}]`;
|
||||||
|
assert.equal(typeof monster.id, "number", `${path}.id must be a number`);
|
||||||
|
assert.ok(Number.isInteger(monster.id), `${path}.id must be an integer`);
|
||||||
|
assert.ok(!ids.has(monster.id), `${path}.id must be unique`);
|
||||||
|
ids.add(monster.id);
|
||||||
|
|
||||||
|
assertSnakeCase(monster.name, `${path}.name`);
|
||||||
|
assert.ok(!names.has(monster.name), `${path}.name must be unique`);
|
||||||
|
names.add(monster.name);
|
||||||
|
assertSnakeCase(monster.type, `${path}.type`);
|
||||||
|
validateConditionValues(monster.ailments, `${path}.ailments`);
|
||||||
|
validateConditionValues(monster.weaknesses, `${path}.weaknesses`);
|
||||||
|
validateConditionValues(monster.weakpoints, `${path}.weakpoints`);
|
||||||
|
|
||||||
|
assert.equal(monster.damage, undefined, `${path}.damage must not be used`);
|
||||||
|
assert.ok(Array.isArray(monster.hitzones), `${path}.hitzones must be an array`);
|
||||||
|
assert.ok(monster.hitzones.length > 0, `${path}.hitzones must not be empty`);
|
||||||
|
monster.hitzones.forEach((hitzone, hitzoneIndex) => {
|
||||||
|
const hitzonePath = `${path}.hitzones[${hitzoneIndex}]`;
|
||||||
|
assertSnakeCase(hitzone.name, `${hitzonePath}.name`);
|
||||||
|
assert.equal(typeof hitzone.physical, "object", `${hitzonePath}.physical must be an object`);
|
||||||
|
assert.equal(typeof hitzone.elemental, "object", `${hitzonePath}.elemental must be an object`);
|
||||||
|
PHYSICAL_HITZONE_KEYS.forEach((key) => assert.equal(typeof hitzone.physical[key], "number", `${hitzonePath}.physical.${key} must be a number`));
|
||||||
|
ELEMENTAL_HITZONE_KEYS.forEach((key) => assert.equal(typeof hitzone.elemental[key], "number", `${hitzonePath}.elemental.${key} must be a number`));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateEndemicData(endemicPayload) {
|
||||||
|
["endemicLife", "aquaticLife"].forEach((collection) => {
|
||||||
|
assert.ok(Array.isArray(endemicPayload[collection]), `${collection} must be an array`);
|
||||||
|
endemicPayload[collection].forEach((item, itemIndex) => {
|
||||||
|
const path = `${collection}[${itemIndex}]`;
|
||||||
|
assertSnakeCase(item.name, `${path}.name`);
|
||||||
|
if (item.description) assertSnakeCase(item.description, `${path}.description`);
|
||||||
|
validateConditionValues(item.locations, `${path}.locations`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateTranslationKeys(translations, path) {
|
||||||
|
Object.keys(translations).forEach((key) => {
|
||||||
|
assert.ok(!/\s/.test(key), `${path}.${key} must not contain spaces`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateDiablo4Affixes(payload) {
|
||||||
|
assert.ok(Array.isArray(payload.categories), "diablo4.categories must be an array");
|
||||||
|
assert.ok(payload.categories.length > 0, "diablo4.categories must not be empty");
|
||||||
|
assert.ok(Array.isArray(payload.affixes), "diablo4.affixes must be an array");
|
||||||
|
assert.ok(payload.affixes.length > 0, "diablo4.affixes must not be empty");
|
||||||
|
|
||||||
|
const ids = new Set();
|
||||||
|
const categoryIds = payload.categories.map((category, index) => {
|
||||||
|
assertSnakeCase(category.id, `diablo4.categories[${index}].id`);
|
||||||
|
assertNonEmptyString({ category }, "category.label");
|
||||||
|
assertSnakeCase(category.icon, `diablo4.categories[${index}].icon`);
|
||||||
|
assertSnakeCase(category.tone, `diablo4.categories[${index}].tone`);
|
||||||
|
return category.id;
|
||||||
|
});
|
||||||
|
payload.affixes.forEach((affix, index) => {
|
||||||
|
assertSnakeCase(affix.id, `diablo4.affixes[${index}].id`);
|
||||||
|
assert.ok(!ids.has(affix.id), `diablo4.affixes[${index}].id must be unique`);
|
||||||
|
ids.add(affix.id);
|
||||||
|
assertNonEmptyString({ affix }, "affix.label");
|
||||||
|
assert.ok(Array.isArray(affix.categories), `diablo4.affixes[${index}].categories must be an array`);
|
||||||
|
affix.categories.forEach((category, categoryIndex) => {
|
||||||
|
assertSnakeCase(category, `diablo4.affixes[${index}].categories[${categoryIndex}]`);
|
||||||
|
assert.ok(categoryIds.includes(category), `diablo4.affixes[${index}].categories[${categoryIndex}] must exist in diablo4.categories`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
test("vite entrypoint loads the react application", async () => {
|
test("vite entrypoint loads the react application", async () => {
|
||||||
const html = await readFile("website/index.html", "utf8");
|
const html = await readFile("website/index.html", "utf8");
|
||||||
|
|
||||||
|
|
@ -103,6 +200,12 @@ test("react application defines the expected local toolbox primitives", async ()
|
||||||
const iconComponent = await readFile("website/src/components/Icon.jsx", "utf8");
|
const iconComponent = await readFile("website/src/components/Icon.jsx", "utf8");
|
||||||
const gamesPage = await readFile("website/src/features/games/GamesPage.jsx", "utf8");
|
const gamesPage = await readFile("website/src/features/games/GamesPage.jsx", "utf8");
|
||||||
const gameRoute = await readFile("website/src/features/games/GameRoute.jsx", "utf8");
|
const gameRoute = await readFile("website/src/features/games/GameRoute.jsx", "utf8");
|
||||||
|
const diablo4Page = await readFile("website/src/features/games/diablo4/Diablo4Page.jsx", "utf8");
|
||||||
|
const diablo4Overview = await readFile("website/src/features/games/diablo4/Diablo4Overview.jsx", "utf8");
|
||||||
|
const diablo4Listing = await readFile("website/src/features/games/diablo4/Diablo4Listing.jsx", "utf8");
|
||||||
|
const diablo4Filters = await readFile("website/src/features/games/diablo4/Diablo4Filters.jsx", "utf8");
|
||||||
|
const diablo4AffixCard = await readFile("website/src/features/games/diablo4/Diablo4AffixCard.jsx", "utf8");
|
||||||
|
const diablo4Utils = await readFile("website/src/features/games/diablo4/utils.js", "utf8");
|
||||||
const mhwildsPage = await readFile("website/src/features/games/mhwilds/MhwildsPage.jsx", "utf8");
|
const mhwildsPage = await readFile("website/src/features/games/mhwilds/MhwildsPage.jsx", "utf8");
|
||||||
const mhwildsListing = await readFile("website/src/features/games/mhwilds/MhwildsListing.jsx", "utf8");
|
const mhwildsListing = await readFile("website/src/features/games/mhwilds/MhwildsListing.jsx", "utf8");
|
||||||
const mhwildsFilters = await readFile("website/src/features/games/mhwilds/MhwildsFilters.jsx", "utf8");
|
const mhwildsFilters = await readFile("website/src/features/games/mhwilds/MhwildsFilters.jsx", "utf8");
|
||||||
|
|
@ -123,6 +226,7 @@ test("react application defines the expected local toolbox primitives", async ()
|
||||||
assert.match(styles, /@use "nebula"/);
|
assert.match(styles, /@use "nebula"/);
|
||||||
assert.match(styles, /@use "toolboxes"/);
|
assert.match(styles, /@use "toolboxes"/);
|
||||||
assert.match(styles, /@use "mhwilds"/);
|
assert.match(styles, /@use "mhwilds"/);
|
||||||
|
assert.match(styles, /@use "diablo4"/);
|
||||||
assert.match(styleTokens, /--gradient-brand/);
|
assert.match(styleTokens, /--gradient-brand/);
|
||||||
assert.match(styleBase, /\.card-icon-button,\n\.drawer-action-button/);
|
assert.match(styleBase, /\.card-icon-button,\n\.drawer-action-button/);
|
||||||
assert.match(styleNebula, /@function star-field/);
|
assert.match(styleNebula, /@function star-field/);
|
||||||
|
|
@ -148,10 +252,21 @@ test("react application defines the expected local toolbox primitives", async ()
|
||||||
assert.match(gamesPage, /export function GamesPage/);
|
assert.match(gamesPage, /export function GamesPage/);
|
||||||
assert.match(gamesPage, /siteContent\.gamesPage/);
|
assert.match(gamesPage, /siteContent\.gamesPage/);
|
||||||
assert.match(gamesPage, /game-card-cover-link/);
|
assert.match(gamesPage, /game-card-cover-link/);
|
||||||
|
assert.match(gamesPage, /game-card-placeholder/);
|
||||||
assert.match(gameRoute, /export function GameRoute/);
|
assert.match(gameRoute, /export function GameRoute/);
|
||||||
assert.match(gameRoute, /MhwildsPage/);
|
assert.match(gameRoute, /MhwildsPage/);
|
||||||
|
assert.match(gameRoute, /Diablo4Page/);
|
||||||
|
assert.match(diablo4Page, /export function Diablo4Page/);
|
||||||
|
assert.match(diablo4Overview, /export function Diablo4Overview/);
|
||||||
|
assert.match(diablo4Listing, /export function Diablo4Listing/);
|
||||||
|
assert.match(diablo4Filters, /export function Diablo4Filters/);
|
||||||
|
assert.match(diablo4AffixCard, /export function Diablo4AffixCard/);
|
||||||
|
assert.match(diablo4AffixCard, /categoryMap/);
|
||||||
|
assert.match(diablo4Utils, /getFilteredDiablo4Affixes/);
|
||||||
|
assert.match(diablo4Utils, /getCategoryIconStyle/);
|
||||||
assert.match(mhwildsPage, /export function MhwildsPage/);
|
assert.match(mhwildsPage, /export function MhwildsPage/);
|
||||||
assert.match(mhwildsListing, /export function MhwildsListing/);
|
assert.match(mhwildsListing, /export function MhwildsListing/);
|
||||||
|
assert.match(mhwildsListing, /endemic_life/);
|
||||||
assert.match(mhwildsFilters, /export function MhwildsFilters/);
|
assert.match(mhwildsFilters, /export function MhwildsFilters/);
|
||||||
assert.match(monsterCard, /export function MonsterCard/);
|
assert.match(monsterCard, /export function MonsterCard/);
|
||||||
assert.match(monsterCard, /ui-icon-flip/);
|
assert.match(monsterCard, /ui-icon-flip/);
|
||||||
|
|
@ -182,6 +297,8 @@ test("react application defines the expected local toolbox primitives", async ()
|
||||||
assert.match(linksModule, /copyText/);
|
assert.match(linksModule, /copyText/);
|
||||||
assert.match(source, /DEFAULT_SITE_CONTENT/);
|
assert.match(source, /DEFAULT_SITE_CONTENT/);
|
||||||
assert.match(source, /\/data\/site\.json/);
|
assert.match(source, /\/data\/site\.json/);
|
||||||
|
assert.match(source, /\/data\/diablo4\/affixes_types\.json/);
|
||||||
|
assert.match(source, /filterOptionKeys/);
|
||||||
assert.match(source, /APP_STORAGE_LIMIT_BYTES/);
|
assert.match(source, /APP_STORAGE_LIMIT_BYTES/);
|
||||||
assert.match(source, /DEFAULT_TOOLBOX_ICON/);
|
assert.match(source, /DEFAULT_TOOLBOX_ICON/);
|
||||||
assert.match(source, /TOOLBOX_ICON_FILES/);
|
assert.match(source, /TOOLBOX_ICON_FILES/);
|
||||||
|
|
@ -240,6 +357,7 @@ test("mhwilds data and assets are available", async () => {
|
||||||
const monsters = JSON.parse(await readFile("website/public/data/mhwilds/monsters.json", "utf8"));
|
const monsters = JSON.parse(await readFile("website/public/data/mhwilds/monsters.json", "utf8"));
|
||||||
const endemicLife = JSON.parse(await readFile("website/public/data/mhwilds/endemic_life.json", "utf8"));
|
const endemicLife = JSON.parse(await readFile("website/public/data/mhwilds/endemic_life.json", "utf8"));
|
||||||
const translations = JSON.parse(await readFile("website/public/data/mhwilds/i18n/fr.json", "utf8"));
|
const translations = JSON.parse(await readFile("website/public/data/mhwilds/i18n/fr.json", "utf8"));
|
||||||
|
const enTranslations = JSON.parse(await readFile("website/public/data/mhwilds/i18n/en.json", "utf8"));
|
||||||
const listingSource = await readFile("website/src/features/games/mhwilds/MhwildsListing.jsx", "utf8");
|
const listingSource = await readFile("website/src/features/games/mhwilds/MhwildsListing.jsx", "utf8");
|
||||||
|
|
||||||
assert.equal(site.brand.name, "Sokko G");
|
assert.equal(site.brand.name, "Sokko G");
|
||||||
|
|
@ -252,16 +370,50 @@ test("mhwilds data and assets are available", async () => {
|
||||||
assert.match(games.games[0].images.cardCover, /games\/mhwilds\/card-cover\.png/);
|
assert.match(games.games[0].images.cardCover, /games\/mhwilds\/card-cover\.png/);
|
||||||
assert.match(games.games[0].images.heroBg, /games\/mhwilds\/hero-bg\.png/);
|
assert.match(games.games[0].images.heroBg, /games\/mhwilds\/hero-bg\.png/);
|
||||||
assert.ok(monsters.monsters.length > 0);
|
assert.ok(monsters.monsters.length > 0);
|
||||||
|
assert.deepEqual(monsters.elements, ["fire", "water", "thunder", "ice", "dragon"]);
|
||||||
|
validateMonsterData(monsters.monsters);
|
||||||
|
assert.ok(Array.isArray(endemicLife.locations), "endemicLife.locations must be an array");
|
||||||
|
assert.ok(endemicLife.locations.length > 0, "endemicLife.locations must not be empty");
|
||||||
assert.ok(endemicLife.endemicLife.length > 0);
|
assert.ok(endemicLife.endemicLife.length > 0);
|
||||||
|
validateEndemicData(endemicLife);
|
||||||
|
validateTranslationKeys(translations, "fr");
|
||||||
|
validateTranslationKeys(enTranslations, "en");
|
||||||
assert.equal(translations.monsters, "monstres");
|
assert.equal(translations.monsters, "monstres");
|
||||||
|
assert.equal(translations.dark_hornet, "frelon clair-obscur");
|
||||||
|
assert.equal(translations["dark hornet"], undefined);
|
||||||
assert.match(listingSource, /function MhwildsListing/);
|
assert.match(listingSource, /function MhwildsListing/);
|
||||||
const monsterCardSource = await readFile("website/src/features/games/mhwilds/cards/MonsterCard.jsx", "utf8");
|
const monsterCardSource = await readFile("website/src/features/games/mhwilds/cards/MonsterCard.jsx", "utf8");
|
||||||
assert.match(monsterCardSource, /monster-card/);
|
assert.match(monsterCardSource, /monster-card/);
|
||||||
|
assert.match(monsterCardSource, /monster\.hitzones/);
|
||||||
await readFile("website/public/static/img/mhwilds/chatacabra.png");
|
await readFile("website/public/static/img/mhwilds/chatacabra.png");
|
||||||
await readFile("website/public/static/img/games/mhwilds/card-cover.png");
|
await readFile("website/public/static/img/games/mhwilds/card-cover.png");
|
||||||
await readFile("website/public/static/img/games/mhwilds/hero-bg.png");
|
await readFile("website/public/static/img/games/mhwilds/hero-bg.png");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("diablo4 data and route are available", async () => {
|
||||||
|
const games = JSON.parse(await readFile("website/public/data/games.json", "utf8"));
|
||||||
|
const affixes = JSON.parse(await readFile("website/public/data/diablo4/affixes_types.json", "utf8"));
|
||||||
|
const routeSource = await readFile("website/src/features/games/GameRoute.jsx", "utf8");
|
||||||
|
const pageSource = await readFile("website/src/features/games/diablo4/Diablo4Page.jsx", "utf8");
|
||||||
|
const listingSource = await readFile("website/src/features/games/diablo4/Diablo4Listing.jsx", "utf8");
|
||||||
|
const diablo4Game = games.games.find((game) => game.id === "diablo4");
|
||||||
|
|
||||||
|
assert.ok(diablo4Game, "games.json must declare diablo4");
|
||||||
|
assert.match(diablo4Game.images.cardCover, /games\/diablo4\/card-cover\.png/);
|
||||||
|
assert.match(diablo4Game.images.heroBg, /games\/diablo4\/hero-bg\.png/);
|
||||||
|
validateDiablo4Affixes(affixes);
|
||||||
|
assert.match(routeSource, /game\.id === "diablo4"/);
|
||||||
|
assert.match(pageSource, /category === "affixes"/);
|
||||||
|
assert.match(listingSource, /diablo4\.filterOptions\.affixes/);
|
||||||
|
await readFile("website/public/static/img/games/diablo4/card-cover.png");
|
||||||
|
await readFile("website/public/static/img/games/diablo4/hero-bg.png");
|
||||||
|
await readFile("website/public/static/img/diablo4/axe.svg");
|
||||||
|
await readFile("website/public/static/img/diablo4/cube.svg");
|
||||||
|
await readFile("website/public/static/img/diablo4/fire.svg");
|
||||||
|
await readFile("website/public/static/img/diablo4/shield.svg");
|
||||||
|
await readFile("website/public/static/img/diablo4/wing.svg");
|
||||||
|
});
|
||||||
|
|
||||||
test("server and vite support local env configuration", async () => {
|
test("server and vite support local env configuration", async () => {
|
||||||
const server = await readFile("server.mjs", "utf8");
|
const server = await readFile("server.mjs", "utf8");
|
||||||
const viteConfig = await readFile("vite.config.js", "utf8");
|
const viteConfig = await readFile("vite.config.js", "utf8");
|
||||||
|
|
|
||||||
428
website/public/data/diablo4/affixes_types.json
Normal file
428
website/public/data/diablo4/affixes_types.json
Normal file
|
|
@ -0,0 +1,428 @@
|
||||||
|
{
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"id": "offensif",
|
||||||
|
"label": "Offensif",
|
||||||
|
"icon": "axe",
|
||||||
|
"tone": "red"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "defensif",
|
||||||
|
"label": "Défensif",
|
||||||
|
"icon": "shield",
|
||||||
|
"tone": "blue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "attribut",
|
||||||
|
"label": "Attribut",
|
||||||
|
"icon": "wing",
|
||||||
|
"tone": "purple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "mobilite",
|
||||||
|
"label": "Mobilité",
|
||||||
|
"icon": "wing",
|
||||||
|
"tone": "yellow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ressource",
|
||||||
|
"label": "Ressource",
|
||||||
|
"icon": "fire",
|
||||||
|
"tone": "green"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "competence",
|
||||||
|
"label": "Compétence",
|
||||||
|
"icon": "cube",
|
||||||
|
"tone": "gold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "caracteristique",
|
||||||
|
"label": "Caractéristique",
|
||||||
|
"icon": "cube",
|
||||||
|
"tone": "gold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance",
|
||||||
|
"label": "Résistance",
|
||||||
|
"icon": "cube",
|
||||||
|
"tone": "violet"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"affixes": [
|
||||||
|
{
|
||||||
|
"id": "force",
|
||||||
|
"label": "Force",
|
||||||
|
"categories": [
|
||||||
|
"offensif",
|
||||||
|
"caracteristique"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "intelligence",
|
||||||
|
"label": "Intelligence",
|
||||||
|
"categories": [
|
||||||
|
"offensif",
|
||||||
|
"caracteristique"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "volonte",
|
||||||
|
"label": "Volonté",
|
||||||
|
"categories": [
|
||||||
|
"offensif",
|
||||||
|
"caracteristique"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dexterite",
|
||||||
|
"label": "Dextérité",
|
||||||
|
"categories": [
|
||||||
|
"offensif",
|
||||||
|
"caracteristique"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "degats_arme",
|
||||||
|
"label": "Dégâts de l'arme",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vitesse_attaque",
|
||||||
|
"label": "Vitesse d'attaque",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "chance_coup_critique",
|
||||||
|
"label": "Chance de coup critique",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "epines",
|
||||||
|
"label": "Épines",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_critiques",
|
||||||
|
"label": "Multiplicateur de dégâts critiques",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_tous_degats",
|
||||||
|
"label": "Multiplicateur de tous les dégâts",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_vulnerables",
|
||||||
|
"label": "Multiplicateur de dégâts aux cibles vulnérables",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_duree",
|
||||||
|
"label": "Multiplicateur de dégâts sur la durée",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_feu",
|
||||||
|
"label": "Multiplicateur de dégâts de feu",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_froid",
|
||||||
|
"label": "Multiplicateur de dégâts de froid",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_foudre",
|
||||||
|
"label": "Multiplicateur de dégâts de foudre",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_poison",
|
||||||
|
"label": "Multiplicateur de dégâts de poison",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_ombre",
|
||||||
|
"label": "Multiplicateur de dégâts d'ombre",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multiplicateur_degats_physiques",
|
||||||
|
"label": "Multiplicateur de dégâts physiques",
|
||||||
|
"categories": [
|
||||||
|
"offensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance_feu",
|
||||||
|
"label": "Résistance au feu",
|
||||||
|
"categories": [
|
||||||
|
"defensif",
|
||||||
|
"resistance"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance_froid",
|
||||||
|
"label": "Résistance au froid",
|
||||||
|
"categories": [
|
||||||
|
"defensif",
|
||||||
|
"resistance"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance_foudre",
|
||||||
|
"label": "Résistance à la foudre",
|
||||||
|
"categories": [
|
||||||
|
"defensif",
|
||||||
|
"resistance"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance_poison",
|
||||||
|
"label": "Résistance au poison",
|
||||||
|
"categories": [
|
||||||
|
"defensif",
|
||||||
|
"resistance"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance_ombre",
|
||||||
|
"label": "Résistance à l'ombre",
|
||||||
|
"categories": [
|
||||||
|
"defensif",
|
||||||
|
"resistance"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "resistance_tous_elements",
|
||||||
|
"label": "Résistance à tous les éléments",
|
||||||
|
"categories": [
|
||||||
|
"defensif",
|
||||||
|
"resistance"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "points_vie_maximum",
|
||||||
|
"label": "Points de vie maximum",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "chance_esquive",
|
||||||
|
"label": "Chance d'esquiver",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "regeneration_vie",
|
||||||
|
"label": "Régénération de vie",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "reduction_degats",
|
||||||
|
"label": "Réduction des dégâts",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "points_vie_par_victime",
|
||||||
|
"label": "Points de vie par victime",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "points_vie_par_coup",
|
||||||
|
"label": "Points de vie par coup",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "armure",
|
||||||
|
"label": "Armure",
|
||||||
|
"categories": [
|
||||||
|
"defensif"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rangs_competences_basiques",
|
||||||
|
"label": "+X rangs aux compétences basiques",
|
||||||
|
"categories": [
|
||||||
|
"attribut",
|
||||||
|
"competence"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rangs_competences_principales",
|
||||||
|
"label": "+X rangs aux compétences principales",
|
||||||
|
"categories": [
|
||||||
|
"attribut",
|
||||||
|
"competence"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rangs_competence",
|
||||||
|
"label": "+X rangs à une compétence",
|
||||||
|
"categories": [
|
||||||
|
"attribut",
|
||||||
|
"competence"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rangs_toutes_competences_classe",
|
||||||
|
"label": "+X rangs à toutes les compétences de la classe",
|
||||||
|
"categories": [
|
||||||
|
"attribut",
|
||||||
|
"competence"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "capacite_potion",
|
||||||
|
"label": "Capacité de potion",
|
||||||
|
"categories": [
|
||||||
|
"attribut"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "generation_fortification",
|
||||||
|
"label": "Génération de fortification",
|
||||||
|
"categories": [
|
||||||
|
"attribut"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "chance_coup_de_chance",
|
||||||
|
"label": "Chance d'obtenir un coup de chance",
|
||||||
|
"categories": [
|
||||||
|
"attribut"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "reduction_temps_recharge",
|
||||||
|
"label": "Réduction du temps de recharge",
|
||||||
|
"categories": [
|
||||||
|
"attribut"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "soins_recus",
|
||||||
|
"label": "Soins reçus",
|
||||||
|
"categories": [
|
||||||
|
"attribut"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "reduction_pertes_controle",
|
||||||
|
"label": "Réduction des pertes de contrôle",
|
||||||
|
"categories": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "generation_barriere",
|
||||||
|
"label": "Génération de barrière",
|
||||||
|
"categories": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ressource_maximum",
|
||||||
|
"label": "Maximum de ressource",
|
||||||
|
"categories": [
|
||||||
|
"ressource"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "regeneration_ressource",
|
||||||
|
"label": "Régénération de ressource",
|
||||||
|
"categories": [
|
||||||
|
"ressource"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "generation_ressource",
|
||||||
|
"label": "Génération de ressource",
|
||||||
|
"categories": [
|
||||||
|
"ressource"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ressource_par_victime",
|
||||||
|
"label": "Ressource par victime",
|
||||||
|
"categories": [
|
||||||
|
"ressource"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "reduction_cout_ressource",
|
||||||
|
"label": "Réduction du coût en ressource",
|
||||||
|
"categories": [
|
||||||
|
"ressource"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "recuperation_ressource_principale",
|
||||||
|
"label": "Récupération de la ressource principale",
|
||||||
|
"categories": [
|
||||||
|
"ressource"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vitesse_deplacement",
|
||||||
|
"label": "Vitesse de déplacement",
|
||||||
|
"categories": [
|
||||||
|
"mobilite"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "charges_esquive_maximum",
|
||||||
|
"label": "Charges d'esquive maximum",
|
||||||
|
"categories": [
|
||||||
|
"mobilite"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "attaques_reduisent_recharge_esquive",
|
||||||
|
"label": "Les attaques réduisent le temps de recharge d'esquive",
|
||||||
|
"categories": [
|
||||||
|
"mobilite"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vitesse_deplacement_apres_esquive",
|
||||||
|
"label": "Vitesse de déplacement après une esquive",
|
||||||
|
"categories": [
|
||||||
|
"mobilite"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -35,6 +35,26 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "diablo4",
|
||||||
|
"title": "Diablo IV",
|
||||||
|
"eyebrow": "Guide de jeu",
|
||||||
|
"images": {
|
||||||
|
"cardCover": "/static/img/games/diablo4/card-cover.png",
|
||||||
|
"heroBg": "/static/img/games/diablo4/hero-bg.png"
|
||||||
|
},
|
||||||
|
"summary": "Repères rapides pour consulter, filtrer et comparer les affixes utiles pendant la préparation d'un build.",
|
||||||
|
"sections": [
|
||||||
|
{
|
||||||
|
"title": "Affixes",
|
||||||
|
"items": [
|
||||||
|
"Filtrer par catégorie",
|
||||||
|
"Rechercher un affixe précis",
|
||||||
|
"Identifier les familles utiles à un build"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,217 +1,238 @@
|
||||||
{
|
{
|
||||||
"and": "and",
|
"abdominal_iceplate": "abdominal iceplate",
|
||||||
"or": "or",
|
|
||||||
"reset": "reset",
|
|
||||||
"create checklist": "create checklist",
|
|
||||||
"to be completed": "to be completed",
|
|
||||||
"monsters": "monsters",
|
|
||||||
"endemic life": "endemic life",
|
|
||||||
"name": "name",
|
|
||||||
"weaknesses": "weaknesses",
|
|
||||||
"locations": "locations",
|
|
||||||
"ailments": "ailments",
|
"ailments": "ailments",
|
||||||
"cut": "cut",
|
|
||||||
"blunt": "blunt",
|
|
||||||
"ammo": "ammo",
|
|
||||||
"windward plains": "windward plains",
|
|
||||||
"scarlet forest": "scarlet forest",
|
|
||||||
"ruins of wyveria": "ruins of wyveria",
|
|
||||||
"oilwell basin": "oilwell basin",
|
|
||||||
"iceshard cliffs": "iceshard cliffs",
|
|
||||||
"dragon": "dragon",
|
|
||||||
"fire": "fire",
|
|
||||||
"ice": "ice",
|
|
||||||
"thunder": "thunder",
|
|
||||||
"water": "water",
|
|
||||||
"dragonblight": "dragonblight",
|
|
||||||
"fireblight": "fireblight",
|
|
||||||
"iceblight": "iceblight",
|
|
||||||
"thunderblight": "thunderblight",
|
|
||||||
"waterblight": "waterblight",
|
|
||||||
"frostblight": "frostblight",
|
|
||||||
"bubbleblight": "bubbleblight",
|
|
||||||
"stench": "stench",
|
|
||||||
"sleep": "sleep",
|
|
||||||
"paralysis": "paralysis",
|
|
||||||
"blast": "blast",
|
|
||||||
"poison": "poison",
|
|
||||||
"webbed": "webbed",
|
|
||||||
"bleeding": "bleeding",
|
|
||||||
"stun": "stun",
|
|
||||||
"frenzy virus": "frenzy virus",
|
|
||||||
"defense down": "defense down",
|
|
||||||
"minor wind pressure": "minor wind pressure",
|
|
||||||
"dragon wind pressure": "dragon wind pressure",
|
|
||||||
"minor tremor": "minor tremor",
|
|
||||||
"weak roar": "weak roar",
|
|
||||||
"strong roar": "strong roar",
|
|
||||||
"mantle broken": "mantle broken",
|
|
||||||
"head": "head",
|
|
||||||
"nose": "nose",
|
|
||||||
"antenna": "antenna",
|
|
||||||
"neck": "neck",
|
|
||||||
"mouth": "mouth",
|
|
||||||
"torso": "torso",
|
|
||||||
"membrane": "membrane",
|
|
||||||
"tongue": "tongue",
|
|
||||||
"chest": "chest",
|
|
||||||
"belly": "belly",
|
|
||||||
"tentacle": "tentacle",
|
|
||||||
"back": "back",
|
|
||||||
"left wingarm": "left wingarm",
|
|
||||||
"right wingarm": "right wingarm",
|
|
||||||
"front left arm": "front left arm",
|
|
||||||
"front right arm": "front right arm",
|
|
||||||
"middle left arm": "middle left arm",
|
|
||||||
"middle right arm": "middle right arm",
|
|
||||||
"rear left arm": "rear left arm",
|
|
||||||
"rear right arm": "rear right arm",
|
|
||||||
"left wing": "left wing",
|
|
||||||
"right wing": "right wing",
|
|
||||||
"left leg": "left leg",
|
|
||||||
"right leg": "right leg",
|
|
||||||
"forelegs": "forelegs",
|
|
||||||
"left foreleg": "left foreleg",
|
|
||||||
"right foreleg": "right foreleg",
|
|
||||||
"hindlegs": "hindlegs",
|
|
||||||
"left hindleg": "left hindleg",
|
|
||||||
"right hindleg": "right hindleg",
|
|
||||||
"left chainblade": "left chainblade",
|
|
||||||
"right chainblade": "right chainblade",
|
|
||||||
"left claw": "left claw",
|
|
||||||
"right claw": "right claw",
|
|
||||||
"abdominal iceplate": "abdominal iceplate",
|
|
||||||
"large iceplate(hidden)": "large iceplate(hidden)",
|
|
||||||
"large iceplate(exposed)": "large iceplate(exposed)",
|
|
||||||
"head (crystallized)": "head (crystallized)",
|
|
||||||
"left wingarm (crystallized)": "left wingarm (crystallized)",
|
|
||||||
"right wingarm (crystallized)": "right wingarm (crystallized)",
|
|
||||||
"back fin": "back fin",
|
|
||||||
"stinger": "stinger",
|
|
||||||
"mantle": "mantle",
|
|
||||||
"petals": "petals",
|
|
||||||
"tail": "tail",
|
|
||||||
"tail hair": "tail hair",
|
|
||||||
"rear": "rear",
|
|
||||||
"tail tip": "tail tip",
|
|
||||||
"flying wyvern": "flying wyvern",
|
|
||||||
"fanged beast": "fanged beast",
|
|
||||||
"construct": "construct",
|
|
||||||
"chatacabra": "chatacabra",
|
|
||||||
"quematrice": "quematrice",
|
|
||||||
"lala barina": "lala barina",
|
|
||||||
"congalala": "congalala",
|
|
||||||
"balahara": "balahara",
|
|
||||||
"doshaguma": "doshaguma",
|
|
||||||
"uth duna": "uth duna",
|
|
||||||
"rompopolo": "rompopolo",
|
|
||||||
"rey dau": "rey dau",
|
|
||||||
"nerscylla": "nerscylla",
|
|
||||||
"hirabami": "hirabami",
|
|
||||||
"ajarakan": "ajarakan",
|
"ajarakan": "ajarakan",
|
||||||
"nu udra": "nu udra",
|
"ammo": "ammo",
|
||||||
"jin dahaad": "jin dahaad",
|
"amphibian": "amphibian",
|
||||||
"xu wu": "xu wu",
|
|
||||||
"zoh shia": "zoh shia",
|
|
||||||
"yian kut-ku": "yian kut-ku",
|
|
||||||
"gypceros": "gypceros",
|
|
||||||
"rathian": "rathian",
|
|
||||||
"rathalos": "rathalos",
|
|
||||||
"gravios": "gravios",
|
|
||||||
"blangonga": "blangonga",
|
|
||||||
"gore magala": "gore magala",
|
|
||||||
"arkveld": "arkveld",
|
|
||||||
"mizutsune": "mizutsune",
|
|
||||||
"guardian doshaguma": "guardian doshaguma",
|
|
||||||
"guardian rathalos": "guardian rathalos",
|
|
||||||
"guardian ebony odogaron": "guardian ebony odogaron",
|
|
||||||
"guardian arkveld": "guardian arkveld",
|
|
||||||
"guardian fulgur anjanath": "guardian fulgur anjanath",
|
|
||||||
"vigorwasp": "vigorwasp",
|
|
||||||
"giant vigorwasp": "giant vigorwasp",
|
|
||||||
"purewasp": "purewasp",
|
|
||||||
"vigormantle bug": "vigormantle bug",
|
|
||||||
"chillmantle bug": "chillmantle bug",
|
|
||||||
"heatmantle bug": "heatmantle bug",
|
|
||||||
"wiggly litchi": "wiggly litchi",
|
|
||||||
"paratoad": "paratoad",
|
|
||||||
"nitrotoad": "nitrotoad",
|
|
||||||
"sleeptoad": "sleeptoad",
|
|
||||||
"flashflies": "flashflies",
|
|
||||||
"dung beetle": "dung beetle",
|
|
||||||
"bomb beetle": "bomb beetle",
|
|
||||||
"rime beetle": "rime beetle",
|
|
||||||
"thunderbug": "thunderbug",
|
|
||||||
"great thunderbugs": "great thunderbugs",
|
|
||||||
"flashbug": "flashbug",
|
|
||||||
"godbug": "godbug",
|
|
||||||
"bitterbug": "bitterbug",
|
|
||||||
"dark hornet": "dark hornet",
|
|
||||||
"wedge beetle": "wedge beetle",
|
|
||||||
"windrustler": "windrustler",
|
|
||||||
"black windrustler": "black windrustler",
|
|
||||||
"nothpecker": "nothpecker",
|
|
||||||
"landlight shrimp": "landlight shrimp",
|
|
||||||
"amstrigian": "amstrigian",
|
"amstrigian": "amstrigian",
|
||||||
"hymstrigian": "hymstrigian",
|
"and": "and",
|
||||||
"rufflizard": "rufflizard",
|
"antenna": "antenna",
|
||||||
"tracktail lizard": "tracktail lizard",
|
"arkveld": "arkveld",
|
||||||
"pallbug": "pallbug",
|
"azure_rufflizard": "azure rufflizard",
|
||||||
"quatreflies": "quatreflies",
|
"back": "back",
|
||||||
"emperor hopper": "emperor hopper",
|
"back_fin": "back fin",
|
||||||
"tyrant hopper": "tyrant hopper",
|
"back_unity": "back unity",
|
||||||
"sandstar": "sandstar",
|
"balahara": "balahara",
|
||||||
"leaflugger ant": "leaflugger ant",
|
"belly": "belly",
|
||||||
"florashell crab": "florashell crab",
|
"bitterbug": "bitterbug",
|
||||||
"crudeshell crab": "crudeshell crab",
|
"black_windrustler": "black windrustler",
|
||||||
"curioshell crab": "curioshell crab",
|
"blangonga": "blangonga",
|
||||||
"smokeshroud gekko": "smokeshroud gekko",
|
"blast": "blast",
|
||||||
|
"bleeding": "bleeding",
|
||||||
|
"blind_perch": "blind perch",
|
||||||
|
"blink_angler": "blink angler",
|
||||||
|
"blunt": "blunt",
|
||||||
|
"bomb_arowana": "bomb arowana",
|
||||||
|
"bomb_beetle": "bomb beetle",
|
||||||
|
"brute_wyvern": "brute wyvern",
|
||||||
|
"bubbleblight": "bubbleblight",
|
||||||
|
"burst_arowana": "burst arowana",
|
||||||
|
"cephalopod": "cephalopod",
|
||||||
|
"chainblade": "chainblade",
|
||||||
|
"chatacabra": "chatacabra",
|
||||||
|
"chest": "chest",
|
||||||
|
"chillmantle_bug": "chillmantle bug",
|
||||||
|
"claw": "claw",
|
||||||
|
"congalala": "congalala",
|
||||||
|
"construct": "construct",
|
||||||
|
"create_checklist": "create checklist",
|
||||||
|
"crudeshell_crab": "crudeshell crab",
|
||||||
|
"curioshell_crab": "curioshell crab",
|
||||||
|
"cut": "cut",
|
||||||
"dapperwing": "dapperwing",
|
"dapperwing": "dapperwing",
|
||||||
|
"dark_hornet": "dark hornet",
|
||||||
"dazzlewing": "dazzlewing",
|
"dazzlewing": "dazzlewing",
|
||||||
"mimiphyta": "mimiphyta",
|
"default": "default",
|
||||||
"scarlet joyperch": "scarlet joyperch",
|
"defense_down": "defense down",
|
||||||
"starduster": "starduster",
|
"demi_elder": "demi elder",
|
||||||
"vaporonid": "vaporonid",
|
"doshaguma": "doshaguma",
|
||||||
"omenfly": "omenfly",
|
"downy_crake": "downy crake",
|
||||||
"myriads": "myriads",
|
"dragon": "dragon",
|
||||||
"jewel scarab": "jewel scarab",
|
"dragon_wind_pressure": "dragon wind pressure",
|
||||||
"regal jewel scarab": "regal jewel scarab",
|
"dragonblight": "dragonblight",
|
||||||
"pink landlight shrimp": "pink landlight shrimp",
|
"dung_beetle": "dung beetle",
|
||||||
"ember rufflizard": "ember rufflizard",
|
"elder_dragon": "elder dragon",
|
||||||
"azure rufflizard": "azure rufflizard",
|
"ember_rufflizard": "ember rufflizard",
|
||||||
"gloom gekko": "gloom gekko",
|
"emperor_hopper": "emperor hopper",
|
||||||
"scalebat": "scalebat",
|
"endemic_life": "endemic life",
|
||||||
"blink angler": "blink angler",
|
|
||||||
"sparklerjelly": "sparklerjelly",
|
|
||||||
"peony sparklerjelly": "peony sparklerjelly",
|
|
||||||
"nu yaya": "nu yaya",
|
|
||||||
"gawkie": "gawkie",
|
|
||||||
"solanaria": "solanaria",
|
|
||||||
"pillopod": "pillopod",
|
|
||||||
"gillopod": "gillopod",
|
|
||||||
"petalfly": "petalfly",
|
|
||||||
"xu yo": "xu yo",
|
|
||||||
"downy crake": "downy crake",
|
|
||||||
"hercudrome": "hercudrome",
|
|
||||||
"gold hercudrome": "gold hercudrome",
|
|
||||||
"prism hercudrome": "prism hercudrome",
|
|
||||||
"virid bowfin": "virid bowfin",
|
|
||||||
"sushifish": "sushifish",
|
|
||||||
"whetfish": "whetfish",
|
|
||||||
"goldenfish": "goldenfish",
|
|
||||||
"platinumfish": "platinumfish",
|
|
||||||
"burst arowana": "burst arowana",
|
|
||||||
"bomb arowana": "bomb arowana",
|
|
||||||
"goldenfry": "goldenfry",
|
|
||||||
"gunpowderfish": "gunpowderfish",
|
|
||||||
"gravid bowfin": "gravid bowfin",
|
|
||||||
"escunite": "escunite",
|
"escunite": "escunite",
|
||||||
"grand escunite": "grand escunite",
|
"fanged_beast": "fanged beast",
|
||||||
"glass parexus": "glass parexus",
|
"fire": "fire",
|
||||||
"blind perch": "blind perch",
|
"fireblight": "fireblight",
|
||||||
"gastronome tuna": "gastronome tuna",
|
"flashbug": "flashbug",
|
||||||
"goliath squid": "goliath squid",
|
"flashflies": "flashflies",
|
||||||
"great trevally": "great trevally",
|
"florashell_crab": "florashell crab",
|
||||||
|
"flying_wyvern": "flying wyvern",
|
||||||
|
"foreleg": "foreleg",
|
||||||
|
"forelegs": "forelegs",
|
||||||
|
"frenzy_virus": "frenzy virus",
|
||||||
|
"front_left_arm": "front left arm",
|
||||||
|
"front_right_arm": "front right arm",
|
||||||
|
"frostblight": "frostblight",
|
||||||
"gajau": "gajau",
|
"gajau": "gajau",
|
||||||
"speartuna": "speartuna"
|
"gastronome_tuna": "gastronome tuna",
|
||||||
|
"gawkie": "gawkie",
|
||||||
|
"giant_vigorwasp": "giant vigorwasp",
|
||||||
|
"gillopod": "gillopod",
|
||||||
|
"glass_parexus": "glass parexus",
|
||||||
|
"gloom_gekko": "gloom gekko",
|
||||||
|
"godbug": "godbug",
|
||||||
|
"gogmazios": "gogmazios",
|
||||||
|
"gold_hercudrome": "gold hercudrome",
|
||||||
|
"goldenfish": "goldenfish",
|
||||||
|
"goldenfry": "goldenfry",
|
||||||
|
"goliath_squid": "goliath squid",
|
||||||
|
"gore_magala": "gore magala",
|
||||||
|
"grand_escunite": "grand escunite",
|
||||||
|
"gravid_bowfin": "gravid bowfin",
|
||||||
|
"gravios": "gravios",
|
||||||
|
"great_thunderbugs": "great thunderbugs",
|
||||||
|
"great_trevally": "great trevally",
|
||||||
|
"guardian_arkveld": "guardian arkveld",
|
||||||
|
"guardian_doshaguma": "guardian doshaguma",
|
||||||
|
"guardian_ebony_odogaron": "guardian ebony odogaron",
|
||||||
|
"guardian_fulgur_anjanath": "guardian fulgur anjanath",
|
||||||
|
"guardian_rathalos": "guardian rathalos",
|
||||||
|
"gunpowderfish": "gunpowderfish",
|
||||||
|
"gypceros": "gypceros",
|
||||||
|
"head": "head",
|
||||||
|
"head_crystallized": "head (crystallized)",
|
||||||
|
"heatmantle_bug": "heatmantle bug",
|
||||||
|
"hercudrome": "hercudrome",
|
||||||
|
"hindlegs": "hindlegs",
|
||||||
|
"hirabami": "hirabami",
|
||||||
|
"hp_penalty": "hp penalty",
|
||||||
|
"hymstrigian": "hymstrigian",
|
||||||
|
"ice": "ice",
|
||||||
|
"iceblight": "iceblight",
|
||||||
|
"iceshard_cliffs": "iceshard cliffs",
|
||||||
|
"jewel_scarab": "jewel scarab",
|
||||||
|
"jin_dahaad": "jin dahaad",
|
||||||
|
"lagiacrus": "lagiacrus",
|
||||||
|
"lala_barina": "lala barina",
|
||||||
|
"landlight_shrimp": "landlight shrimp",
|
||||||
|
"large_iceplate_exposed": "large iceplate(exposed)",
|
||||||
|
"large_iceplate_hidden": "large iceplate(hidden)",
|
||||||
|
"leaflugger_ant": "leaflugger ant",
|
||||||
|
"left_chainblade": "left chainblade",
|
||||||
|
"left_claw": "left claw",
|
||||||
|
"left_foreleg": "left foreleg",
|
||||||
|
"left_hindleg": "left hindleg",
|
||||||
|
"left_leg": "left leg",
|
||||||
|
"left_wing": "left wing",
|
||||||
|
"left_wingarm": "left wingarm",
|
||||||
|
"left_wingarm_crystallized": "left wingarm (crystallized)",
|
||||||
|
"leg": "leg",
|
||||||
|
"legs": "legs",
|
||||||
|
"leviathan": "leviathan",
|
||||||
|
"locations": "locations",
|
||||||
|
"mantle": "mantle",
|
||||||
|
"mantle_broken": "mantle broken",
|
||||||
|
"membrane": "membrane",
|
||||||
|
"middle_left_arm": "middle left arm",
|
||||||
|
"middle_right_arm": "middle right arm",
|
||||||
|
"mimiphyta": "mimiphyta",
|
||||||
|
"minor_tremor": "minor tremor",
|
||||||
|
"minor_wind_pressure": "minor wind pressure",
|
||||||
|
"mizutsune": "mizutsune",
|
||||||
|
"monsters": "monsters",
|
||||||
|
"mouth": "mouth",
|
||||||
|
"myriads": "myriads",
|
||||||
|
"name": "name",
|
||||||
|
"neck": "neck",
|
||||||
|
"nerscylla": "nerscylla",
|
||||||
|
"nitrotoad": "nitrotoad",
|
||||||
|
"none": "none",
|
||||||
|
"nose": "nose",
|
||||||
|
"nothpecker": "nothpecker",
|
||||||
|
"nu_udra": "nu udra",
|
||||||
|
"nu_yaya": "nu yaya",
|
||||||
|
"oilwell_basin": "oilwell basin",
|
||||||
|
"omega_planetes": "omega planetes",
|
||||||
|
"omenfly": "omenfly",
|
||||||
|
"or": "or",
|
||||||
|
"pallbug": "pallbug",
|
||||||
|
"paralysis": "paralysis",
|
||||||
|
"paratoad": "paratoad",
|
||||||
|
"peony_sparklerjelly": "peony sparklerjelly",
|
||||||
|
"petalfly": "petalfly",
|
||||||
|
"petals": "petals",
|
||||||
|
"pillopod": "pillopod",
|
||||||
|
"pink_landlight_shrimp": "pink landlight shrimp",
|
||||||
|
"platinumfish": "platinumfish",
|
||||||
|
"poison": "poison",
|
||||||
|
"prism_hercudrome": "prism hercudrome",
|
||||||
|
"purewasp": "purewasp",
|
||||||
|
"quatreflies": "quatreflies",
|
||||||
|
"quematrice": "quematrice",
|
||||||
|
"rathalos": "rathalos",
|
||||||
|
"rathian": "rathian",
|
||||||
|
"rear": "rear",
|
||||||
|
"rear_left_arm": "rear left arm",
|
||||||
|
"rear_right_arm": "rear right arm",
|
||||||
|
"regal_jewel_scarab": "regal jewel scarab",
|
||||||
|
"reset": "reset",
|
||||||
|
"rey_dau": "rey dau",
|
||||||
|
"right_chainblade": "right chainblade",
|
||||||
|
"right_claw": "right claw",
|
||||||
|
"right_foreleg": "right foreleg",
|
||||||
|
"right_hindleg": "right hindleg",
|
||||||
|
"right_leg": "right leg",
|
||||||
|
"right_wing": "right wing",
|
||||||
|
"right_wingarm": "right wingarm",
|
||||||
|
"right_wingarm_crystallized": "right wingarm (crystallized)",
|
||||||
|
"rime_beetle": "rime beetle",
|
||||||
|
"rompopolo": "rompopolo",
|
||||||
|
"rufflizard": "rufflizard",
|
||||||
|
"ruins_of_wyveria": "ruins of wyveria",
|
||||||
|
"sandstar": "sandstar",
|
||||||
|
"scalebat": "scalebat",
|
||||||
|
"scarlet_forest": "scarlet forest",
|
||||||
|
"scarlet_joyperch": "scarlet joyperch",
|
||||||
|
"seregios": "seregios",
|
||||||
|
"sleep": "sleep",
|
||||||
|
"sleeptoad": "sleeptoad",
|
||||||
|
"smokeshroud_gekko": "smokeshroud gekko",
|
||||||
|
"solanaria": "solanaria",
|
||||||
|
"sparklerjelly": "sparklerjelly",
|
||||||
|
"speartuna": "speartuna",
|
||||||
|
"starduster": "starduster",
|
||||||
|
"stench": "stench",
|
||||||
|
"stinger": "stinger",
|
||||||
|
"strong_roar": "strong roar",
|
||||||
|
"stun": "stun",
|
||||||
|
"sushifish": "sushifish",
|
||||||
|
"tail": "tail",
|
||||||
|
"tail_hair": "tail hair",
|
||||||
|
"tail_tip": "tail tip",
|
||||||
|
"temnoceran": "temnoceran",
|
||||||
|
"tentacle": "tentacle",
|
||||||
|
"thunder": "thunder",
|
||||||
|
"thunderblight": "thunderblight",
|
||||||
|
"thunderbug": "thunderbug",
|
||||||
|
"to_be_completed": "to be completed",
|
||||||
|
"tongue": "tongue",
|
||||||
|
"torso": "torso",
|
||||||
|
"tracktail_lizard": "tracktail lizard",
|
||||||
|
"tyrant_hopper": "tyrant hopper",
|
||||||
|
"unknown": "???",
|
||||||
|
"uth_duna": "uth duna",
|
||||||
|
"vaporonid": "vaporonid",
|
||||||
|
"vigormantle_bug": "vigormantle bug",
|
||||||
|
"vigorwasp": "vigorwasp",
|
||||||
|
"virid_bowfin": "virid bowfin",
|
||||||
|
"water": "water",
|
||||||
|
"waterblight": "waterblight",
|
||||||
|
"weak_roar": "weak roar",
|
||||||
|
"weaknesses": "weaknesses",
|
||||||
|
"webbed": "webbed",
|
||||||
|
"wedge_beetle": "wedge beetle",
|
||||||
|
"whetfish": "whetfish",
|
||||||
|
"wiggly_litchi": "wiggly litchi",
|
||||||
|
"windrustler": "windrustler",
|
||||||
|
"windward_plains": "windward plains",
|
||||||
|
"xu_wu": "xu wu",
|
||||||
|
"xu_yo": "xu yo",
|
||||||
|
"yian_kut_ku": "yian kut-ku",
|
||||||
|
"zoh_shia": "zoh shia"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,217 +1,238 @@
|
||||||
{
|
{
|
||||||
"and": "et",
|
"abdominal_iceplate": "plaque gelée(flancs)",
|
||||||
"or": "ou",
|
|
||||||
"reset": "réinitialiser",
|
|
||||||
"create checklist": "créer checklist",
|
|
||||||
"to be completed": "à compléter",
|
|
||||||
"monsters": "monstres",
|
|
||||||
"endemic life": "faune endémique",
|
|
||||||
"name": "nom",
|
|
||||||
"weaknesses": "faiblesses",
|
|
||||||
"locations": "localisations",
|
|
||||||
"ailments": "afflictions",
|
"ailments": "afflictions",
|
||||||
"cut": "tranchant",
|
|
||||||
"blunt": "contondant",
|
|
||||||
"ammo": "projectiles",
|
|
||||||
"windward plains": "plaines venteuses",
|
|
||||||
"scarlet forest": "forêt écarlate",
|
|
||||||
"ruins of wyveria": "ruines de wyveria",
|
|
||||||
"oilwell basin": "bassin pétrolier",
|
|
||||||
"iceshard cliffs": "falaises de glaces",
|
|
||||||
"dragon": "dragon",
|
|
||||||
"fire": "feu",
|
|
||||||
"ice": "glace",
|
|
||||||
"thunder": "foudre",
|
|
||||||
"water": "eau",
|
|
||||||
"dragonblight": "fléau-dragon",
|
|
||||||
"fireblight": "fléau-feu",
|
|
||||||
"iceblight": "fléau-glace",
|
|
||||||
"thunderblight": "fléau-foudre",
|
|
||||||
"waterblight": "fléau-eau",
|
|
||||||
"frostblight": "fléau-givre",
|
|
||||||
"bubbleblight": "fléau-bulles",
|
|
||||||
"stench": "puanteur",
|
|
||||||
"sleep": "sommeil",
|
|
||||||
"paralysis": "paralysie",
|
|
||||||
"blast": "explosion",
|
|
||||||
"poison": "poison",
|
|
||||||
"webbed": "toile",
|
|
||||||
"bleeding": "hémorragie",
|
|
||||||
"stun": "flash",
|
|
||||||
"frenzy virus": "furie",
|
|
||||||
"defense down": "baisse de défense",
|
|
||||||
"minor wind pressure": "bourrasque mineure",
|
|
||||||
"dragon wind pressure": "bourrasque draconique",
|
|
||||||
"minor tremor": "secousse mineure",
|
|
||||||
"weak roar": "rugissement faible",
|
|
||||||
"strong roar": "rugissement fort",
|
|
||||||
"mantle broken": "manteau brisé",
|
|
||||||
"head": "tête",
|
|
||||||
"nose": "nez",
|
|
||||||
"antenna": "antenne",
|
|
||||||
"neck": "cou",
|
|
||||||
"mouth": "bouche",
|
|
||||||
"torso": "torse",
|
|
||||||
"membrane": "membrane",
|
|
||||||
"tongue": "langue",
|
|
||||||
"chest": "poitrine",
|
|
||||||
"belly": "ventre",
|
|
||||||
"tentacle": "tentacule",
|
|
||||||
"back": "dos",
|
|
||||||
"left wingarm": "patte ailée G",
|
|
||||||
"right wingarm": "patte ailée D",
|
|
||||||
"front left arm": "patte av. G",
|
|
||||||
"front right arm": "patte av. D",
|
|
||||||
"middle left arm": "patte mid. G",
|
|
||||||
"middle right arm": "patte mid. D",
|
|
||||||
"rear left arm": "patte ar. G",
|
|
||||||
"rear right arm": "patte ar. D",
|
|
||||||
"left wing": "aile gauche",
|
|
||||||
"right wing": "aile droite",
|
|
||||||
"left leg": "patte gauche",
|
|
||||||
"right leg": "patte droite",
|
|
||||||
"forelegs": "pattes av.",
|
|
||||||
"left foreleg": "patte av. G",
|
|
||||||
"right foreleg": "patte av. D",
|
|
||||||
"hindlegs": "pattes ar.",
|
|
||||||
"left hindleg": "patte ar. G",
|
|
||||||
"right hindleg": "patte ar. D",
|
|
||||||
"left chainblade": "chaines G",
|
|
||||||
"right chainblade": "chaines D",
|
|
||||||
"left claw": "griffes G",
|
|
||||||
"right claw": "griffes D",
|
|
||||||
"abdominal iceplate": "plaque gelée(flancs)",
|
|
||||||
"large iceplate(hidden)": "gde plaque gelée (cachée)",
|
|
||||||
"large iceplate(exposed)": "gde plaque gelée (visible)",
|
|
||||||
"head (crystallized)": "tête (cristallisée)",
|
|
||||||
"left wingarm (crystallized)": "patte ailée G (cristallisée)",
|
|
||||||
"right wingarm (crystallized)": "patte ailée D (cristallisée)",
|
|
||||||
"back fin": "nageoire dorsale",
|
|
||||||
"stinger": "dard",
|
|
||||||
"mantle": "manteau",
|
|
||||||
"petals": "petales",
|
|
||||||
"tail": "queue",
|
|
||||||
"tail hair": "poils de queue",
|
|
||||||
"rear": "arrière",
|
|
||||||
"tail tip": "Bout de queue",
|
|
||||||
"flying wyvern": "wyverne volante",
|
|
||||||
"fanged beast": "bête à crocs",
|
|
||||||
"construct": "artificiel",
|
|
||||||
"chatacabra": "chatacabra",
|
|
||||||
"quematrice": "quematrice",
|
|
||||||
"lala barina": "lala barina",
|
|
||||||
"congalala": "congalala",
|
|
||||||
"balahara": "balahara",
|
|
||||||
"doshaguma": "doshaguma",
|
|
||||||
"uth duna": "uth duna",
|
|
||||||
"rompopolo": "rompopolo",
|
|
||||||
"rey dau": "rey dau",
|
|
||||||
"nerscylla": "nerscylla",
|
|
||||||
"hirabami": "hirabami",
|
|
||||||
"ajarakan": "ajarakan",
|
"ajarakan": "ajarakan",
|
||||||
"nu udra": "nu udra",
|
"ammo": "projectiles",
|
||||||
"jin dahaad": "jin dahaad",
|
"amphibian": "amphibian",
|
||||||
"xu wu": "xu wu",
|
|
||||||
"zoh shia": "zoh shia",
|
|
||||||
"yian kut-ku": "yian kut-ku",
|
|
||||||
"gypceros": "gypceros",
|
|
||||||
"rathian": "rathian",
|
|
||||||
"rathalos": "rathalos",
|
|
||||||
"gravios": "gravios",
|
|
||||||
"blangonga": "blangonga",
|
|
||||||
"gore magala": "gore magala",
|
|
||||||
"arkveld": "arkveld",
|
|
||||||
"mizutsune": "mizutsune",
|
|
||||||
"guardian doshaguma": "doshaguma gardien",
|
|
||||||
"guardian rathalos": "rathalos gardien",
|
|
||||||
"guardian ebony odogaron": "odogaron désastre gardien",
|
|
||||||
"guardian arkveld": "arkveld gardien",
|
|
||||||
"guardian fulgur anjanath": "anjanath fulgurant gardien",
|
|
||||||
"vigorwasp": "vitaguêpe",
|
|
||||||
"giant vigorwasp": "grande vitaguêpe",
|
|
||||||
"purewasp": "curaguêpe",
|
|
||||||
"vigormantle bug": "vitanille",
|
|
||||||
"chillmantle bug": "glacianille",
|
|
||||||
"heatmantle bug": "calonille",
|
|
||||||
"wiggly litchi": "chenille-litchi",
|
|
||||||
"paratoad": "paralycrapaud",
|
|
||||||
"nitrotoad": "nitrocrapaud",
|
|
||||||
"sleeptoad": "somnicrapaud",
|
|
||||||
"flashflies": "flashinsectes",
|
|
||||||
"dung beetle": "",
|
|
||||||
"bomb beetle": "scarabombe",
|
|
||||||
"rime beetle": "scarabée des neiges",
|
|
||||||
"thunderbug": "foudrinsectes",
|
|
||||||
"great thunderbugs": "grands foudrinsectes",
|
|
||||||
"flashbug": "scaralux",
|
|
||||||
"godbug": "insecte immortel",
|
|
||||||
"bitterbug": "amerinsecte",
|
|
||||||
"dark hornet": "frelon clair-obscur",
|
|
||||||
"wedge beetle": "scaragrappin",
|
|
||||||
"windrustler": "filovent",
|
|
||||||
"black windrustler": "filovent noir",
|
|
||||||
"nothpecker": "",
|
|
||||||
"landlight shrimp": "crevette terralux",
|
|
||||||
"amstrigian": "amstrigien",
|
"amstrigian": "amstrigien",
|
||||||
"hymstrigian": "",
|
"and": "et",
|
||||||
"rufflizard": "gonflézard",
|
"antenna": "antenne",
|
||||||
"tracktail lizard": "lézard markoda",
|
"arkveld": "arkveld",
|
||||||
"pallbug": "charoptère",
|
"azure_rufflizard": "",
|
||||||
"quatreflies": "trèflémères",
|
"back": "dos",
|
||||||
"emperor hopper": "criquet empereur",
|
"back_fin": "nageoire dorsale",
|
||||||
"tyrant hopper": "criquet tyran",
|
"back_unity": "back unity",
|
||||||
"sandstar": "étoile des sables",
|
"balahara": "balahara",
|
||||||
"leaflugger ant": "fourmifolia",
|
"belly": "ventre",
|
||||||
"florashell crab": "floracrabe",
|
"bitterbug": "amerinsecte",
|
||||||
"crudeshell crab": "pétrocrabe",
|
"black_windrustler": "filovent noir",
|
||||||
"curioshell crab": "curiocrabe",
|
"blangonga": "blangonga",
|
||||||
"smokeshroud gekko": "",
|
"blast": "explosion",
|
||||||
|
"bleeding": "hémorragie",
|
||||||
|
"blind_perch": "perche aveugle",
|
||||||
|
"blink_angler": "poisson cillant",
|
||||||
|
"blunt": "contondant",
|
||||||
|
"bomb_arowana": "arowana bombe",
|
||||||
|
"bomb_beetle": "scarabombe",
|
||||||
|
"brute_wyvern": "brute wyvern",
|
||||||
|
"bubbleblight": "fléau-bulles",
|
||||||
|
"burst_arowana": "arowana explosif",
|
||||||
|
"cephalopod": "cephalopod",
|
||||||
|
"chainblade": "chainblade",
|
||||||
|
"chatacabra": "chatacabra",
|
||||||
|
"chest": "poitrine",
|
||||||
|
"chillmantle_bug": "glacianille",
|
||||||
|
"claw": "claw",
|
||||||
|
"congalala": "congalala",
|
||||||
|
"construct": "artificiel",
|
||||||
|
"create_checklist": "créer checklist",
|
||||||
|
"crudeshell_crab": "pétrocrabe",
|
||||||
|
"curioshell_crab": "curiocrabe",
|
||||||
|
"cut": "tranchant",
|
||||||
"dapperwing": "bellaile",
|
"dapperwing": "bellaile",
|
||||||
|
"dark_hornet": "frelon clair-obscur",
|
||||||
"dazzlewing": "",
|
"dazzlewing": "",
|
||||||
"mimiphyta": "mimiflore",
|
"default": "default",
|
||||||
"scarlet joyperch": "perche rampante",
|
"defense_down": "baisse de défense",
|
||||||
"starduster": "stellardine",
|
"demi_elder": "demi elder",
|
||||||
"vaporonid": "",
|
"doshaguma": "doshaguma",
|
||||||
"omenfly": "libellule divinatoire",
|
"downy_crake": "",
|
||||||
"myriads": "myriades",
|
"dragon": "dragon",
|
||||||
"jewel scarab": "scarajoyau",
|
"dragon_wind_pressure": "bourrasque draconique",
|
||||||
"regal jewel scarab": "scarajoyau royal",
|
"dragonblight": "fléau-dragon",
|
||||||
"pink landlight shrimp": "crevette terralux rose",
|
"dung_beetle": "",
|
||||||
"ember rufflizard": "gonflézard incandescent",
|
"elder_dragon": "elder dragon",
|
||||||
"azure rufflizard": "",
|
"ember_rufflizard": "gonflézard incandescent",
|
||||||
"gloom gekko": "gecko nocturne",
|
"emperor_hopper": "criquet empereur",
|
||||||
"scalebat": "chauve-souris à écailles",
|
"endemic_life": "faune endémique",
|
||||||
"blink angler": "poisson cillant",
|
|
||||||
"sparklerjelly": "flaméduse",
|
|
||||||
"peony sparklerjelly": "",
|
|
||||||
"nu yaya": "nu yaya",
|
|
||||||
"gawkie": "zieuteur",
|
|
||||||
"solanaria": "solanaria",
|
|
||||||
"pillopod": "plalimace",
|
|
||||||
"gillopod": "glalimace",
|
|
||||||
"petalfly": "pétaluciole",
|
|
||||||
"xu yo": "",
|
|
||||||
"downy crake": "",
|
|
||||||
"hercudrome": "",
|
|
||||||
"gold hercudrome": "",
|
|
||||||
"prism hercudrome": "",
|
|
||||||
"virid bowfin": "amie émeraude",
|
|
||||||
"sushifish": "sushipoisson",
|
|
||||||
"whetfish": "poissaiguiseur",
|
|
||||||
"goldenfish": "poisson d'or",
|
|
||||||
"platinumfish": "poisson platine",
|
|
||||||
"burst arowana": "arowana explosif",
|
|
||||||
"bomb arowana": "arowana bombe",
|
|
||||||
"goldenfry": "poisson rouge",
|
|
||||||
"gunpowderfish": "poisson-poudre",
|
|
||||||
"gravid bowfin": "amie gravide",
|
|
||||||
"escunite": "escunite",
|
"escunite": "escunite",
|
||||||
"grand escunite": "grande escunite",
|
"fanged_beast": "bête à crocs",
|
||||||
"glass parexus": "parexus de verre",
|
"fire": "feu",
|
||||||
"blind perch": "perche aveugle",
|
"fireblight": "fléau-feu",
|
||||||
"gastronome tuna": "thon glouton",
|
"flashbug": "scaralux",
|
||||||
"goliath squid": "calmar titan",
|
"flashflies": "flashinsectes",
|
||||||
"great trevally": "",
|
"florashell_crab": "floracrabe",
|
||||||
|
"flying_wyvern": "wyverne volante",
|
||||||
|
"foreleg": "foreleg",
|
||||||
|
"forelegs": "pattes av.",
|
||||||
|
"frenzy_virus": "furie",
|
||||||
|
"front_left_arm": "patte av. G",
|
||||||
|
"front_right_arm": "patte av. D",
|
||||||
|
"frostblight": "fléau-givre",
|
||||||
"gajau": "gajau",
|
"gajau": "gajau",
|
||||||
"speartuna": ""
|
"gastronome_tuna": "thon glouton",
|
||||||
|
"gawkie": "zieuteur",
|
||||||
|
"giant_vigorwasp": "grande vitaguêpe",
|
||||||
|
"gillopod": "glalimace",
|
||||||
|
"glass_parexus": "parexus de verre",
|
||||||
|
"gloom_gekko": "gecko nocturne",
|
||||||
|
"godbug": "insecte immortel",
|
||||||
|
"gogmazios": "gogmazios",
|
||||||
|
"gold_hercudrome": "",
|
||||||
|
"goldenfish": "poisson d'or",
|
||||||
|
"goldenfry": "poisson rouge",
|
||||||
|
"goliath_squid": "calmar titan",
|
||||||
|
"gore_magala": "gore magala",
|
||||||
|
"grand_escunite": "grande escunite",
|
||||||
|
"gravid_bowfin": "amie gravide",
|
||||||
|
"gravios": "gravios",
|
||||||
|
"great_thunderbugs": "grands foudrinsectes",
|
||||||
|
"great_trevally": "",
|
||||||
|
"guardian_arkveld": "arkveld gardien",
|
||||||
|
"guardian_doshaguma": "doshaguma gardien",
|
||||||
|
"guardian_ebony_odogaron": "odogaron désastre gardien",
|
||||||
|
"guardian_fulgur_anjanath": "anjanath fulgurant gardien",
|
||||||
|
"guardian_rathalos": "rathalos gardien",
|
||||||
|
"gunpowderfish": "poisson-poudre",
|
||||||
|
"gypceros": "gypceros",
|
||||||
|
"head": "tête",
|
||||||
|
"head_crystallized": "tête (cristallisée)",
|
||||||
|
"heatmantle_bug": "calonille",
|
||||||
|
"hercudrome": "",
|
||||||
|
"hindlegs": "pattes ar.",
|
||||||
|
"hirabami": "hirabami",
|
||||||
|
"hp_penalty": "hp penalty",
|
||||||
|
"hymstrigian": "",
|
||||||
|
"ice": "glace",
|
||||||
|
"iceblight": "fléau-glace",
|
||||||
|
"iceshard_cliffs": "falaises de glaces",
|
||||||
|
"jewel_scarab": "scarajoyau",
|
||||||
|
"jin_dahaad": "jin dahaad",
|
||||||
|
"lagiacrus": "lagiacrus",
|
||||||
|
"lala_barina": "lala barina",
|
||||||
|
"landlight_shrimp": "crevette terralux",
|
||||||
|
"large_iceplate_exposed": "gde plaque gelée (visible)",
|
||||||
|
"large_iceplate_hidden": "gde plaque gelée (cachée)",
|
||||||
|
"leaflugger_ant": "fourmifolia",
|
||||||
|
"left_chainblade": "chaines G",
|
||||||
|
"left_claw": "griffes G",
|
||||||
|
"left_foreleg": "patte av. G",
|
||||||
|
"left_hindleg": "patte ar. G",
|
||||||
|
"left_leg": "patte gauche",
|
||||||
|
"left_wing": "aile gauche",
|
||||||
|
"left_wingarm": "patte ailée G",
|
||||||
|
"left_wingarm_crystallized": "patte ailée G (cristallisée)",
|
||||||
|
"leg": "leg",
|
||||||
|
"legs": "legs",
|
||||||
|
"leviathan": "leviathan",
|
||||||
|
"locations": "localisations",
|
||||||
|
"mantle": "manteau",
|
||||||
|
"mantle_broken": "manteau brisé",
|
||||||
|
"membrane": "membrane",
|
||||||
|
"middle_left_arm": "patte mid. G",
|
||||||
|
"middle_right_arm": "patte mid. D",
|
||||||
|
"mimiphyta": "mimiflore",
|
||||||
|
"minor_tremor": "secousse mineure",
|
||||||
|
"minor_wind_pressure": "bourrasque mineure",
|
||||||
|
"mizutsune": "mizutsune",
|
||||||
|
"monsters": "monstres",
|
||||||
|
"mouth": "bouche",
|
||||||
|
"myriads": "myriades",
|
||||||
|
"name": "nom",
|
||||||
|
"neck": "cou",
|
||||||
|
"nerscylla": "nerscylla",
|
||||||
|
"nitrotoad": "nitrocrapaud",
|
||||||
|
"none": "none",
|
||||||
|
"nose": "nez",
|
||||||
|
"nothpecker": "",
|
||||||
|
"nu_udra": "nu udra",
|
||||||
|
"nu_yaya": "nu yaya",
|
||||||
|
"oilwell_basin": "bassin pétrolier",
|
||||||
|
"omega_planetes": "omega planetes",
|
||||||
|
"omenfly": "libellule divinatoire",
|
||||||
|
"or": "ou",
|
||||||
|
"pallbug": "charoptère",
|
||||||
|
"paralysis": "paralysie",
|
||||||
|
"paratoad": "paralycrapaud",
|
||||||
|
"peony_sparklerjelly": "",
|
||||||
|
"petalfly": "pétaluciole",
|
||||||
|
"petals": "petales",
|
||||||
|
"pillopod": "plalimace",
|
||||||
|
"pink_landlight_shrimp": "crevette terralux rose",
|
||||||
|
"platinumfish": "poisson platine",
|
||||||
|
"poison": "poison",
|
||||||
|
"prism_hercudrome": "",
|
||||||
|
"purewasp": "curaguêpe",
|
||||||
|
"quatreflies": "trèflémères",
|
||||||
|
"quematrice": "quematrice",
|
||||||
|
"rathalos": "rathalos",
|
||||||
|
"rathian": "rathian",
|
||||||
|
"rear": "arrière",
|
||||||
|
"rear_left_arm": "patte ar. G",
|
||||||
|
"rear_right_arm": "patte ar. D",
|
||||||
|
"regal_jewel_scarab": "scarajoyau royal",
|
||||||
|
"reset": "réinitialiser",
|
||||||
|
"rey_dau": "rey dau",
|
||||||
|
"right_chainblade": "chaines D",
|
||||||
|
"right_claw": "griffes D",
|
||||||
|
"right_foreleg": "patte av. D",
|
||||||
|
"right_hindleg": "patte ar. D",
|
||||||
|
"right_leg": "patte droite",
|
||||||
|
"right_wing": "aile droite",
|
||||||
|
"right_wingarm": "patte ailée D",
|
||||||
|
"right_wingarm_crystallized": "patte ailée D (cristallisée)",
|
||||||
|
"rime_beetle": "scarabée des neiges",
|
||||||
|
"rompopolo": "rompopolo",
|
||||||
|
"rufflizard": "gonflézard",
|
||||||
|
"ruins_of_wyveria": "ruines de wyveria",
|
||||||
|
"sandstar": "étoile des sables",
|
||||||
|
"scalebat": "chauve-souris à écailles",
|
||||||
|
"scarlet_forest": "forêt écarlate",
|
||||||
|
"scarlet_joyperch": "perche rampante",
|
||||||
|
"seregios": "seregios",
|
||||||
|
"sleep": "sommeil",
|
||||||
|
"sleeptoad": "somnicrapaud",
|
||||||
|
"smokeshroud_gekko": "",
|
||||||
|
"solanaria": "solanaria",
|
||||||
|
"sparklerjelly": "flaméduse",
|
||||||
|
"speartuna": "",
|
||||||
|
"starduster": "stellardine",
|
||||||
|
"stench": "puanteur",
|
||||||
|
"stinger": "dard",
|
||||||
|
"strong_roar": "rugissement fort",
|
||||||
|
"stun": "flash",
|
||||||
|
"sushifish": "sushipoisson",
|
||||||
|
"tail": "queue",
|
||||||
|
"tail_hair": "poils de queue",
|
||||||
|
"tail_tip": "Bout de queue",
|
||||||
|
"temnoceran": "temnoceran",
|
||||||
|
"tentacle": "tentacule",
|
||||||
|
"thunder": "foudre",
|
||||||
|
"thunderblight": "fléau-foudre",
|
||||||
|
"thunderbug": "foudrinsectes",
|
||||||
|
"to_be_completed": "à compléter",
|
||||||
|
"tongue": "langue",
|
||||||
|
"torso": "torse",
|
||||||
|
"tracktail_lizard": "lézard markoda",
|
||||||
|
"tyrant_hopper": "criquet tyran",
|
||||||
|
"unknown": "???",
|
||||||
|
"uth_duna": "uth duna",
|
||||||
|
"vaporonid": "",
|
||||||
|
"vigormantle_bug": "vitanille",
|
||||||
|
"vigorwasp": "vitaguêpe",
|
||||||
|
"virid_bowfin": "amie émeraude",
|
||||||
|
"water": "eau",
|
||||||
|
"waterblight": "fléau-eau",
|
||||||
|
"weak_roar": "rugissement faible",
|
||||||
|
"weaknesses": "faiblesses",
|
||||||
|
"webbed": "toile",
|
||||||
|
"wedge_beetle": "scaragrappin",
|
||||||
|
"whetfish": "poissaiguiseur",
|
||||||
|
"wiggly_litchi": "chenille-litchi",
|
||||||
|
"windrustler": "filovent",
|
||||||
|
"windward_plains": "plaines venteuses",
|
||||||
|
"xu_wu": "xu wu",
|
||||||
|
"xu_yo": "",
|
||||||
|
"yian_kut_ku": "yian kut-ku",
|
||||||
|
"zoh_shia": "zoh shia"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
2
website/public/static/img/diablo4/axe.svg
Normal file
2
website/public/static/img/diablo4/axe.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg"><defs><style>.cls-1{fill:none;stroke:#020202;stroke-miterlimit:10;stroke-width:2px;}</style></defs><path class="cls-1" d="M22.8,9a9.95,9.95,0,0,1-8.49,8.49l-.7-.7a6.69,6.69,0,0,0-.69-4.55,6.87,6.87,0,0,0-1.15-1.54l-2.4-2.4L13.61,4.1,16,6.5a6.33,6.33,0,0,0,1.55,1.14,6.6,6.6,0,0,0,3.22.83,6.56,6.56,0,0,0,1.32-.13Z"/><path class="cls-1" d="M12.92,12.28l-2.1,2.1-6,6a2.12,2.12,0,0,1-3-3l6-6,2.3-2.29,1.65,1.65A6.87,6.87,0,0,1,12.92,12.28Z"/><path class="cls-1" d="M19.2,5.12a2.12,2.12,0,0,1-.62,1.5l-1,1A6.33,6.33,0,0,1,16,6.5L14.36,4.85l1.22-1.23a2.12,2.12,0,0,1,3.62,1.5Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 821 B |
6
website/public/static/img/diablo4/cube.svg
Normal file
6
website/public/static/img/diablo4/cube.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M20.3873 7.1575L11.9999 12L3.60913 7.14978" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M12 12V21" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M11 2.57735C11.6188 2.22008 12.3812 2.22008 13 2.57735L19.6603 6.42265C20.2791 6.77992 20.6603 7.44017 20.6603 8.1547V15.8453C20.6603 16.5598 20.2791 17.2201 19.6603 17.5774L13 21.4226C12.3812 21.7799 11.6188 21.7799 11 21.4226L4.33975 17.5774C3.72094 17.2201 3.33975 16.5598 3.33975 15.8453V8.1547C3.33975 7.44017 3.72094 6.77992 4.33975 6.42265L11 2.57735Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 923 B |
2
website/public/static/img/diablo4/fire.svg
Normal file
2
website/public/static/img/diablo4/fire.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M9.32 15.653a.812.812 0 0 1-.086-.855c.176-.342.245-.733.2-1.118a2.106 2.106 0 0 0-.267-.779 2.027 2.027 0 0 0-.541-.606 3.96 3.96 0 0 1-1.481-2.282c-1.708 2.239-1.053 3.51-.235 4.63a.748.748 0 0 1-.014.901.87.87 0 0 1-.394.283.838.838 0 0 1-.478.023c-1.105-.27-2.145-.784-2.85-1.603a4.686 4.686 0 0 1-.906-1.555 4.811 4.811 0 0 1-.263-1.797s-.133-2.463 2.837-4.876c0 0 3.51-2.978 2.292-5.18a.621.621 0 0 1 .112-.653.558.558 0 0 1 .623-.147l.146.058a7.63 7.63 0 0 1 2.96 3.5c.58 1.413.576 3.06.184 4.527.325-.292.596-.641.801-1.033l.029-.064c.198-.477.821-.325 1.055-.013.086.137 2.292 3.343 1.107 6.048a5.516 5.516 0 0 1-1.84 2.027 6.127 6.127 0 0 1-2.138.893.834.834 0 0 1-.472-.038.867.867 0 0 1-.381-.29zM7.554 7.892a.422.422 0 0 1 .55.146c.04.059.066.126.075.198l.045.349c.02.511.014 1.045.213 1.536.206.504.526.95.932 1.298a3.06 3.06 0 0 1 1.16 1.422c.22.564.25 1.19.084 1.773a4.123 4.123 0 0 0 1.39-.757l.103-.084c.336-.277.613-.623.813-1.017.201-.393.322-.825.354-1.269.065-1.025-.284-2.054-.827-2.972-.248.36-.59.639-.985.804-.247.105-.509.17-.776.19a.792.792 0 0 1-.439-.1.832.832 0 0 1-.321-.328.825.825 0 0 1-.035-.729c.412-.972.54-2.05.365-3.097a5.874 5.874 0 0 0-1.642-3.16c-.156 2.205-2.417 4.258-2.881 4.7a3.537 3.537 0 0 1-.224.194c-2.426 1.965-2.26 3.755-2.26 3.834a3.678 3.678 0 0 0 .459 2.043c.365.645.89 1.177 1.52 1.54C4.5 12.808 4.5 10.89 7.183 8.14l.372-.25z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
4
website/public/static/img/diablo4/shield.svg
Normal file
4
website/public/static/img/diablo4/shield.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.1548 3.74068C9.13306 4.24326 7.70274 4.75901 5.07021 4.93689C4.43314 4.97993 4.01738 5.47217 4.03533 5.965C4.13502 8.70059 4.45127 11.4217 5.0553 13.6538C5.67349 15.9383 6.53465 17.4879 7.55469 18.1679C9.1615 19.2392 10.4837 20.1681 11.3705 20.8038C11.7447 21.072 12.2553 21.072 12.6294 20.8038C13.5162 20.1681 14.8385 19.2392 16.4453 18.1679C17.4653 17.4879 18.3265 15.9383 18.9447 13.6539C19.5487 11.4218 19.865 8.70066 19.9646 5.965C19.9826 5.47217 19.5668 4.97993 18.9298 4.93689C16.2972 4.75901 14.8669 4.24326 13.8452 3.74068C13.5533 3.5971 13.3276 3.47746 13.1423 3.37923C12.6352 3.11045 12.4305 3.00195 12 3.00195C11.5694 3.00195 11.3647 3.11045 10.8577 3.37923C10.6724 3.47746 10.4467 3.5971 10.1548 3.74068ZM9.68627 1.72824C10.3021 1.39456 11.0268 1.00195 12 1.00195C12.9732 1.00195 13.6978 1.39456 14.3137 1.72825C14.4571 1.80594 14.5946 1.88044 14.728 1.94605C15.503 2.32729 16.6774 2.78014 19.0646 2.94144C20.6316 3.04732 22.0258 4.32298 21.9633 6.03782C21.8605 8.8586 21.5333 11.7445 20.8752 14.1763C20.2313 16.5559 19.2117 18.7274 17.5547 19.8321C15.97 20.8885 14.6667 21.8042 13.7947 22.4293C12.724 23.1969 11.276 23.1969 10.2053 22.4293C9.33329 21.8042 8.02992 20.8885 6.44528 19.8321C4.78826 18.7274 3.76867 16.5559 3.12474 14.1763C2.46666 11.7444 2.13944 8.85853 2.03666 6.03783C1.97417 4.32298 3.36833 3.04732 4.93538 2.94144C7.32256 2.78014 8.49696 2.32729 9.27198 1.94605C9.40536 1.88044 9.54287 1.80594 9.68627 1.72824Z" fill="#0F0F0F"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
2
website/public/static/img/diablo4/wing.svg
Normal file
2
website/public/static/img/diablo4/wing.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<ns0:svg xmlns:ns0="http://www.w3.org/2000/svg" width="800px" height="800px" viewBox="0 0 512 512"><ns0:path fill="none" d="M487 37.1C396.4 53.23 292 95.28 207.5 140 163 163.6 124 187.8 95.39 209.2 81.08 220 69.36 230 60.93 238.6c-8.43 8.7-13.38 16.3-14.65 20.3-9.04 28.7-3.42 57.7 1.73 84.7 9.55 50.4-3.23 88.9-22.98 126.3 25.24-5.7 45.36-19.8 57-47 8.47-19.8 9.13-37 11.43-57.6 2.3-20.6 6.45-44.2 22.44-73.2l.2-.4.2-.4c8.8-12.6 26.2-22.2 50-33.4 23.7-11.2 53.6-23 86-35.1 63.8-23.8 137.2-48.7 190.1-71.3 20-30.1 34-74.24 44.6-114.4zm-55 138.2c-51.7 21-116.6 43.1-173.5 64.3-32.2 12-61.8 23.7-84.6 34.5-22.6 10.7-38.5 21.6-42.6 27.2-6.8 12.3-11.1 23.2-14 33.3 83.4-6.5 195.3-31.8 271.3-66.6 27.4-29.7 36.9-59.7 43.4-92.7zm-58 118.8c-79 32.2-182 53.3-260.8 58.6-.9 5-1.5 9.8-2 14.6-.4 3.5-.7 7.1-1.1 10.6 72.4 7.5 136.3 4 206.2-6.5 32.6-22.5 49.8-49.6 57.7-77.3zm-78.4 98.2c-62.3 8.1-121.6 10.2-187.6 3.4-.7 4.5-1.6 9-2.7 13.6 35.9 19.2 98.1 25.8 140.7 24.6 30.2-12.4 41.5-24.8 49.6-41.6zM99.78 426.7c-1.15 2.1-3.14 6.7-4.21 8.9 14.03 20.2 48.73 32.2 88.43 39.3 21.2-8 28.3-15.5 36.5-23-39.7-1.1-86.7-7.7-120.7-25.2z" stroke="#000000" stroke-width="20" stroke-linejoin="round" stroke-linecap="round" /></ns0:svg>
|
||||||
BIN
website/public/static/img/games/diablo4/card-cover.png
Normal file
BIN
website/public/static/img/games/diablo4/card-cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 118 KiB |
BIN
website/public/static/img/games/diablo4/hero-bg.png
Normal file
BIN
website/public/static/img/games/diablo4/hero-bg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.3 MiB |
|
|
@ -1,4 +1,5 @@
|
||||||
import { GamesPage } from "./GamesPage.jsx";
|
import { GamesPage } from "./GamesPage.jsx";
|
||||||
|
import { Diablo4Page } from "./diablo4/Diablo4Page.jsx";
|
||||||
import { MhwildsPage } from "./mhwilds/MhwildsPage.jsx";
|
import { MhwildsPage } from "./mhwilds/MhwildsPage.jsx";
|
||||||
|
|
||||||
export function GameRoute(props) {
|
export function GameRoute(props) {
|
||||||
|
|
@ -7,6 +8,7 @@ export function GameRoute(props) {
|
||||||
const heroStyle = game?.images?.heroBg ? { "--game-hero-image": `url("${game.images.heroBg}")` } : undefined;
|
const heroStyle = game?.images?.heroBg ? { "--game-hero-image": `url("${game.images.heroBg}")` } : undefined;
|
||||||
|
|
||||||
if (!game) return <GamesPage {...props} />;
|
if (!game) return <GamesPage {...props} />;
|
||||||
|
if (game.id === "diablo4") return <Diablo4Page {...props} game={game} />;
|
||||||
if (game.id === "mhwilds") return <MhwildsPage {...props} game={game} />;
|
if (game.id === "mhwilds") return <MhwildsPage {...props} game={game} />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,11 @@ export function GamesPage({ siteContent, games, gamesError }) {
|
||||||
title={`Ouvrir ${game.title}`}
|
title={`Ouvrir ${game.title}`}
|
||||||
style={{ "--game-cover": game.cover || "var(--gradient-nebula)" }}
|
style={{ "--game-cover": game.cover || "var(--gradient-nebula)" }}
|
||||||
>
|
>
|
||||||
<img src={game.images?.cardCover || game.image || ""} alt={game.title} loading="lazy" />
|
{game.images?.cardCover || game.image ? (
|
||||||
|
<img src={game.images?.cardCover || game.image} alt={game.title} loading="lazy" />
|
||||||
|
) : (
|
||||||
|
<span className="game-card-placeholder" aria-hidden="true">{game.title}</span>
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
<p className="eyebrow">{game.eyebrow || "Guide de jeu"}</p>
|
<p className="eyebrow">{game.eyebrow || "Guide de jeu"}</p>
|
||||||
|
|
|
||||||
22
website/src/features/games/diablo4/Diablo4AffixCard.jsx
Normal file
22
website/src/features/games/diablo4/Diablo4AffixCard.jsx
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
import { getCategoryIconStyle, getCategoryLabel } from "./utils.js";
|
||||||
|
|
||||||
|
export function Diablo4AffixCard({ affix, categoryMap }) {
|
||||||
|
return (
|
||||||
|
<article className="mhwilds-card diablo4-affix-card">
|
||||||
|
<div className="diablo4-affix-card-body">
|
||||||
|
<h2>{affix.label}</h2>
|
||||||
|
<div className="diablo4-category-list" aria-label="Catégories">
|
||||||
|
{(affix.categories || []).map((categoryId) => {
|
||||||
|
const category = categoryMap[categoryId] || categoryId;
|
||||||
|
return (
|
||||||
|
<span className={`tone-${category.tone || "default"}`} key={categoryId}>
|
||||||
|
<span className="diablo4-category-icon" aria-hidden="true" style={getCategoryIconStyle(category)} />
|
||||||
|
{getCategoryLabel(category)}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
);
|
||||||
|
}
|
||||||
58
website/src/features/games/diablo4/Diablo4Filters.jsx
Normal file
58
website/src/features/games/diablo4/Diablo4Filters.jsx
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
import { Icon } from "../../../components/Icon.jsx";
|
||||||
|
import { getCategoryIconStyle, getCategoryId, getCategoryLabel } from "./utils.js";
|
||||||
|
|
||||||
|
export function Diablo4Filters({ options, filters, setFilters }) {
|
||||||
|
const selected = new Set(filters.categories || []);
|
||||||
|
const logicLabel = filters.logic === "or" ? "Ou" : "Et";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="filter-panel">
|
||||||
|
<div className="filter-panel-head">
|
||||||
|
<div>
|
||||||
|
<p className="eyebrow">Filtres</p>
|
||||||
|
<h2>Catégories</h2>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
className="filter-reset-button"
|
||||||
|
onClick={() => setFilters((state) => ({ ...state, diablo4: { name: "", categories: [], logic: "and" } }))}
|
||||||
|
aria-label="Réinitialiser"
|
||||||
|
title="Réinitialiser"
|
||||||
|
>
|
||||||
|
<Icon name="rubber" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<label className="field compact">
|
||||||
|
<span>Nom</span>
|
||||||
|
<input
|
||||||
|
value={filters.name}
|
||||||
|
placeholder="Rechercher..."
|
||||||
|
onChange={(event) => setFilters((state) => ({ ...state, diablo4: { ...state.diablo4, name: event.target.value } }))}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
<div className="filter-logic">
|
||||||
|
<span>Correspondance</span>
|
||||||
|
<button onClick={() => setFilters((state) => ({ ...state, diablo4: { ...state.diablo4, logic: state.diablo4.logic === "and" ? "or" : "and" } }))}>
|
||||||
|
{logicLabel}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="filter-options legacy-scrollbar">
|
||||||
|
{options.map((option) => (
|
||||||
|
<label className={`filter-chip diablo4-filter-chip tone-${option.tone || "default"} ${selected.has(getCategoryId(option)) ? "active" : ""}`} key={getCategoryId(option)}>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={selected.has(getCategoryId(option))}
|
||||||
|
onChange={(event) => setFilters((state) => {
|
||||||
|
const values = new Set(state.diablo4.categories || []);
|
||||||
|
if (event.target.checked) values.add(getCategoryId(option));
|
||||||
|
else values.delete(getCategoryId(option));
|
||||||
|
return { ...state, diablo4: { ...state.diablo4, categories: [...values] } };
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<span className="diablo4-category-icon" aria-hidden="true" style={getCategoryIconStyle(option)} />
|
||||||
|
<span>{getCategoryLabel(option)}</span>
|
||||||
|
</label>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
45
website/src/features/games/diablo4/Diablo4Listing.jsx
Normal file
45
website/src/features/games/diablo4/Diablo4Listing.jsx
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
import { useMemo } from "react";
|
||||||
|
import { Diablo4AffixCard } from "./Diablo4AffixCard.jsx";
|
||||||
|
import { Diablo4Filters } from "./Diablo4Filters.jsx";
|
||||||
|
import { getCategoryLabel, getFilteredDiablo4Affixes } from "./utils.js";
|
||||||
|
|
||||||
|
export function Diablo4Listing({ diablo4, filters, setFilters }) {
|
||||||
|
const activeFilters = filters.diablo4;
|
||||||
|
const options = [...(diablo4.filterOptions.affixes || [])].sort((a, b) => getCategoryLabel(a).localeCompare(getCategoryLabel(b), "fr"));
|
||||||
|
const visible = useMemo(
|
||||||
|
() => getFilteredDiablo4Affixes({ affixes: diablo4.affixes, filters: activeFilters }),
|
||||||
|
[diablo4.affixes, activeFilters]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className="page-heading mhwilds-heading">
|
||||||
|
<div>
|
||||||
|
<p className="eyebrow">Diablo IV</p>
|
||||||
|
<div className="mhwilds-title-row">
|
||||||
|
<h1>Affixes</h1>
|
||||||
|
<span className="results-count">{visible.length} / {diablo4.affixes.length}</span>
|
||||||
|
</div>
|
||||||
|
<p>Filtrez les affixes par nom et catégories pour retrouver rapidement les statistiques utiles à votre build.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section className="mhwilds-layout diablo4-layout" data-game-category="diablo4-affixes">
|
||||||
|
<aside className="mhwilds-filters">
|
||||||
|
<Diablo4Filters options={options} filters={activeFilters} setFilters={setFilters} />
|
||||||
|
</aside>
|
||||||
|
<section className="mhwilds-results" aria-live="polite">
|
||||||
|
<div className="mhwilds-grid diablo4-affix-grid">
|
||||||
|
{visible.length ? visible.map((affix) => (
|
||||||
|
<Diablo4AffixCard key={affix.id} affix={affix} categoryMap={diablo4.categoryMap} />
|
||||||
|
)) : (
|
||||||
|
<div className="empty">
|
||||||
|
<h2>Aucun résultat</h2>
|
||||||
|
<p>Ajustez la recherche ou réinitialisez les filtres actifs.</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
22
website/src/features/games/diablo4/Diablo4Overview.jsx
Normal file
22
website/src/features/games/diablo4/Diablo4Overview.jsx
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
export function Diablo4Overview({ game }) {
|
||||||
|
const heroStyle = game?.images?.heroBg ? { "--game-hero-image": `url("${game.images.heroBg}")` } : undefined;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className="game-hero" style={heroStyle}>
|
||||||
|
<div>
|
||||||
|
<p className="eyebrow">Guide de jeu</p>
|
||||||
|
<h1>Diablo IV</h1>
|
||||||
|
<p>Consultez rapidement les affixes et leurs catégories pour préparer vos builds sans quitter votre session.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section className="mhwilds-home-grid diablo4-home-grid">
|
||||||
|
<a className="feature mhwilds-home-card diablo4-home-card" href="#/games/diablo4/affixes">
|
||||||
|
<span className="diablo4-home-mark" aria-hidden="true" />
|
||||||
|
<strong>Affixes</strong>
|
||||||
|
<span>Recherche et filtres par catégorie pour retrouver les statistiques utiles.</span>
|
||||||
|
</a>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
38
website/src/features/games/diablo4/Diablo4Page.jsx
Normal file
38
website/src/features/games/diablo4/Diablo4Page.jsx
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
import { Diablo4Listing } from "./Diablo4Listing.jsx";
|
||||||
|
import { Diablo4Overview } from "./Diablo4Overview.jsx";
|
||||||
|
|
||||||
|
export function Diablo4Page({ category, game, diablo4, filters, setFilters }) {
|
||||||
|
const activeCategory = category === "affixes" ? category : "";
|
||||||
|
const heroStyle = game?.images?.heroBg ? { "--game-hero-image": `url("${game.images.heroBg}")` } : undefined;
|
||||||
|
|
||||||
|
if (!diablo4.loaded) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className="game-hero" style={heroStyle}>
|
||||||
|
<div>
|
||||||
|
<p className="eyebrow">Diablo IV</p>
|
||||||
|
<h1>Diablo IV</h1>
|
||||||
|
<p>Chargement des affixes et filtres associés.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section className="empty">
|
||||||
|
<h2>Chargement</h2>
|
||||||
|
<p>Préparation des données locales...</p>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (diablo4.error) {
|
||||||
|
return (
|
||||||
|
<section className="empty">
|
||||||
|
<h1>Impossible de charger Diablo IV</h1>
|
||||||
|
<p>{diablo4.error}</p>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!activeCategory) return <Diablo4Overview game={game} />;
|
||||||
|
|
||||||
|
return <Diablo4Listing diablo4={diablo4} filters={filters} setFilters={setFilters} />;
|
||||||
|
}
|
||||||
36
website/src/features/games/diablo4/utils.js
Normal file
36
website/src/features/games/diablo4/utils.js
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
export function normalizeText(value) {
|
||||||
|
return String(value || "").trim().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\s+/g, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatCategory(value) {
|
||||||
|
return String(value || "").replace(/_/g, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getCategoryId(category) {
|
||||||
|
return typeof category === "string" ? category : category?.id || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getCategoryLabel(category) {
|
||||||
|
return typeof category === "string" ? formatCategory(category) : category?.label || formatCategory(category?.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getCategoryIconStyle(category) {
|
||||||
|
const icon = typeof category === "string" ? "" : category?.icon;
|
||||||
|
return icon ? { "--diablo4-category-icon": `url("/static/img/diablo4/${icon}.svg")` } : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFilteredDiablo4Affixes({ affixes, filters }) {
|
||||||
|
const selected = filters.categories || [];
|
||||||
|
const search = normalizeText(filters.name);
|
||||||
|
|
||||||
|
return affixes.filter((affix) => {
|
||||||
|
const nameMatches = !search || normalizeText(affix.label).includes(search) || normalizeText(affix.id).includes(search);
|
||||||
|
if (!nameMatches) return false;
|
||||||
|
if (!selected.length) return true;
|
||||||
|
|
||||||
|
const categories = affix.categories || [];
|
||||||
|
return filters.logic === "or" && selected.length >= 2
|
||||||
|
? selected.some((category) => categories.includes(category))
|
||||||
|
: selected.every((category) => categories.includes(category));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@ import { assetPath } from "./utils.js";
|
||||||
|
|
||||||
export function MhwildsFilters({ category, filterKey, options, filters, setFilters, t }) {
|
export function MhwildsFilters({ category, filterKey, options, filters, setFilters, t }) {
|
||||||
const activeFilters = filters[category];
|
const activeFilters = filters[category];
|
||||||
const selected = new Set(activeFilters[filterKey]);
|
const selected = new Set(activeFilters[filterKey] || []);
|
||||||
const logicLabel = activeFilters.logic === "or" ? t("or", { capitalize: true }) : t("and", { capitalize: true });
|
const logicLabel = activeFilters.logic === "or" ? t("or", { capitalize: true }) : t("and", { capitalize: true });
|
||||||
const updateCategory = (updater) => setFilters((state) => ({ ...state, [category]: updater(state[category]) }));
|
const updateCategory = (updater) => setFilters((state) => ({ ...state, [category]: updater(state[category]) }));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,17 @@ import { useMemo } from "react";
|
||||||
import { EndemicCard } from "./cards/EndemicCard.jsx";
|
import { EndemicCard } from "./cards/EndemicCard.jsx";
|
||||||
import { MonsterCard } from "./cards/MonsterCard.jsx";
|
import { MonsterCard } from "./cards/MonsterCard.jsx";
|
||||||
import { MhwildsFilters } from "./MhwildsFilters.jsx";
|
import { MhwildsFilters } from "./MhwildsFilters.jsx";
|
||||||
import { getFilteredMhwildsItems, getUniqueConditionValues } from "./utils.js";
|
import { getFilteredMhwildsItems, getMhwildsFilterKey, getUniqueConditionValues } from "./utils.js";
|
||||||
|
|
||||||
export function MhwildsListing({ category, mhwilds, filters, setFilters, t }) {
|
export function MhwildsListing({ category, mhwilds, filters, setFilters, t }) {
|
||||||
const isMonsters = category === "monsters";
|
const isMonsters = category === "monsters";
|
||||||
const filterKey = isMonsters ? "weaknesses" : "locations";
|
const filterKey = getMhwildsFilterKey(category, mhwilds);
|
||||||
const items = isMonsters ? mhwilds.monsters : mhwilds.endemic;
|
const items = isMonsters ? mhwilds.monsters : mhwilds.endemic;
|
||||||
const options = getUniqueConditionValues(items, filterKey, t);
|
const options = (mhwilds.filterOptions?.[category]?.length ? mhwilds.filterOptions[category] : getUniqueConditionValues(items, filterKey, t))
|
||||||
const visible = useMemo(() => getFilteredMhwildsItems({ category, mhwilds, filters, t }), [category, mhwilds, filters, t]);
|
.filter((value) => value !== "none")
|
||||||
const label = isMonsters ? t("monsters", { capitalize: true }) : t("endemic life", { capitalize: true });
|
.sort((a, b) => t(a).localeCompare(t(b), "fr"));
|
||||||
|
const visible = useMemo(() => getFilteredMhwildsItems({ category, filterKey, mhwilds, filters, t }), [category, filterKey, mhwilds, filters, t]);
|
||||||
|
const label = isMonsters ? t("monsters", { capitalize: true }) : t("endemic_life", { capitalize: true });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,23 @@
|
||||||
import { assetPath } from "../utils.js";
|
import { assetPath } from "../utils.js";
|
||||||
|
|
||||||
|
const PHYSICAL_COLUMNS = ["cut", "blunt", "ammo"];
|
||||||
|
const ELEMENTAL_COLUMNS = ["fire", "water", "thunder", "ice", "dragon"];
|
||||||
|
const COLUMNS = ["name", ...PHYSICAL_COLUMNS, ...ELEMENTAL_COLUMNS];
|
||||||
|
|
||||||
|
function hitzoneValue(row, column) {
|
||||||
|
if (column === "name") return row.name;
|
||||||
|
return row.physical?.[column] ?? row.elemental?.[column];
|
||||||
|
}
|
||||||
|
|
||||||
export function DamageTable({ rows, t }) {
|
export function DamageTable({ rows, t }) {
|
||||||
if (!rows.length) return null;
|
if (!rows.length) return null;
|
||||||
|
|
||||||
const columns = Object.keys(rows[0]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="damage-table-wrap legacy-scrollbar">
|
<div className="damage-table-wrap legacy-scrollbar">
|
||||||
<table className="damage-table">
|
<table className="damage-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
{columns.map((column) => (
|
{COLUMNS.map((column) => (
|
||||||
<th key={column}>
|
<th key={column}>
|
||||||
{column === "name" ? "" : <img src={assetPath(column)} alt={t(column, { capitalize: true })} title={t(column, { capitalize: true })} />}
|
{column === "name" ? "" : <img src={assetPath(column)} alt={t(column, { capitalize: true })} title={t(column, { capitalize: true })} />}
|
||||||
</th>
|
</th>
|
||||||
|
|
@ -20,10 +27,10 @@ export function DamageTable({ rows, t }) {
|
||||||
<tbody>
|
<tbody>
|
||||||
{rows.map((row, rowIndex) => (
|
{rows.map((row, rowIndex) => (
|
||||||
<tr key={`${row.name}-${rowIndex}`}>
|
<tr key={`${row.name}-${rowIndex}`}>
|
||||||
{columns.map((column) => column === "name" ? (
|
{COLUMNS.map((column) => column === "name" ? (
|
||||||
<td key={column} title={t(row[column], { capitalize: true })}>{t(row[column], { capitalize: true })}</td>
|
<td key={column} title={t(row.name, { capitalize: true })}>{t(row.name, { capitalize: true })}</td>
|
||||||
) : (
|
) : (
|
||||||
<td key={column}><img src={assetPath(`${row[column]}-stars`)} alt={`${row[column]} étoiles`} /></td>
|
<td key={column}><img src={assetPath(`${hitzoneValue(row, column)}-stars`)} alt={`${hitzoneValue(row, column)} étoiles`} /></td>
|
||||||
))}
|
))}
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,10 @@ import { assetPath, getConditionValues, normalizeText } from "../utils.js";
|
||||||
export function EndemicCard({ item, t }) {
|
export function EndemicCard({ item, t }) {
|
||||||
const locations = getConditionValues(item.locations);
|
const locations = getConditionValues(item.locations);
|
||||||
const description = t(item.description);
|
const description = t(item.description);
|
||||||
const hasDescription = normalizeText(description) && normalizeText(description) !== normalizeText("à compléter");
|
const normalizedDescription = normalizeText(description);
|
||||||
|
const hasDescription = normalizedDescription
|
||||||
|
&& normalizedDescription !== normalizeText("à compléter")
|
||||||
|
&& normalizedDescription !== normalizeText("to be completed");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<article className="mhwilds-card endemic-card">
|
<article className="mhwilds-card endemic-card">
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ export function MonsterCard({ monster, t }) {
|
||||||
<p className="eyebrow">Détails</p>
|
<p className="eyebrow">Détails</p>
|
||||||
<h2>{t(monster.name, { capitalize: true })}</h2>
|
<h2>{t(monster.name, { capitalize: true })}</h2>
|
||||||
</div>
|
</div>
|
||||||
<DamageTable rows={monster.damage || []} t={t} />
|
<DamageTable rows={monster.hitzones || []} t={t} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
const MHWILDS_IMG_PATH = "/static/img/mhwilds";
|
const MHWILDS_IMG_PATH = "/static/img/mhwilds";
|
||||||
|
|
||||||
export function assetPath(name) {
|
export function assetPath(name) {
|
||||||
return encodeURI(`${MHWILDS_IMG_PATH}/${name}.png`);
|
return encodeURI(`${MHWILDS_IMG_PATH}/${String(name || "").replace(/_/g, " ")}.png`);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function normalizeText(value) {
|
export function normalizeText(value) {
|
||||||
|
|
@ -18,11 +18,16 @@ export function getUniqueConditionValues(items, property, translate) {
|
||||||
.sort((a, b) => translate(a).localeCompare(translate(b), "fr"));
|
.sort((a, b) => translate(a).localeCompare(translate(b), "fr"));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFilteredMhwildsItems({ category, mhwilds, filters, t }) {
|
export function getMhwildsFilterKey(category, mhwilds) {
|
||||||
|
const optionKey = mhwilds.filterOptionKeys?.[category];
|
||||||
|
if (optionKey === "elements") return "weaknesses";
|
||||||
|
return optionKey || (category === "monsters" ? "weaknesses" : "locations");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFilteredMhwildsItems({ category, filterKey, mhwilds, filters, t }) {
|
||||||
const items = category === "monsters" ? mhwilds.monsters : mhwilds.endemic;
|
const items = category === "monsters" ? mhwilds.monsters : mhwilds.endemic;
|
||||||
const activeFilters = filters[category];
|
const activeFilters = filters[category];
|
||||||
const filterKey = category === "monsters" ? "weaknesses" : "locations";
|
const selected = activeFilters[filterKey] || [];
|
||||||
const selected = activeFilters[filterKey];
|
|
||||||
const search = normalizeText(activeFilters.name);
|
const search = normalizeText(activeFilters.name);
|
||||||
|
|
||||||
return items.filter((item) => {
|
return items.filter((item) => {
|
||||||
|
|
|
||||||
|
|
@ -594,10 +594,29 @@ function App() {
|
||||||
const [siteContent, setSiteContent] = useState(DEFAULT_SITE_CONTENT);
|
const [siteContent, setSiteContent] = useState(DEFAULT_SITE_CONTENT);
|
||||||
const [games, setGames] = useState([]);
|
const [games, setGames] = useState([]);
|
||||||
const [gamesError, setGamesError] = useState("");
|
const [gamesError, setGamesError] = useState("");
|
||||||
const [mhwilds, setMhwilds] = useState({ loaded: false, loading: false, error: "", translations: {}, monsters: [], endemic: [] });
|
const [mhwilds, setMhwilds] = useState({
|
||||||
|
loaded: false,
|
||||||
|
loading: false,
|
||||||
|
error: "",
|
||||||
|
translations: {},
|
||||||
|
monsters: [],
|
||||||
|
endemic: [],
|
||||||
|
filterOptions: { monsters: [], endemic: [] },
|
||||||
|
filterOptionKeys: { monsters: "", endemic: "" }
|
||||||
|
});
|
||||||
|
const [diablo4, setDiablo4] = useState({
|
||||||
|
loaded: false,
|
||||||
|
loading: false,
|
||||||
|
error: "",
|
||||||
|
affixes: [],
|
||||||
|
filterOptions: { affixes: [] },
|
||||||
|
categoryMap: {},
|
||||||
|
filterOptionKeys: { affixes: "" }
|
||||||
|
});
|
||||||
const [filters, setFilters] = useState({
|
const [filters, setFilters] = useState({
|
||||||
monsters: { name: "", weaknesses: [], logic: "and" },
|
monsters: { name: "", weaknesses: [], logic: "and" },
|
||||||
endemic: { name: "", locations: [], logic: "and" }
|
endemic: { name: "", locations: [], logic: "and" },
|
||||||
|
diablo4: { name: "", categories: [], logic: "and" }
|
||||||
});
|
});
|
||||||
const [confirmModal, setConfirmModal] = useState(null);
|
const [confirmModal, setConfirmModal] = useState(null);
|
||||||
const [createModal, setCreateModal] = useState(null);
|
const [createModal, setCreateModal] = useState(null);
|
||||||
|
|
@ -636,19 +655,68 @@ function App() {
|
||||||
endemicResponse.json(),
|
endemicResponse.json(),
|
||||||
translationsResponse.json()
|
translationsResponse.json()
|
||||||
]);
|
]);
|
||||||
|
const monsterFilterKey = Object.keys(monstersJson).find((key) => key !== "monsters") || "";
|
||||||
|
const endemicFilterKey = Object.keys(endemicJson).find((key) => key !== "endemicLife" && key !== "aquaticLife") || "";
|
||||||
setMhwilds({
|
setMhwilds({
|
||||||
loaded: true,
|
loaded: true,
|
||||||
loading: false,
|
loading: false,
|
||||||
error: "",
|
error: "",
|
||||||
translations,
|
translations,
|
||||||
monsters: monstersJson.monsters || [],
|
monsters: monstersJson.monsters || [],
|
||||||
endemic: [...(endemicJson.endemicLife || []), ...(endemicJson.aquaticLife || [])]
|
endemic: [...(endemicJson.endemicLife || []), ...(endemicJson.aquaticLife || [])],
|
||||||
|
filterOptions: {
|
||||||
|
monsters: monstersJson[monsterFilterKey] || [],
|
||||||
|
endemic: endemicJson[endemicFilterKey] || []
|
||||||
|
},
|
||||||
|
filterOptionKeys: {
|
||||||
|
monsters: monsterFilterKey,
|
||||||
|
endemic: endemicFilterKey
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}).catch((error) => setMhwilds({ loaded: true, loading: false, error: error.message, translations: {}, monsters: [], endemic: [] }));
|
}).catch((error) => setMhwilds({
|
||||||
|
loaded: true,
|
||||||
|
loading: false,
|
||||||
|
error: error.message,
|
||||||
|
translations: {},
|
||||||
|
monsters: [],
|
||||||
|
endemic: [],
|
||||||
|
filterOptions: { monsters: [], endemic: [] },
|
||||||
|
filterOptionKeys: { monsters: "", endemic: "" }
|
||||||
|
}));
|
||||||
}, [route, mhwilds.loaded, mhwilds.loading]);
|
}, [route, mhwilds.loaded, mhwilds.loading]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!route.startsWith("/games/diablo4") || diablo4.loaded || diablo4.loading) return;
|
||||||
|
setDiablo4((state) => ({ ...state, loading: true }));
|
||||||
|
fetch("/data/diablo4/affixes_types.json")
|
||||||
|
.then(async (response) => {
|
||||||
|
if (!response.ok) throw new Error("Impossible de charger les données Diablo IV.");
|
||||||
|
const payload = await response.json();
|
||||||
|
const filterKey = Object.keys(payload).find((key) => key !== "affixes") || "";
|
||||||
|
const categories = payload[filterKey] || [];
|
||||||
|
setDiablo4({
|
||||||
|
loaded: true,
|
||||||
|
loading: false,
|
||||||
|
error: "",
|
||||||
|
affixes: payload.affixes || [],
|
||||||
|
filterOptions: { affixes: categories },
|
||||||
|
categoryMap: Object.fromEntries(categories.map((category) => [category.id, category])),
|
||||||
|
filterOptionKeys: { affixes: filterKey }
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((error) => setDiablo4({
|
||||||
|
loaded: true,
|
||||||
|
loading: false,
|
||||||
|
error: error.message,
|
||||||
|
affixes: [],
|
||||||
|
filterOptions: { affixes: [] },
|
||||||
|
categoryMap: {},
|
||||||
|
filterOptionKeys: { affixes: "" }
|
||||||
|
}));
|
||||||
|
}, [route, diablo4.loaded, diablo4.loading]);
|
||||||
|
|
||||||
const t = (key, { capitalize = false } = {}) => {
|
const t = (key, { capitalize = false } = {}) => {
|
||||||
const value = mhwilds.translations[key] || key;
|
const value = mhwilds.translations[key] || String(key || "").replace(/_/g, " ");
|
||||||
return capitalize ? value.charAt(0).toUpperCase() + value.slice(1) : value;
|
return capitalize ? value.charAt(0).toUpperCase() + value.slice(1) : value;
|
||||||
};
|
};
|
||||||
const getGame = (gameId) => games.find((item) => item.id === gameId);
|
const getGame = (gameId) => games.find((item) => item.id === gameId);
|
||||||
|
|
@ -829,6 +897,7 @@ function App() {
|
||||||
games={games}
|
games={games}
|
||||||
gamesError={gamesError}
|
gamesError={gamesError}
|
||||||
mhwilds={mhwilds}
|
mhwilds={mhwilds}
|
||||||
|
diablo4={diablo4}
|
||||||
filters={filters}
|
filters={filters}
|
||||||
setFilters={setFilters}
|
setFilters={setFilters}
|
||||||
t={t}
|
t={t}
|
||||||
|
|
|
||||||
188
website/src/styles/_diablo4.scss
Normal file
188
website/src/styles/_diablo4.scss
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
.game-card-placeholder {
|
||||||
|
display: grid;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
min-height: inherit;
|
||||||
|
place-items: center;
|
||||||
|
background:
|
||||||
|
radial-gradient(circle at 78% 22%, rgba(246, 196, 83, 0.18), transparent 28%),
|
||||||
|
radial-gradient(circle at 22% 70%, rgba(139, 92, 246, 0.28), transparent 38%),
|
||||||
|
linear-gradient(135deg, rgba(16, 20, 38, 0.92), rgba(53, 18, 45, 0.76));
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
font-size: clamp(1.8rem, 5vw, 3.3rem);
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-home-mark {
|
||||||
|
display: grid;
|
||||||
|
width: 100%;
|
||||||
|
height: 120px;
|
||||||
|
margin: 0;
|
||||||
|
place-items: center;
|
||||||
|
border-bottom: 1px solid rgba(246, 196, 83, 0.42);
|
||||||
|
background: rgba(5, 7, 17, 0.28);
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mhwilds-home-card .diablo4-home-mark {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-home-mark::before {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
width: 72px;
|
||||||
|
height: 72px;
|
||||||
|
background: currentColor;
|
||||||
|
filter: drop-shadow(0 16px 24px rgba(0, 0, 0, 0.44));
|
||||||
|
mask: url("/static/img/diablo4/cube.svg") center / contain no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-affix-grid {
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-affix-card {
|
||||||
|
min-height: 158px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-affix-card-body {
|
||||||
|
display: flex;
|
||||||
|
min-height: 100%;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
padding: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-affix-card h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: 1.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
gap: 4px;
|
||||||
|
margin-top: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list > span {
|
||||||
|
display: inline-flex;
|
||||||
|
min-height: 23px;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
border: 1px solid rgba(246, 196, 83, 0.22);
|
||||||
|
border-radius: var(--radius-pill);
|
||||||
|
background: rgba(246, 196, 83, 0.08);
|
||||||
|
color: var(--color-text-secondary);
|
||||||
|
font-size: 0.68rem;
|
||||||
|
font-weight: 800;
|
||||||
|
padding: 2px 6px;
|
||||||
|
text-transform: capitalize;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-filter-chip {
|
||||||
|
grid-template-columns: 18px 22px 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-filter-chip span {
|
||||||
|
text-transform: capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-icon {
|
||||||
|
display: inline-block;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
flex: 0 0 18px;
|
||||||
|
background: currentColor;
|
||||||
|
mask: var(--diablo4-category-icon) center / contain no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-filter-chip .diablo4-category-icon {
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
flex-basis: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .diablo4-category-icon {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
flex-basis: 12px;
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-purple .diablo4-category-icon {
|
||||||
|
color: #c4b5fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-purple {
|
||||||
|
border-color: rgba(168, 85, 247, 0.3);
|
||||||
|
background: rgba(168, 85, 247, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-gold .diablo4-category-icon {
|
||||||
|
color: #f6c453;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-gold {
|
||||||
|
border-color: rgba(246, 196, 83, 0.34);
|
||||||
|
background: rgba(246, 196, 83, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-blue .diablo4-category-icon {
|
||||||
|
color: #93c5fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-blue {
|
||||||
|
border-color: rgba(96, 165, 250, 0.34);
|
||||||
|
background: rgba(96, 165, 250, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-yellow .diablo4-category-icon {
|
||||||
|
color: #fde047;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-yellow {
|
||||||
|
border-color: rgba(250, 204, 21, 0.34);
|
||||||
|
background: rgba(250, 204, 21, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-red .diablo4-category-icon {
|
||||||
|
color: #f87171;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-red {
|
||||||
|
border-color: rgba(248, 113, 113, 0.34);
|
||||||
|
background: rgba(248, 113, 113, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-violet .diablo4-category-icon {
|
||||||
|
color: #a78bfa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-violet {
|
||||||
|
border-color: rgba(139, 92, 246, 0.34);
|
||||||
|
background: rgba(139, 92, 246, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tone-green .diablo4-category-icon {
|
||||||
|
color: #86efac;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-green {
|
||||||
|
border-color: rgba(74, 222, 128, 0.34);
|
||||||
|
background: rgba(74, 222, 128, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.diablo4-category-list .tone-purple .diablo4-category-icon,
|
||||||
|
.diablo4-category-list .tone-gold .diablo4-category-icon,
|
||||||
|
.diablo4-category-list .tone-blue .diablo4-category-icon,
|
||||||
|
.diablo4-category-list .tone-yellow .diablo4-category-icon,
|
||||||
|
.diablo4-category-list .tone-red .diablo4-category-icon,
|
||||||
|
.diablo4-category-list .tone-violet .diablo4-category-icon,
|
||||||
|
.diablo4-category-list .tone-green .diablo4-category-icon {
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
.game-card .card-cover {
|
.game-card .card-cover {
|
||||||
|
display: block;
|
||||||
|
height: 170px;
|
||||||
min-height: 170px;
|
min-height: 170px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
.mhwilds-home-grid {
|
.mhwilds-home-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, minmax(240px, 380px));
|
grid-template-columns: repeat(auto-fit, minmax(240px, 380px));
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: var(--space-4);
|
gap: var(--space-4);
|
||||||
margin-top: var(--space-6);
|
margin-top: var(--space-6);
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@
|
||||||
@use "toolboxes";
|
@use "toolboxes";
|
||||||
@use "overlays";
|
@use "overlays";
|
||||||
@use "mhwilds";
|
@use "mhwilds";
|
||||||
|
@use "diablo4";
|
||||||
@use "responsive";
|
@use "responsive";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue