Flowr QoL

A QoL script for Flowr!

// ==UserScript==
// @name         Flowr QoL
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  A QoL script for Flowr!
// @author       Suprinister
// @match        https://flowr.fun/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @license      Apache-2.0
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    Colors.rarities[9] = {"name":"Fabled","color":"#ff5500","border":"#cf4500","fancy":{"border":"#cf4500","hue":10,"light":60,"sat":95,"spread":20,"period":1.5}};

    const ogColors = JSON.parse(JSON.stringify(Colors.rarities));

    let pressedG = false;

    window.addEventListener('keydown', event => {
        if (event.code === 'KeyG') {
            pressedG = true;
        };
    });

    window.addEventListener('keyup', event => {
        if (event.code === 'KeyG') {
            pressedG = false;
        };
    });

    let performanceMode = (localStorage.getItem('performanceMode') ?? 'false') === 'false' ? false : true;

    if (performanceMode) {
        for (let i = 0; i < Colors.rarities.length; i++) {
            delete Colors.rarities[i].fancy;
        };

        blendAmount = function(p) {
            return 0;
        };
    };

    for (let i = 7; i <= 12; i++) {
        settingsMenu.options[i].screenPosition.y += 50;
    };

    settingsMenu.options.splice(7, 0, {
        changeTime: 0,
        name: 'Performance mode',
        screenPosition: {
            x: 125,
            y: 386,
            w: 28,
            h: 28
        },
        state: performanceMode,
        toggleFn(state) {
            performanceMode = state;
            localStorage.setItem('performanceMode', state);

            if (state) {
                for (let i = 0; i < Colors.rarities.length; i++) {
                    delete Colors.rarities[i].fancy;
                };

                blendAmount = function(p) {
                    return 0;
                };
            } else {
                Colors.rarities = JSON.parse(JSON.stringify(ogColors));

                blendAmount = function(p) {
                    return Math.max(0, 1 - p.ticksSinceLastDamaged / 166.5);
                };
            };
        },
        type: 'toggle'
    });

    settingsMenu.h += 50;
    settingsMenu.offset = -settingsMenu.h - 40;
    settingsMenu.targetOffset = -settingsMenu.h - 40;

    Flower.prototype.draw = function() {
        if(this.id !== window.selfId){
            this.updateInterpolate();
        }

        this.updatePetsAndProjectiles();

        for(let i = 0; i < this.deadProjectiles.length; i++){
            if(toRender({x: this.deadProjectiles[i].render.x, y: this.deadProjectiles[i].render.y, radius: this.deadProjectiles[i].radius}, window.camera) === true){
                this.deadProjectiles[i].draw();
            }
            this.deadProjectiles[i].updateTimer();
        }

        

        this.ticksSinceLastDamaged += dt;
        if(this.ticksSinceLastDamaged > 666){
            this.beforeStreakHp = this.hp;
        }
        
        renderHpBar({
            x: this.render.headX,
            y: this.render.headY - this.render.radius / 3,
            radius: this.render.radius,
            hp: this.render.hp,
            maxHp: this.maxHp,
            shield: this.render.shield,
            beforeStreakHp: this.render.beforeStreakHp,
            flowerName: this.name,
            flowerUsername: this.username
        },this);

        if(this.petalAlpha !== undefined){
            ctx.globalAlpha = this.petalAlpha;
        }

        if (this.id == window.selfId){
            petalReloadData = {};
            petalHpData = {};
        }
        for(let i = 0; i < this.petals.length; i++){
            let petal = this.petals[i];
            if(toRender({x: petal.render.x, y: petal.render.y, radius: petal.radius}, window.camera) === true){
                if (!petal.dead && pressedG) {
                    ctx.beginPath();

                    ctx.font = '900 12px Ubuntu';
                    ctx.lineWidth = 5;
                    ctx.globalAlpha = 1;
                    ctx.fillStyle = Colors.rarities[petal.rarity].color;
                    ctx.strokeStyle = 'black';
                    ctx.strokeText(Colors.rarities[petal.rarity].name, petal.render.x, petal.render.y + petal.radius * 1.75 + 7);
                    ctx.fillText(Colors.rarities[petal.rarity].name, petal.render.x, petal.render.y + petal.radius * 1.75 + 7);

                    ctx.globalAlpha = 0.5;
                    ctx.arc(petal.render.x, petal.render.y, petal.radius * 1.75, 0, 2 * Math.PI);
                    ctx.fill();

                    ctx.globalAlpha = 1;

                    ctx.closePath();
                };
                
                petal.draw();
            }
            if (this.id == window.selfId){
                let containerId = petal.petalContainerId;
                if (!petalReloadData[containerId]){
                    if (petal.dead){
                        petalReloadData[containerId] = {
                            reload: petal.render.reload/petal.maxReload
                        }
                    }
                }
                else{
                    if (petalReloadData[containerId].reload < petal.render.reload/petal.maxReload && petal.dead){
                        petalReloadData[containerId].reload = petal.render.reload/petal.maxReload;
                    }
                }

                if (!petalHpData[containerId]){
                    if (!petal.dead){
                        petalHpData[containerId] = {
                            hp: petal.render.hp/petal.maxHp,
                            count: 1
                        }
                    }
                }
                else{
                    if(!petal.dead){
                        petalHpData[containerId].hp = (petalHpData[containerId].count * petalHpData[containerId].hp + petal.render.hp/petal.maxHp)/(petalHpData[containerId].count+1);
                        petalHpData[containerId].count++;
                    }
                }
            }
            petal.updateTimer();
        }
        ctx.globalAlpha = 1;
        
        if(toRender({x: this.render.headX, y: this.render.headY, radius: this.render.radius}, window.camera) === true){
            this.drawFlower(this.render.headX, this.render.headY, this.radius);
        }
        if (this.lightnings){
            if (this.lightnings.length > 0){
                this.lightnings = this.lightnings.filter((e) => time < (e.time+600))
                ctx.strokeStyle = "#97f0ea";
                ctx.lineWidth = 3;
                for(let i of this.lightnings){
                    ctx.globalAlpha = (1-(time-i.time)/700);
                    ctx.beginPath();
                    for(let j = 0; j < i.renderData.length; j++){
                        ctx.lineTo(i.renderData[j].x, i.renderData[j].y);
                    }
                    ctx.stroke();
                    ctx.closePath();
                }
            }     
        }
    }

    PetalContainer.prototype.draw = function(inGame, number, crafting = false) {
        this.updateInterpolate();

        if(this.toOscillate === true && toRender({x: this.render.x, y: this.render.y, radius: this.radius}, window.camera) === false && this.toSkipCulling !== true){
            return;
        }

        const renderAnimationTimer = smoothstep(this.spawnAnimation);

        let scale = 1;
        let rotation = 0;

        ctx.lastTransform = ctx.getTransform();
        ctx.translate(this.render.x, this.render.y);
        scale *= renderAnimationTimer * this.render.w / 50;

        rotation -= (1 - renderAnimationTimer) * Math.PI * 3;
        if(this.isDraggingPetalContainer === true){
            if(this.draggingTimer === undefined)this.draggingTimer = 0;
            this.draggingTimer += 1000 / 30 * dt/16.66;
            rotation += Math.sin(this.draggingTimer / 280) * 0.28;
            if(this !== draggingPetalContainer){
                this.isDraggingPetalContainer = false;
                this.undraggingPetalContainerTimer = 30;
                this.lastDraggingAngle = Math.sin(this.draggingTimer / 280) * 0.28;
            }
        } else if(this.undraggingPetalContainerTimer !== undefined){
            if(this.interval === undefined){
                this.lastDraggingAngle = interpolate(this.lastDraggingAngle, 0, 0.15);
                rotation += this.lastDraggingAngle;
                this.undraggingPetalContainerTimer--;
                if(this.undraggingPetalContainerTimer < 0){
                    delete this.undraggingPetalContainerTimer;
                    delete this.lastDraggingAngle;
                    delete this.draggingTimer;
                }
            }
        }

        if(this.toOscillate === true){
            scale *= 1+Math.sin(performance.now()/ 1000 / .076)/52;
            rotation += this.angleOffset;
        }

        if(rotation !== 0)ctx.rotate(rotation);
        if(scale !== 1)ctx.scale(scale, scale);
        if(this.toOscillate === true && this.isDisplayPetalContainer !== true){
            ctx.globalAlpha = 0.3;
            ctx.fillStyle = 'black';
            ctx.beginPath();
            ctx.roundRect(-30, -30, 60, 60, 5);
            ctx.fill();
            ctx.closePath();
            ctx.globalAlpha = 1;
        }

        ctx.lineWidth = 4.5;

        currentBiome = biomeManager.getCurrentBiome();
        this.greyed = (this.customBiome !== undefined && window.officialBiomes.includes(currentBiome) === true) || (crafting && this.amount < 5);
        if(this.type === 'soccer petal' && currentBiome !== 'Soccer!') this.greyed = true;
        if(this.greyed){
            ctx.globalAlpha = 0.3;
            ctx.fillStyle = "#525252";
            ctx.strokeStyle = "#404040";
        } else {
            ctx.fillStyle = Colors.rarities[this.rarity].color;
            ctx.strokeStyle = Colors.rarities[this.rarity].border;
        }

        if((currentBiome === '1v1' && this.generatedIn1v1 === false) || (currentBiome !== '1v1' && this.generatedIn1v1 === true)){
            if(pregeneratedPvpStats === undefined) generatePvpStats();
            let statsToTake;
            if(currentBiome === '1v1'){
                statsToTake = pregeneratedPvpStats;
            } else {
                statsToTake = Stats;
            }

            if(this.petals.length !== 0 && this.petals[0].team !== undefined){
                statsToTake = statsToTake.enemies;
            } else {
                statsToTake = statsToTake.petals;
            }

            let petalAmount = 0;
            if(statsToTake[this.type] !== undefined && statsToTake[this.type][this.rarity] !== undefined){
                const petalLayout = statsToTake[this.type][this.rarity].petalLayout;
                if(petalLayout === undefined) petalAmount = 1;
                else {
                    for(let i = 0; i < petalLayout.length; i++){
                        for(let j = 0; j < petalLayout[i].length; j++){
                            petalAmount++;
                        }
                    }
                }
            } else {
                petalAmount = 1;
            }

            if(petalAmount < this.petals.length){
                this.petals.length = petalAmount;
            } else {
                while(this.petals.length < petalAmount){
                    this.petals.push(new Petal(this.petals[Math.floor(Math.random() * this.petals.length)]));
                }
            }
            this.generatedIn1v1 = !this.generatedIn1v1;
        }

        if (Colors.rarities[this.rarity].fancy !== undefined){
            const gradientFill = ctx.createLinearGradient(-30, -30, 30, 30);
            createFancyGradient(gradientFill, this.rarity);
            ctx.fillStyle = gradientFill;
            ctx.strokeStyle = Colors.rarities[this.rarity].fancy.border;
        }

        ctx.beginPath();
        ctx.roundRect(-25, -25, 50, 50, .25);
        ctx.fill();
        ctx.stroke();
        ctx.closePath();

        if(Colors.rarities[this.rarity].fancy !== undefined && Colors.rarities[this.rarity].fancy.stars !== undefined){
            ctx.save();
            if(!this.stars){
                this.stars = [];
                for(let starnum = 0; starnum < Colors.rarities[this.rarity].fancy.stars; starnum++){
                    this.stars.push({x: Math.random()*50 - 25, y: Math.random()*50 - 25})
                }
            }
            ctx.shadowBlur = 20;
            ctx.shadowColor = "white";
            ctx.fillStyle = "#ffffff";
            for(let star of this.stars){
                star.x+=0.1;
                star.y+=0.1;
                if(star.x >30 || star.y >30){
                    star.x = Math.random()*800 - 20 - 30;
                    star.y = -30;

                }

                if(star.x < -30 || star.x > 30 || star.y < -30 || star.y > 30){
                    continue;
                }
                ctx.beginPath();

                var grad = ctx.createRadialGradient(star.x, star.y,15,star.x, star.y,0);
                grad.addColorStop(0,"transparent");
                grad.addColorStop(0.8,`rgba(255,255,255,${(Math.cos(Date.now()/600+ star.x/30 + star.y/30) + 1)*0.8})`);
                grad.addColorStop(1,"white");

                ctx.fillStyle = grad;
                ctx.globalAlpha = 0.3;

                ctx.fillRect(-20.5, -20.5, 41,41);
                ctx.globalAlpha = 1;
                if(star.x < 20.5 && star.x > -20.5 && star.y < 20.5 && star.y > -20.5){

                    ctx.fillStyle = "#fff";

                    ctx.arc(star.x, star.y, 1, 0, 2*Math.PI);
                    ctx.fill();
                }
                ctx.closePath();
            }
            ctx.restore();
        }

        if (inGame){
            if (petalReloadData[number]){
                if (petalReloadData[number].reload > 0.001 && petalReloadData[number].reload < 0.999){
                    ctx.save();
                    ctx.beginPath();
                    ctx.roundRect(-25, -25, 50, 50, .25);
                    ctx.clip();

                    ctx.globalAlpha = 0.3;
                    ctx.lineCap = "butt";

                    let offset = (1-Math.pow(petalReloadData[number].reload, 0.7))*Math.PI*6 + this.randomAngle;

                    ctx.strokeStyle = "#000000";
                    ctx.lineWidth = 50;
                    ctx.beginPath();
                    ctx.arc(0, 0, 25, offset - Math.PI * 2 * smoothstep(petalReloadData[number].reload), offset);
                    ctx.stroke();
                    ctx.closePath();

                    ctx.restore();
                }
            }else if(petalHpData[number]){
                if (petalHpData[number].hp > 0.001 && petalHpData[number].hp < 0.999){
                    ctx.save();
                    ctx.beginPath();
                    ctx.roundRect(-23, -23, 46, 46, .25);
                    ctx.clip();

                    ctx.globalAlpha = 0.3;
                    ctx.lineCap = "butt";

                    ctx.fillStyle = "#000000";
                    ctx.beginPath();
                    ctx.rect(-25, -25, 50, 50 * (1-petalHpData[number].hp));
                    ctx.fill();
                    ctx.closePath();

                    ctx.restore();
                }

            }
        }

        if(this.greyed)ctx.globalAlpha = 1;

        if(this.toRenderText === false){
            ctx.translate(0, 3.5);
        }

        if(this.type === 'Wing'){
            ctx.translate(0, -1.8);
        }

        if(this.petals.length === 1){
            this.petals[0].render.x = 0
            this.petals[0].render.y = 0

            let scaleMult = .8;
            if(this.petals[0].radius * .8 > 13.25/2){
                scaleMult = 13.25/(this.petals[0].radius*.8)/2;
            }
            if(petalContainerRenderSizeMultsMap[this.petals[0].type] !== undefined){
                if (typeof petalContainerRenderSizeMultsMap[this.petals[0].type] == "object"){
                    if (petalContainerRenderSizeMultsMap[this.petals[0].type][this.petals[0].rarity]){
                        scaleMult *= petalContainerRenderSizeMultsMap[this.petals[0].type][this.petals[0].rarity];
                    }
                }
                else{
                    scaleMult *= petalContainerRenderSizeMultsMap[this.petals[0].type];
                }
            }

            let individualRotate = false;
            if(petalContainerIndividualRotate[this.petals[0].type] !== undefined){
                if (typeof petalContainerIndividualRotate[this.petals[0].type] == "object"){
                    if (petalContainerIndividualRotate[this.petals[0].type][this.petals[0].rarity]){
                        individualRotate = petalContainerIndividualRotate[this.petals[0].type][this.petals[0].rarity];
                    }
                }
                else{
                    individualRotate = petalContainerIndividualRotate[this.petals[0].type];
                }
            }

            let last = {y: this.petals[0].render.y, selfAngle: this.petals[0].selfAngle};
            this.petals[0].render.y -= 4;
            this.petals[0].scaleMult = scaleMult;
            if(individualRotate !== false)this.petals[0].selfAngle += individualRotate;

            if(this.greyed === true)window.alphaMult = 0.4;
            this.petals[0].draw();
            this.petals[0].render.y = last.y;
            delete this.petals[0].scaleMult;
            this.petals[0].selfAngle = last.selfAngle;
        } else {
            let petalRadius = (this.petals[0] ?? {radius: 0}).radius;
            if((this.petals[0] ?? {type: 'not peas'}).type === 'Peas'){
                petalRadius -= 0.2;
            }
            let radius = Math.min(petalRadius * 1.16, 25 - petalRadius);

            let greaterThanMargin = petalRadius * .8 + radius - 13.25;
            if(greaterThanMargin > 0){
                radius -= greaterThanMargin;
                if(radius < 8){
                    greaterThanMargin = 8-radius;
                    radius = 8;
                    petalRadius *= 1 / (greaterThanMargin/13.25+1);
                    for(let i = 0; i < this.petals.length; i++){
                        this.petals[i].radius = petalRadius;
                    }
                }
            }
            if (petalContainerMultPetalRadiusMap[this.petals[0].type] !== undefined){
                if (typeof petalContainerMultPetalRadiusMap[this.petals[0].type] == "object"){
                    if (petalContainerMultPetalRadiusMap[this.petals[0].type][this.petals[0].rarity]){
                        radius *= petalContainerMultPetalRadiusMap[this.petals[0].type][this.petals[0].rarity];
                    }
                }
                else{
                    radius *= petalContainerMultPetalRadiusMap[this.petals[0].type];
                }
            }
            let toPointToCenter = ['Stinger'].includes((this.petals[0] ?? {type: "Basic"}).type) && (this.petals[0] ?? {rarity: 0}).rarity > 5;
            if (toPointToCenter == true){
                toPointToCenter = 0;
            }
            if (pointToCenterPetals[this.petals[0].type] !== undefined){
                if (typeof pointToCenterPetals[this.petals[0].type] == "object"){
                    if (pointToCenterPetals[this.petals[0].type][this.petals[0].rarity]){
                        toPointToCenter = pointToCenterPetals[this.petals[0].type][this.petals[0].rarity];
                    }
                }
                else{
                    toPointToCenter = pointToCenterPetals[this.petals[0].type];
                }
            }
            for(let i = 0; i < this.petals.length; i++){
                let rotateOffset = 0;
                if (petalContainerRotateMap[this.petals[0].type]){
                    rotateOffset = petalContainerRotateMap[this.petals[0].type];
                }
                const angle = Math.PI * 2 * i / this.petals.length + rotateOffset;
                this.petals[i].render.x = 0
                this.petals[i].render.y = 0

                let scaleMult = .8;
                if(petalContainerRenderSizeMultsMap[this.petals[0].type] !== undefined){
                    if (typeof petalContainerRenderSizeMultsMap[this.petals[0].type] == "object"){
                        if (petalContainerRenderSizeMultsMap[this.petals[0].type][this.petals[0].rarity]){
                            scaleMult *= petalContainerRenderSizeMultsMap[this.petals[0].type][this.petals[0].rarity];
                        }
                    }
                    else{
                        scaleMult *= petalContainerRenderSizeMultsMap[this.petals[0].type];
                    }
                }

                let last = {x: this.petals[i].render.x, y: this.petals[i].render.y, selfAngle: this.petals[i].selfAngle};
                this.petals[i].render.x += Math.cos(angle) * radius * scaleMult/.8;
                this.petals[i].render.y += Math.sin(angle) * radius * scaleMult/.8 - 4;
                this.petals[i].scaleMult = scaleMult;
                if(toPointToCenter !== false)this.petals[i].selfAngle += angle+Math.PI+toPointToCenter;
                if(this.greyed === true)window.alphaMult = 0.4;
                this.petals[i].draw();
                this.petals[i].render.x = last.x;
                this.petals[i].render.y = last.y;
                delete this.petals[i].scaleMult;
                this.petals[i].selfAngle = last.selfAngle;
            }
        }

        if(this.type === 'Wing'){
            ctx.translate(0, 1.8);
        }

        if(this.toRenderText === false){
            ctx.translate(0, -3.5);
        }

        if(this.toRenderText === undefined){
            if(this.type === "Dandelion" || this.type === "Neutron Star" || this.type === "Mini Flower"){
                ctx.font = '900 8.5px Ubuntu';
                ctx.letterSpacing = "-.1px";
            } else if(this.type === "Lightning" || this.type === "Pentagon" || this.type === "Hexagon" || this.type == "Plastic Egg"){
                ctx.font = '900 9.5px Ubuntu';
                ctx.letterSpacing = "-.1px";
            } else {
                ctx.font = '900 11px Ubuntu';
                ctx.letterSpacing = "-.05px";
            }
            ctx.textBaseline = 'middle';
            ctx.textAlign = 'center';
            ctx.fillStyle = 'white';
            ctx.strokeStyle = 'black';
            ctx.lineWidth = 1.35;

            ctx.fontKerning = "none";

            let type = this.type;
            if (type == "Fire Missile"){
                type = "Missile";
            }
            if (type == "Dark Compass"){
                type = "Compass";
            }
            if (type == "Waterlogged Compass"){
                type = "Compass"
            }
            if (type == "Plastic Egg"){
                type = "Egg";
            }
            if (type == "Jellyfish Egg"){
                type = "Egg";
            }
            if (type == "Oranges" && this.rarity >= 12){
                type = "Orange";
            }

            if(this.greyed) ctx.globalAlpha = 0.3;
            ctx.strokeText(type, 0, 13.25);
            ctx.fillText(type, 0, 13.25);
            ctx.globalAlpha = 1;
        }

        if(scale !== 1)ctx.scale(1/scale, 1/scale);
        if(rotation !== 0)ctx.rotate(-rotation);

        if(this.amount !== 1 || (performance.now() - this.lastAmountChangedTime < 240)){
            if(performance.now() - this.lastAmountChangedTime < 240){
                ctx.globalAlpha = smoothstep((performance.now() - this.lastAmountChangedTime) / 240);
            }
            if(this.amount === 1){
                ctx.globalAlpha = 1 - ctx.globalAlpha;
            }
            ctx.font = `600 ${13 * scale}px Ubuntu`;
            ctx.letterSpacing = "1px";
            ctx.textBaseline = 'middle';
            ctx.textAlign = 'right';
            ctx.fillStyle = 'white';
            ctx.strokeStyle = 'black';
            ctx.lineWidth = 2;
            ctx.translate((70/(2.5) + .5) * scale, (-42/(2.5) + .5) * scale);
            ctx.rotate(Math.PI / 9.1);
            if(this.greyed) ctx.globalAlpha *= 0.3;
            ctx.strokeText('x' + (this.amount === 1 ? 2 : formatAmount(this.amount)), 0, 0);
            ctx.fillText('x' + (this.amount === 1 ? 2 : formatAmount(this.amount)), 0, 0);
            ctx.globalAlpha = 1;
        }
        ctx.setTransform(ctx.lastTransform);
        delete ctx.lastTransform;
    };

    craftingMenu.drawInventory = function(alpha = 1) {
        this.render.scroll = interpolate(this.render.scroll, this.scroll, 0.0070 * dt);

        if (alpha !== 1) {
            ctx.globalAlpha = alpha;
        }
        let translation = 0;
        if (time - this.lastCloseTime < 160) {
            translation += this.h * easeOutCubic((time - this.lastCloseTime) / 160);
        }
        if (time - this.lastOpenTime < 160) {
            translation += (this.h + 40) - (this.h + 40) * easeOutCubic((time - this.lastOpenTime) / 160);
        }
        if (translation !== 0) {
            ctx.translate(0, translation);
        }

        ctx.translate(130, canvas.h - this.h - 20);
        ctx.fillStyle = this.getMainFill();
        ctx.strokeStyle = this.getMainStroke();
        ctx.lineWidth = 8;

        ctx.beginPath()
        ctx.roundRect(0, 0, this.w, this.h, 3);
        ctx.fill();
        ctx.stroke();
        ctx.closePath();

        ctx.fillStyle = '#f0f0f0';
        ctx.strokeStyle = 'black';
        ctx.lineWidth = 3.75;
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        ctx.font = `900 32px Ubuntu`;
        ctx.strokeText("Craft", this.w / 2, 29);
        ctx.fillText("Craft", this.w / 2, 29);

        if (this.craftingAnimationState === true) {
            this.runCraftingAnimation();
        }
        if (this.craftingAnimationState === "display") {
            this.displayPetalContainer.x = this.craftingPetalSlotsDimensions.x + this.displayPetalContainer.render.w * .35;
            this.displayPetalContainer.y = this.craftingPetalSlotsDimensions.y + this.displayPetalContainer.render.h * .35;
            this.displayPetalContainer.render.x = this.displayPetalContainer.x;
            this.displayPetalContainer.render.y = this.displayPetalContainer.y;
            this.displayPetalContainer.draw();
        } else {
            for (let i = 0; i < this.craftingPetalSlots.length; i++) {
                ctx.fillStyle = '#b17f49';
                ctx.beginPath();
                ctx.roundRect(this.craftingPetalSlots[i].x, this.craftingPetalSlots[i].y, this.craftingPetalSlots[i].w, this.craftingPetalSlots[i].h, 8);
                ctx.fill();
                ctx.closePath();

                if (this.craftingPetalContainers[i] !== undefined) {
                    const pc = this.craftingPetalContainers[i];
                    pc.x = this.craftingPetalSlots[i].x + this.craftingPetalSlots[i].w / 2;
                    pc.y = this.craftingPetalSlots[i].y + this.craftingPetalSlots[i].h / 2;
                    pc.draw();
                }
            }
        }

        if (mouseInBox({ x: mouse.canvasX, y: mouse.canvasY }, { x: this.craftingButton.x - this.craftingButton.w / 2 + 130, y: this.craftingButton.y - this.craftingButton.h / 2 + canvas.h - this.h - 20, w: this.craftingButton.w, h: this.craftingButton.h }) === true && this.craftingAnimationState === false) {
            this.hoveringOverCraftButton = true;
        } else {
            this.hoveringOverCraftButton = false;
        }
        ctx.letterSpacing = "0px";
        let fillcolor = "#777777"
        let strokecolor = "#555555";
        if (this.craftingPetalContainers[0] !== undefined) {
            if (Colors.rarities[this.craftingPetalContainers[0].rarity + 1]) {
                fillcolor = Colors.rarities[this.craftingPetalContainers[0].rarity + 1].color;
                strokecolor = Colors.rarities[this.craftingPetalContainers[0].rarity + 1].border;

                if (this.hoveringOverCraftButton) {
                    fillcolor = blendColor(fillcolor, "#ffffff", 0.1);
                    strokecolor = blendColor(strokecolor, "#ffffff", 0.03)
                }
            }
        }
        ctx.lineWidth = 7;
        ctx.fillStyle = fillcolor;
        ctx.strokeStyle = strokecolor;
        ctx.beginPath();
        ctx.roundRect(this.craftingButton.x - this.craftingButton.w / 2, this.craftingButton.y - this.craftingButton.h / 2, this.craftingButton.w, this.craftingButton.h, 4);
        ctx.fill();
        ctx.stroke();
        ctx.closePath();

        ctx.fillStyle = '#f0f0f0';
        ctx.strokeStyle = 'black';
        ctx.lineWidth = 2.25;
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        ctx.font = `900 22px Ubuntu`;
        ctx.strokeText("Craft", this.craftingButton.x, this.craftingButton.y);
        ctx.fillText("Craft", this.craftingButton.x, this.craftingButton.y);
        if (this.craftingPetalContainers[0]) {
            ctx.fillStyle = '#f0f0f0';
            ctx.strokeStyle = 'black';
            ctx.lineWidth = 2.25;
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            ctx.font = `900 12px Ubuntu`;

            let attempt = this.craftingPetalContainers[0].attempt;
            if (attempt == undefined) {
                attempt = 0;
            }
            let chance = calculateChance(attempt, this.craftingPetalContainers[0].rarity)
            if (this.craftingAnimationTimer > 3000 && this.craftingAnimationData.successAmount > 0) {
                ctx.fillStyle = "#00ff00"
                ctx.strokeText("Success (-" + this.craftingAnimationData.lost + ")", this.craftingButton.x, this.craftingButton.y + 40);
                ctx.fillText("Success (-" + this.craftingAnimationData.lost + ")", this.craftingButton.x, this.craftingButton.y + 40);
            }
            else {
                ctx.strokeText("Attempt " + (attempt + 1), this.craftingButton.x, this.craftingButton.y + 60);
                ctx.fillText("Attempt " + (attempt + 1), this.craftingButton.x, this.craftingButton.y + 60);

                if (this.craftingPetalContainers[0].rarity >= 12){
                    ctx.strokeText(Math.floor(chance * 100) / 100 + "% success chance", this.craftingButton.x, this.craftingButton.y + 40);
                    ctx.fillText(Math.floor(chance * 100) / 100 + "% success chance", this.craftingButton.x, this.craftingButton.y + 40);
                }
                else{
                    ctx.strokeText(Math.floor(chance * 10) / 10 + "% success chance", this.craftingButton.x, this.craftingButton.y + 40);
                    ctx.fillText(Math.floor(chance * 10) / 10 + "% success chance", this.craftingButton.x, this.craftingButton.y + 40);
                }
            }

        }

        if (this.hoveringOverCraftButton === true || this.draggingHorizontalScrollBar === true || this.draggingScrollBar === true || this.hoveringOverHorizontalScrollBar === true || this.hoveringOverScrollBar === true) {
            setCursor('pointer');
        }

        ctx.save();

        ctx.beginPath();
        ctx.rect(this.inventorySpace.x, this.inventorySpace.y, this.fillingHorizontal ? this.inventorySpace.w + 24 : this.inventorySpace.w, this.inventorySpace.h);
        ctx.clip();
        ctx.closePath();

        this.firstPetalContainer = null;
        this.lastPetalContainer = null;

        const firstRarityX = this.petalContainerSize / 2 + this.inventorySpace.x + (this.petalContainerSize + 12) * 0 + 3;
        const lastRarityX = this.petalContainerSize / 2 + this.inventorySpace.x + (this.petalContainerSize + 12) * this.maxRarity - 6;
        this.totalPetalWidth = lastRarityX - firstRarityX;

        let maxTypeIndex = 0;
        for (let typeKey in this.petalContainers) {
            for (let i = 0; i <= Math.max(5, this.maxRarity); i++) {
                const rarityKey = i;
                const pcX = this.petalContainerSize / 2 + this.inventorySpace.x + (this.petalContainerSize + 12) * rarityKey + 3 - this.render.horizontalScroll * (this.totalPetalWidth - this.inventorySpace.h);
                const pcY = 5 + this.petalContainerSize / 2 + this.typeIndexes[typeKey] * (this.petalContainerSize + 12) + 5 + this.inventorySpace.y - this.render.scroll * (this.totalPetalHeight - this.inventorySpace.h);
                if (this.typeIndexes[typeKey] > maxTypeIndex) {
                    maxTypeIndex = this.typeIndexes[typeKey];
                }
                if (this.fillerPetalSlots[typeKey] === undefined) {
                    this.fillerPetalSlots[typeKey] = {};
                }
                if (this.fillerPetalSlots[typeKey][rarityKey] === undefined) {
                    this.fillerPetalSlots[typeKey][rarityKey] = { render: { x: pcX, y: pcY } };
                }

                const fpc = this.fillerPetalSlots[typeKey][rarityKey];
                fpc.x = pcX;
                fpc.y = pcY;
                fpc.render.x = interpolate(fpc.render.x, fpc.x, 0.00672 * dt);
                fpc.render.y = interpolate(fpc.render.y, fpc.y, 0.00672 * dt);
                ctx.fillStyle = '#b17f49';

                if (this.petalContainers[typeKey][rarityKey] === undefined && fpc.render.x + this.petalContainerSize / 2 > this.inventorySpace.x * 0.9 && fpc.render.x + this.petalContainerSize / 2 < (this.inventorySpace.x + this.inventorySpace.w) * 1.2 && fpc.render.y + this.petalContainerSize / 2 > this.inventorySpace.y * 0.9 && fpc.render.y + this.petalContainerSize / 2 < (this.inventorySpace.y + this.inventorySpace.h) * 1.1) {
                    ctx.beginPath();
                    ctx.roundRect(fpc.render.x - this.petalContainerSize / 2, fpc.render.y - this.petalContainerSize / 2, this.petalContainerSize, this.petalContainerSize, 8);
                    ctx.fill();
                    ctx.closePath();
                }

                if (this.petalContainers[typeKey] !== undefined && this.petalContainers[typeKey][rarityKey] !== undefined) {
                    const pc = this.petalContainers[typeKey][rarityKey];
                    pc.x = pcX;
                    pc.y = pcY;

                    if (pc.render.x + pc.w / 2 > this.inventorySpace.x * 0.9 && pc.render.x - pc.w / 2 < (this.inventorySpace.x + this.inventorySpace.w) * 1.1 && pc.render.y + pc.w / 2 > this.inventorySpace.y * 0.9 && pc.render.y - pc.w / 2 < (this.inventorySpace.y + this.inventorySpace.h) * 1.1) {
                        pc.draw(undefined, undefined, true);
                    } else {
                        pc.render.x = interpolate(pc.render.x, pc.x, 0.00672 * dt)
                        pc.render.y = interpolate(pc.render.y, pc.y, 0.00672 * dt)
                    }

                    if (this.firstPetalContainer === null) {
                        this.firstPetalContainer = pc;
                    }
                    this.lastPetalContainer = pc;
                } else {
                    if (this.firstPetalContainer === null) {
                        this.firstPetalContainer = fpc;
                    }
                    this.lastPetalContainer = fpc;
                }
            }
        }

        if (Object.keys(this.petalContainers).length < 5) {
            this.fillingHorizontal = true;
            for (let j = Object.keys(this.petalContainers).length; j < 5; j++) {
                const typeKey = "filler" + j;
                for (let i = 0; i <= Math.max(5, this.maxRarity); i++) {
                    const rarityKey = i;
                    const pcX = this.petalContainerSize / 2 + this.inventorySpace.x + (this.petalContainerSize + 12) * rarityKey + 3 - this.render.horizontalScroll * (this.totalPetalWidth - this.inventorySpace.h);
                    const pcY = 5 + this.petalContainerSize / 2 + (maxTypeIndex + j - Object.keys(this.petalContainers).length + 1) * (this.petalContainerSize + 12) + 5 + this.inventorySpace.y - this.render.scroll * (this.totalPetalHeight - this.inventorySpace.h);

                    if (this.fillerPetalSlots[typeKey] === undefined) {
                        this.fillerPetalSlots[typeKey] = {};
                    }
                    if (this.fillerPetalSlots[typeKey][rarityKey] === undefined) {
                        this.fillerPetalSlots[typeKey][rarityKey] = { render: { x: pcX, y: pcY } };
                    }
                    const fpc = this.fillerPetalSlots[typeKey][rarityKey];
                    fpc.x = pcX;
                    fpc.y = pcY;
                    fpc.render.x = interpolate(fpc.render.x, fpc.x, 0.00672 * dt);
                    fpc.render.y = interpolate(fpc.render.y, fpc.y, 0.00672 * dt);
                    ctx.fillStyle = '#b17f49';
                    ctx.beginPath();
                    ctx.roundRect(fpc.render.x - this.petalContainerSize / 2, fpc.render.y - this.petalContainerSize / 2, this.petalContainerSize, this.petalContainerSize, 8);
                    ctx.fill();
                    ctx.closePath();
                }
            }
        } else {
            this.fillingHorizontal = false;
        }

        if (this.lastPetalContainer !== null) {
            const petalDimensions = {
                start: this.firstPetalContainer.y - this.petalContainerSize / 2 - 6,
                end: this.lastPetalContainer.y + this.petalContainerSize / 2 + 6
            }
            petalDimensions.length = petalDimensions.end - petalDimensions.start;
            this.totalPetalHeight = petalDimensions.length;
        }

        ctx.restore();

        let needsFilter = false;
        for (let i = 0; i < this.fadingPetalContainers.length; i++) {
            if (this.fadingPetalContainers[i].spawnTime < 0.001) {
                this.fadingPetalContainers[i].toRemove = true;
                needsFilter = true;
            }
            this.fadingPetalContainers[i].draw();
        }
        if (needsFilter === true) {
            this.fadingPetalContainers = this.fadingPetalContainers.filter(p => p.toRemove !== true);
        }
        if (this.fillingHorizontal === false) {
            this.render.scroll = interpolate(this.render.scroll, this.scroll, 0.0070 * dt);
            if (this.render.scroll < -.1) {
                this.render.scroll = -.1;
            } else if (this.render.scroll > 1.1) {
                this.render.scroll = 1.1;
            }

            this.scrollbar.pos = interpolate(this.scrollbar.start, this.scrollbar.end, this.render.scroll);
            this.scrollbar.bottom = this.scrollbar.pos + this.scrollbar.length / 2;
            this.scrollbar.top = this.scrollbar.pos - this.scrollbar.length / 2;

            this.scrollbar.renderTop = interpolate(this.scrollbar.renderTop, this.scrollbar.top, this.draggingScrollBar ? 0.28 : 0.08);
            this.scrollbar.renderBottom = interpolate(this.scrollbar.renderBottom, this.scrollbar.bottom, this.draggingScrollBar ? 0.28 : 0.08);
        }

        if (this.maxRarity >= 5) {
            this.render.horizontalScroll = interpolate(this.render.horizontalScroll, this.horizontalScroll, 0.0070 * dt);

            this.horizontalScrollBar.pos = interpolate(this.horizontalScrollBar.start, this.horizontalScrollBar.end, this.render.horizontalScroll);
            this.horizontalScrollBar.right = this.horizontalScrollBar.pos + this.horizontalScrollBar.length / 2;
            this.horizontalScrollBar.left = this.horizontalScrollBar.pos - this.horizontalScrollBar.length / 2;

            this.horizontalScrollBar.renderRight = interpolate(this.horizontalScrollBar.renderRight, this.horizontalScrollBar.right, this.draggingHorizontalScrollBar ? 0.28 : 0.08);
            this.horizontalScrollBar.renderLeft = interpolate(this.horizontalScrollBar.renderLeft, this.horizontalScrollBar.left, this.draggingHorizontalScrollBar ? 0.28 : 0.08);
        }

        if (this.scroll < 0) {
            this.scroll = 0;
        } else if (this.scroll > 1) {
            this.scroll = 1;
        }

        ctx.strokeStyle = this.getMainStroke();
        ctx.lineWidth = 8;
        ctx.lineCap = 'round';
        ctx.beginPath();
        ctx.moveTo(this.w - 16, (this.scrollbar.renderTop));
        ctx.lineTo(this.w - 16, (this.scrollbar.renderBottom));
        ctx.stroke();
        ctx.closePath();

        ctx.beginPath();
        ctx.moveTo(this.horizontalScrollBar.renderRight, this.h - 16);
        ctx.lineTo(this.horizontalScrollBar.renderLeft, this.h - 16);
        ctx.stroke();
        ctx.closePath();

        if (this.menuActive === true && translation === 0) {
            if (mouse.canvasX > 130 + this.w - 7.5 - 30 - 3 && mouse.canvasY > canvas.h - this.h - 20 + 7.5 + 3 && mouse.canvasX < 130 + this.w - 7.5 - 3 && mouse.canvasY < canvas.h - this.h - 20 + 7.5 + 30 + 3) {
                ctx.fillStyle = "#c16666";
                setCursor('pointer');
                this.hoveringOverX = true;
            } else {
                this.hoveringOverX = false;
                ctx.fillStyle = '#c1565e';
            }
        } else {
            ctx.fillStyle = '#c1565e';
            this.hoveringOverX = false;
        }
        ctx.translate(-3, 3);
        ctx.strokeStyle = '#90464b';
        ctx.lineWidth = 5;
        ctx.beginPath();
        ctx.roundRect(this.w - 7.5 - 30, 7.5, 30, 30, 6);
        ctx.fill();
        ctx.stroke();
        ctx.closePath();

        ctx.lineWidth = 4.75;
        ctx.lineCap = 'round';
        ctx.strokeStyle = '#cccccc';
        ctx.beginPath();
        ctx.moveTo(this.w - 30, 30);
        ctx.lineTo(this.w - 7.5 * 2, 7.5 + 7.5);
        ctx.stroke();
        ctx.closePath();
        ctx.beginPath();
        ctx.moveTo(this.w - 7.5 * 2, 30);
        ctx.lineTo(this.w - 30, 7.5 + 7.5);
        ctx.stroke();
        ctx.closePath();
        ctx.translate(3, -3);

        const mouseX = mouse.x * canvas.w / window.innerWidth;
        const mouseY = mouse.y * canvas.h / window.innerHeight;

        if (mouseX > 130 && mouseX < 130 + this.w - 20 && mouseY > canvas.h - this.h - 20 && mouseY < canvas.h - 20) {
            ctx.lastTransform5 = ctx.getTransform();
            for (let typeKey in this.petalContainers) {
                for (let i = 0; i <= this.maxRarity; i++) {
                    if (this.petalContainers[typeKey] === undefined) continue;
                    const rarityKey = i;
                    const pc = this.petalContainers[typeKey][rarityKey];
                    if (pc === undefined) continue;

                    if (pc.render.x + pc.w / 2 > this.inventorySpace.x * 0.9 && pc.render.x - pc.w / 2 < (this.inventorySpace.x + this.inventorySpace.w) * 1.1 && pc.render.y + pc.w / 2 > this.inventorySpace.y * 0.9 && pc.render.y - pc.w / 2 < (this.inventorySpace.y + this.inventorySpace.h) * 1.1) {
                        if (mouseInBox({ x: mouseX, y: mouseY }, { x: pc.render.x - pc.w / 2 + 130, y: pc.render.y - pc.h / 2 + canvas.h - this.h - 20, w: pc.w, h: pc.h }) === true) {
                            pc.isHovered = true;
                        }
                        pc.drawStatsBox();
                    }
                }
            }

            if (this.craftingAnimationState === "display") {
                const pc = this.displayPetalContainer;
                if (mouseInBox({ x: mouseX, y: mouseY }, { x: pc.render.x - pc.w / 2 + 130, y: pc.render.y - pc.h / 2 + canvas.h - this.h - 20, w: pc.w, h: pc.h }) === true) {
                    pc.isHovered = true;
                }
                pc.drawStatsBox();
            } else {
                for (let i = 0; i < this.craftingPetalSlots.length; i++) {
                    if (this.craftingPetalContainers[i] !== undefined) {
                        const pc = this.craftingPetalContainers[i];
                        if (mouseInBox({ x: mouseX, y: mouseY }, { x: pc.render.x - pc.w / 2 + 130, y: pc.render.y - pc.h / 2 + canvas.h - this.h - 20, w: pc.w, h: pc.h }) === true) {
                            pc.isHovered = true;
                        }
                        pc.drawStatsBox();
                    }
                }
            }
            ctx.setTransform(ctx.lastTransform5);
            delete ctx.lastTransform5;
        }

        ctx.translate(-130, -(canvas.h - this.h - 20));

        if (translation !== 0) {
            ctx.translate(0, -translation);
        }
        ctx.globalAlpha = 1;
    }

    renderHpBar = function({x,y,radius,hp,maxHp,beforeStreakHp,givenAlpha,flowerName,flowerUsername,shield,team},entity={fadeState: undefined, fadeTime: 0, lastHp: hp}, rarity, isBoss){
        if(entity.fadeState === undefined){
            if(Math.ceil(entity.hp) === maxHp && !shield){
                entity.fadeState = 'invisible';
                entity.fadeTime = -220;
            } else {
                entity.fadeTime = time;
                entity.fadeState = 'fadeIn';
            }
        }
        if(entity.lastHp === undefined){
            entity.lastHp = entity.hp;
        }
        if(entity.lastShield === undefined){
            entity.lastShield = entity.shield;
        }
    
        let fadeAlphaMult = 1;

        if(entity.dead !== true){
            if(Math.ceil(entity.lastHp) < maxHp && Math.ceil(entity.hp) === maxHp && entity.shield == 0){
                entity.fadeTime = time;
                entity.fadeState = 'fadeOut';
            } else if((Math.ceil(entity.lastHp) === maxHp && Math.ceil(entity.hp) < maxHp) || (entity.shield != 0 && entity.lastShield == 0)){
                entity.fadeTime = time;
                entity.fadeState = 'fadeIn';
            }
        }
        entity.lastShield = entity.shield;
        entity.lastHp = entity.hp;
    
        toResetFadeState = false;
        if (givenAlpha){
            if (givenAlpha > 0){
                toResetFadeState = entity.fadeState;
                entity.fadeState = "visible";
            }
        }
        if(entity.fadeState === 'fadeOut'){
            fadeAlphaMult = 1 - (time - entity.fadeTime) / 180;
            if(fadeAlphaMult < 0){
                fadeAlphaMult = 0;
                entity.fadeState = 'invisible';
            }
        } else if(entity.fadeState === 'fadeIn'){
            fadeAlphaMult = (time - entity.fadeTime) / 180;
            if(fadeAlphaMult > 1){
                fadeAlphaMult = 1;
                entity.fadeState = 'visible';
            }
        } else if(entity.fadeState === 'invisible'){
            return;
        }
    
        if(entity.dead === true)fadeAlphaMult *= ((10 - entity.deadAnimationTimer) / 166) ** 3;

        if (givenAlpha){
            fadeAlphaMult = givenAlpha;
        }
        const barDimensions = {
            w: (radius/25)**1.2*25*3.2+.33,
            h: (radius/25)**1.2*25*0.39+.33,
            borderRadius: (radius/25)**1.2*25*0.25,
            innerPadding: (radius/25)**1.05*1.8-.1
        }
        ctx.globalAlpha = fadeAlphaMult;
        hp = Math.max(hp, 0);
        beforeStreakHp = Math.max(beforeStreakHp, 0);

        if(rarity){
            let rarName = Colors.rarities[rarity].name;
            if(isBoss){
                ctx.fillStyle = `hsl(${(time/10) % 360}, 50%, 40%)`;
                rarName = 'Boss';
            } else {
                ctx.fillStyle = Colors.rarities[rarity].color;
            };
            ctx.beginPath();
            ctx.roundRect(x - barDimensions.w/2 - barDimensions.innerPadding, y + radius*1.775 - barDimensions.innerPadding, (barDimensions.w - barDimensions.borderRadius * 1.5) + barDimensions.borderRadius * 1.5 + barDimensions.innerPadding * 2, barDimensions.h + barDimensions.innerPadding * 2, barDimensions.borderRadius * barDimensions.h / (barDimensions.h - barDimensions.innerPadding * 2));
            ctx.fill();
            ctx.closePath();

            ctx.font = '900 36px Ubuntu';
            ctx.lineWidth = 5;
            ctx.strokeStyle = 'black';
            ctx.strokeText(rarName, x - barDimensions.w/2 + barDimensions.w / 2, y + radius*2.5 + barDimensions.innerPadding);
            ctx.fillText(rarName, x - barDimensions.w/2 + barDimensions.w / 2, y + radius*2.5 + barDimensions.innerPadding);
        }

        ctx.fillStyle = '#333333';
        ctx.beginPath();
        ctx.roundRect(x - barDimensions.w/2, y + radius*1.775, barDimensions.w, barDimensions.h, barDimensions.borderRadius);
        ctx.fill();
        ctx.closePath();
    
        if(flowerName !== undefined && entity.id !== window.selfId){
            
            ctx.globalAlpha = 1;
            ctx.fillStyle = 'white';
        ctx.strokeStyle = 'black';
        ctx.lineWidth = 2.25;
        ctx.textAlign = 'center';
        ctx.textBaseline = 'top';
        ctx.font = `900 22px Ubuntu`;
                if (window.usernames === true) {
                    ctx.strokeText(flowerName, x, y - radius * 2.75 + barDimensions.h + 2);
                    ctx.fillText(flowerName, x, y - radius * 2.75 + barDimensions.h + 2);
                    ctx.font = `900 10px Ubuntu`;
                    ctx.fillStyle = '#bbbbbb';
                    ctx.strokeText(flowerUsername, x, y - radius * 2 + barDimensions.h + 2);
                    ctx.fillText(flowerUsername, x, y - radius * 2 + barDimensions.h + 2);
            } else {
                    ctx.strokeText(flowerName, x, y - radius * 2.375 + barDimensions.h + 2);
                    ctx.fillText(flowerName, x, y - radius * 2.375 + barDimensions.h + 2);
            }
        }
    
        if(beforeStreakHp < maxHp / 10){
            ctx.globalAlpha = Math.max(0,hp * .95 / (maxHp / 10) + 0.05) * fadeAlphaMult;
        }
        if(beforeStreakHp > 0){
            ctx.fillStyle = '#dd3434'
            ctx.beginPath();
            const paddingMult = 1.4;
            ctx.roundRect(x - barDimensions.w/2 + barDimensions.innerPadding * paddingMult, y + radius*1.775 + barDimensions.innerPadding * paddingMult, (barDimensions.w - barDimensions.borderRadius * 1.5) * Math.min(1,beforeStreakHp / maxHp) + barDimensions.borderRadius * 1.5 - barDimensions.innerPadding * 2 * paddingMult, barDimensions.h - barDimensions.innerPadding * paddingMult * 2, barDimensions.borderRadius * barDimensions.h / (barDimensions.h + barDimensions.innerPadding * 2));
            ctx.fill();
            ctx.closePath();
        }
        
    
        ctx.globalAlpha = fadeAlphaMult;
        if(hp < maxHp / 10){
            ctx.globalAlpha = Math.max(0,hp * .95 / (maxHp / 10) + 0.05) * fadeAlphaMult;
        }
    
        if(hp > 0){
            ctx.fillStyle = '#75dd34'
            if (team == "flower"){
                ctx.fillStyle = "#b5aa31"
            }
            ctx.beginPath();
            
            ctx.roundRect(x - barDimensions.w/2 + barDimensions.innerPadding, y + radius*1.775 + barDimensions.innerPadding, (barDimensions.w - barDimensions.borderRadius * 1.5) * Math.min(1, hp / maxHp) + barDimensions.borderRadius * 1.5 - barDimensions.innerPadding * 2, barDimensions.h - barDimensions.innerPadding * 2, barDimensions.borderRadius * barDimensions.h / (barDimensions.h + barDimensions.innerPadding * 2));
            ctx.fill();
            ctx.closePath();
        }
        if (shield){
            if (shield > maxHp * 0.005){
                ctx.fillStyle = 'white'
                ctx.beginPath();
                
                ctx.roundRect(x - barDimensions.w/2 + barDimensions.innerPadding, y + radius*1.805 + barDimensions.innerPadding, (barDimensions.w - barDimensions.borderRadius * 1.5) * Math.min(1, shield / maxHp) + barDimensions.borderRadius * 1.5 - barDimensions.innerPadding * 2, barDimensions.h - barDimensions.innerPadding * 3, barDimensions.borderRadius * barDimensions.h / (barDimensions.h + barDimensions.innerPadding * 3));
                ctx.fill();
                ctx.closePath();
            }
        }
    
        ctx.globalAlpha = 1;
    
        if(toResetFadeState !== false){
            entity.fadeState = toResetFadeState;
        }
    }

    enemyRenderMapText = function(e) {
        renderHpBar({
            x: 0,
            y: 0,
            radius: e.render.radius * 0.8,
            hp: e.render.hp,
            maxHp: e.maxHp,
            beforeStreakHp: e.render.beforeStreakHp,
            team: e.team
        }, e, e.rarity, e.isBoss);
        if (!window.isEditor === true && window.damageCounter) {
            renderDamageCounter({
                radius: e.render.radius,
                timeAlive: e.ticksSinceLastDamaged,
                totalDamage: e.damageCount,
            })
        }
    }

    inventory.draw = function(alpha = 1) {
        if(this.fadingPetalContainer !== null){
            const temp = {x: this.fadingPetalContainer.render.x, y: this.fadingPetalContainer.render.y};
            this.fadingPetalContainer.render.x = this.fadingPetalContainer.x;
            this.fadingPetalContainer.render.y = this.fadingPetalContainer.y;
            const animationTime = 1 - (time - this.fadingPetalContainer.fadeTime) / 200;
            ctx.globalAlpha = Math.max(0,Math.min(1,animationTime));
            ctx.save();
            ctx.translate(this.fadingPetalContainer.x, this.fadingPetalContainer.y);
            ctx.scale(2 - animationTime, 2 - animationTime);
            ctx.translate(-this.fadingPetalContainer.x, -this.fadingPetalContainer.y);
            this.fadingPetalContainer.draw(alpha);
            ctx.restore();
            this.fadingPetalContainer.render.x = temp.x;
            this.fadingPetalContainer.render.y = temp.y;
            if(time - this.fadingPetalContainer.fadeTime > 200){
                this.fadingPetalContainer = null;
            }
        }

        for(let i = 0; i < this.topPetalSlots.length; i++){
            this.topPetalSlots[i].draw(alpha);
        }
        for(let i = 0; i < this.bottomPetalSlots.length; i++){
            this.bottomPetalSlots[i].draw(alpha);
        }
        for(let key in this.topPetalContainers){
            const tpc = this.topPetalContainers[key];
            let showTimer = false;
            let rarity;
            if (tpc.type == 'Egg' || tpc.type == 'Plastic Egg') {
                if (petalReloadData[key] && Math.abs(petalReloadData[key].reload - 1) >= 1e-12) {
                    tpc.respawnTimer = tpc.petalStats.hatchTime + tpc.petalStats.reload * petalReloadData[key].reload;
                    showTimer = true;
                } else if (tpc.hasOwnProperty('respawnTimer')) {
                    tpc.respawnTimer -= dt / 1000;
                    showTimer = true;
                    if (tpc.respawnTimer <= 0) {
                        delete tpc.respawnTimer;
                        showTimer = false;
                    };
                };
                rarity = tpc.petalStats.spawnRarity;
            } else if (tpc.type == 'Stick') {
                if (petalReloadData[key]) {
                    tpc.respawnTimer = [];
                    tpc.respawnTimer.push(tpc.petalStats.spawnSystem[1] + tpc.petalStats.reload * petalReloadData[key].reload);
                    tpc.respawnTimer.push(tpc.petalStats.spawnSystem[1] * 2 + tpc.petalStats.reload * petalReloadData[key].reload);
                    showTimer = true;
                } else if (tpc.hasOwnProperty('respawnTimer')) {
                    tpc.respawnTimer[0] -= dt / 1000;
                    tpc.respawnTimer[1] -= dt / 1000;
                    showTimer = true;
                    if (tpc.respawnTimer[1] <= 0) {
                        delete tpc.respawnTimer;
                        showTimer = false;
                    } else if (tpc.respawnTimer[0] <= 0) {
                        tpc.respawnTimer[0] = 0;
                    };
                };
                rarity = tpc.petalStats.spawnSystem[0];
            };
            tpc.draw(true, key);
            if (showTimer) {
                ctx.save();
                ctx.lineWidth = 4.5;
                ctx.translate(tpc.x, tpc.y - tpc.h * 1.15);
                ctx.scale(tpc.w / 50, tpc.h / 50);

                if (Colors.rarities[rarity].fancy !== undefined){
                    const gradientFill = ctx.createLinearGradient(-30, -30, 30, 30);
                    createFancyGradient(gradientFill, rarity);
                    ctx.fillStyle = gradientFill;
                    ctx.strokeStyle = Colors.rarities[rarity].fancy.border;
                } else {
                    ctx.fillStyle = Colors.rarities[rarity].color;
                    ctx.strokeStyle = Colors.rarities[rarity].border;
                }
        
                ctx.beginPath();
                ctx.roundRect(-25, -25, 50, 50, .25);
                ctx.fill();
                ctx.stroke();
                ctx.closePath();

                ctx.restore();

                ctx.font = '900 24px Ubuntu';
                ctx.lineWidth = 5;
                ctx.strokeStyle = 'black';
                ctx.fillStyle = 'white';
                let timer = tpc.type == 'Stick' ? (tpc.respawnTimer[0] == 0 ? tpc.respawnTimer[1] : tpc.respawnTimer[0]) : tpc.respawnTimer;
                ctx.strokeText(Math.round(timer * 100) / 100 + 's', tpc.x, tpc.y - tpc.h * 1.15);
                ctx.fillText(Math.round(timer * 100) / 100 + 's', tpc.x, tpc.y - tpc.h * 1.15);
            };
        }
        for(let key in this.bottomPetalContainers){
            this.bottomPetalContainers[key].draw();
        }

        if(this === menuInventory){
            const mouseX = mouse.x * canvas.w / window.innerWidth;
            const mouseY = mouse.y * canvas.h / window.innerHeight;
            const offsetMouseY = mouseY - this.translateY;
            ctx.lastTransform8 = ctx.getTransform();
            for(let key in this.topPetalContainers){
                const pc = this.topPetalContainers[key];

                if(mouseX > pc.x - pc.w/2 && mouseX < pc.x + pc.w/2 && offsetMouseY > pc.y - pc.h/2 && offsetMouseY < pc.y + pc.h/2){
                    pc.isHovered = true;
                }
                pc.drawStatsBox(true);
            }

            for(let key in this.bottomPetalContainers){
                const pc = this.bottomPetalContainers[key];

                if(mouseX > pc.x - pc.w/2 && mouseX < pc.x + pc.w/2 && offsetMouseY > pc.y - pc.h/2 && offsetMouseY < pc.y + pc.h/2){
                    pc.isHovered = true;
                }
                pc.drawStatsBox(true);
            }
            ctx.setTransform(ctx.lastTransform8);
            delete ctx.lastTransform8;
        }
    }
})();