Skip to content

Instantly share code, notes, and snippets.

@robb83
Last active July 6, 2024 10:10
Show Gist options
  • Save robb83/c80a92f41f6f0d677f4479fb06de4be2 to your computer and use it in GitHub Desktop.
Save robb83/c80a92f41f6f0d677f4479fb06de4be2 to your computer and use it in GitHub Desktop.
Archean - Auto Crafter Script
; COMPUTER PORTS
var $container = 0
var $crafter = 1
var $recipes : text
storage var $resources : text
var $items : text
var $selected_category = ""
var $selected_page = 0
var $selected_item = ""
var $scene_stock = 0
var $scene_stock_page = 0
var $scene_queue = 0
var $scene_queue_page = 0
array $queue_order : text
var $queue = ""
var $craft_current = ""
var $craft_quantity = 0
var $craft_started = 0
var $text_mode = 3 ; 0 = none, 1 = cut, 2 = scroll, 3 = abbreviate
var $text_scroll_position = 0
var $text_scroll_timer = 0
var $uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
storage var $stocks : text
function @create_recipe_mapping()
$recipes = ""
array $cs : text
$cs.from(get_recipes_categories("crafter"), ",")
foreach $cs ($i, $v)
array $rs : text
$rs.from(get_recipes("crafter", $v), ",")
foreach $rs ($j, $r)
$recipes.$r = $v
function @get_recipe_by_name($recipe : text) : text
return get_recipe("crafter", $recipes.$recipe, $recipe)
function @create_resource_mapping()
$resources = ""
foreach $recipes ($r, $c)
var $recipe = get_recipe("crafter", $c, $r)
if $recipe
foreach $recipe ($k, $v)
if !@get_recipe_by_name($k)
$resources.$k += 1
function @get_stock($item : text) : number
return $items.$item
function @keep_stock_set($item:text, $q:number)
$stocks.$item = $q
function @keep_stock_add($item:text, $q:number)
$stocks.$item += $q
function @queue_increment($item:text, $q:number)
if $queue.$item
$queue.$item += $q
else
$queue.$item = $q
$queue_order.append($item)
function @queue_cancel($item:text)
if $queue.$item
$queue.$item = 0
if $queue_order.size > 0 && $queue_order.0 == $item
$craft_current = ""
$craft_quantity = 0
$craft_started = 0
output_text($crafter, 1, "")
output_number($crafter, 0, 0)
function @queue_clear()
$queue = ""
$queue_order.clear()
function @is_fluid_or_gas($item : text) : number
return $item == "H2" || $item == "O2" || $item == "H2O"
function @crafter_set($item : text, $on : number)
output_text($crafter, 1, $item)
output_number($crafter, 0, $on)
$craft_started = $on
function @crafter_check()
if $craft_started
var $p = input_number($crafter, 0)
var $craft = input_text($crafter, 1)
if $craft != $craft_current
@crafter_set($craft_current, 1)
elseif $craft == $craft_current && $p == 1
$craft_quantity -= 1
if $craft_quantity > 0
@crafter_set($craft_current, 1)
else
$craft_current = ""
$craft_quantity = 0
@crafter_set($craft_current, 0)
elseif $craft == $craft_current && $p == -1
$craft_current = ""
$craft_quantity = 0
@crafter_set($craft_current, 0)
if $queue_order.size > 0
var $k = $queue_order.0
var $q = $queue.$k
if $k == $craft && $p == 1
$queue.$k -= 1
function @build_step($item : text) : number
var $recipe = @get_recipe_by_name($item)
if !$recipe
return 0
var $current = ""
$current.name = $item
$current.q = 1
array $open : text
$open.append($current)
while $open.size > 0
$current = $open.0
$open.erase(0)
$recipe = @get_recipe_by_name($current.name)
if $recipe
var $craftable = 1
foreach $recipe ($k, $v)
if @is_fluid_or_gas($k)
continue
if @get_stock($k) < ($v * $current.q)
if @get_recipe_by_name($k)
var $r = ""
$r.name = $k
$r.q = ($v * $current.q) - @get_stock($k)
$open.append($r)
$craftable = 0
break
else
print("Missing non craftable material: " & $k)
$craftable = 0
return -1
if $craftable
$craft_current = $current.name
$craft_quantity = $current.q
@crafter_set($craft_current, 1)
return 1
return 0
function @build_next()
if !$craft_started
if $queue_order.size > 0
var $k = $queue_order.0
if $queue.$k > 0
@build_step($k)
else
$queue_order.erase(0)
else
foreach $stocks ($sk, $sv)
if @get_stock($sk) < $sv
$queue.$sk += $sv - @get_stock($sk)
$queue_order.append($sk)
break
function @text_scroll_update()
$text_scroll_timer += delta_time
if $text_scroll_timer >= 0.35
$text_scroll_timer -= 0.35
$text_scroll_position += 1
if $text_scroll_position >= 1000
$text_scroll_position -= 1000
function @text_scroll_reset()
$text_scroll_timer = 0
$text_scroll_position = 0
function @draw_long_word($text:text, $max : number) : text
var $ts = size($text)
if $ts > $max
var $result = ""
var $lw = ""
var $i = 0
while $i < $ts
if find($uppercase, $text.$i) >= 0
$lw = ""
$result &= $text.$i & "."
$lw &= ($text.$i)
$i += 1
if size($result) >= 2
return substring($result, 0, size($result) - 2) & $lw
return $lw
return $text
function @draw_long_text($x:number, $y:number, $w:number, $color:number, $text:text)
var $s = size($text)
var $wnd = floor($w / char_w)
; 0 = none, 1 = cut, 2 = scroll, 3 = abbreviate
if $text_mode == 1
if $s > $wnd
write($x, $y, $color, substring($text, 0, $wnd))
else
write($x, $y, $color, $text)
elseif $text_mode == 2
if $s > 1 && $s > $wnd
var $p = $text_scroll_position % $s
var $d = ($s - $p)
write($x, $y, $color, substring($text, $p, $wnd))
if $d < $wnd
write($x + (($d + 1) * char_w), $y, $color, substring($text, 0, $wnd - ($s - $p)))
else
write($x, $y, $color, $text)
elseif $text_mode == 3
write($x, $y, $color, @draw_long_word($text, $wnd))
else
write($x, $y, $color, $text)
function @draw_button_1($x:number, $y:number, $w:number, $text1:text) : number
draw_rect($x, $y, $x + $w, $y + char_h + 6, black, black)
write($x + 3, $y + 3, green, $text1)
return button_rect($x, $y, $x + $w, $y + char_h + 6, gray)
function @draw_button_1x($x:number, $y:number, $w:number, $h:number, $text1:text) : number
draw_rect($x, $y, $x + $w, $y + $h + 6, black, black)
write($x + 3, $y + 3 + ($h - char_h) / 2, green, $text1)
return button_rect($x, $y, $x + $w, $y + $h + 6, gray)
function @draw_button_item($x:number, $y:number, $w:number, $text1:text, $text2:text, $text3 : text) : number
draw_rect($x, $y, $x + $w, $y + char_h + char_h + 6, gray, black)
@draw_long_text($x + 3, $y + 3, $w - 12 - 3, green, $text1)
@draw_long_text($x + 3, $y + char_h + 3, $w - 12 - 3, green, $text2)
draw_rect($x + $w - 12, $y, $x + $w, $y + char_h + char_h + 6, gray, black)
write($x + $w - 12 + 3, $y + char_h / 2 + 3, green, $text3)
; 0 = not pressed, 1 = add to queue, 2 = configuration
var $b1 = button_rect($x + $w - 12, $y, $x + $w, $y + char_h + char_h + 6, gray) * 2
var $b2 = button_rect($x, $y, $x + $w - 11, $y + char_h + char_h + 6, gray)
return $b1 + $b2
function @draw_item_scene()
var $ox = 17
var $oy = 10
write($ox + 3, $oy + 3, green, $selected_item & text(": {0}", @get_stock($selected_item)))
$oy += char_h + char_h
write($ox + 3, $oy + 3, green, text("Queue: {0}", $queue.$selected_item))
$oy += char_h + 6 + 1
if @draw_button_1($ox, $oy, 40, "+1")
@queue_increment($selected_item, 1)
if @draw_button_1($ox + 40, $oy, 40, "+10")
@queue_increment($selected_item, 10)
if @draw_button_1($ox + 40 + 40, $oy, 40, "+50")
@queue_increment($selected_item, 50)
$oy += char_h + 6 + 1
if @draw_button_1($ox, $oy, 40, "+100")
@queue_increment($selected_item, 100)
if @draw_button_1($ox + 40, $oy, 40, "+500")
@queue_increment($selected_item, 500)
if @draw_button_1($ox + 40 + 40, $oy, 40, "+1000")
@queue_increment($selected_item, 1000)
if @draw_button_1($ox + 40 + 40 + 40, $oy, 40, "X")
@queue_cancel($selected_item)
$oy += char_h + char_h
write($ox + 3, $oy + 3, green, text("Buffer: {0}", $stocks.$selected_item))
$oy += char_h + 6 + 1
if @draw_button_1($ox, $oy, 40, "+1")
@keep_stock_add($selected_item, 1)
if @draw_button_1($ox + 40, $oy, 40, "+10")
@keep_stock_add($selected_item, 10)
if @draw_button_1($ox + 40 + 40, $oy, 40, "+50")
@keep_stock_add($selected_item, 50)
$oy += char_h + 6 + 1
if @draw_button_1($ox, $oy, 40, "+100")
@keep_stock_add($selected_item, 100)
if @draw_button_1($ox + 40, $oy, 40, "+500")
@keep_stock_add($selected_item, 500)
if @draw_button_1($ox + 40 + 40, $oy, 40, "+1000")
@keep_stock_add($selected_item, 1000)
if @draw_button_1($ox + 40 + 40 + 40, $oy, 40, "X")
@keep_stock_set($selected_item, 0)
if @draw_button_1(17, screen_h - char_h - 6 - 17, 80, "Back")
$selected_item = ""
function @draw_category_scene()
array $categories : text
$categories.from(get_recipes_categories("crafter"), ",")
var $ox = 17
var $oy = 10
foreach $categories ($i, $c)
if @draw_button_1($ox, $oy, 80, $c)
@text_scroll_reset()
$selected_category = $c
$selected_page = 0
$ox += 80 + 6
if $ox > 160
$ox = 17
$oy += char_h + 9
;if @draw_button_1(17, screen_h - char_h - 6 - 17, 80, "Queue")
; $selected_item = ""
if @draw_button_1(17 + 86, screen_h - char_h - 6 - 17, 80, "Buffer")
$scene_stock = 1
$scene_stock_page = 0
function @draw_crafting_scene()
array $craftable:text
$craftable.from(get_recipes("crafter", $selected_category), ",")
var $pages = ceil($craftable.size / 10)
var $cursor = clamp($selected_page * 10, 0, $craftable.size)
var $end = $cursor + 10
var $ox = 12
var $oy = 3
while $cursor < $end && $cursor < $craftable.size
var $c = $craftable.$cursor
var $stock = @get_stock($c)
var $inqueue = $queue.$c : number
$cursor += 1
var $a = @draw_button_item($ox, $oy, 87, $c, ($stock : text) & " + " & ($inqueue : text), "C" )
if $a == 1
@queue_increment($c, 1)
elseif $a == 2
$selected_item = $c
$ox += 89
if $ox > 160
$ox = 12
$oy += char_h + char_h + 9
if @draw_button_1x(0, 3, 11, (char_h + char_h + 9) * 5 - 9, "-")
$selected_page = max($selected_page - 1, 0)
if @draw_button_1x(screen_w - 11, 3, 11, (char_h + char_h + 9) * 5 - 9, "+")
$selected_page = min($selected_page + 1, $pages - 1)
if @draw_button_1(17, screen_h - char_h - 6 - 17, 80, "Back")
$selected_category = ""
$selected_page = 0
if @draw_button_1(17 + 80 + 6, screen_h - char_h - 6 - 17, 80, "Cancel")
@queue_clear()
function @draw_stock_scene()
array $list : text
$list.clear()
foreach $stocks ($k, $v)
if $v > 0
$list.append($k)
$list.sort()
var $pages = floor($list.size / 10)
$scene_stock_page = clamp($scene_stock_page, 0, $pages)
var $cursor = clamp($scene_stock_page * 10, 0, $list.size)
var $end = $cursor + 10
var $ox = 12
var $oy = 3
if $list.size > 0
while $cursor < $end && $cursor < $list.size
var $c = $list.$cursor
$cursor += 1
if @draw_button_item($ox, $oy, 87, $c, text("{0}", $stocks.$c), "X") == 2
@keep_stock_set($c, 0)
$ox += 89
if $ox > 160
$ox = 12
$oy += char_h + char_h + 9
else
write((screen_w - 110) / 2, (screen_h - char_h) / 2 - char_h, green, "Buffer List is Empty")
if $scene_stock_page > 0
if @draw_button_1x(0, 3, 11, (char_h + char_h + 9) * 5 - 3, "-")
$scene_stock_page = max($scene_stock_page - 1, 0)
if $scene_stock_page + 1 <= $pages
if @draw_button_1x(screen_w - 11, 3, 11, (char_h + char_h + 9) * 5 - 3, "+")
$scene_stock_page = min($scene_stock_page + 1, $pages)
if @draw_button_1(17, screen_h - char_h - 6 - 17, 80, "Back")
$scene_stock = 0
$scene_stock_page = 0
init
@crafter_set("", 0)
@create_recipe_mapping()
@create_resource_mapping()
update
$items = input_text($container, 0)
@crafter_check()
@build_next()
@text_scroll_update()
blank(black)
if $scene_stock
@draw_stock_scene()
elseif $selected_item
@draw_item_scene()
elseif $selected_category
@draw_crafting_scene()
else
@draw_category_scene()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment