cc-haxe/src/kernel/peripherals/Peripherals.hx

171 lines
4.3 KiB
Haxe

package kernel.peripherals;
import kernel.log.Log;
import kernel.peripherals.Modem;
import kernel.peripherals.Screen;
using lua.Table;
using Lambda;
using tink.CoreApi;
/**
Class responseable for retrieving peripherals.
**/
class Peripheral {
public static function getAllAddresses():Array<String> {
return cc.Peripheral.getNames().toArray();
}
public static function isPresent(addr:String):Bool {
return cc.Peripheral.isPresent(addr);
}
public static function getTypes(addr:String):Array<String> {
if (!cc.Peripheral.isPresent(addr)) {
return [];
}
return cc.Peripheral.getType(addr).toArray();
}
public static function findAddrByType(type:String):Array<String> {
return getAllAddresses().filter(addr -> getTypes(addr).contains(type));
}
private static function safeGetAddr(addr:String, type:String):Null<String> {
if (!isPresent(addr)) {
return null;
}
var types = getTypes(addr);
if (!types.contains(type)) {
return null;
}
return addr;
}
public static function inspect(addr:String):Null<{types:Array<String>, methods:Array<String>}> {
if (!isPresent(addr)) {
return null;
}
var types = getTypes(addr);
var methods = cc.Peripheral.getMethods(addr).toArray();
return {
types: types,
methods: methods
};
}
/**
Cast peripheral to a specific type.
This is a temporary solution, maybe forever.
**/
public static function getFromType(addr:String, type:String):Null<IPeripheral> {
switch (type) {
case Computer.TYPE_NAME:
return getComputer(addr);
case Screen.TYPE_NAME:
return getScreen(addr);
case Drive.TYPE_NAME:
return getDrive(addr);
case EnergyStorage.TYPE_NAME:
return getEnergyStorage(addr);
case Modem.TYPE_NAME:
return getModem(addr);
case Printer.TYPE_NAME:
return getPrinter(addr);
case Speaker.TYPE_NAME:
return getSpeaker(addr);
case Redstone.TYPE_NAME:
return getRedstone(addr);
}
return null;
}
public static function getScreen(addr:String):Null<Screen> {
var addr = safeGetAddr(addr, Screen.TYPE_NAME);
if (addr == null)
return null;
return new Screen(addr);
}
public static function getAllScreens():Array<Screen> {
return [for (addr in findAddrByType(Screen.TYPE_NAME)) new Screen(addr)];
}
public static function getModem(addr:String):Null<Modem> {
var addr = safeGetAddr(addr, Modem.TYPE_NAME);
if (addr == null)
return null;
return new Modem(addr);
}
public static function getAllModems():Array<Modem> {
return [for (addr in findAddrByType(Modem.TYPE_NAME)) new Modem(addr)];
}
public static function getDrive(addr:String):Null<Drive> {
var addr = safeGetAddr(addr, Drive.TYPE_NAME);
if (addr == null)
return null;
return new Drive(addr);
}
public static function getAllDrives():Array<Drive> {
return [for (addr in findAddrByType(Drive.TYPE_NAME)) new Drive(addr)];
}
public static function getRedstone(side:String):Redstone {
// TODO: maybe handle restone differently to not duplicate event listeners
return new Redstone(side);
}
public static function getPrinter(addr:String):Null<Printer> {
var addr = safeGetAddr(addr, Printer.TYPE_NAME);
if (addr == null)
return null;
return new Printer(addr);
}
public static function getAllPrinters():Array<Printer> {
return [for (addr in findAddrByType(Printer.TYPE_NAME)) new Printer(addr)];
}
public static function getEnergyStorage(addr:String):Null<EnergyStorage> {
var addr = safeGetAddr(addr, EnergyStorage.TYPE_NAME);
if (addr == null)
return null;
return new EnergyStorage(addr);
}
public static function getAllEnergyStorages():Array<EnergyStorage> {
return [for (addr in findAddrByType(EnergyStorage.TYPE_NAME)) new EnergyStorage(addr)];
}
public static function getComputer(addr:String):Null<Computer> {
var addr = safeGetAddr(addr, Computer.TYPE_NAME);
if (addr == null)
return null;
return new Computer(addr);
}
public static function getAllComputers():Array<Computer> {
return [for (addr in findAddrByType(Computer.TYPE_NAME)) new Computer(addr)];
}
public static function getSpeaker(addr:String):Null<Speaker> {
var addr = safeGetAddr(addr, Speaker.TYPE_NAME);
if (addr == null)
return null;
return new Speaker(addr);
}
public static function getAllSpeakers():Array<Speaker> {
return [for (addr in findAddrByType(Speaker.TYPE_NAME)) new Speaker(addr)];
}
}