import React from "react"; import { Box, VStack } from "@chakra-ui/react"; import { WarningTwoIcon } from "@chakra-ui/icons"; import { FaBug } from "react-icons/fa"; import { GlitchBadgeLayout, layerUsesHTML5 } from "../components/HTML5Badge"; function OutfitKnownGlitchesBadge({ appearance }) { const glitchMessages = []; const { petAppearance, items } = appearance; // Look for UC/Invisible/etc incompatibilities that we hid, that we should // just mark Incompatible someday instead. // // HACK: Most of this logic is copy-pasted from `useOutfitAppearance`. const petOccupiedZoneIds = new Set( petAppearance?.layers.map((l) => l.zone.id) ); const petRestrictedZoneIds = new Set( petAppearance?.restrictedZones.map((z) => z.id) ); const petOccupiedOrRestrictedZoneIds = new Set([ ...petOccupiedZoneIds, ...petRestrictedZoneIds, ]); for (const item of items) { const itemHasZoneRestrictedByPet = item.appearance.layers.some( (layer) => layer.bodyId !== "0" && petOccupiedOrRestrictedZoneIds.has(layer.zone.id) ); if (itemHasZoneRestrictedByPet) { glitchMessages.push( {item.name} isn't actually compatible with this special pet. We're still showing the old behavior, which is to hide the item. Fixing this is in our todo list, sorry for the confusing UI! ); } } // Look for items with the OFFICIAL_SWF_IS_INCORRECT glitch. for (const item of items) { const itemHasBrokenOnNeopetsDotCom = item.appearance.layers.some((l) => (l.knownGlitches || []).includes("OFFICIAL_SWF_IS_INCORRECT") ); const itemHasBrokenUnconvertedLayers = item.appearance.layers.some( (l) => (l.knownGlitches || []).includes("OFFICIAL_SWF_IS_INCORRECT") && !layerUsesHTML5(l) ); if (itemHasBrokenOnNeopetsDotCom) { glitchMessages.push( {itemHasBrokenUnconvertedLayers ? ( <> We're aware of a glitch affecting the art for {item.name}. Last time we checked, this glitch affected its appearance on Neopets.com, too. Hopefully this will be fixed once it's converted to HTML5! ) : ( <> We're aware of a previous glitch affecting the art for{" "} {item.name}, but it might have been resolved during HTML5 conversion. Please use the feedback form on the homepage to let us know if it looks right, or still looks wrong! Thank you! )} ); } } // Look for items with the OFFICIAL_SVG_IS_INCORRECT glitch. for (const item of items) { const itemHasOfficialSvgIsIncorrect = item.appearance.layers.some((l) => (l.knownGlitches || []).includes("OFFICIAL_SVG_IS_INCORRECT") ); if (itemHasOfficialSvgIsIncorrect) { glitchMessages.push( There's a glitch in the art for {item.name} that prevents us from showing the full-scale SVG version of the image. Instead, we're showing a PNG, which might look a bit blurry on larger screens. ); } } // Look for Dyeworks items that aren't converted yet. for (const item of items) { const itemIsDyeworks = item.name.includes("Dyeworks"); const itemIsConverted = item.appearance.layers.every(layerUsesHTML5); if (itemIsDyeworks && !itemIsConverted) { glitchMessages.push( {item.name} isn't converted to HTML5 yet, and our Classic DTI code often shows old Dyeworks items in the wrong color. Once it's converted, we'll display it correctly! ); } } // Check whether the pet has OFFICIAL_SVG_IS_INCORRECT. const petLayers = petAppearance?.layers || []; for (const layer of petLayers) { const layerHasOfficialSvgIsIncorrect = (layer.knownGlitches || []).includes( "OFFICIAL_SVG_IS_INCORRECT" ); if (layerHasOfficialSvgIsIncorrect) { glitchMessages.push( There's a glitch in the art for this pet's {layer.zone.label}{" "} zone that prevents us from showing the full-scale SVG version of the image. Instead, we're showing a PNG, which might look a bit blurry on larger screens. ); } } if (glitchMessages.length === 0) { return null; } return ( Known glitches {glitchMessages} } > ); } export default OutfitKnownGlitchesBadge;