CC-Tweaked/src/main/java/dan200/computercraft/core/apis/RedstoneAPI.java

135 lines
4.4 KiB
Java
Raw Normal View History

/*
* This file is part of ComputerCraft - http://www.computercraft.info
2019-01-01 01:10:18 +00:00
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.core.apis;
import dan200.computercraft.api.lua.ILuaAPI;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.core.computer.ComputerSide;
2017-05-06 23:07:42 +00:00
import javax.annotation.Nonnull;
import java.util.HashMap;
import java.util.Map;
import static dan200.computercraft.core.apis.ArgumentHelper.*;
public class RedstoneAPI implements ILuaAPI
{
2017-05-01 14:48:44 +00:00
private IAPIEnvironment m_environment;
2017-05-01 14:48:44 +00:00
public RedstoneAPI( IAPIEnvironment environment )
{
m_environment = environment;
}
2017-05-01 14:48:44 +00:00
@Override
public String[] getNames()
{
return new String[] { "rs", "redstone" };
}
2017-05-06 23:07:42 +00:00
@Nonnull
2017-05-01 14:48:44 +00:00
@Override
public String[] getMethodNames()
{
2017-05-01 14:48:44 +00:00
return new String[] {
"getSides",
"setOutput",
"getOutput",
"getInput",
"setBundledOutput",
"getBundledOutput",
"getBundledInput",
"testBundledInput",
"setAnalogOutput",
"setAnalogueOutput",
"getAnalogOutput",
"getAnalogueOutput",
"getAnalogInput",
"getAnalogueInput",
};
}
2017-05-01 14:48:44 +00:00
@Override
2017-05-06 23:07:42 +00:00
public Object[] callMethod( @Nonnull ILuaContext context, int method, @Nonnull Object[] args ) throws LuaException
{
2017-05-01 14:48:44 +00:00
switch( method )
{
case 0:
{
// getSides
Map<Object, Object> table = new HashMap<>();
for( int i = 0; i < ComputerSide.NAMES.length; i++ )
2017-05-01 14:48:44 +00:00
{
table.put( i + 1, ComputerSide.NAMES[i] );
2017-05-01 14:48:44 +00:00
}
return new Object[] { table };
}
case 1:
{
// setOutput
ComputerSide side = parseSide( args );
boolean output = getBoolean( args, 1 );
2017-05-01 14:48:44 +00:00
m_environment.setOutput( side, output ? 15 : 0 );
return null;
}
case 2: // getOutput
return new Object[] { m_environment.getOutput( parseSide( args ) ) > 0 };
case 3: // getInput
return new Object[] { m_environment.getInput( parseSide( args ) ) > 0 };
2017-05-01 14:48:44 +00:00
case 4:
{
// setBundledOutput
ComputerSide side = parseSide( args );
int output = getInt( args, 1 );
2017-05-01 14:48:44 +00:00
m_environment.setBundledOutput( side, output );
return null;
}
case 5: // getBundledOutput
return new Object[] { m_environment.getBundledOutput( parseSide( args ) ) };
case 6: // getBundledInput
return new Object[] { m_environment.getBundledInput( parseSide( args ) ) };
2017-05-01 14:48:44 +00:00
case 7:
{
// testBundledInput
ComputerSide side = parseSide( args );
int mask = getInt( args, 1 );
2017-05-01 14:48:44 +00:00
int input = m_environment.getBundledInput( side );
return new Object[] { (input & mask) == mask };
2017-05-01 14:48:44 +00:00
}
case 8:
case 9:
{
// setAnalogOutput/setAnalogueOutput
ComputerSide side = parseSide( args );
int output = getInt( args, 1 );
2017-05-01 14:48:44 +00:00
if( output < 0 || output > 15 )
{
2017-05-01 14:48:44 +00:00
throw new LuaException( "Expected number in range 0-15" );
}
m_environment.setOutput( side, output );
return null;
}
case 10:
case 11: // getAnalogOutput/getAnalogueOutput
return new Object[] { m_environment.getOutput( parseSide( args ) ) };
2017-05-01 14:48:44 +00:00
case 12:
case 13: // getAnalogInput/getAnalogueInput
return new Object[] { m_environment.getInput( parseSide( args ) ) };
2017-05-01 14:48:44 +00:00
default:
return null;
}
}
private static ComputerSide parseSide( Object[] args ) throws LuaException
{
ComputerSide side = ComputerSide.valueOfInsensitive( getString( args, 0 ) );
if( side == null ) throw new LuaException( "Invalid side." );
return side;
}
}