93 lines
1.9 KiB
Haxe
93 lines
1.9 KiB
Haxe
package lib.turtle;
|
|
|
|
import kernel.turtle.Turtle;
|
|
|
|
using tink.CoreApi;
|
|
|
|
/**
|
|
Extends the Turtle kernel.
|
|
**/
|
|
class TurtleExt {
|
|
public static function getFreeSlots(t:Turtle):Int {
|
|
var ret:Int = 0;
|
|
|
|
for (i in 0...Turtle.MAX_SLOTS) {
|
|
if (t.getItemCount(i) == 0) {
|
|
ret++;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
public static function canPickup(t:Turtle, item:Item):Bool {
|
|
for (i in 0...Turtle.MAX_SLOTS) {
|
|
var slotItem = t.getItemDetail(i).orNull();
|
|
if (slotItem != null && slotItem.name == item) {
|
|
if (t.getItemSpace(i) > 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static function canPickupCount(t:Turtle, item:Item):Int {
|
|
var ret:Int = 0;
|
|
|
|
for (i in 0...Turtle.MAX_SLOTS) {
|
|
var slotItem = Turtle.getItemDetail(i).orNull();
|
|
if (slotItem != null && slotItem.name == item) {
|
|
ret += Turtle.getItemSpace(i);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
public static function getInventory(t:Turtle):Map<Int, {item:Item, count:Int, free:Int}> {
|
|
var rtn:Map<Int, {item:Item, count:Int, free:Int}> = new Map();
|
|
|
|
for (i in 0...Turtle.MAX_SLOTS) {
|
|
var slotItem = t.getItemDetail(i).orNull();
|
|
if (slotItem != null) {
|
|
rtn.set(i, {item: slotItem.name, count: slotItem.count, free: t.getItemSpace(i)});
|
|
}
|
|
}
|
|
|
|
return rtn;
|
|
}
|
|
|
|
/**
|
|
Optimize the turtle inventory.
|
|
TODO: does not work 100% yet. Can be optimized more i think. Not that it needs to be optimized.
|
|
**/
|
|
public static function tidy(t:Turtle) {
|
|
var inv = getInventory(t);
|
|
// For each item in the inventory
|
|
for (k1 => v1 in inv) {
|
|
if (v1.free == 0 || v1.count == 0) {
|
|
continue;
|
|
}
|
|
|
|
for (k2 => v2 in inv) {
|
|
if (k2 == k1) {
|
|
continue;
|
|
}
|
|
|
|
if (v1.item == v2.item && v2.free > 0) {
|
|
// We can move an item in there
|
|
t.transfer(k1, k2, v2.free);
|
|
|
|
v1.count -= v2.free;
|
|
if (v1.count <= 0) {
|
|
inv.remove(k1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|