---------------------------
-- TurtleFleet Installer --
---------------------------
local width, height = term.getSize()
local mid_x = math.ceil( width / 2 )
local mid_y = math.ceil( height / 2 )
local panel_x, panel_x2, panel_y, panel_y2 = mid_x - 16, mid_x + 16, mid_y - 3, mid_y + 3
local yes_x = panel_x2 - 9
local yes_x2 = panel_x2 - 1
local btn_y = panel_y2
local btn_y2 = panel_y2 + 2
local no_x = panel_x + 1
local no_x2 = panel_x + 9
local was_installed = false
local theme = {}
local git_path = "https://raw.githubusercontent.com/Calame321/TurtleFleet/main/"
local fleet_folder = "turtlefleet/"
local all_files = {
"computer/computer_startup.lua",
"turtle/jobs/builder.lua",
"turtle/jobs/harvester.lua",
"turtle/jobs/lumberjack.lua",
"turtle/jobs/miner.lua",
"turtle/jobs/smelter.lua",
"turtle/advanced_turtle.lua",
"turtle/fleet_mode.lua",
"turtle/pathfind.lua",
"turtle/turtle_menu.lua",
"turtle/turtle_startup.lua",
"utils/update.lua",
}
-- Center the text based on the total length
function print_centered( text, from, to, line, back_color, fore_color )
back_color = back_color or theme.text_bg
fore_color = fore_color or theme.text_fg
local total_length = to - from
local half_text_length = #text / 2
local offset = math.ceil( ( ( total_length / 2 ) + from ) - half_text_length )
term.setCursorPos( offset, line )
term.setBackgroundColor( back_color )
term.setTextColor( fore_color )
term.write( text )
end
-- Display a promt for the installation.
function show_prompt()
if term.isColor() then
theme = {
bg = colors.white,
text_bg = colors.white,
text_fg = colors.blue,
title_bg = colors.lightBlue,
title_fg = colors.black,
window_border = colors.blue,
window_corners = colors.cyan,
window_text_fg = colors.green,
here_btn_bg = colors.green,
here_btn_fg = colors.orange,
disk_btn_bg = colors.brown,
disk_btn_fg = colors.yellow,
text_error = colors.red
}
else
theme = {
bg = colors.white,
text_bg = colors.white,
text_fg = colors.gray,
title_bg = colors.gray,
title_fg = colors.white,
window_border = colors.lightGray,
window_corners = colors.lime,
window_text_fg = colors.brown,
here_btn_bg = colors.brown,
here_btn_fg = colors.pink,
disk_btn_bg = colors.brown,
disk_btn_fg = colors.pink,
text_error = colors.white
}
end
term.clear()
local lastBgColor = term.getBackgroundColor()
-- Draw the panel.
paintutils.drawFilledBox( panel_x, panel_y, panel_x2, panel_y2, theme.bg )
-- Add a border.
paintutils.drawBox( panel_x - 1, panel_y - 1, panel_x2 + 1, panel_y2 + 1, theme.window_border )
paintutils.drawPixel( panel_x - 1, panel_y2 + 1, theme.window_corners )
paintutils.drawPixel( panel_x2 + 1, panel_y2 + 1, theme.window_corners )
-- Add box for the headder.
paintutils.drawFilledBox( panel_x - 1, panel_y - 1, panel_x2 + 1, panel_y + 1, theme.title_bg )
paintutils.drawLine( panel_x - 1, panel_y - 1, panel_x - 1, panel_y + 1, theme.window_corners )
paintutils.drawLine( panel_x2 + 1, panel_y - 1, panel_x2 + 1, panel_y + 1, theme.window_corners )
-- Add the title.
print_centered( "TurtleFleet Installer", panel_x, panel_x2, panel_y, theme.title_bg, theme.title_fg )
-- Add the text.
print_centered( "Where to install?", panel_x, panel_x2, panel_y + 3, nil, theme.window_text_fg )
-- Button Here
paintutils.drawFilledBox( yes_x, btn_y, yes_x2, btn_y2, theme.here_btn_bg )
print_centered( "Here!", yes_x + 1, yes_x2, btn_y + 1, theme.here_btn_bg, theme.here_btn_fg )
print_centered( "\175" .. " ", yes_x, yes_x2, btn_y2, theme.here_btn_bg, theme.here_btn_fg )
-- Button Disk
paintutils.drawFilledBox( no_x, btn_y, no_x2, btn_y2, theme.disk_btn_bg )
print_centered( "Disk.", no_x + 1, no_x2, btn_y + 1, theme.disk_btn_bg, theme.disk_btn_fg )
print_centered( "\175" .. " ", no_x, no_x2, btn_y2, theme.disk_btn_bg, theme.disk_btn_fg )
term.setBackgroundColor( lastBgColor )
end
-- Show installing message.
function show_installing()
local _x = panel_x + 1
local _x2 = panel_x2 - 1
local _y = panel_y2
local _y2 = panel_y2 + 2
paintutils.drawFilledBox( _x, _y, _x2, _y2, theme.disk_btn_bg )
print_centered( "Installing...", _x + 1, _x2, _y + 1, theme.disk_btn_bg, theme.disk_btn_fg )
end
-- Install the software on the current turtle or computer.
function install_here()
fs.delete( "turtlefleet" )
fs.delete( "startup" )
local to_install = {}
for i = 1, #all_files do
to_install[ git_path .. all_files[ i ] ] = fleet_folder .. all_files[ i ]
end
to_install[ git_path .. "startup.lua" ] = "startup.lua"
install_files( to_install )
was_installed = true
end
-- Install the files on a disk for easy mass install.
function install_disk()
fs.delete( "/disk/main_startup" )
fs.delete( "/disk/turtlefleet" )
fs.delete( "/disk/startup" )
local to_install = {}
for i = 1, #all_files do
to_install[ git_path .. all_files[ i ] ] = "/disk/" ..fleet_folder .. all_files[ i ]
end
to_install[ git_path .. "startup.lua" ] = "/disk/main_startup.lua"
to_install[ git_path .. "disk_startup.lua" ] = "/disk/startup.lua"
install_files( to_install )
was_installed = true
end
-- Install the file from the dictionary.
function install_files( files_to_install )
local i = 1
for git_file, local_file in pairs( files_to_install ) do
local f = fs.open( local_file, "w" )
local w, m = http.get( git_file )
if w then
f.write( w.readAll() )
f.flush()
f.close()
local file_count = 0
for _ in pairs( files_to_install ) do file_count = file_count + 1 end
display_progress( i, file_count, local_file )
i = i + 1
else
display_error( "Can't load '" .. local_file .. "' : " .. m )
end
end
end
-- Display a progress bar.
function display_progress( current, max, current_file )
local bar_width = 20
local progress = math.floor( current * bar_width / max )
local bar = ""
local bar_fg = ""
local bar_bg = ""
for i = 1, bar_width do
if i <= progress then
bar = bar .. string.char( 128 )
bar_fg = bar_fg .. "0"
bar_bg = bar_bg .. "b"
else
bar = bar .. string.char( 127 )
bar_fg = bar_fg .. "3"
bar_bg = bar_bg .. "0"
end
end
local total_length = panel_x2 - panel_x
local position_x = total_length / 2 - #bar / 2
term.setCursorPos( panel_x + position_x, panel_y + 4 )
term.setBackgroundColor( theme.bg )
term.setTextColor( theme.text_fg )
if #current_file > 20 then
write( "..." .. string.sub( current_file, -17 ) )
else
write( current_file .. ( string.rep( " ", 20 - #current_file ) ) )
end
term.setCursorPos( panel_x + position_x, panel_y + 3 )
term.blit( bar, bar_fg, bar_bg )
end
-- Display an error if a file is not found.
function display_error( message )
term.setCursorPos( 1, height )
term.setTextColor( theme.text_error )
term.write( message )
term.setTextColor( theme.text_fg )
end
-- Show the prompt and listen to events.
show_prompt()
while ( true ) do
local event, p1, p2, p3, p4 = os.pullEvent()
-- If key pressed.
if ( event == "key" ) then
if keys.getName( p1 ) == 'h' then
show_installing()
install_here()
break
end
if keys.getName( p1 ) == 'd' then
show_installing()
install_disk()
break
end
end
-- If clicked.
if ( event == "mouse_click" ) then
local x = p2
local y = p3
local here_was_clicked = x >= yes_x and x <= yes_x2 and y >= btn_y and y <= btn_y2
if ( here_was_clicked ) then
show_installing()
install_here()
break
end
local disk_was_clicked = x >= no_x and x <= no_x2 and y >= btn_y and y <= btn_y2
if disk_was_clicked then
show_installing()
install_disk()
break
end
end
end
-- Show the end message.
function show_end()
local txt = "Installation Completed!"
local total_length = panel_x2 - panel_x
local position_x = total_length / 2 - #txt / 2
term.setCursorPos( panel_x + position_x + 1, panel_y + 4 )
write( txt )
local _x = panel_x + 1
local _x2 = panel_x2 - 1
local _y = panel_y2
local _y2 = panel_y2 + 2
paintutils.drawFilledBox( _x, _y, _x2, _y2, theme.window_text_fg )
print_centered( "Press Enter to reboot.", _x + 1, _x2, _y + 1, theme.window_text_fg, theme.text_bg )
end
show_end()
read()
os.reboot()
Comments