added turtle kernel stuff

This commit is contained in:
Djeeberjr 2022-04-11 00:54:58 +02:00
parent fa62e3a2eb
commit 943391dddc
2 changed files with 287 additions and 0 deletions

263
src/kernel/turtle/Turtle.hx Normal file
View File

@ -0,0 +1,263 @@
package kernel.turtle;
import kernel.turtle.Types;
using tink.CoreApi;
typedef TurtleSlot = Int;
class Turtle {
public static function isTurtle():Bool {
return true; // TODO: Implement
}
private function conterToOutcome(r:cc.Turtle.TurtleActionResult):Outcome<Noise, String> {
if (r.successful) {
return Outcome.Success(null);
} else {
if (r.error != null) {
return Outcome.Failure(r.error);
} else {
return Outcome.Failure("Unknown error");
}
}
}
public function forward():Outcome<Noise, String> {
var r = cc.Turtle.forward();
return conterToOutcome(r);
}
public function back():Outcome<Noise, String> {
var r = cc.Turtle.back();
return conterToOutcome(r);
}
public function up():Outcome<Noise, String> {
var r = cc.Turtle.up();
return conterToOutcome(r);
}
public function down():Outcome<Noise, String> {
var r = cc.Turtle.down();
return conterToOutcome(r);
}
public function turnLeft():Outcome<Noise, String> {
var r = cc.Turtle.turnLeft();
return conterToOutcome(r);
}
public function turnRight():Outcome<Noise, String> {
var r = cc.Turtle.turnRight();
return conterToOutcome(r);
}
public function dig(dir:InteractDirections, ?toolSide:ToolSide):Outcome<Noise, String> {
var r:cc.Turtle.TurtleActionResult;
// FIXME: upstream needs to be fixed to accept ToolSide
switch dir {
case Front:
r = cc.Turtle.dig();
case Up:
r = cc.Turtle.digUp();
case Down:
r = cc.Turtle.digDown();
}
return conterToOutcome(r);
}
public function place(dir:InteractDirections):Outcome<Noise, String> {
var r:cc.Turtle.TurtleActionResult;
switch dir {
case Front:
r = cc.Turtle.place();
case Up:
r = cc.Turtle.placeUp();
case Down:
r = cc.Turtle.placeDown();
}
return conterToOutcome(r);
}
public function placeSign(dir:InteractDirections, text:String):Outcome<Noise, String> {
var r:cc.Turtle.TurtleActionResult;
switch dir {
case Front:
r = cc.Turtle.place(text);
case Up:
r = cc.Turtle.placeUp(); // FIXME: fix upstream to accept text
case Down:
r = cc.Turtle.placeDown();
}
return conterToOutcome(r);
}
public function drop(dir:InteractDirections, ?count:Int):Outcome<Noise, String> {
var r = cc.Turtle.drop(count);
return conterToOutcome(r);
}
public function selectSlot(slot:TurtleSlot):Outcome<Noise, Noise> {
// TODO: slot in bounds?
var r = cc.Turtle.select(slot);
return (r) ? Outcome.Success(null) : Outcome.Failure("Slot out of bounds");
}
public function getItemCount(?slot:TurtleSlot):Int {
// TODO: slot in bounds?
return cc.Turtle.getItemCount(slot);
}
public function getItemSpace(?slot:TurtleSlot):Int {
// TODO: slot in bounds?
return cc.Turtle.getItemSpace(slot);
}
public function detect(dir:InteractDirections):Bool {
switch dir {
case Front:
return cc.Turtle.detect();
case Up:
return cc.Turtle.detectUp();
case Down:
return cc.Turtle.detectDown();
}
}
public function compareToSlot(dir:InteractDirections):Bool {
switch dir {
case Front:
return cc.Turtle.compare();
case Up:
return cc.Turtle.compareUp();
case Down:
return cc.Turtle.compareDown();
}
}
public function attack(dir:InteractDirections, ?toolSide:ToolSide):Outcome<Noise, String> {
var r:cc.Turtle.TurtleActionResult;
// FIXEM: upstream needs to be fixed to accept ToolSide
switch dir {
case Front:
r = cc.Turtle.attack();
case Up:
r = cc.Turtle.attackUp();
case Down:
r = cc.Turtle.attackDown();
}
return conterToOutcome(r);
}
public function suckItem(dir:InteractDirections, ?ammount:Int):Outcome<Noise, String> {
// TODO: ammount in bounds?
var r:cc.Turtle.TurtleActionResult;
switch dir {
case Front:
r = cc.Turtle.suck(ammount);
case Up:
r = cc.Turtle.suckUp(ammount);
case Down:
r = cc.Turtle.suckDown(ammount);
}
return conterToOutcome(r);
}
public function getFuelLevel():Int {
var r = cc.Turtle.getFuelLevel(); // FIXME: can be a string. Has to be fixed upstream
return r;
}
public function refuel(?ammount:Int):Outcome<Noise, String> {
var r = cc.Turtle.refuel(ammount);
return conterToOutcome(r);
}
public function canRefultWithSlot():Bool {
var r = cc.Turtle.refuel(0);
return r.successful;
}
public function compareSlot(otherSlot:TurtleSlot):Bool {
return cc.Turtle.compareTo(otherSlot);
}
public function transferToSlot(to:TurtleSlot, ?count:Int):Outcome<Noise, Noise> {
var r = cc.Turtle.transferTo(to, count);
return r ? Outcome.Success(null) : Outcome.Failure(null);
}
public function getSelectedSlot():TurtleSlot {
return cc.Turtle.getSelectedSlot();
}
public function getFuelLimit():Int {
return cc.Turtle.getFuelLimit(); // FIXME: can be a string. Has to be fixed upstream
}
public function equip(side:ToolSide):Outcome<Noise, String> {
switch side {
case Left:
return conterToOutcome(cc.Turtle.equipLeft());
case Right:
return conterToOutcome(cc.Turtle.equipRight());
}
}
public function inspect(dir:InteractDirections):Outcome<BlockInspect, String> {
var r:cc.Turtle.TurtleInspectResult;
switch dir {
case Front:
r = cc.Turtle.inspect();
case Up:
r = cc.Turtle.inspectUp();
case Down:
r = cc.Turtle.inspectDown();
}
if (!r.successful) {
return Outcome.Failure(r.result);
}
// TODO: check if this is correct
return Outcome.Success({
name: (r.result : cc.Turtle.TurtleBlockDetail).name,
state: (r.result : cc.Turtle.TurtleBlockDetail).state,
metadata: (r.result : cc.Turtle.TurtleBlockDetail).metadata,
});
}
public function getItemDetail(?detailed:Bool = false, ?slot:TurtleSlot):Option<ItemInspect> {
var r = cc.Turtle.getItemDetail(slot); // FIXME: can take detailed as flag. Has to be fixed upstream
if (r == null) {
return None;
}
// TODO: check if this is correct
return Some({
name: r.name,
count: r.count,
damage: r.damage,
});
}
public function craft(?limit:Int = 64):Outcome<Noise, String> {
if (limit < 1 || limit > 64) {
return Outcome.Failure("Crafting limit out of bounds");
}
var r = cc.Turtle.craft(limit);
return conterToOutcome(r);
}
}

View File

@ -0,0 +1,24 @@
package kernel.turtle;
enum ToolSide {
Left;
Right;
}
enum InteractDirections {
Front;
Up;
Down;
}
typedef BlockInspect = {
public var name:String;
public var metadata:Int;
public var state:Dynamic;
}
typedef ItemInspect = {
public var name:String;
public var damage:Int;
public var count:Int;
}