CCCPaste

Extreme reactor

--[[
Programma di controllo per Extreme Reactors (V4 - Finale)
Mostra:
- Stato (Attivo/Spento)
- Produzione FE/t e Temperatura
- Barre per Calore, Energia, Carburante, Control Rod
- Pulsanti: [ ON ], [ OFF ], [ - ] (10% step), [ + ] (10% step)
]]

--- --- ---
-- 1. CONFIGURAZIONE DEI PERIPHERAL
--- --- ---

-- Avvolge il monitor (presunto sul lato 'bottom')
local mon = peripheral.wrap("bottom")
if mon == nil then
    print("Errore: Monitor non trovato sul lato 'bottom'.")
    return
end

-- Trova il reattore su qualsiasi lato connesso
local reactor = peripheral.find("reactor")
if reactor == nil then
    print("Errore: Nessun reattore 'Extreme Reactor' trovato in rete.")
    return
end

--- --- ---
-- 2. VARIABILI DI STATO E DISEGNO
--- --- ---

local monWidth, monHeight = mon.getSize()

-- Livello target delle rod (inizializzato al livello attuale)
local targetRodLevel = reactor.getAverageControlRodLevel()

local TEMP_MAX_VISUAL = 2000 -- Max visivo per la barra temperatura

-- Definiamo le aree dei pulsanti
-- Pulsanti ON/OFF (penultima riga)
local btnOff = { y = monHeight - 1, x1 = 2, x2 = 7 }             -- [ OFF ]
local btnOn = { y = monHeight - 1, x1 = monWidth - 4, x2 = monWidth - 1 } -- [ ON ]

-- Pulsanti Control Rod (ultima riga)
local btnMinus = { y = monHeight, x1 = 2, x2 = 6 }               -- [ - ]
local btnPlus = { y = monHeight, x1 = monWidth - 5, x2 = monWidth - 1 } -- [ + ]

-- Funzione helper per disegnare una barra di progresso
local function drawProgressBar(y, label, current, max, color)
    mon.setCursorPos(1, y)
    mon.write(label)
    
    local percent = 0
    if max > 0 then
        percent = current / max
    end
    
    local width = monWidth - 2
    local filledWidth = math.floor(width * percent)
    local percentText = string.format(" %.1f%% ", percent * 100)
    
    -- Sfondo
    mon.setCursorPos(2, y + 1)
    mon.setBackgroundColor(colors.gray)
    mon.write(string.rep(" ", width))
    
    -- Barra piena
    if filledWidth > 0 then
        mon.setCursorPos(2, y + 1)
        mon.setBackgroundColor(color)
        mon.write(string.rep(" ", filledWidth))
    end
    
    -- Testo percentuale
    mon.setCursorPos(math.floor(monWidth / 2 - #percentText / 2), y + 1)
    mon.setTextColor(colors.black)
    mon.write(percentText)
    
    -- Reset
    mon.setBackgroundColor(colors.black)
    mon.setTextColor(colors.white)
end

-- Funzione principale per disegnare tutto
local function drawDisplay()
    -- Puliamo lo schermo
    mon.clear()
    mon.setCursorPos(math.floor(monWidth / 2 - 10), 1)
    mon.write("--- STATO REATTORE ---")
    
    --- --- Dati Reattore --- ---
    local status = reactor.isMachineActive()
    local energyProd = reactor.getEnergyGeneratedLastTick()
    local energyStored = reactor.getEnergyStored()
    local energyMax = reactor.getMaxEnergyStored()
    local temp = reactor.getCoreTemperature()
    local fuelAmount = reactor.getFuelAmount()
    local wasteAmount = reactor.getWasteAmount()
    local fuelCapacity = fuelAmount + wasteAmount
    local currentRods = reactor.getAverageControlRodLevel()
    
    --- --- Disegno UI --- ---
    
    -- 1. Produzione e Temperatura (Testo)
    mon.setCursorPos(1, 3)
    mon.write(string.format("Produzione: %.0f FE/t", energyProd))
    
    mon.setCursorPos(1, 4)
    mon.write(string.format("Temperatura: %.0f C", temp))
    
    -- 2. Stato (Attivo/Spento)
    mon.setCursorPos(1, 5)
    if status then
        mon.setTextColor(colors.lime)
        mon.write("Stato: [ATTIVO]")
    else
        mon.setTextColor(colors.red)
        mon.write("Stato: [SPENTO]")
    end
    mon.setTextColor(colors.white) -- Reset
    
    -- 3. Barra Temperatura
    local tempPercent = temp / TEMP_MAX_VISUAL
    local tempColor = colors.green
    if tempPercent >= 0.8 then
        tempColor = colors.red
    elseif tempPercent >= 0.5 then
        tempColor = colors.orange
    end
    drawProgressBar(7, "Calore Core:", temp, TEMP_MAX_VISUAL, tempColor)
    
    -- 4. Barra Energia Immagazzinata
    drawProgressBar(10, "Energia:", energyStored, energyMax, colors.cyan)
    
    -- 5. Barra Carburante
    drawProgressBar(13, "Carburante:", fuelAmount, fuelCapacity, colors.yellow)
    
    -- 6. Barra Control Rod
    drawProgressBar(16, "Control Rods (Target: " .. targetRodLevel .. "%)", currentRods, 100, colors.orange)
    
    -- 7. Pulsanti ON / OFF (penultima riga)
    mon.setBackgroundColor(colors.red)
    mon.setCursorPos(btnOff.x1, btnOff.y)
    mon.write("[ OFF ]")
    
    mon.setBackgroundColor(colors.lime)
    mon.setCursorPos(btnOn.x1, btnOn.y)
    mon.write("[ ON ]")
    
    -- 8. Pulsanti Control Rod (ultima riga)
    mon.setBackgroundColor(colors.red)
    mon.setCursorPos(btnMinus.x1, btnMinus.y)
    mon.write("[ - ]")
    
    mon.setBackgroundColor(colors.lime)
    mon.setCursorPos(btnPlus.x1, btnPlus.y)
    mon.write("[ + ]")
    
    mon.setBackgroundColor(colors.black) -- Reset
end


--- --- ---
-- 3. LOOP PRINCIPALE (EVENTI E AGGIORNAMENTO)
--- --- ---

print("Programma avviato. Disegno l'interfaccia sul monitor...")
mon.clear()
drawDisplay()

while true do
    -- Aspetta un evento (touch o timer)
    local event, param1, x, y = os.pullEvent("monitor_touch", "timer") 
    local modified = false 
    
    if event == "timer" then
        -- Aggiorna il display ogni secondo
        drawDisplay()
        
    elseif event == "monitor_touch" then
        
        -- Controlli Control Rod (ultima riga)
        if y == btnMinus.y and x >= btnMinus.x1 and x <= btnMinus.x2 then
            -- Diminuisce di 10%
            targetRodLevel = math.max(0, targetRodLevel - 10) 
            reactor.setAllControlRodLevels(targetRodLevel)
            modified = true
            
        elseif y == btnPlus.y and x >= btnPlus.x1 and x <= btnPlus.x2 then
            -- Aumenta di 10%
            targetRodLevel = math.min(100, targetRodLevel + 10)
            reactor.setAllControlRodLevels(targetRodLevel)
            modified = true
            
        -- Controlli Accensione (penultima riga)
        elseif y == btnOff.y and x >= btnOff.x1 and x <= btnOff.x2 then
            reactor.deactivate() 
            modified = true
            
        elseif y == btnOn.y and x >= btnOn.x1 and x <= btnOn.x2 then
            reactor.activate() 
            modified = true
        end
        
        -- Se abbiamo premuto un pulsante, aggiorniamo subito
        if modified then
            drawDisplay()
        end
    end
    
    -- Riavvia il timer (per il prossimo aggiornamento)
    if not timer.isStarted() then
        timer.start(1) 
    end
end