RyanHub – file viewer
filename: common/src/main/java/rearth/oritech/client/ui/CatalystScreen.java
branch: 1.21
back to repo
package rearth.oritech.client.ui;

import io.wispforest.owo.ui.component.Components;
import io.wispforest.owo.ui.component.LabelComponent;
import io.wispforest.owo.ui.container.FlowLayout;
import io.wispforest.owo.ui.core.PositionedRectangle;
import io.wispforest.owo.ui.core.Positioning;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.NotNull;
import rearth.oritech.Oritech;

public class CatalystScreen extends BasicMachineScreen<CatalystScreenHandler> {
    
    public static final Identifier GUI_COMPONENTS = Oritech.id("textures/gui/modular/machine_gui_components_souls.png");
    public static final Identifier BOOK_SLOT = Oritech.id("textures/gui/modular/book_slot_background.png");
    
    private LabelComponent costLabel;
    private LabelComponent stabilizationLabel;
    
    public CatalystScreen(CatalystScreenHandler handler, PlayerInventory inventory, Text title) {
        super(handler, inventory, title);
    }
    
    @Override
    public Identifier getGuiComponents() {
        return GUI_COMPONENTS;
    }
    
    @Override
    public boolean showExtensionPanel() {
        return false;
    }
    
    @Override
    public void fillOverlay(FlowLayout overlay) {
        super.fillOverlay(overlay);
        
        costLabel = Components.label(Text.translatable("message.oritech.catalyst.cost", 0));
        stabilizationLabel = Components.label(Text.translatable("title.oritech.catalyst.stable"));
        overlay.child(costLabel.positioning(Positioning.absolute(56, 58)));
        overlay.child(stabilizationLabel.positioning(Positioning.absolute(108, 39)));
        
        var slotConfig = handler.screenData.getGuiSlots().getFirst();
        overlay.child(Components.texture(BOOK_SLOT, 0, 0, 16, 16, 16, 16).positioning(Positioning.absolute(slotConfig.x(), slotConfig.y())));
        
    }
    
    @Override
    protected void handledScreenTick() {
        super.handledScreenTick();
        
        var cost = handler.catalyst.getDisplayedCost();
        costLabel.text(Text.translatable("message.oritech.catalyst.cost", cost).formatted(Formatting.BLACK));
        
        if (cost == 0) {
            costLabel.zIndex(-5);
        } else {
            costLabel.zIndex(1);
        }
        
        var result = getStabilizationTitle();
        stabilizationLabel.text(result.formatted(Formatting.BLACK));
        
    }
    
    @NotNull
    private MutableText getStabilizationTitle() {
        var currentSouls = handler.catalyst.collectedSouls;
        var baseSouls = handler.catalyst.baseSoulCapacity;
        var maxSouls = handler.catalyst.maxSouls;
        var soulBonus = maxSouls - baseSouls;
        var free = maxSouls - currentSouls;
        
        var result = Text.translatable("title.oritech.catalyst.stable");
        
        if (soulBonus > 0 && currentSouls >= baseSouls) {
            if (free > 5) {
                result = Text.translatable("title.oritech.catalyst.stabilized");;
            } else if (free > 0) {
                result = Text.translatable("title.oritech.catalyst.semi_stable");;
            } else {
                result = Text.translatable("title.oritech.catalyst.unstable");;
            }
        } else {
            if (free > 5) {
                result = Text.translatable("title.oritech.catalyst.stable");;
            } else if (free > 0) {
                result = Text.translatable("title.oritech.catalyst.semi_stable");;
            } else {
                result = Text.translatable("title.oritech.catalyst.stable");;
            }
        }
        return result;
    }
    
    @Override
    protected void updateEnergyBar() {
        
        var capacity = handler.catalyst.maxSouls;
        var amount = handler.catalyst.collectedSouls;
        
        var fillAmount = (float) amount / capacity;
        var tooltipText = getSoulTooltip(amount, capacity);
        
        energyIndicator.tooltip(tooltipText);
        energyIndicator.visibleArea(PositionedRectangle.of(0, 96 - ((int) (96 * (fillAmount))), 24, (int) (96 * fillAmount)));
    }
    
    public Text getSoulTooltip(long amount, long max) {
        return Text.translatable("tooltip.oritech.spawner.collected_souls", amount, max);
    }
}