Last active
July 6, 2024 10:10
-
-
Save robb83/c80a92f41f6f0d677f4479fb06de4be2 to your computer and use it in GitHub Desktop.
Archean - Auto Crafter Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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