.goody-combat-vfx{position:fixed;inset:0;z-index:9470;pointer-events:none;overflow:hidden}
.goody-combat-vfx>span{position:absolute;pointer-events:none}
.goody-vfx-sling{width:180px;height:150px;margin:-75px 0 0 -100px;transform-origin:100px 75px;filter:drop-shadow(0 3px 4px #150a20)}
.goody-vfx-sling svg{width:100%;height:100%;overflow:visible}
.goody-sling-wood{fill:none;stroke:#ac763f;stroke-width:15;stroke-linecap:round;stroke-linejoin:round}
.goody-sling-grip{fill:none;stroke:#6838a1;stroke-width:19;stroke-dasharray:3 3}
.goody-sling-band{fill:none;stroke:#e8b778;stroke-width:5;stroke-linecap:round}
.goody-vfx-sling circle{fill:#a4e951;stroke:#5a7930;stroke-width:3}
.goody-vfx-sling>img{position:absolute;left:100px;top:75px;width:52px;height:52px;object-fit:contain;margin-left:-26px;filter:drop-shadow(0 0 12px #9be55b)}
.goody-vfx-bomb{width:64px;height:64px;margin:-32px;filter:drop-shadow(0 0 8px #b0fb49) drop-shadow(0 0 17px #913dd6)}
.goody-vfx-bomb img{width:100%;height:100%;object-fit:contain}
.goody-vfx-bubble{width:17px;height:17px;margin:-8px;border-radius:50%;border:1px solid #d6ff95;background:radial-gradient(circle at 29% 23%,#fff 0 5%,#aaff6380 15%,#6ac71e66 60%,#adff61ba 80%,transparent);box-shadow:inset -2px -2px 5px #478027,0 0 9px #a5f55299}
.goody-vfx-bubble.is-purple{border-color:#e6b2ff;background:radial-gradient(circle at 29% 23%,#fff 0 5%,#d06aff90 15%,#8524be70 60%,#be64eeaa 80%,transparent);box-shadow:inset -2px -2px 5px #59216f,0 0 9px #ae55dfaa}
.goody-vfx-fly{width:7px;height:11px;border-radius:50%;background:#24202c;box-shadow:0 0 2px #e1ff93;z-index:4}
.goody-vfx-fly i,.goody-vfx-fly b{position:absolute;top:0;width:8px;height:5px;border-radius:70%;background:#def4ebbb;animation:goodyFlyWing 70ms ease-in-out infinite alternate}
.goody-vfx-fly i{right:4px;transform-origin:right bottom}.goody-vfx-fly b{left:4px;transform-origin:left bottom;animation-direction:alternate-reverse}
.goody-vfx-splatter{overflow:hidden;border-radius:18px}
.goody-vfx-splatter>b{position:absolute;left:var(--gx);top:var(--gy);width:var(--gs);height:var(--gs);background:radial-gradient(circle at 30% 25%,#fff6,transparent 28%),var(--gc);border-radius:43% 57% 34% 66% / 55% 42% 58% 45%;box-shadow:8px -11px 0 -8px var(--gc),-17px 9px 0 -11px var(--gc),14px 18px 0 -10px var(--gc);opacity:0;animation:goodySlimeSpread 1100ms cubic-bezier(.16,.8,.2,1) var(--gd) both}
.goody-vfx-splatter>b::after{content:'';position:absolute;top:65%;left:40%;width:15%;height:65%;background:var(--gc);border-radius:0 0 80% 80%;transform-origin:top;animation:goodySlimeDrip 1100ms ease-in both}
.goody-vfx-shock{position:absolute;left:50%;top:44%;width:75px;height:75px;margin:-38px;border:5px solid var(--goody-splash-a,#c2fc77);border-radius:50%;box-shadow:0 0 24px var(--goody-splash-b,#ab58f7),inset 0 0 18px var(--goody-splash-a,#b3ff80);animation:goodyImpactRing 650ms ease-out both}
.goody-vfx-forge{width:230px;height:230px;margin:-115px;filter:drop-shadow(0 0 13px #9deb56)}
.goody-vfx-forge>img{position:absolute;inset:70px;width:90px;height:90px;object-fit:contain;animation:goodyForgeBomb 450ms ease-in-out infinite alternate}
.goody-vfx-forge>i{position:absolute;inset:5px;border:3px dashed #c5f477;border-radius:50%;box-shadow:0 0 16px #7fc94a88;animation:goodyForgeSpin 1800ms linear infinite}
.goody-vfx-forge>i:nth-child(2){inset:30px;border-color:#c379ff;animation-direction:reverse}.goody-vfx-forge>i:nth-child(3){inset:52px;border:1px solid #d9ff9f;background:radial-gradient(circle,#9953d259,transparent 70%)}
.goody-vfx-forge>b{position:absolute;left:50%;top:50%;width:40px;height:40px;margin:-20px;transform:rotate(var(--ga)) translateX(100px);animation:goodyForgeOrbit 1800ms ease-in-out both}
.goody-vfx-forge>b img{width:100%;height:100%;object-fit:contain}
@keyframes goodyFlyWing{to{transform:scaleX(.25) rotate(40deg)}}
@keyframes goodySlimeSpread{0%{transform:translate(-50%,-50%) scale(.05);opacity:0}16%{transform:translate(-50%,-50%) scale(1.25);opacity:.8}38%{transform:translate(-50%,-50%) scale(1);opacity:.72}100%{transform:translate(-50%,-30%) scale(1.05);opacity:0}}
@keyframes goodySlimeDrip{from{transform:scaleY(.05)}to{transform:scaleY(1.7)}}
@keyframes goodyImpactRing{from{transform:scale(.1);opacity:1}to{transform:scale(4);opacity:0}}
@keyframes goodyForgeSpin{to{transform:rotate(360deg)}}
@keyframes goodyForgeBomb{to{transform:rotate(9deg) scale(1.12)}}
@keyframes goodyForgeOrbit{0%{transform:rotate(var(--ga)) translateX(30px) scale(.1);opacity:0}35%{opacity:1}75%{opacity:1}100%{transform:rotate(calc(var(--ga) + 270deg)) translateX(125px) scale(1.15);opacity:0}}
/* Halloween ornaments retain the existing bomb and splatter palette. */
.goody-vfx-haunt{width:34px;height:34px;margin:-17px;z-index:4;filter:drop-shadow(0 0 5px #6B1885) drop-shadow(0 0 3px #22E5BB70)}
.goody-vfx-haunt svg,.goody-vfx-spooky-splat svg,.goody-vfx-forge>b>svg{display:block;width:100%;height:100%;overflow:visible}
.goody-combat-vfx[data-goody-theme="halloween"] .goody-vfx-spooky-splat{z-index:2;background:none;border-radius:0;box-shadow:none;filter:drop-shadow(0 0 4px #2E1338);animation-name:goodySpookySplat}
.goody-combat-vfx[data-goody-theme="halloween"] .goody-vfx-spooky-splat::after{content:none}
.goody-combat-vfx[data-goody-theme="halloween"] .goody-vfx-forge>b>svg{filter:drop-shadow(0 0 5px #6B1885)}
@keyframes goodySpookySplat{0%{transform:translate(-50%,-50%) scale(.2) rotate(-12deg);opacity:0}18%{transform:translate(-50%,-50%) scale(1.15) rotate(6deg);opacity:1}65%{transform:translate(-50%,-65%) scale(1);opacity:1}100%{transform:translate(-50%,-95%) scale(.9) rotate(-8deg);opacity:0}}
@media(prefers-reduced-motion:reduce){.goody-combat-vfx *,.goody-combat-vfx *::after{animation-duration:1ms!important;animation-iteration-count:1!important}.goody-combat-vfx[data-goody-theme="halloween"] .goody-vfx-spooky-splat{animation:none!important;opacity:1;transform:translate(-50%,-50%)}}
