added turtle kernel stuff
This commit is contained in:
		
							parent
							
								
									fa62e3a2eb
								
							
						
					
					
						commit
						943391dddc
					
				
							
								
								
									
										263
									
								
								src/kernel/turtle/Turtle.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								src/kernel/turtle/Turtle.hx
									
									
									
									
									
										Normal 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);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								src/kernel/turtle/Types.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/kernel/turtle/Types.hx
									
									
									
									
									
										Normal 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;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user