1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-06-26 07:02:55 +00:00

Merge branch 'master' into mc-1.14.x

Unfortunately we can't apply the config changes due to backwards
compatibility. This'll be something we may need to PR into Forge.

CraftTweaker support still needs to be added.
This commit is contained in:
SquidDev 2019-12-23 22:34:28 +00:00
commit 037cbabb32
101 changed files with 1569 additions and 1173 deletions

View File

@ -11,5 +11,8 @@ insert_final_newline = true
[*.md] [*.md]
trim_trailing_whitespace = false trim_trailing_whitespace = false
[*.sexp]
indent_size = 2
[*.properties] [*.properties]
insert_final_newline = false insert_final_newline = false

View File

@ -4,6 +4,7 @@ on: [push, pull_request]
jobs: jobs:
build: build:
name: Build
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@ -16,3 +17,17 @@ jobs:
- name: Build with Gradle - name: Build with Gradle
run: ./gradlew build --no-daemon run: ./gradlew build --no-daemon
lint-lua:
name: Lint Lua
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Lint Lua code
run: |
test -d bin || mkdir bin
test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/bin/illuaminate
chmod +x bin/illuaminate
bin/illuaminate lint

View File

@ -1,35 +0,0 @@
std = "max"
ignore = {
-- Allow access to undefined globals or their fields. In the future we'll
-- define all of CC's globals within this file
'113', '143',
-- FIXME: Ignore unused arguments and loop variables
'212', '213',
-- Disable line is too long for now. It would be possible to clean
-- this up in the future.
'631',
}
-- Only run the linter on ROM and bios for now, as the treasure disks
-- are largely unsupported.
include_files = {
'src/main/resources/assets/computercraft/lua/rom',
'src/main/resources/assets/computercraft/lua/bios.lua',
'src/test/resources/test-rom',
}
files['src/main/resources/assets/computercraft/lua/bios.lua'] = {
-- Allow declaring and mutating globals
allow_defined_top = true,
ignore = { '112', '121', '122', '131', '142' },
}
files['src/main/resources/assets/computercraft/lua/rom/apis'] = {
-- APIs may define globals on the top level. We'll ignore unused globals,
-- as obviously they may be used outside that API.
allow_defined_top = true,
ignore = { '131' },
}

View File

@ -81,6 +81,10 @@ repositories {
name "Amadornes" name "Amadornes"
url "https://maven.amadornes.com/" url "https://maven.amadornes.com/"
} }
maven {
name "CraftTweaker"
url "https://maven.blamejared.com/"
}
} }
configurations { configurations {
@ -95,8 +99,7 @@ dependencies {
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25:api") compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25:api")
// deobfProvided "pl.asie:Charset-Lib:0.5.4.6" compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.14.4:5.0.1.150")
// deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25") runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25")
@ -162,6 +165,7 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
// Add the main runtime jar and all non-shadowed dependencies // Add the main runtime jar and all non-shadowed dependencies
libraryjars "${System.getProperty('java.home')}/lib/rt.jar" libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
doFirst { doFirst {
sourceSets.main.compileClasspath sourceSets.main.compileClasspath
.filter { !it.name.contains("Cobalt") } .filter { !it.name.contains("Cobalt") }
@ -177,9 +181,6 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
// Preserve ComputerCraft classes - we only want to strip shadowed files. // Preserve ComputerCraft classes - we only want to strip shadowed files.
keep 'class dan200.computercraft.** { *; }' keep 'class dan200.computercraft.** { *; }'
// Preserve the constructors in Cobalt library class, as we init them via reflection
keepclassmembers 'class org.squiddev.cobalt.lib.** { <init>(...); }'
// LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard // LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard
dontwarn 'module-info' dontwarn 'module-info'
dontwarn 'org.apache.**,org.lwjgl.**' dontwarn 'org.apache.**,org.lwjgl.**'

View File

@ -1,5 +1,5 @@
# Mod properties # Mod properties
mod_version=1.85.2 mod_version=1.86.0
# Minecraft properties (update mods.toml when changing) # Minecraft properties (update mods.toml when changing)
mc_version=1.14.4 mc_version=1.14.4

28
illuaminate.sexp Normal file
View File

@ -0,0 +1,28 @@
; -*- mode: Lisp;-*-
(sources
/src/main/resources/assets/computercraft/lua/bios.lua
/src/main/resources/assets/computercraft/lua/rom/
/src/test/resources/test-rom)
(at /
(linters
;; It'd be nice to avoid this, but right now there's a lot of instances of
;; it.
-var:set-loop
;; It's useful to name arguments for documentation, so we allow this. It'd
;; be good to find a compromise in the future, but this works for now.
-var:unused-arg))
;; We disable the unused global linter in bios.lua and the APIs. In the future
;; hopefully we'll get illuaminate to handle this.
(at
(/src/main/resources/assets/computercraft/lua/bios.lua
/src/main/resources/assets/computercraft/lua/rom/apis/)
(linters -var:unused-global)
(lint
(allow-toplevel-global true)))
;; These warnings are broken right now
(at (bios.lua worm.lua) (linters -control:unreachable))

View File

@ -17,11 +17,33 @@ import net.minecraftforge.fml.ModLoadingContext;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.stream.Stream;
public final class TurtleUpgrades public final class TurtleUpgrades
{ {
public static class Wrapper
{
final ITurtleUpgrade upgrade;
final int legacyId;
final String id;
final String modId;
boolean enabled;
public Wrapper( ITurtleUpgrade upgrade )
{
ModContainer mc = ModLoadingContext.get().getActiveContainer();
this.upgrade = upgrade;
this.id = upgrade.getUpgradeID().toString();
this.modId = mc != null && mc.getModId() != null ? mc.getModId() : null;
this.enabled = true;
}
}
private static ITurtleUpgrade[] vanilla;
private static final Map<String, ITurtleUpgrade> upgrades = new HashMap<>(); private static final Map<String, ITurtleUpgrade> upgrades = new HashMap<>();
private static final IdentityHashMap<ITurtleUpgrade, String> upgradeOwners = new IdentityHashMap<>(); private static final IdentityHashMap<ITurtleUpgrade, Wrapper> wrappers = new IdentityHashMap<>();
private TurtleUpgrades() {} private TurtleUpgrades() {}
@ -29,7 +51,8 @@ public final class TurtleUpgrades
{ {
Objects.requireNonNull( upgrade, "upgrade cannot be null" ); Objects.requireNonNull( upgrade, "upgrade cannot be null" );
String id = upgrade.getUpgradeID().toString(); Wrapper wrapper = new Wrapper( upgrade );
String id = wrapper.id;
ITurtleUpgrade existing = upgrades.get( id ); ITurtleUpgrade existing = upgrades.get( id );
if( existing != null ) if( existing != null )
{ {
@ -37,17 +60,28 @@ public final class TurtleUpgrades
} }
upgrades.put( id, upgrade ); upgrades.put( id, upgrade );
wrappers.put( upgrade, wrapper );
ModContainer mc = ModLoadingContext.get().getActiveContainer();
if( mc != null && mc.getModId() != null ) upgradeOwners.put( upgrade, mc.getModId() );
} }
@Nullable
public static ITurtleUpgrade get( String id ) public static ITurtleUpgrade get( String id )
{ {
return upgrades.get( id ); return upgrades.get( id );
} }
@Nullable
public static ITurtleUpgrade get( int id )
{
return legacyUpgrades.get( id );
}
@Nullable
public static String getOwner( @Nonnull ITurtleUpgrade upgrade )
{
Wrapper wrapper = wrappers.get( upgrade );
return wrapper != null ? wrapper.modId : null;
}
public static ITurtleUpgrade get( @Nonnull ItemStack stack ) public static ITurtleUpgrade get( @Nonnull ItemStack stack )
{ {
if( stack.isEmpty() ) return null; if( stack.isEmpty() ) return null;
@ -64,30 +98,27 @@ public final class TurtleUpgrades
return null; return null;
} }
public static Iterable<ITurtleUpgrade> getVanillaUpgrades() public static Stream<ITurtleUpgrade> getVanillaUpgrades()
{ {
List<ITurtleUpgrade> vanilla = new ArrayList<>(); if( vanilla == null )
{
vanilla = new ITurtleUpgrade[] {
// ComputerCraft upgrades
ComputerCraft.TurtleUpgrades.wirelessModemNormal,
ComputerCraft.TurtleUpgrades.wirelessModemAdvanced,
ComputerCraft.TurtleUpgrades.speaker,
// Vanilla Minecraft upgrades
ComputerCraft.TurtleUpgrades.diamondPickaxe,
ComputerCraft.TurtleUpgrades.diamondAxe,
ComputerCraft.TurtleUpgrades.diamondSword,
ComputerCraft.TurtleUpgrades.diamondShovel,
ComputerCraft.TurtleUpgrades.diamondHoe,
ComputerCraft.TurtleUpgrades.craftingTable,
};
}
// ComputerCraft upgrades return Arrays.stream( vanilla ).filter( x -> x != null && wrappers.get( x ).enabled );
vanilla.add( ComputerCraft.TurtleUpgrades.wirelessModemNormal );
vanilla.add( ComputerCraft.TurtleUpgrades.wirelessModemAdvanced );
vanilla.add( ComputerCraft.TurtleUpgrades.speaker );
// Vanilla Minecraft upgrades
vanilla.add( ComputerCraft.TurtleUpgrades.diamondPickaxe );
vanilla.add( ComputerCraft.TurtleUpgrades.diamondAxe );
vanilla.add( ComputerCraft.TurtleUpgrades.diamondSword );
vanilla.add( ComputerCraft.TurtleUpgrades.diamondShovel );
vanilla.add( ComputerCraft.TurtleUpgrades.diamondHoe );
vanilla.add( ComputerCraft.TurtleUpgrades.craftingTable );
return vanilla;
}
@Nullable
public static String getOwner( @Nonnull ITurtleUpgrade upgrade )
{
return upgradeOwners.get( upgrade );
} }
public static Iterable<ITurtleUpgrade> getUpgrades() public static Iterable<ITurtleUpgrade> getUpgrades()
@ -99,4 +130,14 @@ public final class TurtleUpgrades
{ {
return true; return true;
} }
public static void disable( ITurtleUpgrade upgrade )
{
Wrapper wrapper = wrappers.get( upgrade );
if( !wrapper.enabled ) return;
wrapper.enabled = false;
upgrades.remove( wrapper.id );
if( wrapper.legacyId >= 0 ) legacyUpgrades.remove( wrapper.legacyId );
}
} }

View File

@ -0,0 +1,70 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.integration.crafttweaker;
import crafttweaker.CraftTweakerAPI;
import crafttweaker.annotations.ModOnly;
import crafttweaker.annotations.ZenDoc;
import crafttweaker.annotations.ZenRegister;
import crafttweaker.api.item.IItemStack;
import crafttweaker.api.minecraft.CraftTweakerMC;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.integration.crafttweaker.actions.AddTurtleTool;
import dan200.computercraft.shared.integration.crafttweaker.actions.RemoveTurtleUpgradeByItem;
import dan200.computercraft.shared.integration.crafttweaker.actions.RemoveTurtleUpgradeByName;
import stanhebben.zenscript.annotations.ZenClass;
import stanhebben.zenscript.annotations.ZenMethod;
@ZenRegister
@ZenClass( "dan200.computercraft.turtle" )
@ModOnly( ComputerCraft.MOD_ID )
public class TurtleTweaker
{
@ZenMethod
@ZenDoc( "Remove a turtle upgrade with the given id" )
public static void removeUpgrade( String upgrade )
{
CraftTweakerAPI.apply( new RemoveTurtleUpgradeByName( upgrade ) );
}
@ZenMethod
@ZenDoc( "Remove a turtle upgrade crafted with the given item stack" )
public static void removeUpgrade( IItemStack stack )
{
CraftTweakerAPI.apply( new RemoveTurtleUpgradeByItem( CraftTweakerMC.getItemStack( stack ) ) );
}
@ZenMethod
@ZenDoc( "Add a new turtle tool with the given id, which crafts and acts using the given stack." )
public static void addTool( String id, IItemStack stack )
{
addTool( id, stack, stack, "tool" );
}
@ZenMethod
@ZenDoc( "Add a new turtle tool with the given id, which is crafted with one item, and uses another." )
public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack )
{
addTool( id, craftingStack, toolStack, "tool" );
}
@ZenMethod
@ZenDoc( "Add a new turtle tool with the given id, which crafts and acts using the given stack. You may also" +
"specify a 'kind' of tool, which limits what blocks the turtle can break (for instance, an 'axe' may only break wood)." )
public static void addTool( String id, IItemStack stack, String kind )
{
addTool( id, stack, stack, kind );
}
@ZenMethod
@ZenDoc( "Add a new turtle tool with the given id, which is crafted with one item, and uses another. You may also" +
"specify a 'kind' of tool, which limits what blocks the turtle can break (for instance, an 'axe' may only break wood)." )
public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack, String kind )
{
CraftTweakerAPI.apply( new AddTurtleTool( id, CraftTweakerMC.getItemStack( craftingStack ), CraftTweakerMC.getItemStack( toolStack ), kind ) );
}
}

View File

@ -0,0 +1,96 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.integration.crafttweaker.actions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.turtle.upgrades.*;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* Register a new turtle tool.
*/
public class AddTurtleTool implements IAction
{
private interface Factory
{
TurtleTool create( ResourceLocation location, ItemStack craftItem, ItemStack toolItem );
}
private static final Map<String, Factory> kinds = new HashMap<>();
static
{
kinds.put( "tool", TurtleTool::new );
kinds.put( "axe", TurtleAxe::new );
kinds.put( "hoe", TurtleHoe::new );
kinds.put( "shovel", TurtleShovel::new );
kinds.put( "sword", TurtleSword::new );
}
private final String id;
private final ItemStack craftItem;
private final ItemStack toolItem;
private final String kind;
public AddTurtleTool( String id, ItemStack craftItem, ItemStack toolItem, String kind )
{
this.id = id;
this.craftItem = craftItem;
this.toolItem = toolItem;
this.kind = kind;
}
@Override
public void apply()
{
Factory factory = kinds.get( kind );
if( factory == null )
{
ComputerCraft.log.error( "Unknown turtle upgrade kind '{}' (this should have been rejected by verify!)", kind );
return;
}
try
{
TurtleUpgrades.register( factory.create( new ResourceLocation( id ), craftItem, toolItem ) );
}
catch( RuntimeException e )
{
ComputerCraft.log.error( "Registration of turtle tool failed", e );
}
}
@Override
public String describe()
{
return String.format( "Add new turtle %s '%s' (crafted with '%s', uses a '%s')", kind, id, craftItem, toolItem );
}
public Optional<String> getValidationProblem()
{
if( craftItem.isEmpty() ) return Optional.of( "Crafting item stack is empty." );
if( craftItem.hasTagCompound() && !craftItem.getTagCompound().isEmpty() )
{
return Optional.of( "Crafting item has NBT." );
}
if( toolItem.isEmpty() ) return Optional.of( "Tool item stack is empty." );
if( !kinds.containsKey( kind ) ) return Optional.of( String.format( "Unknown kind '%s'.", kind ) );
if( TurtleUpgrades.get( id ) != null )
{
return Optional.of( String.format( "An upgrade with the same name ('%s') has already been registered.", id ) );
}
return Optional.empty();
}
}

View File

@ -0,0 +1,32 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.integration.crafttweaker.actions;
import java.util.Optional;
/**
* An extension of {@link IAction} with a single validation function, rather than two.
*/
public interface IAction extends crafttweaker.IAction
{
default Optional<String> getValidationProblem()
{
return Optional.empty();
}
@Override
default boolean validate()
{
return !getValidationProblem().isPresent();
}
@Override
default String describeInvalid()
{
return getValidationProblem().orElse( "No problems found." );
}
}

View File

@ -0,0 +1,50 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.integration.crafttweaker.actions;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.shared.TurtleUpgrades;
import net.minecraft.item.ItemStack;
import java.util.Optional;
/**
* Removes a turtle upgrade crafted with the given stack.
*/
public class RemoveTurtleUpgradeByItem implements IAction
{
private final ItemStack stack;
public RemoveTurtleUpgradeByItem( ItemStack stack )
{
this.stack = stack;
}
@Override
public void apply()
{
ITurtleUpgrade upgrade = TurtleUpgrades.get( stack );
if( upgrade != null ) TurtleUpgrades.disable( upgrade );
}
@Override
public String describe()
{
return String.format( "Remove turtle upgrades crafted with '%s'", stack );
}
@Override
public Optional<String> getValidationProblem()
{
if( TurtleUpgrades.get( stack ) == null )
{
return Optional.of( String.format( "Unknown turtle upgrade crafted with '%s'.", stack ) );
}
return Optional.empty();
}
}

View File

@ -0,0 +1,49 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.integration.crafttweaker.actions;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.shared.TurtleUpgrades;
import java.util.Optional;
/**
* Removes a turtle upgrade with the given id.
*/
public class RemoveTurtleUpgradeByName implements IAction
{
private final String id;
public RemoveTurtleUpgradeByName( String id )
{
this.id = id;
}
@Override
public void apply()
{
ITurtleUpgrade upgrade = TurtleUpgrades.get( id );
if( upgrade != null ) TurtleUpgrades.disable( upgrade );
}
@Override
public String describe()
{
return String.format( "Remove turtle upgrade '%s'", id );
}
@Override
public Optional<String> getValidationProblem()
{
if( TurtleUpgrades.get( id ) == null )
{
return Optional.of( String.format( "Unknown turtle upgrade '%s'.", id ) );
}
return Optional.empty();
}
}

View File

@ -7,6 +7,7 @@
package dan200.computercraft.shared.turtle.upgrades; package dan200.computercraft.shared.turtle.upgrades;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
public class TurtleAxe extends TurtleTool public class TurtleAxe extends TurtleTool
@ -21,6 +22,11 @@ public class TurtleAxe extends TurtleTool
super( id, item ); super( id, item );
} }
public TurtleAxe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
{
super( id, craftItem, toolItem );
}
@Override @Override
protected float getDamageMultiplier() protected float getDamageMultiplier()
{ {

View File

@ -35,6 +35,11 @@ public class TurtleHoe extends TurtleTool
super( id, item ); super( id, item );
} }
public TurtleHoe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
{
super( id, craftItem, toolItem );
}
@Override @Override
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
{ {

View File

@ -35,6 +35,11 @@ public class TurtleShovel extends TurtleTool
super( id, item ); super( id, item );
} }
public TurtleShovel( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
{
super( id, craftItem, toolItem );
}
@Override @Override
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
{ {

View File

@ -10,6 +10,7 @@ import dan200.computercraft.shared.turtle.core.TurtlePlayer;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -26,6 +27,11 @@ public class TurtleSword extends TurtleTool
super( id, item ); super( id, item );
} }
public TurtleSword( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
{
super( id, craftItem, toolItem );
}
@Override @Override
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
{ {

View File

@ -63,6 +63,12 @@ public class TurtleTool extends AbstractTurtleUpgrade
this.item = new ItemStack( item ); this.item = new ItemStack( item );
} }
public TurtleTool( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
{
super( id, -1, TurtleUpgradeType.Tool, craftItem );
this.item = toolItem;
}
@Nonnull @Nonnull
@Override @Override
@OnlyIn( Dist.CLIENT ) @OnlyIn( Dist.CLIENT )
@ -77,7 +83,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
); );
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
return Pair.of( return Pair.of(
mc.getItemRenderer().getItemModelMesher().getItemModel( item ), mc.getItemRenderer().getItemModelMesher().getItemModel( getCraftingItem() ),
transform transform
); );
} }

View File

@ -93,7 +93,7 @@ if _VERSION == "Lua 5.1" then
bxor = bit32.bxor, bxor = bit32.bxor,
brshift = bit32.arshift, brshift = bit32.arshift,
blshift = bit32.lshift, blshift = bit32.lshift,
blogic_rshift = bit32.rshift blogic_rshift = bit32.rshift,
} }
end end
end end
@ -184,15 +184,15 @@ function sleep( nTime )
expect(1, nTime, "number", "nil") expect(1, nTime, "number", "nil")
local timer = os.startTimer( nTime or 0 ) local timer = os.startTimer( nTime or 0 )
repeat repeat
local sEvent, param = os.pullEvent( "timer" ) local _, param = os.pullEvent( "timer" )
until param == timer until param == timer
end end
function write( sText ) function write( sText )
expect(1, sText, "string", "number") expect(1, sText, "string", "number")
local w,h = term.getSize() local w, h = term.getSize()
local x,y = term.getCursorPos() local x, y = term.getCursorPos()
local nLinesPrinted = 0 local nLinesPrinted = 0
local function newLine() local function newLine()
@ -207,13 +207,13 @@ function write( sText )
end end
-- Print the line with proper word wrapping -- Print the line with proper word wrapping
while string.len(sText) > 0 do while #sText > 0 do
local whitespace = string.match( sText, "^[ \t]+" ) local whitespace = string.match( sText, "^[ \t]+" )
if whitespace then if whitespace then
-- Print whitespace -- Print whitespace
term.write( whitespace ) term.write( whitespace )
x,y = term.getCursorPos() x, y = term.getCursorPos()
sText = string.sub( sText, string.len(whitespace) + 1 ) sText = string.sub( sText, #whitespace + 1 )
end end
local newline = string.match( sText, "^\n" ) local newline = string.match( sText, "^\n" )
@ -225,24 +225,24 @@ function write( sText )
local text = string.match( sText, "^[^ \t\n]+" ) local text = string.match( sText, "^[^ \t\n]+" )
if text then if text then
sText = string.sub( sText, string.len(text) + 1 ) sText = string.sub( sText, #text + 1 )
if string.len(text) > w then if #text > w then
-- Print a multiline word -- Print a multiline word
while string.len( text ) > 0 do while #text > 0 do
if x > w then if x > w then
newLine() newLine()
end end
term.write( text ) term.write( text )
text = string.sub( text, (w-x) + 2 ) text = string.sub( text, w - x + 2 )
x,y = term.getCursorPos() x, y = term.getCursorPos()
end end
else else
-- Print a word normally -- Print a word normally
if x + string.len(text) - 1 > w then if x + #text - 1 > w then
newLine() newLine()
end end
term.write( text ) term.write( text )
x,y = term.getCursorPos() x, y = term.getCursorPos()
end end
end end
end end
@ -299,7 +299,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
local tCompletions local tCompletions
local nCompletion local nCompletion
local function recomplete() local function recomplete()
if _fnComplete and nPos == string.len(sLine) then if _fnComplete and nPos == #sLine then
tCompletions = _fnComplete( sLine ) tCompletions = _fnComplete( sLine )
if tCompletions and #tCompletions > 0 then if tCompletions and #tCompletions > 0 then
nCompletion = 1 nCompletion = 1
@ -332,7 +332,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
local _, cy = term.getCursorPos() local _, cy = term.getCursorPos()
term.setCursorPos( sx, cy ) term.setCursorPos( sx, cy )
local sReplace = (_bClear and " ") or _sReplaceChar local sReplace = _bClear and " " or _sReplaceChar
if sReplace then if sReplace then
term.write( string.rep( sReplace, math.max( #sLine - nScroll, 0 ) ) ) term.write( string.rep( sReplace, math.max( #sLine - nScroll, 0 ) ) )
else else
@ -544,7 +544,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
end end
end end
local cx, cy = term.getCursorPos() local _, cy = term.getCursorPos()
term.setCursorBlink( false ) term.setCursorBlink( false )
term.setCursorPos( w + 1, cy ) term.setCursorPos( w + 1, cy )
print() print()
@ -613,10 +613,10 @@ function os.loadAPI( _sPath )
expect(1, _sPath, "string") expect(1, _sPath, "string")
local sName = fs.getName( _sPath ) local sName = fs.getName( _sPath )
if sName:sub(-4) == ".lua" then if sName:sub(-4) == ".lua" then
sName = sName:sub(1,-5) sName = sName:sub(1, -5)
end end
if tAPIsLoading[sName] == true then if tAPIsLoading[sName] == true then
printError( "API "..sName.." is already being loaded" ) printError( "API " .. sName .. " is already being loaded" )
return false return false
end end
tAPIsLoading[sName] = true tAPIsLoading[sName] = true
@ -636,7 +636,7 @@ function os.loadAPI( _sPath )
end end
local tAPI = {} local tAPI = {}
for k,v in pairs( tEnv ) do for k, v in pairs( tEnv ) do
if k ~= "_ENV" then if k ~= "_ENV" then
tAPI[k] = v tAPI[k] = v
end end
@ -680,7 +680,8 @@ if http then
local methods = { local methods = {
GET = true, POST = true, HEAD = true, GET = true, POST = true, HEAD = true,
OPTIONS = true, PUT = true, DELETE = true OPTIONS = true, PUT = true, DELETE = true,
PATCH = true, TRACE = true,
} }
local function checkKey( options, key, ty, opt ) local function checkKey( options, key, ty, opt )
@ -775,7 +776,7 @@ if http then
if not ok then return ok, err end if not ok then return ok, err end
while true do while true do
local event, url, ok, err = os.pullEvent( "http_check" ) local _, url, ok, err = os.pullEvent( "http_check" )
if url == _url then return ok, err end if url == _url then return ok, err end
end end
end end
@ -808,8 +809,8 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
expect(3, bIncludeFiles, "boolean", "nil") expect(3, bIncludeFiles, "boolean", "nil")
expect(4, bIncludeDirs, "boolean", "nil") expect(4, bIncludeDirs, "boolean", "nil")
bIncludeFiles = (bIncludeFiles ~= false) bIncludeFiles = bIncludeFiles ~= false
bIncludeDirs = (bIncludeDirs ~= false) bIncludeDirs = bIncludeDirs ~= false
local sDir = sLocation local sDir = sLocation
local nStart = 1 local nStart = 1
local nSlash = string.find( sPath, "[/\\]", nStart ) local nSlash = string.find( sPath, "[/\\]", nStart )
@ -836,13 +837,13 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
end end
if sDir ~= "" then if sDir ~= "" then
if sPath == "" then if sPath == "" then
table.insert( tResults, (bIncludeDirs and "..") or "../" ) table.insert( tResults, bIncludeDirs and ".." or "../" )
elseif sPath == "." then elseif sPath == "." then
table.insert( tResults, (bIncludeDirs and ".") or "./" ) table.insert( tResults, bIncludeDirs and "." or "./" )
end end
end end
local tFiles = fs.list( sDir ) local tFiles = fs.list( sDir )
for n=1,#tFiles do for n = 1, #tFiles do
local sFile = tFiles[n] local sFile = tFiles[n]
if #sFile >= #sName and string.sub( sFile, 1, #sName ) == sName then if #sFile >= #sName and string.sub( sFile, 1, #sName ) == sName then
local bIsDir = fs.isDir( fs.combine( sDir, sFile ) ) local bIsDir = fs.isDir( fs.combine( sDir, sFile ) )
@ -867,7 +868,7 @@ end
-- Load APIs -- Load APIs
local bAPIError = false local bAPIError = false
local tApis = fs.list( "rom/apis" ) local tApis = fs.list( "rom/apis" )
for n,sFile in ipairs( tApis ) do for _, sFile in ipairs( tApis ) do
if string.sub( sFile, 1, 1 ) ~= "." then if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = fs.combine( "rom/apis", sFile ) local sPath = fs.combine( "rom/apis", sFile )
if not fs.isDir( sPath ) then if not fs.isDir( sPath ) then
@ -881,7 +882,7 @@ end
if turtle and fs.isDir( "rom/apis/turtle" ) then if turtle and fs.isDir( "rom/apis/turtle" ) then
-- Load turtle APIs -- Load turtle APIs
local tApis = fs.list( "rom/apis/turtle" ) local tApis = fs.list( "rom/apis/turtle" )
for n,sFile in ipairs( tApis ) do for _, sFile in ipairs( tApis ) do
if string.sub( sFile, 1, 1 ) ~= "." then if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = fs.combine( "rom/apis/turtle", sFile ) local sPath = fs.combine( "rom/apis/turtle", sFile )
if not fs.isDir( sPath ) then if not fs.isDir( sPath ) then
@ -896,7 +897,7 @@ end
if pocket and fs.isDir( "rom/apis/pocket" ) then if pocket and fs.isDir( "rom/apis/pocket" ) then
-- Load pocket APIs -- Load pocket APIs
local tApis = fs.list( "rom/apis/pocket" ) local tApis = fs.list( "rom/apis/pocket" )
for n,sFile in ipairs( tApis ) do for _, sFile in ipairs( tApis ) do
if string.sub( sFile, 1, 1 ) ~= "." then if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = fs.combine( "rom/apis/pocket", sFile ) local sPath = fs.combine( "rom/apis/pocket", sFile )
if not fs.isDir( sPath ) then if not fs.isDir( sPath ) then
@ -925,7 +926,7 @@ if commands and fs.isDir( "rom/apis/command" ) then
end end
end end
return nil return nil
end end,
} }
setmetatable( commands, tCaseInsensitiveMetatable ) setmetatable( commands, tCaseInsensitiveMetatable )
setmetatable( commands.async, tCaseInsensitiveMetatable ) setmetatable( commands.async, tCaseInsensitiveMetatable )
@ -941,12 +942,12 @@ if bAPIError then
print( "Press any key to continue" ) print( "Press any key to continue" )
os.pullEvent( "key" ) os.pullEvent( "key" )
term.clear() term.clear()
term.setCursorPos( 1,1 ) term.setCursorPos( 1, 1 )
end end
-- Set default settings -- Set default settings
settings.set( "shell.allow_startup", true ) settings.set( "shell.allow_startup", true )
settings.set( "shell.allow_disk_startup", (commands == nil) ) settings.set( "shell.allow_disk_startup", commands == nil )
settings.set( "shell.autocomplete", true ) settings.set( "shell.autocomplete", true )
settings.set( "edit.autocomplete", true ) settings.set( "edit.autocomplete", true )
settings.set( "edit.default_extension", "lua" ) settings.set( "edit.default_extension", "lua" )

View File

@ -23,7 +23,7 @@ function combine( ... )
for i = 1, select('#', ...) do for i = 1, select('#', ...) do
local c = select(i, ...) local c = select(i, ...)
expect(i, c, "number") expect(i, c, "number")
r = bit32.bor(r,c) r = bit32.bor(r, c)
end end
return r return r
end end
@ -50,8 +50,8 @@ function packRGB( r, g, b )
expect(2, g, "number") expect(2, g, "number")
expect(3, b, "number") expect(3, b, "number")
return return
bit32.band( r * 255, 0xFF ) * 2^16 + bit32.band( r * 255, 0xFF ) * 2 ^ 16 +
bit32.band( g * 255, 0xFF ) * 2^8 + bit32.band( g * 255, 0xFF ) * 2 ^ 8 +
bit32.band( b * 255, 0xFF ) bit32.band( b * 255, 0xFF )
end end

View File

@ -1,6 +1,6 @@
-- Colours (for lovers of british spelling) -- Colours (for lovers of british spelling)
local colours = _ENV local colours = _ENV
for k,v in pairs(colors) do for k, v in pairs(colors) do
colours[k] = v colours[k] = v
end end

View File

@ -62,7 +62,7 @@ end
function stopAudio( name ) function stopAudio( name )
if not name then if not name then
for n,sName in ipairs( peripheral.getNames() ) do for _, sName in ipairs( peripheral.getNames() ) do
stopAudio( sName ) stopAudio( sName )
end end
else else

View File

@ -13,7 +13,7 @@ local function trilaterate( A, B, C )
local d = a2b:length() local d = a2b:length()
local ex = a2b:normalize( ) local ex = a2b:normalize( )
local i = ex:dot( a2c ) local i = ex:dot( a2c )
local ey = (a2c - (ex * i)):normalize() local ey = (a2c - ex * i):normalize()
local j = ey:dot( a2c ) local j = ey:dot( a2c )
local ez = ex:cross( ey ) local ez = ex:cross( ey )
@ -21,16 +21,16 @@ local function trilaterate( A, B, C )
local r2 = B.nDistance local r2 = B.nDistance
local r3 = C.nDistance local r3 = C.nDistance
local x = (r1*r1 - r2*r2 + d*d) / (2*d) local x = (r1 * r1 - r2 * r2 + d * d) / (2 * d)
local y = (r1*r1 - r3*r3 - x*x + (x-i)*(x-i) + j*j) / (2*j) local y = (r1 * r1 - r3 * r3 - x * x + (x - i) * (x - i) + j * j) / (2 * j)
local result = A.vPosition + (ex * x) + (ey * y) local result = A.vPosition + ex * x + ey * y
local zSquared = r1*r1 - x*x - y*y local zSquared = r1 * r1 - x * x - y * y
if zSquared > 0 then if zSquared > 0 then
local z = math.sqrt( zSquared ) local z = math.sqrt( zSquared )
local result1 = result + (ez * z) local result1 = result + ez * z
local result2 = result - (ez * z) local result2 = result - ez * z
local rounded1, rounded2 = result1:round( 0.01 ), result2:round( 0.01 ) local rounded1, rounded2 = result1:round( 0.01 ), result2:round( 0.01 )
if rounded1.x ~= rounded2.x or rounded1.y ~= rounded2.y or rounded1.z ~= rounded2.z then if rounded1.x ~= rounded2.x or rounded1.y ~= rounded2.y or rounded1.z ~= rounded2.z then
@ -66,7 +66,7 @@ function locate( _nTimeout, _bDebug )
-- Find a modem -- Find a modem
local sModemSide = nil local sModemSide = nil
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
sModemSide = sSide sModemSide = sSide
break break
@ -109,7 +109,7 @@ function locate( _nTimeout, _bDebug )
if type(tMessage) == "table" and #tMessage == 3 and tonumber(tMessage[1]) and tonumber(tMessage[2]) and tonumber(tMessage[3]) then if type(tMessage) == "table" and #tMessage == 3 and tonumber(tMessage[1]) and tonumber(tMessage[2]) and tonumber(tMessage[3]) then
local tFix = { vPosition = vector.new( tMessage[1], tMessage[2], tMessage[3] ), nDistance = nDistance } local tFix = { vPosition = vector.new( tMessage[1], tMessage[2], tMessage[3] ), nDistance = nDistance }
if _bDebug then if _bDebug then
print( tFix.nDistance.." metres from "..tostring( tFix.vPosition ) ) print( tFix.nDistance .. " metres from " .. tostring( tFix.vPosition ) )
end end
if tFix.nDistance == 0 then if tFix.nDistance == 0 then
pos1, pos2 = tFix.vPosition, nil pos1, pos2 = tFix.vPosition, nil
@ -148,12 +148,12 @@ function locate( _nTimeout, _bDebug )
if pos1 and pos2 then if pos1 and pos2 then
if _bDebug then if _bDebug then
print( "Ambiguous position" ) print( "Ambiguous position" )
print( "Could be "..pos1.x..","..pos1.y..","..pos1.z.." or "..pos2.x..","..pos2.y..","..pos2.z ) print( "Could be " .. pos1.x .. "," .. pos1.y .. "," .. pos1.z .. " or " .. pos2.x .. "," .. pos2.y .. "," .. pos2.z )
end end
return nil return nil
elseif pos1 then elseif pos1 then
if _bDebug then if _bDebug then
print( "Position is "..pos1.x..","..pos1.y..","..pos1.z ) print( "Position is " .. pos1.x .. "," .. pos1.y .. "," .. pos1.z )
end end
return pos1.x, pos1.y, pos1.z return pos1.x, pos1.y, pos1.z
else else

View File

@ -18,8 +18,8 @@ function lookup( _sTopic )
sPath = fs.combine( sPath, _sTopic ) sPath = fs.combine( sPath, _sTopic )
if fs.exists( sPath ) and not fs.isDir( sPath ) then if fs.exists( sPath ) and not fs.isDir( sPath ) then
return sPath return sPath
elseif fs.exists( sPath..".txt" ) and not fs.isDir( sPath..".txt" ) then elseif fs.exists( sPath .. ".txt" ) and not fs.isDir( sPath .. ".txt" ) then
return sPath..".txt" return sPath .. ".txt"
end end
end end
@ -30,18 +30,18 @@ end
function topics() function topics()
-- Add index -- Add index
local tItems = { local tItems = {
[ "index" ] = true [ "index" ] = true,
} }
-- Add topics from the path -- Add topics from the path
for sPath in string.gmatch(sPath, "[^:]+") do for sPath in string.gmatch(sPath, "[^:]+") do
if fs.isDir( sPath ) then if fs.isDir( sPath ) then
local tList = fs.list( sPath ) local tList = fs.list( sPath )
for n,sFile in pairs( tList ) do for _, sFile in pairs( tList ) do
if string.sub( sFile, 1, 1 ) ~= "." then if string.sub( sFile, 1, 1 ) ~= "." then
if not fs.isDir( fs.combine( sPath, sFile ) ) then if not fs.isDir( fs.combine( sPath, sFile ) ) then
if #sFile > 4 and sFile:sub(-4) == ".txt" then if #sFile > 4 and sFile:sub(-4) == ".txt" then
sFile = sFile:sub(1,-5) sFile = sFile:sub(1, -5)
end end
tItems[ sFile ] = true tItems[ sFile ] = true
end end
@ -52,7 +52,7 @@ function topics()
-- Sort and return -- Sort and return
local tItemList = {} local tItemList = {}
for sItem, b in pairs( tItems ) do for sItem in pairs( tItems ) do
table.insert( tItemList, sItem ) table.insert( tItemList, sItem )
end end
table.sort( tItemList ) table.sort( tItemList )
@ -63,7 +63,7 @@ function completeTopic( sText )
expect(1, sText, "string") expect(1, sText, "string")
local tTopics = topics() local tTopics = topics()
local tResults = {} local tResults = {}
for n=1,#tTopics do for n = 1, #tTopics do
local sTopic = tTopics[n] local sTopic = tTopics[n]
if #sTopic > #sText and string.sub( sTopic, 1, #sText ) == sText then if #sTopic > #sText and string.sub( sTopic, 1, #sText ) == sText then
table.insert( tResults, string.sub( sTopic, #sText + 1 ) ) table.insert( tResults, string.sub( sTopic, #sText + 1 ) )

View File

@ -129,11 +129,11 @@ handleMetatable = {
} }
local defaultInput = setmetatable({ local defaultInput = setmetatable({
_handle = { readLine = _G.read } _handle = { readLine = _G.read },
}, handleMetatable) }, handleMetatable)
local defaultOutput = setmetatable({ local defaultOutput = setmetatable({
_handle = { write = _G.write } _handle = { write = _G.write },
}, handleMetatable) }, handleMetatable)
local defaultError = setmetatable({ local defaultError = setmetatable({
@ -147,7 +147,7 @@ local defaultError = setmetatable({
_G.write(...) _G.write(...)
if term.isColour() then term.setTextColour(oldColour) end if term.isColour() then term.setTextColour(oldColour) end
end, end,
} },
}, handleMetatable) }, handleMetatable)
local currentInput = defaultInput local currentInput = defaultInput

View File

@ -6,14 +6,14 @@ local function drawPixelInternal( xPos, yPos )
end end
local tColourLookup = {} local tColourLookup = {}
for n=1,16 do for n = 1, 16 do
tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1) tColourLookup[ string.byte( "0123456789abcdef", n, n ) ] = 2 ^ (n - 1)
end end
local function parseLine( tImageArg, sLine ) local function parseLine( tImageArg, sLine )
local tLine = {} local tLine = {}
for x=1,sLine:len() do for x = 1, sLine:len() do
tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0 tLine[x] = tColourLookup[ string.byte(sLine, x, x) ] or 0
end end
table.insert( tImageArg, tLine ) table.insert( tImageArg, tLine )
end end
@ -89,7 +89,7 @@ function drawLine( startX, startY, endX, endY, nColour )
if xDiff > math.abs(yDiff) then if xDiff > math.abs(yDiff) then
local y = minY local y = minY
local dy = yDiff / xDiff local dy = yDiff / xDiff
for x=minX,maxX do for x = minX, maxX do
drawPixelInternal( x, math.floor( y + 0.5 ) ) drawPixelInternal( x, math.floor( y + 0.5 ) )
y = y + dy y = y + dy
end end
@ -97,12 +97,12 @@ function drawLine( startX, startY, endX, endY, nColour )
local x = minX local x = minX
local dx = xDiff / yDiff local dx = xDiff / yDiff
if maxY >= minY then if maxY >= minY then
for y=minY,maxY do for y = minY, maxY do
drawPixelInternal( math.floor( x + 0.5 ), y ) drawPixelInternal( math.floor( x + 0.5 ), y )
x = x + dx x = x + dx
end end
else else
for y=minY,maxY,-1 do for y = minY, maxY, -1 do
drawPixelInternal( math.floor( x + 0.5 ), y ) drawPixelInternal( math.floor( x + 0.5 ), y )
x = x - dx x = x - dx
end end
@ -142,13 +142,13 @@ function drawBox( startX, startY, endX, endY, nColour )
maxY = startY maxY = startY
end end
for x=minX,maxX do for x = minX, maxX do
drawPixelInternal( x, minY ) drawPixelInternal( x, minY )
drawPixelInternal( x, maxY ) drawPixelInternal( x, maxY )
end end
if (maxY - minY) >= 2 then if maxY - minY >= 2 then
for y=(minY+1),(maxY-1) do for y = minY + 1, maxY - 1 do
drawPixelInternal( minX, y ) drawPixelInternal( minX, y )
drawPixelInternal( maxX, y ) drawPixelInternal( maxX, y )
end end
@ -187,8 +187,8 @@ function drawFilledBox( startX, startY, endX, endY, nColour )
maxY = startY maxY = startY
end end
for x=minX,maxX do for x = minX, maxX do
for y=minY,maxY do for y = minY, maxY do
drawPixelInternal( x, y ) drawPixelInternal( x, y )
end end
end end
@ -198,9 +198,9 @@ function drawImage( tImage, xPos, yPos )
expect(1, tImage, "table") expect(1, tImage, "table")
expect(2, xPos, "number") expect(2, xPos, "number")
expect(3, yPos, "number") expect(3, yPos, "number")
for y=1,#tImage do for y = 1, #tImage do
local tLine = tImage[y] local tLine = tImage[y]
for x=1,#tLine do for x = 1, #tLine do
if tLine[x] > 0 then if tLine[x] > 0 then
term.setBackgroundColor( tLine[x] ) term.setBackgroundColor( tLine[x] )
drawPixelInternal( x + xPos - 1, y + yPos - 1 ) drawPixelInternal( x + xPos - 1, y + yPos - 1 )

View File

@ -21,7 +21,7 @@ local function runUntilLimit( _routines, _limit )
local tFilters = {} local tFilters = {}
local eventData = { n = 0 } local eventData = { n = 0 }
while true do while true do
for n=1,count do for n = 1, count do
local r = _routines[n] local r = _routines[n]
if r then if r then
if tFilters[r] == nil or tFilters[r] == eventData[1] or eventData[1] == "terminate" then if tFilters[r] == nil or tFilters[r] == eventData[1] or eventData[1] == "terminate" then
@ -41,7 +41,7 @@ local function runUntilLimit( _routines, _limit )
end end
end end
end end
for n=1,count do for n = 1, count do
local r = _routines[n] local r = _routines[n]
if r and coroutine.status( r ) == "dead" then if r and coroutine.status( r ) == "dead" then
_routines[n] = nil _routines[n] = nil

View File

@ -4,12 +4,12 @@ local native = peripheral
function getNames() function getNames()
local tResults = {} local tResults = {}
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if native.isPresent( sSide ) then if native.isPresent( sSide ) then
table.insert( tResults, sSide ) table.insert( tResults, sSide )
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
local tRemote = native.call( sSide, "getNamesRemote" ) local tRemote = native.call( sSide, "getNamesRemote" )
for n,sName in ipairs( tRemote ) do for _, sName in ipairs( tRemote ) do
table.insert( tResults, sName ) table.insert( tResults, sName )
end end
end end
@ -23,7 +23,7 @@ function isPresent( _sSide )
if native.isPresent( _sSide ) then if native.isPresent( _sSide ) then
return true return true
end end
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then if native.call( sSide, "isPresentRemote", _sSide ) then
return true return true
@ -38,7 +38,7 @@ function getType( _sSide )
if native.isPresent( _sSide ) then if native.isPresent( _sSide ) then
return native.getType( _sSide ) return native.getType( _sSide )
end end
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then if native.call( sSide, "isPresentRemote", _sSide ) then
return native.call( sSide, "getTypeRemote", _sSide ) return native.call( sSide, "getTypeRemote", _sSide )
@ -53,7 +53,7 @@ function getMethods( _sSide )
if native.isPresent( _sSide ) then if native.isPresent( _sSide ) then
return native.getMethods( _sSide ) return native.getMethods( _sSide )
end end
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then if native.call( sSide, "isPresentRemote", _sSide ) then
return native.call( sSide, "getMethodsRemote", _sSide ) return native.call( sSide, "getMethodsRemote", _sSide )
@ -69,7 +69,7 @@ function call( _sSide, _sMethod, ... )
if native.isPresent( _sSide ) then if native.isPresent( _sSide ) then
return native.call( _sSide, _sMethod, ... ) return native.call( _sSide, _sMethod, ... )
end end
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
if native.call( sSide, "isPresentRemote", _sSide ) then if native.call( sSide, "isPresentRemote", _sSide ) then
return native.call( sSide, "callRemote", _sSide, _sMethod, ... ) return native.call( sSide, "callRemote", _sSide, _sMethod, ... )
@ -84,7 +84,7 @@ function wrap( _sSide )
if peripheral.isPresent( _sSide ) then if peripheral.isPresent( _sSide ) then
local tMethods = peripheral.getMethods( _sSide ) local tMethods = peripheral.getMethods( _sSide )
local tResult = {} local tResult = {}
for n,sMethod in ipairs( tMethods ) do for _, sMethod in ipairs( tMethods ) do
tResult[sMethod] = function( ... ) tResult[sMethod] = function( ... )
return peripheral.call( _sSide, sMethod, ... ) return peripheral.call( _sSide, sMethod, ... )
end end
@ -98,7 +98,7 @@ function find( sType, fnFilter )
expect(1, sType, "string") expect(1, sType, "string")
expect(2, fnFilter, "function", "nil") expect(2, fnFilter, "function", "nil")
local tResults = {} local tResults = {}
for n,sName in ipairs( peripheral.getNames() ) do for _, sName in ipairs( peripheral.getNames() ) do
if peripheral.getType( sName ) == sType then if peripheral.getType( sName ) == sType then
local wrapped = peripheral.wrap( sName ) local wrapped = peripheral.wrap( sName )
if fnFilter == nil or fnFilter( sName, wrapped ) then if fnFilter == nil or fnFilter( sName, wrapped ) then

View File

@ -10,7 +10,7 @@ local tHostnames = {}
function open( sModem ) function open( sModem )
expect(1, sModem, "string") expect(1, sModem, "string")
if peripheral.getType( sModem ) ~= "modem" then if peripheral.getType( sModem ) ~= "modem" then
error( "No such modem: "..sModem, 2 ) error( "No such modem: " .. sModem, 2 )
end end
peripheral.call( sModem, "open", os.getComputerID() ) peripheral.call( sModem, "open", os.getComputerID() )
peripheral.call( sModem, "open", CHANNEL_BROADCAST ) peripheral.call( sModem, "open", CHANNEL_BROADCAST )
@ -21,13 +21,13 @@ function close( sModem )
if sModem then if sModem then
-- Close a specific modem -- Close a specific modem
if peripheral.getType( sModem ) ~= "modem" then if peripheral.getType( sModem ) ~= "modem" then
error( "No such modem: "..sModem, 2 ) error( "No such modem: " .. sModem, 2 )
end end
peripheral.call( sModem, "close", os.getComputerID() ) peripheral.call( sModem, "close", os.getComputerID() )
peripheral.call( sModem, "close", CHANNEL_BROADCAST ) peripheral.call( sModem, "close", CHANNEL_BROADCAST )
else else
-- Close all modems -- Close all modems
for n,sModem in ipairs( peripheral.getNames() ) do for _, sModem in ipairs( peripheral.getNames() ) do
if isOpen( sModem ) then if isOpen( sModem ) then
close( sModem ) close( sModem )
end end
@ -44,7 +44,7 @@ function isOpen( sModem )
end end
else else
-- Check if any modem is open -- Check if any modem is open
for n,sModem in ipairs( peripheral.getNames() ) do for _, sModem in ipairs( peripheral.getNames() ) do
if isOpen( sModem ) then if isOpen( sModem ) then
return true return true
end end
@ -79,10 +79,10 @@ function send( nRecipient, message, sProtocol )
sent = true sent = true
else else
-- Send on all open modems, to the target and to repeaters -- Send on all open modems, to the target and to repeaters
for n,sModem in ipairs( peripheral.getNames() ) do for _, sModem in ipairs( peripheral.getNames() ) do
if isOpen( sModem ) then if isOpen( sModem ) then
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage ); peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage )
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage ); peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage )
sent = true sent = true
end end
end end

View File

@ -17,7 +17,7 @@ local copy
function copy( value ) function copy( value )
if type(value) == "table" then if type(value) == "table" then
local result = {} local result = {}
for k,v in pairs(value) do for k, v in pairs(value) do
result[k] = copy(v) result[k] = copy(v)
end end
return result return result
@ -47,7 +47,7 @@ end
function getNames() function getNames()
local result = {} local result = {}
for k,v in pairs( tSettings ) do for k in pairs( tSettings ) do
result[ #result + 1 ] = k result[ #result + 1 ] = k
end end
table.sort(result) table.sort(result)
@ -69,7 +69,7 @@ function load( sPath )
return false return false
end end
for k,v in pairs(tFile) do for k, v in pairs(tFile) do
if type(k) == "string" and if type(k) == "string" and
(type(v) == "string" or type(v) == "number" or type(v) == "boolean" or type(v) == "table") then (type(v) == "string" or type(v) == "number" or type(v) == "boolean" or type(v) == "table") then
set( k, v ) set( k, v )

View File

@ -1,6 +1,6 @@
local expect = dofile("rom/modules/main/cc/expect.lua").expect local expect = dofile("rom/modules/main/cc/expect.lua").expect
local native = (term.native and term.native()) or term local native = term.native and term.native() or term
local redirectTarget = native local redirectTarget = native
local function wrap( _sFunction ) local function wrap( _sFunction )
@ -16,11 +16,11 @@ term.redirect = function( target )
if target == term or target == _G.term then if target == term or target == _G.term then
error( "term is not a recommended redirect target, try term.current() instead", 2 ) error( "term is not a recommended redirect target, try term.current() instead", 2 )
end end
for k,v in pairs( native ) do for k, v in pairs( native ) do
if type( k ) == "string" and type( v ) == "function" then if type( k ) == "string" and type( v ) == "function" then
if type( target[k] ) ~= "function" then if type( target[k] ) ~= "function" then
target[k] = function() target[k] = function()
error( "Redirect object is missing method "..k..".", 2 ) error( "Redirect object is missing method " .. k .. ".", 2 )
end end
end end
end end
@ -48,13 +48,13 @@ for _, method in ipairs { "nativePaletteColor", "nativePaletteColour"} do
native[method] = nil native[method] = nil
end end
for k,v in pairs( native ) do for k, v in pairs( native ) do
if type( k ) == "string" and type( v ) == "function" and term[k] == nil then if type( k ) == "string" and type( v ) == "function" and term[k] == nil then
term[k] = wrap( k ) term[k] = wrap( k )
end end
end end
local env = _ENV local env = _ENV
for k,v in pairs( term ) do for k, v in pairs( term ) do
env[k] = v env[k] = v
end end

View File

@ -9,14 +9,14 @@ function slowWrite( sText, nRate )
local nSleep = 1 / nRate local nSleep = 1 / nRate
sText = tostring( sText ) sText = tostring( sText )
local x,y = term.getCursorPos() local x, y = term.getCursorPos()
local len = string.len( sText ) local len = #sText
for n=1,len do for n = 1, len do
term.setCursorPos( x, y ) term.setCursorPos( x, y )
sleep( nSleep ) sleep( nSleep )
local nLines = write( string.sub( sText, 1, n ) ) local nLines = write( string.sub( sText, 1, n ) )
local newX, newY = term.getCursorPos() local _, newY = term.getCursorPos()
y = newY - nLines y = newY - nLines
end end
end end
@ -42,7 +42,7 @@ function formatTime( nTime, bTwentyFourHour )
end end
local nHour = math.floor(nTime) local nHour = math.floor(nTime)
local nMinute = math.floor((nTime - nHour)*60) local nMinute = math.floor((nTime - nHour) * 60)
if sTOD then if sTOD then
return string.format( "%d:%02d %s", nHour, nMinute, sTOD ) return string.format( "%d:%02d %s", nHour, nMinute, sTOD )
else else
@ -54,11 +54,11 @@ local function makePagedScroll( _term, _nFreeLines )
local nativeScroll = _term.scroll local nativeScroll = _term.scroll
local nFreeLines = _nFreeLines or 0 local nFreeLines = _nFreeLines or 0
return function( _n ) return function( _n )
for n=1,_n do for _ = 1, _n do
nativeScroll( 1 ) nativeScroll( 1 )
if nFreeLines <= 0 then if nFreeLines <= 0 then
local w,h = _term.getSize() local _, h = _term.getSize()
_term.setCursorPos( 1, h ) _term.setCursorPos( 1, h )
_term.write( "Press any key to continue" ) _term.write( "Press any key to continue" )
os.pullEvent( "key" ) os.pullEvent( "key" )
@ -76,7 +76,7 @@ function pagedPrint( _sText, _nFreeLines )
-- Setup a redirector -- Setup a redirector
local oldTerm = term.current() local oldTerm = term.current()
local newTerm = {} local newTerm = {}
for k,v in pairs( oldTerm ) do for k, v in pairs( oldTerm ) do
newTerm[k] = v newTerm[k] = v
end end
newTerm.scroll = makePagedScroll( oldTerm, _nFreeLines ) newTerm.scroll = makePagedScroll( oldTerm, _nFreeLines )
@ -108,22 +108,22 @@ local function tabulateCommon( bPaged, ... )
expect(i, tAll[i], "number", "table") expect(i, tAll[i], "number", "table")
end end
local w,h = term.getSize() local w, h = term.getSize()
local nMaxLen = w / 8 local nMaxLen = w / 8
for n, t in ipairs( tAll ) do for n, t in ipairs( tAll ) do
if type(t) == "table" then if type(t) == "table" then
for nu, sItem in pairs(t) do for nu, sItem in pairs(t) do
if type( sItem ) ~= "string" then if type( sItem ) ~= "string" then
error( "bad argument #"..n.."."..nu.." (expected string, got " .. type( sItem ) .. ")", 3 ) error( "bad argument #" .. n .. "." .. nu .. " (expected string, got " .. type( sItem ) .. ")", 3 )
end end
nMaxLen = math.max( string.len( sItem ) + 1, nMaxLen ) nMaxLen = math.max( #sItem + 1, nMaxLen )
end end
end end
end end
local nCols = math.floor( w / nMaxLen ) local nCols = math.floor( w / nMaxLen )
local nLines = 0 local nLines = 0
local function newLine() local function newLine()
if bPaged and nLines >= (h-3) then if bPaged and nLines >= h - 3 then
pagedPrint() pagedPrint()
else else
print() print()
@ -133,14 +133,14 @@ local function tabulateCommon( bPaged, ... )
local function drawCols( _t ) local function drawCols( _t )
local nCol = 1 local nCol = 1
for n, s in ipairs( _t ) do for _, s in ipairs( _t ) do
if nCol > nCols then if nCol > nCols then
nCol = 1 nCol = 1
newLine() newLine()
end end
local cx, cy = term.getCursorPos() local cx, cy = term.getCursorPos()
cx = 1 + ((nCol - 1) * nMaxLen) cx = 1 + (nCol - 1) * nMaxLen
term.setCursorPos( cx, cy ) term.setCursorPos( cx, cy )
term.write( s ) term.write( s )
@ -148,7 +148,7 @@ local function tabulateCommon( bPaged, ... )
end end
print() print()
end end
for n, t in ipairs( tAll ) do for _, t in ipairs( tAll ) do
if type(t) == "table" then if type(t) == "table" then
if #t > 0 then if #t > 0 then
drawCols( t ) drawCols( t )
@ -207,11 +207,11 @@ local function serializeImpl( t, tTracking, sIndent )
local sResult = "{\n" local sResult = "{\n"
local sSubIndent = sIndent .. " " local sSubIndent = sIndent .. " "
local tSeen = {} local tSeen = {}
for k,v in ipairs(t) do for k, v in ipairs(t) do
tSeen[k] = true tSeen[k] = true
sResult = sResult .. sSubIndent .. serializeImpl( v, tTracking, sSubIndent ) .. ",\n" sResult = sResult .. sSubIndent .. serializeImpl( v, tTracking, sSubIndent ) .. ",\n"
end end
for k,v in pairs(t) do for k, v in pairs(t) do
if not tSeen[k] then if not tSeen[k] then
local sEntry local sEntry
if type(k) == "string" and not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then if type(k) == "string" and not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then
@ -233,7 +233,7 @@ local function serializeImpl( t, tTracking, sIndent )
return tostring(t) return tostring(t)
else else
error( "Cannot serialize type "..sType, 0 ) error( "Cannot serialize type " .. sType, 0 )
end end
end end
@ -241,7 +241,7 @@ end
empty_json_array = setmetatable({}, { empty_json_array = setmetatable({}, {
__newindex = function() __newindex = function()
error("attempt to mutate textutils.empty_json_array", 2) error("attempt to mutate textutils.empty_json_array", 2)
end end,
}) })
local function serializeJSONImpl( t, tTracking, bNBTStyle ) local function serializeJSONImpl( t, tTracking, bNBTStyle )
@ -264,7 +264,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
local sArrayResult = "[" local sArrayResult = "["
local nObjectSize = 0 local nObjectSize = 0
local nArraySize = 0 local nArraySize = 0
for k,v in pairs(t) do for k, v in pairs(t) do
if type(k) == "string" then if type(k) == "string" then
local sEntry local sEntry
if bNBTStyle then if bNBTStyle then
@ -280,7 +280,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
nObjectSize = nObjectSize + 1 nObjectSize = nObjectSize + 1
end end
end end
for n,v in ipairs(t) do for _, v in ipairs(t) do
local sEntry = serializeJSONImpl( v, tTracking, bNBTStyle ) local sEntry = serializeJSONImpl( v, tTracking, bNBTStyle )
if nArraySize == 0 then if nArraySize == 0 then
sArrayResult = sArrayResult .. sEntry sArrayResult = sArrayResult .. sEntry
@ -305,7 +305,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
return tostring(t) return tostring(t)
else else
error( "Cannot serialize type "..sType, 0 ) error( "Cannot serialize type " .. sType, 0 )
end end
end end
@ -317,7 +317,7 @@ end
function unserialize( s ) function unserialize( s )
expect(1, s, "string") expect(1, s, "string")
local func = load( "return "..s, "unserialize", "t", {} ) local func = load( "return " .. s, "unserialize", "t", {} )
if func then if func then
local ok, result = pcall( func ) local ok, result = pcall( func )
if ok then if ok then
@ -346,7 +346,7 @@ function urlEncode( str )
else else
-- Non-ASCII (encode as UTF-8) -- Non-ASCII (encode as UTF-8)
return return
string.format("%%%02X", 192 + bit32.band( bit32.arshift(n,6), 31 ) ) .. string.format("%%%02X", 192 + bit32.band( bit32.arshift(n, 6), 31 ) ) ..
string.format("%%%02X", 128 + bit32.band( n, 63 ) ) string.format("%%%02X", 128 + bit32.band( n, 63 ) )
end end
end ) end )
@ -388,12 +388,12 @@ function complete( sSearchText, tSearchTable )
end end
local sPart = string.sub( sSearchText, nStart ) local sPart = string.sub( sSearchText, nStart )
local nPartLength = string.len( sPart ) local nPartLength = #sPart
local tResults = {} local tResults = {}
local tSeen = {} local tSeen = {}
while tTable do while tTable do
for k,v in pairs( tTable ) do for k, v in pairs( tTable ) do
if not tSeen[k] and type(k) == "string" then if not tSeen[k] and type(k) == "string" then
if string.find( k, sPart, 1, true ) == 1 then if string.find( k, sPart, 1, true ) == 1 then
if not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then if not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then

View File

@ -20,7 +20,7 @@ end
-- Put commands into environment table -- Put commands into environment table
local env = _ENV local env = _ENV
for k,v in pairs( native ) do for k, v in pairs( native ) do
if k == "equipLeft" or k == "equipRight" then if k == "equipLeft" or k == "equipRight" then
env[k] = function( ... ) env[k] = function( ... )
local result, err = v( ... ) local result, err = v( ... )

View File

@ -36,17 +36,17 @@ local vector = {
) )
end, end,
dot = function( self, o ) dot = function( self, o )
return self.x*o.x + self.y*o.y + self.z*o.z return self.x * o.x + self.y * o.y + self.z * o.z
end, end,
cross = function( self, o ) cross = function( self, o )
return vector.new( return vector.new(
self.y*o.z - self.z*o.y, self.y * o.z - self.z * o.y,
self.z*o.x - self.x*o.z, self.z * o.x - self.x * o.z,
self.x*o.y - self.y*o.x self.x * o.y - self.y * o.x
) )
end, end,
length = function( self ) length = function( self )
return math.sqrt( self.x*self.x + self.y*self.y + self.z*self.z ) return math.sqrt( self.x * self.x + self.y * self.y + self.z * self.z )
end, end,
normalize = function( self ) normalize = function( self )
return self:mul( 1 / self:length() ) return self:mul( 1 / self:length() )
@ -54,13 +54,13 @@ local vector = {
round = function( self, nTolerance ) round = function( self, nTolerance )
nTolerance = nTolerance or 1.0 nTolerance = nTolerance or 1.0
return vector.new( return vector.new(
math.floor( (self.x + (nTolerance * 0.5)) / nTolerance ) * nTolerance, math.floor( (self.x + nTolerance * 0.5) / nTolerance ) * nTolerance,
math.floor( (self.y + (nTolerance * 0.5)) / nTolerance ) * nTolerance, math.floor( (self.y + nTolerance * 0.5) / nTolerance ) * nTolerance,
math.floor( (self.z + (nTolerance * 0.5)) / nTolerance ) * nTolerance math.floor( (self.z + nTolerance * 0.5) / nTolerance ) * nTolerance
) )
end, end,
tostring = function( self ) tostring = function( self )
return self.x..","..self.y..","..self.z return self.x .. "," .. self.y .. "," .. self.z
end, end,
} }
@ -78,7 +78,7 @@ function new( x, y, z )
local v = { local v = {
x = tonumber(x) or 0, x = tonumber(x) or 0,
y = tonumber(y) or 0, y = tonumber(y) or 0,
z = tonumber(z) or 0 z = tonumber(z) or 0,
} }
setmetatable( v, vmetatable ) setmetatable( v, vmetatable )
return v return v

View File

@ -39,8 +39,8 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
local tEmptyColorLines = {} local tEmptyColorLines = {}
local function createEmptyLines( nWidth ) local function createEmptyLines( nWidth )
sEmptySpaceLine = string_rep( " ", nWidth ) sEmptySpaceLine = string_rep( " ", nWidth )
for n=0,15 do for n = 0, 15 do
local nColor = 2^n local nColor = 2 ^ n
local sHex = tHex[nColor] local sHex = tHex[nColor]
tEmptyColorLines[nColor] = string_rep( sHex, nWidth ) tEmptyColorLines[nColor] = string_rep( sHex, nWidth )
end end
@ -49,7 +49,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
createEmptyLines( nWidth ) createEmptyLines( nWidth )
-- Setup -- Setup
local bVisible = (bStartVisible ~= false) local bVisible = bStartVisible ~= false
local nCursorX = 1 local nCursorX = 1
local nCursorY = 1 local nCursorY = 1
local bCursorBlink = false local bCursorBlink = false
@ -61,7 +61,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
local sEmptyText = sEmptySpaceLine local sEmptyText = sEmptySpaceLine
local sEmptyTextColor = tEmptyColorLines[ nTextColor ] local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ] local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
for y=1,nHeight do for y = 1, nHeight do
tLines[y] = { tLines[y] = {
text = sEmptyText, text = sEmptyText,
textColor = sEmptyTextColor, textColor = sEmptyTextColor,
@ -69,7 +69,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
} }
end end
for i=0,15 do for i = 0, 15 do
local c = 2 ^ i local c = 2 ^ i
tPalette[c] = { parent.getPaletteColour( c ) } tPalette[c] = { parent.getPaletteColour( c ) }
end end
@ -100,13 +100,13 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
end end
local function redraw() local function redraw()
for n=1,nHeight do for n = 1, nHeight do
redrawLine( n ) redrawLine( n )
end end
end end
local function updatePalette() local function updatePalette()
for k,v in pairs( tPalette ) do for k, v in pairs( tPalette ) do
parent.setPaletteColour( k, v[1], v[2], v[3] ) parent.setPaletteColour( k, v[1], v[2], v[3] )
end end
end end
@ -204,7 +204,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
local sEmptyText = sEmptySpaceLine local sEmptyText = sEmptySpaceLine
local sEmptyTextColor = tEmptyColorLines[ nTextColor ] local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ] local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
for y=1,nHeight do for y = 1, nHeight do
tLines[y] = { tLines[y] = {
text = sEmptyText, text = sEmptyText,
textColor = sEmptyTextColor, textColor = sEmptyTextColor,
@ -351,7 +351,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
local sEmptyText = sEmptySpaceLine local sEmptyText = sEmptySpaceLine
local sEmptyTextColor = tEmptyColorLines[ nTextColor ] local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ] local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
for newY=1,nHeight do for newY = 1, nHeight do
local y = newY + n local y = newY + n
if y >= 1 and y <= nHeight then if y >= 1 and y <= nHeight then
tNewLines[newY] = tLines[y] tNewLines[newY] = tLines[y]
@ -451,12 +451,12 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
local sEmptyText = sEmptySpaceLine local sEmptyText = sEmptySpaceLine
local sEmptyTextColor = tEmptyColorLines[ nTextColor ] local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ] local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
for y=1,nNewHeight do for y = 1, nNewHeight do
if y > nHeight then if y > nHeight then
tNewLines[y] = { tNewLines[y] = {
text = sEmptyText, text = sEmptyText,
textColor = sEmptyTextColor, textColor = sEmptyTextColor,
backgroundColor = sEmptyBackgroundColor backgroundColor = sEmptyBackgroundColor,
} }
else else
local tOldLine = tLines[y] local tOldLine = tLines[y]

View File

@ -1,3 +1,12 @@
# New features in CC: Tweaked 1.86.0
* Add PATCH and TRACE HTTP methods. (jaredallard)
* Add more MOTD messages. (JakobDev)
* Allow removing and adding turtle upgrades via CraftTweaker.
And several bug fixes:
* Fix crash when interacting with Wearable Backpacks.
# New features in CC: Tweaked 1.85.2 # New features in CC: Tweaked 1.85.2
* Fix crashes when using the mouse with advanced computers. * Fix crashes when using the mouse with advanced computers.

View File

@ -1,5 +1,10 @@
New features in CC: Tweaked 1.85.2 New features in CC: Tweaked 1.86.0
* Fix crashes when using the mouse with advanced computers. * Add PATCH and TRACE HTTP methods. (jaredallard)
* Add more MOTD messages. (JakobDev)
* Allow removing and adding turtle upgrades via CraftTweaker.
And several bug fixes:
* Fix crash when interacting with Wearable Backpacks.
Type "help changelog" to see the full version history. Type "help changelog" to see the full version history.

View File

@ -1,7 +1,7 @@
View the source code at https://github.com/SquidDev-CC/CC-Tweaked View the source code at https://github.com/SquidDev-CC/CC-Tweaked
View the documentation at https://wiki.computercraft.cc View the documentation at https://wiki.computercraft.cc
Visit the forum at https://forums.computercraft.cc Visit the forum at https://forums.computercraft.cc
You can disable these messages by running "set motd.enable false" You can disable these messages by running "set motd.enable false".
You can create directories with "mkdir". You can create directories with "mkdir".
Want to see hidden files? Run "set list.show_hidden true". Want to see hidden files? Run "set list.show_hidden true".
Run "list" or "ls" to see all files in a directory. Run "list" or "ls" to see all files in a directory.
@ -13,3 +13,22 @@ Use the "edit" program to create and edit your programs.
You can copy files with "copy" or "cp". You can copy files with "copy" or "cp".
You can use "wget run <url>" to run a program from the internet. You can use "wget run <url>" to run a program from the internet.
You can use "wget" to download a file from the internet. You can use "wget" to download a file from the internet.
On an advanced computer you can use "fg" or "bg" to run multiple programs at the same time.
Use "type" to see if a path is a file or a directory.
Get a list of all programs with "programs".
Use an advanced computer to use colours and the mouse.
With a speaker you can play sounds.
Use "motd" to print the Message of the Day.
You can disable the startup from a computer with "set shell.allow_startup false".
You can disable the startup from a disk with "set shell.allow_disk_startup false".
Programs that are placed in the "startup" folder in the root of a computer are started on boot.
Use a modem to connect with other computers.
With the "gps" program you can get the position of a computer.
Use "monitor" to run a program on a attached monitor.
View all attached peripherals with "peripherals".
Use "time" to see the in-game time.
You can set the label of a computer with "label set".
A computer needs a label to keep its files if it got destroyed.
You can disable auto completion in the shell with "set shell.autocomplete false".
You can disable auto completion in edit with "set edit.autocomplete false".
Feeling creative? Use a printer to print a book!

View File

@ -2,7 +2,7 @@ local expect = dofile("rom/modules/main/cc/expect.lua").expect
-- Setup process switching -- Setup process switching
local parentTerm = term.current() local parentTerm = term.current()
local w,h = parentTerm.getSize() local w, h = parentTerm.getSize()
local tProcesses = {} local tProcesses = {}
local nCurrentProcess = nil local nCurrentProcess = nil
@ -55,7 +55,7 @@ local function launchProcess( bFocus, tProgramEnv, sProgramPath, ... )
local tProcess = {} local tProcess = {}
tProcess.sTitle = fs.getName( sProgramPath ) tProcess.sTitle = fs.getName( sProgramPath )
if bShowMenu then if bShowMenu then
tProcess.window = window.create( parentTerm, 1, 2, w, h-1, false ) tProcess.window = window.create( parentTerm, 1, 2, w, h - 1, false )
else else
tProcess.window = window.create( parentTerm, 1, 1, w, h, false ) tProcess.window = window.create( parentTerm, 1, 1, w, h, false )
end end
@ -102,7 +102,7 @@ end
local function cullProcesses() local function cullProcesses()
local culled = false local culled = false
for n=#tProcesses,1,-1 do for n = #tProcesses, 1, -1 do
culled = culled or cullProcess( n ) culled = culled or cullProcess( n )
end end
return culled return culled
@ -132,7 +132,7 @@ local function redrawMenu()
parentTerm.write( "<" ) parentTerm.write( "<" )
nCharCount = 1 nCharCount = 1
end end
for n=nScrollPos,#tProcesses do for n = nScrollPos, #tProcesses do
if n == nCurrentProcess then if n == nCurrentProcess then
parentTerm.setTextColor( menuMainTextColor ) parentTerm.setTextColor( menuMainTextColor )
parentTerm.setBackgroundColor( menuMainBgColor ) parentTerm.setBackgroundColor( menuMainBgColor )
@ -165,15 +165,14 @@ local function resizeWindows()
local windowY, windowHeight local windowY, windowHeight
if bShowMenu then if bShowMenu then
windowY = 2 windowY = 2
windowHeight = h-1 windowHeight = h - 1
else else
windowY = 1 windowY = 1
windowHeight = h windowHeight = h
end end
for n=1,#tProcesses do for n = 1, #tProcesses do
local tProcess = tProcesses[n] local tProcess = tProcesses[n]
local window = tProcess.window local x, y = tProcess.window.getCursorPos()
local x,y = tProcess.window.getCursorPos()
if y > windowHeight then if y > windowHeight then
tProcess.window.scroll( y - windowHeight ) tProcess.window.scroll( y - windowHeight )
tProcess.window.setCursorPos( x, windowHeight ) tProcess.window.setCursorPos( x, windowHeight )
@ -232,7 +231,7 @@ function multishell.launch( tProgramEnv, sProgramPath, ... )
expect(1, tProgramEnv, "table") expect(1, tProgramEnv, "table")
expect(2, sProgramPath, "string") expect(2, sProgramPath, "string")
local previousTerm = term.current() local previousTerm = term.current()
setMenuVisible( (#tProcesses + 1) >= 2 ) setMenuVisible( #tProcesses + 1 >= 2 )
local nResult = launchProcess( false, tProgramEnv, sProgramPath, ... ) local nResult = launchProcess( false, tProgramEnv, sProgramPath, ... )
redrawMenu() redrawMenu()
term.redirect( previousTerm ) term.redirect( previousTerm )
@ -258,7 +257,7 @@ while #tProcesses > 0 do
local sEvent = tEventData[1] local sEvent = tEventData[1]
if sEvent == "term_resize" then if sEvent == "term_resize" then
-- Resize event -- Resize event
w,h = parentTerm.getSize() w, h = parentTerm.getSize()
resizeWindows() resizeWindows()
redrawMenu() redrawMenu()
@ -287,8 +286,8 @@ while #tProcesses > 0 do
if nScrollPos ~= 1 then if nScrollPos ~= 1 then
tabStart = 2 tabStart = 2
end end
for n=nScrollPos,#tProcesses do for n = nScrollPos, #tProcesses do
local tabEnd = tabStart + string.len( tProcesses[n].sTitle ) + 1 local tabEnd = tabStart + #tProcesses[n].sTitle + 1
if x >= tabStart and x <= tabEnd then if x >= tabStart and x <= tabEnd then
selectProcess( n ) selectProcess( n )
redrawMenu() redrawMenu()
@ -299,7 +298,7 @@ while #tProcesses > 0 do
end end
else else
-- Passthrough to current process -- Passthrough to current process
resumeProcess( nCurrentProcess, sEvent, button, x, (bShowMenu and y-1) or y ) resumeProcess( nCurrentProcess, sEvent, button, x, bShowMenu and y - 1 or y )
if cullProcess( nCurrentProcess ) then if cullProcess( nCurrentProcess ) then
setMenuVisible( #tProcesses >= 2 ) setMenuVisible( #tProcesses >= 2 )
redrawMenu() redrawMenu()
@ -319,7 +318,7 @@ while #tProcesses > 0 do
end end
elseif not (bShowMenu and y == 1) then elseif not (bShowMenu and y == 1) then
-- Passthrough to current process -- Passthrough to current process
resumeProcess( nCurrentProcess, sEvent, p1, x, (bShowMenu and y-1) or y ) resumeProcess( nCurrentProcess, sEvent, p1, x, bShowMenu and y - 1 or y )
if cullProcess( nCurrentProcess ) then if cullProcess( nCurrentProcess ) then
setMenuVisible( #tProcesses >= 2 ) setMenuVisible( #tProcesses >= 2 )
redrawMenu() redrawMenu()
@ -330,7 +329,7 @@ while #tProcesses > 0 do
-- Other event -- Other event
-- Passthrough to all processes -- Passthrough to all processes
local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event
for n=1,nLimit do for n = 1, nLimit do
resumeProcess( n, table.unpack( tEventData, 1, tEventData.n ) ) resumeProcess( n, table.unpack( tEventData, 1, tEventData.n ) )
end end
if cullProcesses() then if cullProcesses() then
@ -342,7 +341,7 @@ while #tProcesses > 0 do
if bWindowsResized then if bWindowsResized then
-- Pass term_resize to all processes -- Pass term_resize to all processes
local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event
for n=1,nLimit do for n = 1, nLimit do
resumeProcess( n, "term_resize" ) resumeProcess( n, "term_resize" )
end end
bWindowsResized = false bWindowsResized = false

View File

@ -19,7 +19,7 @@ else
local tAliases = shell.aliases() local tAliases = shell.aliases()
local tList = {} local tList = {}
for sAlias, sCommand in pairs( tAliases ) do for sAlias, sCommand in pairs( tAliases ) do
table.insert( tList, sAlias..":"..sCommand ) table.insert( tList, sAlias .. ":" .. sCommand )
end end
table.sort( tList ) table.sort( tList )
textutils.pagedTabulate( tList ) textutils.pagedTabulate( tList )

View File

@ -1,6 +1,6 @@
local tApis = {} local tApis = {}
for k,v in pairs( _G ) do for k, v in pairs( _G ) do
if type(k) == "string" and type(v) == "table" and k ~= "_G" then if type(k) == "string" and type(v) == "table" and k ~= "_G" then
table.insert( tApis, k ) table.insert( tApis, k )
end end

View File

@ -18,7 +18,7 @@ local function printSuccess( text )
end end
local sCommand = string.lower( tArgs[1] ) local sCommand = string.lower( tArgs[1] )
for n=2,#tArgs do for n = 2, #tArgs do
sCommand = sCommand .. " " .. tArgs[n] sCommand = sCommand .. " " .. tArgs[n]
end end
@ -26,14 +26,14 @@ local bResult, tOutput = commands.exec( sCommand )
if bResult then if bResult then
printSuccess( "Success" ) printSuccess( "Success" )
if #tOutput > 0 then if #tOutput > 0 then
for n=1,#tOutput do for n = 1, #tOutput do
print( tOutput[n] ) print( tOutput[n] )
end end
end end
else else
printError( "Failed" ) printError( "Failed" )
if #tOutput > 0 then if #tOutput > 0 then
for n=1,#tOutput do for n = 1, #tOutput do
print( tOutput[n] ) print( tOutput[n] )
end end
end end

View File

@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
local sDest = shell.resolve( tArgs[2] ) local sDest = shell.resolve( tArgs[2] )
local tFiles = fs.find( sSource ) local tFiles = fs.find( sSource )
if #tFiles > 0 then if #tFiles > 0 then
for n,sFile in ipairs( tFiles ) do for _, sFile in ipairs( tFiles ) do
if fs.isDir( sDest ) then if fs.isDir( sDest ) then
fs.copy( sFile, fs.combine( sDest, fs.getName(sFile) ) ) fs.copy( sFile, fs.combine( sDest, fs.getName(sFile) ) )
elseif #tFiles == 1 then elseif #tFiles == 1 then

View File

@ -8,7 +8,7 @@ end
for i = 1, args.n do for i = 1, args.n do
local files = fs.find(shell.resolve(args[i])) local files = fs.find(shell.resolve(args[i]))
if #files > 0 then if #files > 0 then
for n, file in ipairs(files) do for _, file in ipairs(files) do
local ok, err = pcall(fs.delete, file) local ok, err = pcall(fs.delete, file)
if not ok then if not ok then
printError((err:gsub("^pcall: ", ""))) printError((err:gsub("^pcall: ", "")))

View File

@ -10,9 +10,9 @@ if fs.exists( sPath ) then
write( fs.getDrive( sPath ) .. " (" ) write( fs.getDrive( sPath ) .. " (" )
local nSpace = fs.getFreeSpace( sPath ) local nSpace = fs.getFreeSpace( sPath )
if nSpace >= 1000 * 1000 then if nSpace >= 1000 * 1000 then
print( (math.floor( nSpace / (100 * 1000) ) / 10) .. "MB remaining)" ) print( math.floor( nSpace / (100 * 1000) ) / 10 .. "MB remaining)" )
elseif nSpace >= 1000 then elseif nSpace >= 1000 then
print( (math.floor( nSpace / 100 ) / 10) .. "KB remaining)" ) print( math.floor( nSpace / 100 ) / 10 .. "KB remaining)" )
else else
print( nSpace .. "B remaining)" ) print( nSpace .. "B remaining)" )
end end

View File

@ -21,9 +21,9 @@ if not fs.exists( sPath ) and not string.find( sPath, "%." ) then
end end
end end
local x,y = 1,1 local x, y = 1, 1
local w,h = term.getSize() local w, h = term.getSize()
local scrollX, scrollY = 0,0 local scrollX, scrollY = 0, 0
local tLines = {} local tLines = {}
local bRunning = true local bRunning = true
@ -62,7 +62,7 @@ end
table.insert( tMenuItems, "Exit" ) table.insert( tMenuItems, "Exit" )
local sStatus = "Press Ctrl to access menu" local sStatus = "Press Ctrl to access menu"
if string.len( sStatus ) > w - 5 then if #sStatus > w - 5 then
sStatus = "Press Ctrl for menu" sStatus = "Press Ctrl for menu"
end end
@ -95,11 +95,11 @@ local function save( _sPath )
local function innerSave() local function innerSave()
file, fileerr = fs.open( _sPath, "w" ) file, fileerr = fs.open( _sPath, "w" )
if file then if file then
for n, sLine in ipairs( tLines ) do for _, sLine in ipairs( tLines ) do
file.write( sLine .. "\n" ) file.write( sLine .. "\n" )
end end
else else
error( "Failed to open ".._sPath ) error( "Failed to open " .. _sPath )
end end
end end
@ -130,7 +130,7 @@ local tKeywords = {
["return"] = true, ["return"] = true,
["then"] = true, ["then"] = true,
["true"] = true, ["true"] = true,
["until"]= true, ["until"] = true,
["while"] = true, ["while"] = true,
} }
@ -144,13 +144,13 @@ local function tryWrite( sLine, regex, colour )
end end
term.write( match ) term.write( match )
term.setTextColour( textColour ) term.setTextColour( textColour )
return string.sub( sLine, string.len(match) + 1 ) return string.sub( sLine, #match + 1 )
end end
return nil return nil
end end
local function writeHighlighted( sLine ) local function writeHighlighted( sLine )
while string.len(sLine) > 0 do while #sLine > 0 do
sLine = sLine =
tryWrite( sLine, "^%-%-%[%[.-%]%]", commentColour ) or tryWrite( sLine, "^%-%-%[%[.-%]%]", commentColour ) or
tryWrite( sLine, "^%-%-.*", commentColour ) or tryWrite( sLine, "^%-%-.*", commentColour ) or
@ -188,7 +188,7 @@ end
local function recomplete() local function recomplete()
local sLine = tLines[y] local sLine = tLines[y]
if not bMenu and not bReadOnly and x == string.len(sLine) + 1 then if not bMenu and not bReadOnly and x == #sLine + 1 then
tCompletions = complete( sLine ) tCompletions = complete( sLine )
if tCompletions and #tCompletions > 0 then if tCompletions and #tCompletions > 0 then
nCompletion = 1 nCompletion = 1
@ -214,7 +214,7 @@ end
local function redrawText() local function redrawText()
local cursorX, cursorY = x, y local cursorX, cursorY = x, y
for y=1,h-1 do for y = 1, h - 1 do
term.setCursorPos( 1 - scrollX, y ) term.setCursorPos( 1 - scrollX, y )
term.clearLine() term.clearLine()
@ -248,7 +248,7 @@ local function redrawMenu()
term.clearLine() term.clearLine()
-- Draw line numbers -- Draw line numbers
term.setCursorPos( w - string.len( "Ln "..y ) + 1, h ) term.setCursorPos( w - #( "Ln " .. y ) + 1, h )
term.setTextColour( highlightColour ) term.setTextColour( highlightColour )
term.write( "Ln " ) term.write( "Ln " )
term.setTextColour( textColour ) term.setTextColour( textColour )
@ -258,7 +258,7 @@ local function redrawMenu()
if bMenu then if bMenu then
-- Draw menu -- Draw menu
term.setTextColour( textColour ) term.setTextColour( textColour )
for nItem,sItem in pairs( tMenuItems ) do for nItem, sItem in pairs( tMenuItems ) do
if nItem == nMenuItem then if nItem == nMenuItem then
term.setTextColour( highlightColour ) term.setTextColour( highlightColour )
term.write( "[" ) term.write( "[" )
@ -268,7 +268,7 @@ local function redrawMenu()
term.write( "]" ) term.write( "]" )
term.setTextColour( textColour ) term.setTextColour( textColour )
else else
term.write( " "..sItem.." " ) term.write( " " .. sItem .. " " )
end end
end end
else else
@ -287,14 +287,14 @@ local tMenuFuncs = {
if bReadOnly then if bReadOnly then
sStatus = "Access denied" sStatus = "Access denied"
else else
local ok, err, fileerr = save( sPath ) local ok, _, fileerr = save( sPath )
if ok then if ok then
sStatus="Saved to "..sPath sStatus = "Saved to " .. sPath
else else
if fileerr then if fileerr then
sStatus="Error saving to "..fileerr sStatus = "Error saving to " .. fileerr
else else
sStatus="Error saving to "..sPath sStatus = "Error saving to " .. sPath
end end
end end
end end
@ -326,7 +326,7 @@ local tMenuFuncs = {
} }
printerTerminal.scroll = function() printerTerminal.scroll = function()
if nPage == 1 then if nPage == 1 then
printer.setPageTitle( sName.." (page "..nPage..")" ) printer.setPageTitle( sName .. " (page " .. nPage .. ")" )
end end
while not printer.newPage() do while not printer.newPage() do
@ -349,7 +349,7 @@ local tMenuFuncs = {
if nPage == 1 then if nPage == 1 then
printer.setPageTitle( sName ) printer.setPageTitle( sName )
else else
printer.setPageTitle( sName.." (page "..nPage..")" ) printer.setPageTitle( sName .. " (page " .. nPage .. ")" )
end end
end end
@ -357,7 +357,7 @@ local tMenuFuncs = {
term.redirect( printerTerminal ) term.redirect( printerTerminal )
local ok, error = pcall( function() local ok, error = pcall( function()
term.scroll() term.scroll()
for n, sLine in ipairs( tLines ) do for _, sLine in ipairs( tLines ) do
print( sLine ) print( sLine )
end end
end ) end )
@ -374,7 +374,7 @@ local tMenuFuncs = {
bMenu = true bMenu = true
if nPage > 1 then if nPage > 1 then
sStatus = "Printed "..nPage.." Pages" sStatus = "Printed " .. nPage .. " Pages"
else else
sStatus = "Printed 1 Page" sStatus = "Printed 1 Page"
end end
@ -385,20 +385,20 @@ local tMenuFuncs = {
end, end,
Run = function() Run = function()
local sTempPath = "/.temp" local sTempPath = "/.temp"
local ok, err = save( sTempPath ) local ok = save( sTempPath )
if ok then if ok then
local nTask = shell.openTab( sTempPath ) local nTask = shell.openTab( sTempPath )
if nTask then if nTask then
shell.switchTab( nTask ) shell.switchTab( nTask )
else else
sStatus="Error starting Task" sStatus = "Error starting Task"
end end
fs.delete( sTempPath ) fs.delete( sTempPath )
else else
sStatus="Error saving to "..sTempPath sStatus = "Error saving to " .. sTempPath
end end
redrawMenu() redrawMenu()
end end,
} }
local function doMenuItem( _n ) local function doMenuItem( _n )
@ -411,7 +411,7 @@ local function doMenuItem( _n )
end end
local function setCursor( newX, newY ) local function setCursor( newX, newY )
local oldX, oldY = x, y local _, oldY = x, y
x, y = newX, newY x, y = newX, newY
local screenX = x - scrollX local screenX = x - scrollX
local screenY = y - scrollY local screenY = y - scrollY
@ -431,9 +431,9 @@ local function setCursor( newX, newY )
scrollY = y - 1 scrollY = y - 1
screenY = 1 screenY = 1
bRedraw = true bRedraw = true
elseif screenY > h-1 then elseif screenY > h - 1 then
scrollY = y - (h-1) scrollY = y - (h - 1)
screenY = h-1 screenY = h - 1
bRedraw = true bRedraw = true
end end
@ -456,7 +456,7 @@ load(sPath)
term.setBackgroundColour( bgColour ) term.setBackgroundColour( bgColour )
term.clear() term.clear()
term.setCursorPos(x,y) term.setCursorPos(x, y)
term.setCursorBlink( true ) term.setCursorBlink( true )
recomplete() recomplete()
@ -468,7 +468,7 @@ local function acceptCompletion()
-- Append the completion -- Append the completion
local sCompletion = tCompletions[ nCompletion ] local sCompletion = tCompletions[ nCompletion ]
tLines[y] = tLines[y] .. sCompletion tLines[y] = tLines[y] .. sCompletion
setCursor( x + string.len( sCompletion ), y ) setCursor( x + #sCompletion , y )
end end
end end
@ -476,7 +476,6 @@ end
while bRunning do while bRunning do
local sEvent, param, param2, param3 = os.pullEvent() local sEvent, param, param2, param3 = os.pullEvent()
if sEvent == "key" then if sEvent == "key" then
local oldX, oldY = x, y
if param == keys.up then if param == keys.up then
-- Up -- Up
if not bMenu then if not bMenu then
@ -491,7 +490,7 @@ while bRunning do
elseif y > 1 then elseif y > 1 then
-- Move cursor up -- Move cursor up
setCursor( setCursor(
math.min( x, string.len( tLines[y - 1] ) + 1 ), math.min( x, #tLines[y - 1] + 1 ),
y - 1 y - 1
) )
end end
@ -512,7 +511,7 @@ while bRunning do
elseif y < #tLines then elseif y < #tLines then
-- Move cursor down -- Move cursor down
setCursor( setCursor(
math.min( x, string.len( tLines[y + 1] ) + 1 ), math.min( x, #tLines[y + 1] + 1 ),
y + 1 y + 1
) )
end end
@ -521,13 +520,13 @@ while bRunning do
elseif param == keys.tab then elseif param == keys.tab then
-- Tab -- Tab
if not bMenu and not bReadOnly then if not bMenu and not bReadOnly then
if nCompletion and x == string.len(tLines[y]) + 1 then if nCompletion and x == #tLines[y] + 1 then
-- Accept autocomplete -- Accept autocomplete
acceptCompletion() acceptCompletion()
else else
-- Indent line -- Indent line
local sLine = tLines[y] local sLine = tLines[y]
tLines[y] = string.sub(sLine,1,x-1) .. " " .. string.sub(sLine,x) tLines[y] = string.sub(sLine, 1, x - 1) .. " " .. string.sub(sLine, x)
setCursor( x + 4, y ) setCursor( x + 4, y )
end end
end end
@ -543,7 +542,7 @@ while bRunning do
newY = 1 newY = 1
end end
setCursor( setCursor(
math.min( x, string.len( tLines[newY] ) + 1 ), math.min( x, #tLines[newY] + 1 ),
newY newY
) )
end end
@ -558,7 +557,7 @@ while bRunning do
else else
newY = #tLines newY = #tLines
end end
local newX = math.min( x, string.len( tLines[newY] ) + 1 ) local newX = math.min( x, #tLines[newY] + 1 )
setCursor( newX, newY ) setCursor( newX, newY )
end end
@ -567,7 +566,7 @@ while bRunning do
if not bMenu then if not bMenu then
-- Move cursor to the beginning -- Move cursor to the beginning
if x > 1 then if x > 1 then
setCursor(1,y) setCursor(1, y)
end end
end end
@ -575,7 +574,7 @@ while bRunning do
-- End -- End
if not bMenu then if not bMenu then
-- Move cursor to the end -- Move cursor to the end
local nLimit = string.len( tLines[y] ) + 1 local nLimit = #tLines[y] + 1
if x < nLimit then if x < nLimit then
setCursor( nLimit, y ) setCursor( nLimit, y )
end end
@ -587,8 +586,8 @@ while bRunning do
if x > 1 then if x > 1 then
-- Move cursor left -- Move cursor left
setCursor( x - 1, y ) setCursor( x - 1, y )
elseif x==1 and y>1 then elseif x == 1 and y > 1 then
setCursor( string.len( tLines[y-1] ) + 1, y - 1 ) setCursor( #tLines[y - 1] + 1, y - 1 )
end end
else else
-- Move menu left -- Move menu left
@ -602,14 +601,14 @@ while bRunning do
elseif param == keys.right then elseif param == keys.right then
-- Right -- Right
if not bMenu then if not bMenu then
local nLimit = string.len( tLines[y] ) + 1 local nLimit = #tLines[y] + 1
if x < nLimit then if x < nLimit then
-- Move cursor right -- Move cursor right
setCursor( x + 1, y ) setCursor( x + 1, y )
elseif nCompletion and x == string.len(tLines[y]) + 1 then elseif nCompletion and x == #tLines[y] + 1 then
-- Accept autocomplete -- Accept autocomplete
acceptCompletion() acceptCompletion()
elseif x==nLimit and y<#tLines then elseif x == nLimit and y < #tLines then
-- Go to next line -- Go to next line
setCursor( 1, y + 1 ) setCursor( 1, y + 1 )
end end
@ -625,15 +624,15 @@ while bRunning do
elseif param == keys.delete then elseif param == keys.delete then
-- Delete -- Delete
if not bMenu and not bReadOnly then if not bMenu and not bReadOnly then
local nLimit = string.len( tLines[y] ) + 1 local nLimit = #tLines[y] + 1
if x < nLimit then if x < nLimit then
local sLine = tLines[y] local sLine = tLines[y]
tLines[y] = string.sub(sLine,1,x-1) .. string.sub(sLine,x+1) tLines[y] = string.sub(sLine, 1, x - 1) .. string.sub(sLine, x + 1)
recomplete() recomplete()
redrawLine(y) redrawLine(y)
elseif y<#tLines then elseif y < #tLines then
tLines[y] = tLines[y] .. tLines[y+1] tLines[y] = tLines[y] .. tLines[y + 1]
table.remove( tLines, y+1 ) table.remove( tLines, y + 1 )
recomplete() recomplete()
redrawText() redrawText()
end end
@ -645,17 +644,17 @@ while bRunning do
if x > 1 then if x > 1 then
-- Remove character -- Remove character
local sLine = tLines[y] local sLine = tLines[y]
if x > 4 and string.sub(sLine,x-4,x-1) == " " and not string.sub(sLine, 1, x - 1):find("%S") then if x > 4 and string.sub(sLine, x - 4, x - 1) == " " and not string.sub(sLine, 1, x - 1):find("%S") then
tLines[y] = string.sub(sLine,1,x-5) .. string.sub(sLine,x) tLines[y] = string.sub(sLine, 1, x - 5) .. string.sub(sLine, x)
setCursor( x - 4, y ) setCursor( x - 4, y )
else else
tLines[y] = string.sub(sLine,1,x-2) .. string.sub(sLine,x) tLines[y] = string.sub(sLine, 1, x - 2) .. string.sub(sLine, x)
setCursor( x - 1, y ) setCursor( x - 1, y )
end end
elseif y > 1 then elseif y > 1 then
-- Remove newline -- Remove newline
local sPrevLen = string.len( tLines[y-1] ) local sPrevLen = #tLines[y - 1]
tLines[y-1] = tLines[y-1] .. tLines[y] tLines[y - 1] = tLines[y - 1] .. tLines[y]
table.remove( tLines, y ) table.remove( tLines, y )
setCursor( sPrevLen + 1, y - 1 ) setCursor( sPrevLen + 1, y - 1 )
redrawText() redrawText()
@ -667,12 +666,12 @@ while bRunning do
if not bMenu and not bReadOnly then if not bMenu and not bReadOnly then
-- Newline -- Newline
local sLine = tLines[y] local sLine = tLines[y]
local _,spaces=string.find(sLine,"^[ ]+") local _, spaces = string.find(sLine, "^[ ]+")
if not spaces then if not spaces then
spaces=0 spaces = 0
end end
tLines[y] = string.sub(sLine,1,x-1) tLines[y] = string.sub(sLine, 1, x - 1)
table.insert( tLines, y+1, string.rep(' ',spaces)..string.sub(sLine,x) ) table.insert( tLines, y + 1, string.rep(' ', spaces) .. string.sub(sLine, x) )
setCursor( spaces + 1, y + 1 ) setCursor( spaces + 1, y + 1 )
redrawText() redrawText()
@ -698,13 +697,13 @@ while bRunning do
if not bMenu and not bReadOnly then if not bMenu and not bReadOnly then
-- Input text -- Input text
local sLine = tLines[y] local sLine = tLines[y]
tLines[y] = string.sub(sLine,1,x-1) .. param .. string.sub(sLine,x) tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x)
setCursor( x + 1, y ) setCursor( x + 1, y )
elseif bMenu then elseif bMenu then
-- Select menu items -- Select menu items
for n,sMenuItem in ipairs( tMenuItems ) do for n, sMenuItem in ipairs( tMenuItems ) do
if string.lower(string.sub(sMenuItem,1,1)) == string.lower(param) then if string.lower(string.sub(sMenuItem, 1, 1)) == string.lower(param) then
doMenuItem( n ) doMenuItem( n )
break break
end end
@ -721,18 +720,18 @@ while bRunning do
end end
-- Input text -- Input text
local sLine = tLines[y] local sLine = tLines[y]
tLines[y] = string.sub(sLine,1,x-1) .. param .. string.sub(sLine,x) tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x)
setCursor( x + string.len( param ), y ) setCursor( x + #param , y )
end end
elseif sEvent == "mouse_click" then elseif sEvent == "mouse_click" then
if not bMenu then if not bMenu then
if param == 1 then if param == 1 then
-- Left click -- Left click
local cx,cy = param2, param3 local cx, cy = param2, param3
if cy < h then if cy < h then
local newY = math.min( math.max( scrollY + cy, 1 ), #tLines ) local newY = math.min( math.max( scrollY + cy, 1 ), #tLines )
local newX = math.min( math.max( scrollX + cx, 1 ), string.len( tLines[newY] ) + 1 ) local newX = math.min( math.max( scrollX + cx, 1 ), #tLines[newY] + 1 )
setCursor( newX, newY ) setCursor( newX, newY )
end end
end end
@ -750,7 +749,7 @@ while bRunning do
elseif param == 1 then elseif param == 1 then
-- Scroll down -- Scroll down
local nMaxScroll = #tLines - (h-1) local nMaxScroll = #tLines - (h - 1)
if scrollY < nMaxScroll then if scrollY < nMaxScroll then
-- Move cursor down -- Move cursor down
scrollY = scrollY + 1 scrollY = scrollY + 1
@ -761,7 +760,7 @@ while bRunning do
end end
elseif sEvent == "term_resize" then elseif sEvent == "term_resize" then
w,h = term.getSize() w, h = term.getSize()
setCursor( x, y ) setCursor( x, y )
redrawMenu() redrawMenu()
redrawText() redrawText()

View File

@ -11,7 +11,7 @@ local sDrive = tArgs[1]
-- Check the disk exists -- Check the disk exists
local bPresent = disk.isPresent( sDrive ) local bPresent = disk.isPresent( sDrive )
if not bPresent then if not bPresent then
print( "Nothing in "..sDrive.." drive" ) print( "Nothing in " .. sDrive .. " drive" )
return return
end end

View File

@ -6,7 +6,7 @@
------------ ------------
-- The width and height of the terminal -- The width and height of the terminal
local w,h = term.getSize() local w, h = term.getSize()
-- The selected colours on the left and right mouse button, and the colour of the canvas -- The selected colours on the left and right mouse button, and the colour of the canvas
local leftColour, rightColour = colours.white, nil local leftColour, rightColour = colours.white, nil
@ -16,7 +16,7 @@ local canvasColour = colours.black
local canvas = {} local canvas = {}
-- The menu options -- The menu options
local mChoices = { "Save","Exit" } local mChoices = { "Save", "Exit" }
-- The message displayed in the footer bar -- The message displayed in the footer bar
local fMessage = "Press Ctrl to access menu" local fMessage = "Press Ctrl to access menu"
@ -86,8 +86,8 @@ end
returns: the colour number of the hex value returns: the colour number of the hex value
]] ]]
local tColourLookup = {} local tColourLookup = {}
for n=1,16 do for n = 1, 16 do
tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1) tColourLookup[ string.byte( "0123456789abcdef", n, n ) ] = 2 ^ (n - 1)
end end
local function getColourOf( char ) local function getColourOf( char )
-- Values not in the hex table are transparent (canvas coloured) -- Values not in the hex table are transparent (canvas coloured)
@ -106,8 +106,8 @@ local function load(path)
local sLine = file.readLine() local sLine = file.readLine()
while sLine do while sLine do
local line = {} local line = {}
for x=1,w-2 do for x = 1, w - 2 do
line[x] = getColourOf( string.byte(sLine,x,x) ) line[x] = getColourOf( string.byte(sLine, x, x) )
end end
table.insert( canvas, line ) table.insert( canvas, line )
sLine = file.readLine() sLine = file.readLine()
@ -136,10 +136,10 @@ local function save(path)
-- Encode (and trim) -- Encode (and trim)
local tLines = {} local tLines = {}
local nLastLine = 0 local nLastLine = 0
for y=1,h-1 do for y = 1, h - 1 do
local sLine = "" local sLine = ""
local nLastChar = 0 local nLastChar = 0
for x=1,w-2 do for x = 1, w - 2 do
local c = getCharOf( getCanvasPixel( x, y ) ) local c = getCharOf( getCanvasPixel( x, y ) )
sLine = sLine .. c sLine = sLine .. c
if c ~= " " then if c ~= " " then
@ -148,13 +148,13 @@ local function save(path)
end end
sLine = string.sub( sLine, 1, nLastChar ) sLine = string.sub( sLine, 1, nLastChar )
tLines[y] = sLine tLines[y] = sLine
if string.len( sLine ) > 0 then if #sLine > 0 then
nLastLine = y nLastLine = y
end end
end end
-- Save out -- Save out
for n=1,nLastLine do for n = 1, nLastLine do
file.writeLine( tLines[ n ] ) file.writeLine( tLines[ n ] )
end end
file.close() file.close()
@ -174,20 +174,20 @@ local function drawInterface()
term.write(fMessage) term.write(fMessage)
-- Colour Picker -- Colour Picker
for i=1,16 do for i = 1, 16 do
term.setCursorPos(w-1, i) term.setCursorPos(w - 1, i)
term.setBackgroundColour( 2^(i-1) ) term.setBackgroundColour( 2 ^ (i - 1) )
term.write(" ") term.write(" ")
end end
term.setCursorPos(w-1, 17) term.setCursorPos(w - 1, 17)
term.setBackgroundColour( canvasColour ) term.setBackgroundColour( canvasColour )
term.setTextColour( colours.grey ) term.setTextColour( colours.grey )
term.write("\127\127") term.write("\127\127")
-- Left and Right Selected Colours -- Left and Right Selected Colours
for i=18,18 do do
term.setCursorPos(w-1, i) term.setCursorPos(w - 1, 18)
if leftColour ~= nil then if leftColour ~= nil then
term.setBackgroundColour( leftColour ) term.setBackgroundColour( leftColour )
term.write(" ") term.write(" ")
@ -208,8 +208,8 @@ local function drawInterface()
-- Padding -- Padding
term.setBackgroundColour( canvasColour ) term.setBackgroundColour( canvasColour )
for i=20,h-1 do for i = 20, h - 1 do
term.setCursorPos(w-1, i) term.setCursorPos(w - 1, i)
term.write(" ") term.write(" ")
end end
end end
@ -237,7 +237,7 @@ end
returns: nil returns: nil
]] ]]
local function drawCanvasLine( y ) local function drawCanvasLine( y )
for x = 1, w-2 do for x = 1, w - 2 do
drawCanvasPixel( x, y ) drawCanvasPixel( x, y )
end end
end end
@ -247,7 +247,7 @@ end
returns: nil returns: nil
]] ]]
local function drawCanvas() local function drawCanvas()
for y = 1, h-1 do for y = 1, h - 1 do
drawCanvasLine( y ) drawCanvasLine( y )
end end
end end
@ -263,25 +263,25 @@ local function accessMenu()
term.setBackgroundColour(colours.black) term.setBackgroundColour(colours.black)
while true do while true do
-- Draw the menu -- Draw the menu
term.setCursorPos(1,h) term.setCursorPos(1, h)
term.clearLine() term.clearLine()
term.setTextColour(colours.white) term.setTextColour(colours.white)
for k,v in pairs(mChoices) do for k, v in pairs(mChoices) do
if selection==k then if selection == k then
term.setTextColour(colours.yellow) term.setTextColour(colours.yellow)
local ox,_ = term.getCursorPos() local ox = term.getCursorPos()
term.write("["..string.rep(" ",#v).."]") term.write("[" .. string.rep(" ", #v) .. "]")
term.setCursorPos(ox+1,h) term.setCursorPos(ox + 1, h)
term.setTextColour(colours.white) term.setTextColour(colours.white)
term.write(v) term.write(v)
term.setCursorPos(term.getCursorPos()+1,h) term.setCursorPos(term.getCursorPos() + 1, h)
else else
term.write(" "..v.." ") term.write(" " .. v .. " ")
end end
end end
-- Handle input in the menu -- Handle input in the menu
local id,key = os.pullEvent("key") local id, key = os.pullEvent("key")
if id == "key" then if id == "key" then
-- S and E are shortcuts -- S and E are shortcuts
if key == keys.s then if key == keys.s then
@ -308,23 +308,23 @@ local function accessMenu()
elseif key == keys.enter then elseif key == keys.enter then
-- Select an option -- Select an option
if mChoices[selection]=="Save" then if mChoices[selection] == "Save" then
if bReadOnly then if bReadOnly then
fMessage = "Access denied" fMessage = "Access denied"
return false return false
end end
local success, err = save(sPath) local success, err = save(sPath)
if success then if success then
fMessage = "Saved to "..sPath fMessage = "Saved to " .. sPath
else else
if err then if err then
fMessage = "Error saving to "..err fMessage = "Error saving to " .. err
else else
fMessage = "Error saving to "..sPath fMessage = "Error saving to " .. sPath
end end
end end
return false return false
elseif mChoices[selection]=="Exit" then elseif mChoices[selection] == "Exit" then
return true return true
end end
elseif key == keys.leftCtrl or keys == keys.rightCtrl then elseif key == keys.leftCtrl or keys == keys.rightCtrl then
@ -343,19 +343,19 @@ end
local function handleEvents() local function handleEvents()
local programActive = true local programActive = true
while programActive do while programActive do
local id,p1,p2,p3 = os.pullEvent() local id, p1, p2, p3 = os.pullEvent()
if id=="mouse_click" or id=="mouse_drag" then if id == "mouse_click" or id == "mouse_drag" then
if p2 >= w-1 and p3 >= 1 and p3 <= 17 then if p2 >= w - 1 and p3 >= 1 and p3 <= 17 then
if id ~= "mouse_drag" then if id ~= "mouse_drag" then
-- Selecting an items in the colour picker -- Selecting an items in the colour picker
if p3 <= 16 then if p3 <= 16 then
if p1==1 then if p1 == 1 then
leftColour = 2^(p3-1) leftColour = 2 ^ (p3 - 1)
else else
rightColour = 2^(p3-1) rightColour = 2 ^ (p3 - 1)
end end
else else
if p1==1 then if p1 == 1 then
leftColour = nil leftColour = nil
else else
rightColour = nil rightColour = nil
@ -364,12 +364,12 @@ local function handleEvents()
--drawCanvas() --drawCanvas()
drawInterface() drawInterface()
end end
elseif p2 < w-1 and p3 <= h-1 then elseif p2 < w - 1 and p3 <= h - 1 then
-- Clicking on the canvas -- Clicking on the canvas
local paintColour = nil local paintColour = nil
if p1==1 then if p1 == 1 then
paintColour = leftColour paintColour = leftColour
elseif p1==2 then elseif p1 == 2 then
paintColour = rightColour paintColour = rightColour
end end
if not canvas[p3] then if not canvas[p3] then
@ -379,13 +379,13 @@ local function handleEvents()
drawCanvasPixel( p2, p3 ) drawCanvasPixel( p2, p3 )
end end
elseif id=="key" then elseif id == "key" then
if p1==keys.leftCtrl or p1==keys.rightCtrl then if p1 == keys.leftCtrl or p1 == keys.rightCtrl then
programActive = not accessMenu() programActive = not accessMenu()
drawInterface() drawInterface()
end end
elseif id=="term_resize" then elseif id == "term_resize" then
w,h = term.getSize() w, h = term.getSize()
drawCanvas() drawCanvas()
drawInterface() drawInterface()
end end
@ -404,4 +404,4 @@ handleEvents()
term.setBackgroundColour(colours.black) term.setBackgroundColour(colours.black)
term.setTextColour(colours.white) term.setTextColour(colours.white)
term.clear() term.clear()
term.setCursorPos(1,1) term.setCursorPos(1, 1)

View File

@ -3,12 +3,12 @@
--Clearing Screen-- --Clearing Screen--
--Vars-- --Vars--
local TermW,TermH = term.getSize() local TermW, TermH = term.getSize()
local sLevelTitle local sLevelTitle
local tScreen local tScreen
local oScreen local oScreen
local SizeW,SizeH local SizeW, SizeH
local aExits local aExits
local fExit local fExit
local nSpeed local nSpeed
@ -18,14 +18,14 @@ local fSpeedS
local bPaused local bPaused
local Tick local Tick
local Blocks local Blocks
local XOrgin,YOrgin local XOrgin, YOrgin
local fLevel local fLevel
local function reset() local function reset()
sLevelTitle = "" sLevelTitle = ""
tScreen = {} tScreen = {}
oScreen = {} oScreen = {}
SizeW,SizeH = TermW,TermH SizeW, SizeH = TermW, TermH
aExits = 0 aExits = 0
fExit = "nop" fExit = "nop"
nSpeed = 0.6 nSpeed = 0.6
@ -35,7 +35,7 @@ local function reset()
bPaused = false bPaused = false
Tick = os.startTimer(Speed) Tick = os.startTimer(Speed)
Blocks = 0 Blocks = 0
XOrgin,YOrgin = 1,1 XOrgin, YOrgin = 1, 1
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.setTextColor(colors.white) term.setTextColor(colors.white)
@ -60,22 +60,22 @@ local tArgs = { ... }
--Functions-- --Functions--
local function printCentred( yc, stg ) local function printCentred( yc, stg )
local xc = math.floor((TermW - string.len(stg)) / 2) + 1 local xc = math.floor((TermW - #stg) / 2) + 1
term.setCursorPos(xc,yc) term.setCursorPos(xc, yc)
term.write( stg ) term.write( stg )
end end
local function centerOrgin() local function centerOrgin()
XOrgin = math.floor((TermW/2)-(SizeW/2)) XOrgin = math.floor(TermW / 2 - SizeW / 2)
YOrgin = math.floor((TermH/2)-(SizeH/2)) YOrgin = math.floor(TermH / 2 - SizeH / 2)
end end
local function reMap() local function reMap()
tScreen = nil tScreen = nil
tScreen = {} tScreen = {}
for x=1,SizeW do for x = 1, SizeW do
tScreen[x] = {} tScreen[x] = {}
for y=1,SizeH do for y = 1, SizeH do
tScreen[x][y] = { space = true, wall = false, ground = false, robot = "zz", start = "zz", exit = "zz" } tScreen[x][y] = { space = true, wall = false, ground = false, robot = "zz", start = "zz", exit = "zz" }
end end
end end
@ -83,7 +83,7 @@ end
local function tablecopy(t) local function tablecopy(t)
local t2 = {} local t2 = {}
for k,v in pairs(t) do for k, v in pairs(t) do
t2[k] = v t2[k] = v
end end
return t2 return t2
@ -92,17 +92,17 @@ end
local function buMap() local function buMap()
oScreen = nil oScreen = nil
oScreen = {} oScreen = {}
for x=1,SizeW do for x = 1, SizeW do
oScreen[x] = {} oScreen[x] = {}
for y=1,SizeH do for y = 1, SizeH do
oScreen[x][y] = tablecopy(tScreen[x][y]) oScreen[x][y] = tablecopy(tScreen[x][y])
end end
end end
end end
local function addRobot(x,y,side,color) local function addRobot(x, y, side, color)
local obj = tScreen[x][y] local obj = tScreen[x][y]
local data = side..color local data = side .. color
if obj.wall == nil and obj.robot == nil then if obj.wall == nil and obj.robot == nil then
tScreen[x][y].robot = data tScreen[x][y].robot = data
else else
@ -112,9 +112,9 @@ local function addRobot(x,y,side,color)
end end
end end
local function addStart(x,y,side,color) local function addStart(x, y, side, color)
local obj = tScreen[x][y] local obj = tScreen[x][y]
local data = side..color local data = side .. color
if obj.wall == nil and obj.space == nil then if obj.wall == nil and obj.space == nil then
tScreen[x][y].start = data tScreen[x][y].start = data
else else
@ -122,10 +122,10 @@ local function addStart(x,y,side,color)
obj.space = nil obj.space = nil
tScreen[x][y].start = data tScreen[x][y].start = data
end end
aExits = aExits+1 aExits = aExits + 1
end end
local function addGround(x,y) local function addGround(x, y)
local obj = tScreen[x][y] local obj = tScreen[x][y]
if obj.space == nil and obj.exit == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then if obj.space == nil and obj.exit == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
tScreen[x][y].ground = true tScreen[x][y].ground = true
@ -139,7 +139,7 @@ local function addGround(x,y)
end end
end end
local function addExit(x,y,cl) local function addExit(x, y, cl)
local obj = tScreen[x][y] local obj = tScreen[x][y]
if obj.space == nil and obj.ground == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then if obj.space == nil and obj.ground == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
tScreen[x][y].exit = cl tScreen[x][y].exit = cl
@ -153,10 +153,10 @@ local function addExit(x,y,cl)
end end
end end
local function addWall(x,y) local function addWall(x, y)
local obj = tScreen[x][y] local obj = tScreen[x][y]
if obj == nil then if obj == nil then
return error("Here X"..x.." Y"..y) return error("Here X" .. x .. " Y" .. y)
end end
if obj.space == nil and obj.exit == nil and obj.ground == nil and obj.robot == nil and obj.start == nil then if obj.space == nil and obj.exit == nil and obj.ground == nil and obj.robot == nil and obj.start == nil then
tScreen[x][y].wall = true tScreen[x][y].wall = true
@ -171,16 +171,15 @@ local function addWall(x,y)
end end
local function loadLevel(nNum) local function loadLevel(nNum)
sLevelTitle = "Level "..nNum sLevelTitle = "Level " .. nNum
if nNum == nil then return error("nNum == nil") end if nNum == nil then return error("nNum == nil") end
local sDir = fs.getDir( shell.getRunningProgram() ) local sDir = fs.getDir( shell.getRunningProgram() )
local sLevelD = sDir .. "/levels/" .. tostring(nNum)..".dat" local sLevelD = sDir .. "/levels/" .. tostring(nNum) .. ".dat"
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : "..sLevelD) end if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : " .. sLevelD) end
fLevel = fs.open(sLevelD,"r") fLevel = fs.open(sLevelD, "r")
local Line = 0
local wl = true local wl = true
Blocks = tonumber(string.sub(fLevel.readLine(),1,1)) Blocks = tonumber(string.sub(fLevel.readLine(), 1, 1))
local xSize = string.len(fLevel.readLine())+2 local xSize = #fLevel.readLine() + 2
local Lines = 3 local Lines = 3
while wl do while wl do
local wLine = fLevel.readLine() local wLine = fLevel.readLine()
@ -188,43 +187,43 @@ local function loadLevel(nNum)
fLevel.close() fLevel.close()
wl = false wl = false
else else
xSize = math.max(string.len(wLine)+2,xSize) xSize = math.max(#wLine + 2, xSize)
Lines = Lines + 1 Lines = Lines + 1
end end
end end
SizeW,SizeH = xSize,Lines SizeW, SizeH = xSize, Lines
reMap() reMap()
fLevel = fs.open(sLevelD,"r") fLevel = fs.open(sLevelD, "r")
fLevel.readLine() fLevel.readLine()
for Line=2,Lines-1 do for Line = 2, Lines - 1 do
local sLine = fLevel.readLine() local sLine = fLevel.readLine()
local chars = string.len(sLine) local chars = #sLine
for char = 1, chars do for char = 1, chars do
local el = string.sub(sLine,char,char) local el = string.sub(sLine, char, char)
if el == "8" then if el == "8" then
addGround(char+1,Line) addGround(char + 1, Line)
elseif el == "0" then elseif el == "0" then
addStart(char+1,Line,"a","a") addStart(char + 1, Line, "a", "a")
elseif el == "1" then elseif el == "1" then
addStart(char+1,Line,"b","a") addStart(char + 1, Line, "b", "a")
elseif el == "2" then elseif el == "2" then
addStart(char+1,Line,"c","a") addStart(char + 1, Line, "c", "a")
elseif el == "3" then elseif el == "3" then
addStart(char+1,Line,"d","a") addStart(char + 1, Line, "d", "a")
elseif el == "4" then elseif el == "4" then
addStart(char+1,Line,"a","b") addStart(char + 1, Line, "a", "b")
elseif el == "5" then elseif el == "5" then
addStart(char+1,Line,"b","b") addStart(char + 1, Line, "b", "b")
elseif el == "6" then elseif el == "6" then
addStart(char+1,Line,"c","b") addStart(char + 1, Line, "c", "b")
elseif el == "9" then elseif el == "9" then
addStart(char+1,Line,"d","b") addStart(char + 1, Line, "d", "b")
elseif el == "b" then elseif el == "b" then
addExit(char+1,Line,"a") addExit(char + 1, Line, "a")
elseif el == "e" then elseif el == "e" then
addExit(char+1,Line,"b") addExit(char + 1, Line, "b")
elseif el == "7" then elseif el == "7" then
addWall(char+1,Line) addWall(char + 1, Line)
end end
end end
end end
@ -233,29 +232,29 @@ end
local function drawStars() local function drawStars()
--CCR Background By : RamiLego-- --CCR Background By : RamiLego--
local cStar,cStarG,crStar,crStarB = colors.lightGray,colors.gray,".","*" local cStar, cStarG, crStar, crStarB = colors.lightGray, colors.gray, ".", "*"
local DStar,BStar,nStar,gStar = 14,10,16,3 local DStar, BStar, nStar, gStar = 14, 10, 16, 3
local TermW,TermH = term.getSize() local TermW, TermH = term.getSize()
term.clear() term.clear()
term.setCursorPos(1,1) term.setCursorPos(1, 1)
for x=1,TermW do for x = 1, TermW do
for y=1,TermH do for y = 1, TermH do
local StarT = math.random(1,30) local StarT = math.random(1, 30)
if StarT == DStar then if StarT == DStar then
term.setCursorPos(x,y) term.setCursorPos(x, y)
term.setTextColor(cStar) term.setTextColor(cStar)
write(crStar) write(crStar)
elseif StarT == BStar then elseif StarT == BStar then
term.setCursorPos(x,y) term.setCursorPos(x, y)
term.setTextColor(cStar) term.setTextColor(cStar)
write(crStarB) write(crStarB)
elseif StarT == nStar then elseif StarT == nStar then
term.setCursorPos(x,y) term.setCursorPos(x, y)
term.setTextColor(cStarG) term.setTextColor(cStarG)
write(crStar) write(crStar)
elseif StarT == gStar then elseif StarT == gStar then
term.setCursorPos(x,y) term.setCursorPos(x, y)
term.setTextColor(cStarG) term.setTextColor(cStarG)
write(crStarB) write(crStarB)
end end
@ -264,15 +263,15 @@ local function drawStars()
end end
local function drawMap() local function drawMap()
for x=1,SizeW do for x = 1, SizeW do
for y=1,SizeH do for y = 1, SizeH do
local obj = tScreen[x][y] local obj = tScreen[x][y]
if obj.ground == true then if obj.ground == true then
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cG) paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cG)
end end
if obj.wall == true then if obj.wall == true then
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cW) paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cW)
end end
local ex = tostring(tScreen[x][y].exit) local ex = tostring(tScreen[x][y].exit)
@ -290,13 +289,13 @@ local function drawMap()
end end
term.setBackgroundColor(cG) term.setBackgroundColor(cG)
term.setTextColor(ex) term.setTextColor(ex)
term.setCursorPos(XOrgin+x,YOrgin+y+1) term.setCursorPos(XOrgin + x, YOrgin + y + 1)
print("X") print("X")
end end
local st = tostring(tScreen[x][y].start) local st = tostring(tScreen[x][y].start)
if not(st == "zz" or st == "nil") then if not(st == "zz" or st == "nil") then
local Cr = string.sub(st,2,2) local Cr = string.sub(st, 2, 2)
if Cr == "a" then if Cr == "a" then
Cr = cR1 Cr = cR1
elseif Cr == "b" then elseif Cr == "b" then
@ -311,9 +310,9 @@ local function drawMap()
term.setTextColor(Cr) term.setTextColor(Cr)
term.setBackgroundColor(cG) term.setBackgroundColor(cG)
term.setCursorPos(XOrgin+x,YOrgin+y+1) term.setCursorPos(XOrgin + x, YOrgin + y + 1)
local sSide = string.sub(st,1,1) local sSide = string.sub(st, 1, 1)
if sSide == "a" then if sSide == "a" then
print("^") print("^")
elseif sSide == "b" then elseif sSide == "b" then
@ -328,12 +327,12 @@ local function drawMap()
end end
if obj.space == true then if obj.space == true then
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cS) paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cS)
end end
local rb = tostring(tScreen[x][y].robot) local rb = tostring(tScreen[x][y].robot)
if not(rb == "zz" or rb == "nil") then if not(rb == "zz" or rb == "nil") then
local Cr = string.sub(rb,2,2) local Cr = string.sub(rb, 2, 2)
if Cr == "a" then if Cr == "a" then
Cr = cR1 Cr = cR1
elseif Cr == "b" then elseif Cr == "b" then
@ -347,8 +346,8 @@ local function drawMap()
end end
term.setBackgroundColor(Cr) term.setBackgroundColor(Cr)
term.setTextColor(colors.white) term.setTextColor(colors.white)
term.setCursorPos(XOrgin+x,YOrgin+y+1) term.setCursorPos(XOrgin + x, YOrgin + y + 1)
local sSide = string.sub(rb,1,1) local sSide = string.sub(rb, 1, 1)
if sSide == "a" then if sSide == "a" then
print("^") print("^")
elseif sSide == "b" then elseif sSide == "b" then
@ -365,7 +364,7 @@ local function drawMap()
end end
end end
local function isBrick(x,y) local function isBrick(x, y)
local brb = tostring(tScreen[x][y].robot) local brb = tostring(tScreen[x][y].robot)
local bobj = oScreen[x][y] local bobj = oScreen[x][y]
if (brb == "zz" or brb == "nil") and not bobj.wall == true then if (brb == "zz" or brb == "nil") and not bobj.wall == true then
@ -377,134 +376,134 @@ end
local function gRender(sContext) local function gRender(sContext)
if sContext == "start" then if sContext == "start" then
for x=1,SizeW do for x = 1, SizeW do
for y=1,SizeH do for y = 1, SizeH do
local st = tostring(tScreen[x][y].start) local st = tostring(tScreen[x][y].start)
if not(st == "zz" or st == "nil") then if not(st == "zz" or st == "nil") then
local Cr = string.sub(st,2,2) local Cr = string.sub(st, 2, 2)
local sSide = string.sub(st,1,1) local sSide = string.sub(st, 1, 1)
addRobot(x,y,sSide,Cr) addRobot(x, y, sSide, Cr)
end end
end end
end end
elseif sContext == "tick" then elseif sContext == "tick" then
buMap() buMap()
for x=1,SizeW do for x = 1, SizeW do
for y=1,SizeH do for y = 1, SizeH do
local rb = tostring(oScreen[x][y].robot) local rb = tostring(oScreen[x][y].robot)
if not(rb == "zz" or rb == "nil") then if not(rb == "zz" or rb == "nil") then
local Cr = string.sub(rb,2,2) local Cr = string.sub(rb, 2, 2)
local sSide = string.sub(rb,1,1) local sSide = string.sub(rb, 1, 1)
local sobj = oScreen[x][y] local sobj = oScreen[x][y]
if sobj.space == true then if sobj.space == true then
tScreen[x][y].robot = "zz" tScreen[x][y].robot = "zz"
if not sSide == "g" then if not sSide == "g" then
addRobot(x,y,"g",Cr) addRobot(x, y, "g", Cr)
end end
elseif sobj.exit == Cr then elseif sobj.exit == Cr then
if sSide == "a" or sSide == "b" or sSide == "c" or sSide == "d" then if sSide == "a" or sSide == "b" or sSide == "c" or sSide == "d" then
tScreen[x][y].robot = "zz" tScreen[x][y].robot = "zz"
addRobot(x,y,"g",Cr) addRobot(x, y, "g", Cr)
aExits = aExits-1 aExits = aExits - 1
end end
elseif sSide == "a" then elseif sSide == "a" then
local obj = isBrick(x,y-1) local obj = isBrick(x, y - 1)
tScreen[x][y].robot = "zz" tScreen[x][y].robot = "zz"
if not obj == true then if not obj == true then
addRobot(x,y-1,sSide,Cr) addRobot(x, y - 1, sSide, Cr)
else else
local obj2 = isBrick(x-1,y) local obj2 = isBrick(x - 1, y)
local obj3 = isBrick(x+1,y) local obj3 = isBrick(x + 1, y)
if not obj2 == true and not obj3 == true then if not obj2 == true and not obj3 == true then
if Cr == "a" then if Cr == "a" then
addRobot(x,y,"d",Cr) addRobot(x, y, "d", Cr)
elseif Cr == "b" then elseif Cr == "b" then
addRobot(x,y,"b",Cr) addRobot(x, y, "b", Cr)
end end
elseif obj == true and obj2 == true and obj3 == true then elseif obj == true and obj2 == true and obj3 == true then
addRobot(x,y,"c",Cr) addRobot(x, y, "c", Cr)
else else
if obj3 == true then if obj3 == true then
addRobot(x,y,"d",Cr) addRobot(x, y, "d", Cr)
elseif obj2 == true then elseif obj2 == true then
addRobot(x,y,"b",Cr) addRobot(x, y, "b", Cr)
end end
end end
end end
elseif sSide == "b" then elseif sSide == "b" then
local obj = isBrick(x+1,y) local obj = isBrick(x + 1, y)
tScreen[x][y].robot = "zz" tScreen[x][y].robot = "zz"
if not obj == true then if not obj == true then
addRobot(x+1,y,sSide,Cr) addRobot(x + 1, y, sSide, Cr)
else else
local obj2 = isBrick(x,y-1) local obj2 = isBrick(x, y - 1)
local obj3 = isBrick(x,y+1) local obj3 = isBrick(x, y + 1)
if not obj2 == true and not obj3 == true then if not obj2 == true and not obj3 == true then
if Cr == "a" then if Cr == "a" then
addRobot(x,y,"a",Cr) addRobot(x, y, "a", Cr)
elseif Cr == "b" then elseif Cr == "b" then
addRobot(x,y,"c",Cr) addRobot(x, y, "c", Cr)
end end
elseif obj == true and obj2 == true and obj3 == true then elseif obj == true and obj2 == true and obj3 == true then
addRobot(x,y,"d",Cr) addRobot(x, y, "d", Cr)
else else
if obj3 == true then if obj3 == true then
addRobot(x,y,"a",Cr) addRobot(x, y, "a", Cr)
elseif obj2 == true then elseif obj2 == true then
addRobot(x,y,"c",Cr) addRobot(x, y, "c", Cr)
end end
end end
end end
elseif sSide == "c" then elseif sSide == "c" then
local obj = isBrick(x,y+1) local obj = isBrick(x, y + 1)
tScreen[x][y].robot = "zz" tScreen[x][y].robot = "zz"
if not obj == true then if not obj == true then
addRobot(x,y+1,sSide,Cr) addRobot(x, y + 1, sSide, Cr)
else else
local obj2 = isBrick(x-1,y) local obj2 = isBrick(x - 1, y)
local obj3 = isBrick(x+1,y) local obj3 = isBrick(x + 1, y)
if not obj2 == true and not obj3 == true then if not obj2 == true and not obj3 == true then
if Cr == "a" then if Cr == "a" then
addRobot(x,y,"b",Cr) addRobot(x, y, "b", Cr)
elseif Cr == "b" then elseif Cr == "b" then
addRobot(x,y,"d",Cr) addRobot(x, y, "d", Cr)
end end
elseif obj == true and obj2 == true and obj3 == true then elseif obj == true and obj2 == true and obj3 == true then
addRobot(x,y,"a",Cr) addRobot(x, y, "a", Cr)
else else
if obj3 == true then if obj3 == true then
addRobot(x,y,"d",Cr) addRobot(x, y, "d", Cr)
elseif obj2 == true then elseif obj2 == true then
addRobot(x,y,"b",Cr) addRobot(x, y, "b", Cr)
end end
end end
end end
elseif sSide == "d" then elseif sSide == "d" then
local obj = isBrick(x-1,y) local obj = isBrick(x - 1, y)
tScreen[x][y].robot = "zz" tScreen[x][y].robot = "zz"
if not obj == true then if not obj == true then
addRobot(x-1,y,sSide,Cr) addRobot(x - 1, y, sSide, Cr)
else else
local obj2 = isBrick(x,y-1) local obj2 = isBrick(x, y - 1)
local obj3 = isBrick(x,y+1) local obj3 = isBrick(x, y + 1)
if not obj2 == true and not obj3 == true then if not obj2 == true and not obj3 == true then
if Cr == "a" then if Cr == "a" then
addRobot(x,y,"c",Cr) addRobot(x, y, "c", Cr)
elseif Cr == "b" then elseif Cr == "b" then
addRobot(x,y,"a",Cr) addRobot(x, y, "a", Cr)
end end
elseif obj == true and obj2 == true and obj3 == true then elseif obj == true and obj2 == true and obj3 == true then
addRobot(x,y,"b",Cr) addRobot(x, y, "b", Cr)
else else
if obj3 == true then if obj3 == true then
addRobot(x,y,"a",Cr) addRobot(x, y, "a", Cr)
elseif obj2 == true then elseif obj2 == true then
addRobot(x,y,"c",Cr) addRobot(x, y, "c", Cr)
end end
end end
end end
else else
addRobot(x,y,sSide,"g") addRobot(x, y, sSide, "g")
end end
end end
end end
@ -515,15 +514,15 @@ end
function InterFace.drawBar() function InterFace.drawBar()
term.setBackgroundColor( colors.black ) term.setBackgroundColor( colors.black )
term.setTextColor( InterFace.cTitle ) term.setTextColor( InterFace.cTitle )
printCentred( 1, " "..sLevelTitle.." " ) printCentred( 1, " " .. sLevelTitle .. " " )
term.setCursorPos(1,1) term.setCursorPos(1, 1)
term.setBackgroundColor( cW ) term.setBackgroundColor( cW )
write( " " ) write( " " )
term.setBackgroundColor( colors.black ) term.setBackgroundColor( colors.black )
write( " x "..tostring(Blocks).." " ) write( " x " .. tostring(Blocks) .. " " )
term.setCursorPos( TermW-8,TermH ) term.setCursorPos( TermW - 8, TermH )
term.setBackgroundColor( colors.black ) term.setBackgroundColor( colors.black )
term.setTextColour(InterFace.cSpeedD) term.setTextColour(InterFace.cSpeedD)
write(" <<" ) write(" <<" )
@ -540,7 +539,7 @@ function InterFace.drawBar()
end end
write(" >>") write(" >>")
term.setCursorPos( TermW-1, 1 ) term.setCursorPos( TermW - 1, 1 )
term.setBackgroundColor( colors.black ) term.setBackgroundColor( colors.black )
term.setTextColour( InterFace.cExit ) term.setTextColour( InterFace.cExit )
write(" X") write(" X")
@ -548,35 +547,35 @@ function InterFace.drawBar()
end end
function InterFace.render() function InterFace.render()
local id,p1,p2,p3 = os.pullEvent() local id, p1, p2, p3 = os.pullEvent()
if id == "mouse_click" then if id == "mouse_click" then
if p3 == 1 and p2 == TermW then if p3 == 1 and p2 == TermW then
return "end" return "end"
elseif p3 == TermH and p2 >= TermW-7 and p2 <= TermW-6 then elseif p3 == TermH and p2 >= TermW - 7 and p2 <= TermW - 6 then
return "retry" return "retry"
elseif p3 == TermH and p2 >= TermW-4 and p2 <= TermW-3 then elseif p3 == TermH and p2 >= TermW - 4 and p2 <= TermW - 3 then
bPaused = not bPaused bPaused = not bPaused
fSpeedS = false fSpeedS = false
Speed = (bPaused and 0) or nSpeed Speed = bPaused and 0 or nSpeed
if Speed > 0 then if Speed > 0 then
Tick = os.startTimer(Speed) Tick = os.startTimer(Speed)
else else
Tick = nil Tick = nil
end end
InterFace.drawBar() InterFace.drawBar()
elseif p3 == TermH and p2 >= TermW-1 then elseif p3 == TermH and p2 >= TermW - 1 then
bPaused = false bPaused = false
fSpeedS = not fSpeedS fSpeedS = not fSpeedS
Speed = (fSpeedS and fSpeed) or nSpeed Speed = fSpeedS and fSpeed or nSpeed
Tick = os.startTimer(Speed) Tick = os.startTimer(Speed)
InterFace.drawBar() InterFace.drawBar()
elseif p3-1 < YOrgin+SizeH+1 and p3-1 > YOrgin and elseif p3 - 1 < YOrgin + SizeH + 1 and p3 - 1 > YOrgin and
p2 < XOrgin+SizeW+1 and p2 > XOrgin then p2 < XOrgin + SizeW + 1 and p2 > XOrgin then
local eobj = tScreen[p2-XOrgin][p3-YOrgin-1] local eobj = tScreen[p2 - XOrgin][p3 - YOrgin - 1]
local erobj = tostring(tScreen[p2-XOrgin][p3-YOrgin-1].robot) local erobj = tostring(tScreen[p2 - XOrgin][p3 - YOrgin - 1].robot)
if (erobj == "zz" or erobj == "nil") and not eobj.wall == true and not eobj.space == true and Blocks > 0 then if (erobj == "zz" or erobj == "nil") and not eobj.wall == true and not eobj.space == true and Blocks > 0 then
addWall(p2-XOrgin,p3-YOrgin-1) addWall(p2 - XOrgin, p3 - YOrgin - 1)
Blocks = Blocks-1 Blocks = Blocks - 1
InterFace.drawBar() InterFace.drawBar()
drawMap() drawMap()
end end
@ -596,7 +595,6 @@ local function startG(LevelN)
drawStars() drawStars()
loadLevel(LevelN) loadLevel(LevelN)
centerOrgin() centerOrgin()
local create = true
drawMap() drawMap()
InterFace.drawBar() InterFace.drawBar()
gRender("start") gRender("start")
@ -637,17 +635,17 @@ if ok and not sStartLevel then
term.clear() term.clear()
drawStars() drawStars()
term.setTextColor( colors.red ) term.setTextColor( colors.red )
printCentred( TermH/2 - 1, " REDIRECTION " ) printCentred( TermH / 2 - 1, " REDIRECTION " )
printCentred( TermH/2 - 0, " ComputerCraft Edition " ) printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
term.setTextColor( colors.yellow ) term.setTextColor( colors.yellow )
printCentred( TermH/2 + 2, " Click to Begin " ) printCentred( TermH / 2 + 2, " Click to Begin " )
os.pullEvent( "mouse_click" ) os.pullEvent( "mouse_click" )
end ) end )
end end
--Game-- --Game--
if ok then if ok then
ok,err = pcall( function() ok, err = pcall( function()
local nLevel local nLevel
if sStartLevel then if sStartLevel then
nLevel = tonumber( sStartLevel ) nLevel = tonumber( sStartLevel )
@ -670,18 +668,18 @@ if ok then
drawStars() drawStars()
term.setTextColor( colors.red ) term.setTextColor( colors.red )
if TermW >= 40 then if TermW >= 40 then
printCentred( TermH/2 - 1, " Thank you for playing Redirection " ) printCentred( TermH / 2 - 1, " Thank you for playing Redirection " )
printCentred( TermH/2 - 0, " ComputerCraft Edition " ) printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
printCentred( TermH/2 + 2, " Check out the full game: " ) printCentred( TermH / 2 + 2, " Check out the full game: " )
term.setTextColor( colors.yellow ) term.setTextColor( colors.yellow )
printCentred( TermH/2 + 3, " http://www.redirectiongame.com " ) printCentred( TermH / 2 + 3, " http://www.redirectiongame.com " )
else else
printCentred( TermH/2 - 2, " Thank you for " ) printCentred( TermH / 2 - 2, " Thank you for " )
printCentred( TermH/2 - 1, " playing Redirection " ) printCentred( TermH / 2 - 1, " playing Redirection " )
printCentred( TermH/2 - 0, " ComputerCraft Edition " ) printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
printCentred( TermH/2 + 2, " Check out the full game: " ) printCentred( TermH / 2 + 2, " Check out the full game: " )
term.setTextColor( colors.yellow ) term.setTextColor( colors.yellow )
printCentred( TermH/2 + 3, " www.redirectiongame.com " ) printCentred( TermH / 2 + 3, " www.redirectiongame.com " )
end end
parallel.waitForAll( parallel.waitForAll(
function() sleep(2) end, function() sleep(2) end,
@ -691,7 +689,7 @@ if ok then
end end
--Clear and exit-- --Clear and exit--
term.setCursorPos(1,1) term.setCursorPos(1, 1)
term.setTextColor(colors.white) term.setTextColor(colors.white)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.clear() term.clear()

View File

@ -112,7 +112,7 @@ local items = {
desc = "A perfect handle for torches or a pickaxe.", desc = "A perfect handle for torches or a pickaxe.",
}, },
["a crafting table"] = { ["a crafting table"] = {
aliases = { "crafting table", "craft table", "work bench", "workbench", "crafting bench", "table", }, aliases = { "crafting table", "craft table", "work bench", "workbench", "crafting bench", "table" },
desc = "It's a crafting table. I shouldn't tell you this, but these don't actually do anything in this game, you can craft tools whenever you like.", desc = "It's a crafting table. I shouldn't tell you this, but these don't actually do anything in this game, you can craft tools whenever you like.",
}, },
["a furnace"] = { ["a furnace"] = {
@ -270,7 +270,7 @@ local tAnimals = {
} }
local tMonsters = { local tMonsters = {
"a creeper", "a skeleton", "a zombie", "a spider" "a creeper", "a skeleton", "a zombie", "a spider",
} }
local tRecipes = { local tRecipes = {
@ -309,8 +309,8 @@ local tGoWest = {
local nGoWest = 0 local nGoWest = 0
local bRunning = true local bRunning = true
local tMap = { { {}, }, } local tMap = { { {} } }
local x,y,z = 0,0,0 local x, y, z = 0, 0, 0
local inventory = { local inventory = {
["no tea"] = items["no tea"], ["no tea"] = items["no tea"],
} }
@ -338,11 +338,11 @@ local tDayCycle = {
} }
local function getTimeOfDay() local function getTimeOfDay()
return math.fmod( math.floor(nTurn/3), #tDayCycle ) + 1 return math.fmod( math.floor(nTurn / 3), #tDayCycle ) + 1
end end
local function isSunny() local function isSunny()
return (getTimeOfDay() < 10) return getTimeOfDay() < 10
end end
local function getRoom( x, y, z, dontCreate ) local function getRoom( x, y, z, dontCreate )
@ -364,21 +364,21 @@ local function getRoom( x, y, z, dontCreate )
room.trees = hasTrees( room.nBiome ) room.trees = hasTrees( room.nBiome )
-- Add animals -- Add animals
if math.random(1,3) == 1 then if math.random(1, 3) == 1 then
for n = 1,math.random(1,2) do for _ = 1, math.random(1, 2) do
local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ] local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ]
room.items[ sAnimal ] = items[ sAnimal ] room.items[ sAnimal ] = items[ sAnimal ]
end end
end end
-- Add surface ore -- Add surface ore
if math.random(1,5) == 1 or hasStone( room.nBiome ) then if math.random(1, 5) == 1 or hasStone( room.nBiome ) then
room.items[ "some stone" ] = items[ "some stone" ] room.items[ "some stone" ] = items[ "some stone" ]
end end
if math.random(1,8) == 1 then if math.random(1, 8) == 1 then
room.items[ "some coal" ] = items[ "some coal" ] room.items[ "some coal" ] = items[ "some coal" ]
end end
if math.random(1,8) == 1 and hasRivers( room.nBiome ) then if math.random(1, 8) == 1 and hasRivers( room.nBiome ) then
room.items[ "a river" ] = items[ "a river" ] room.items[ "a river" ] = items[ "a river" ]
end end
@ -389,7 +389,7 @@ local function getRoom( x, y, z, dontCreate )
["east"] = true, ["east"] = true,
["west"] = true, ["west"] = true,
} }
if math.random(1,8) == 1 then if math.random(1, 8) == 1 then
room.exits["down"] = true room.exits["down"] = true
room.items["a cave entrance"] = items["a cave entrance"] room.items["a cave entrance"] = items["a cave entrance"]
end end
@ -404,7 +404,7 @@ local function getRoom( x, y, z, dontCreate )
room.exits[sDir] = true room.exits[sDir] = true
end end
else else
if math.random(1,3) == 1 then if math.random(1, 3) == 1 then
room.exits[sDir] = true room.exits[sDir] = true
end end
end end
@ -431,13 +431,13 @@ local function getRoom( x, y, z, dontCreate )
-- Add ores -- Add ores
room.items[ "some stone" ] = items[ "some stone" ] room.items[ "some stone" ] = items[ "some stone" ]
if math.random(1,3) == 1 then if math.random(1, 3) == 1 then
room.items[ "some coal" ] = items[ "some coal" ] room.items[ "some coal" ] = items[ "some coal" ]
end end
if math.random(1,8) == 1 then if math.random(1, 8) == 1 then
room.items[ "some iron" ] = items[ "some iron" ] room.items[ "some iron" ] = items[ "some iron" ]
end end
if y == -3 and math.random(1,15) == 1 then if y == -3 and math.random(1, 15) == 1 then
room.items[ "some diamond" ] = items[ "some diamond" ] room.items[ "some diamond" ] = items[ "some diamond" ]
end end
@ -478,7 +478,7 @@ local function findItem( _tList, _sQuery )
return sItem return sItem
end end
if tItem.aliases ~= nil then if tItem.aliases ~= nil then
for n, sAlias in pairs( tItem.aliases ) do for _, sAlias in pairs( tItem.aliases ) do
if sAlias == _sQuery then if sAlias == _sQuery then
return sItem return sItem
end end
@ -613,7 +613,7 @@ local function doCommand( text )
end end
for sCommand, t in pairs( tMatches ) do for sCommand, t in pairs( tMatches ) do
for n, sMatch in pairs( t ) do for _, sMatch in pairs( t ) do
local tCaptures = { string.match( text, "^" .. sMatch .. "$" ) } local tCaptures = { string.match( text, "^" .. sMatch .. "$" ) }
if #tCaptures ~= 0 then if #tCaptures ~= 0 then
local fnCommand = commands[ sCommand ] local fnCommand = commands[ sCommand ]
@ -634,7 +634,7 @@ function commands.wait()
end end
function commands.look( _sTarget ) function commands.look( _sTarget )
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
if room.dark then if room.dark then
print( "It is pitch dark." ) print( "It is pitch dark." )
return return
@ -648,7 +648,7 @@ function commands.look( _sTarget )
else else
io.write( "You are underground. " ) io.write( "You are underground. " )
if next( room.exits ) ~= nil then if next( room.exits ) ~= nil then
print( "You can travel "..itemize( room.exits ).."." ) print( "You can travel " .. itemize( room.exits ) .. "." )
else else
print() print()
end end
@ -679,16 +679,16 @@ function commands.look( _sTarget )
end end
if tItem then if tItem then
print( tItem.desc or ("You see nothing special about "..sItem..".") ) print( tItem.desc or "You see nothing special about " .. sItem .. "." )
else else
print( "You don't see any ".._sTarget.." here." ) print( "You don't see any " .. _sTarget .. " here." )
end end
end end
end end
end end
function commands.go( _sDir ) function commands.go( _sDir )
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
if _sDir == nil then if _sDir == nil then
print( "Go where?" ) print( "Go where?" )
return return
@ -735,7 +735,7 @@ function commands.go( _sDir )
end end
function commands.dig( _sDir, _sTool ) function commands.dig( _sDir, _sTool )
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
if _sDir == nil then if _sDir == nil then
print( "Dig where?" ) print( "Dig where?" )
return return
@ -746,13 +746,13 @@ function commands.dig( _sDir, _sTool )
if _sTool ~= nil then if _sTool ~= nil then
sTool = findItem( inventory, _sTool ) sTool = findItem( inventory, _sTool )
if not sTool then if not sTool then
print( "You're not carrying a ".._sTool.."." ) print( "You're not carrying a " .. _sTool .. "." )
return return
end end
tTool = inventory[ sTool ] tTool = inventory[ sTool ]
end end
local bActuallyDigging = (room.exits[ _sDir ] ~= true) local bActuallyDigging = room.exits[ _sDir ] ~= true
if bActuallyDigging then if bActuallyDigging then
if sTool == nil or tTool.toolType ~= "pick" then if sTool == nil or tTool.toolType ~= "pick" then
print( "You need to use a pickaxe to dig through stone." ) print( "You need to use a pickaxe to dig through stone." )
@ -827,10 +827,10 @@ function commands.dig( _sDir, _sTool )
_sDir == "up" and y == 0 then _sDir == "up" and y == 0 then
inventory[ "some dirt" ] = items[ "some dirt" ] inventory[ "some dirt" ] = items[ "some dirt" ]
inventory[ "some stone" ] = items[ "some stone" ] inventory[ "some stone" ] = items[ "some stone" ]
print( "You dig ".._sDir.." using "..sTool.." and collect some dirt and stone." ) print( "You dig " .. _sDir .. " using " .. sTool .. " and collect some dirt and stone." )
else else
inventory[ "some stone" ] = items[ "some stone" ] inventory[ "some stone" ] = items[ "some stone" ]
print( "You dig ".._sDir.." using "..sTool.." and collect some stone." ) print( "You dig " .. _sDir .. " using " .. sTool .. " and collect some stone." )
end end
end end
@ -848,7 +848,7 @@ function commands.drop( _sItem )
return return
end end
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
local sItem = findItem( inventory, _sItem ) local sItem = findItem( inventory, _sItem )
if sItem then if sItem then
local tItem = inventory[ sItem ] local tItem = inventory[ sItem ]
@ -860,7 +860,7 @@ function commands.drop( _sItem )
print( "Dropped." ) print( "Dropped." )
end end
else else
print( "You don't have a ".._sItem.."." ) print( "You don't have a " .. _sItem .. "." )
end end
end end
@ -871,7 +871,7 @@ function commands.place( _sItem )
end end
if _sItem == "torch" or _sItem == "a torch" then if _sItem == "torch" or _sItem == "a torch" then
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
if inventory["some torches"] or inventory["a torch"] then if inventory["some torches"] or inventory["a torch"] then
inventory["a torch"] = nil inventory["a torch"] = nil
room.items["a torch"] = items["a torch"] room.items["a torch"] = items["a torch"]
@ -898,12 +898,12 @@ function commands.take( _sItem )
return return
end end
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
local sItem = findItem( room.items, _sItem ) local sItem = findItem( room.items, _sItem )
if sItem then if sItem then
local tItem = room.items[ sItem ] local tItem = room.items[ sItem ]
if tItem.heavy == true then if tItem.heavy == true then
print( "You can't carry "..sItem.."." ) print( "You can't carry " .. sItem .. "." )
elseif tItem.ore == true then elseif tItem.ore == true then
print( "You need to mine this ore." ) print( "You need to mine this ore." )
else else
@ -923,7 +923,7 @@ function commands.take( _sItem )
end end
end end
else else
print( "You don't see a ".._sItem.." here." ) print( "You don't see a " .. _sItem .. " here." )
end end
end end
@ -933,7 +933,7 @@ function commands.mine( _sItem, _sTool )
return return
end end
if _sTool == nil then if _sTool == nil then
print( "Mine ".._sItem.." with what?" ) print( "Mine " .. _sItem .. " with what?" )
return return
end end
commands.cbreak( _sItem, _sTool ) commands.cbreak( _sItem, _sTool )
@ -957,12 +957,12 @@ function commands.cbreak( _sItem, _sTool )
if _sTool ~= nil then if _sTool ~= nil then
sTool = findItem( inventory, _sTool ) sTool = findItem( inventory, _sTool )
if sTool == nil then if sTool == nil then
print( "You're not carrying a ".._sTool.."." ) print( "You're not carrying a " .. _sTool .. "." )
return return
end end
end end
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
if _sItem == "tree" or _sItem == "trees" or _sItem == "a tree" then if _sItem == "tree" or _sItem == "trees" or _sItem == "a tree" then
print( "The tree breaks into blocks of wood, which you pick up." ) print( "The tree breaks into blocks of wood, which you pick up." )
inventory[ "some wood" ] = items[ "some wood" ] inventory[ "some wood" ] = items[ "some wood" ]
@ -990,18 +990,18 @@ function commands.cbreak( _sItem, _sTool )
local tTool = inventory[ sTool ] local tTool = inventory[ sTool ]
if tTool.tool then if tTool.tool then
if tTool.toolLevel < tItem.toolLevel then if tTool.toolLevel < tItem.toolLevel then
print( sTool .." is not strong enough to break this ore." ) print( sTool .. " is not strong enough to break this ore." )
elseif tTool.toolType ~= tItem.toolType then elseif tTool.toolType ~= tItem.toolType then
print( "You need a different kind of tool to break this ore." ) print( "You need a different kind of tool to break this ore." )
else else
print( "The ore breaks, dropping "..sItem..", which you pick up." ) print( "The ore breaks, dropping " .. sItem .. ", which you pick up." )
inventory[ sItem ] = items[ sItem ] inventory[ sItem ] = items[ sItem ]
if tItem.infinite ~= true then if tItem.infinite ~= true then
room.items[ sItem ] = nil room.items[ sItem ] = nil
end end
end end
else else
print( "You can't break "..sItem.." with "..sTool..".") print( "You can't break " .. sItem .. " with " .. sTool .. ".")
end end
elseif tItem.creature == true then elseif tItem.creature == true then
@ -1018,12 +1018,12 @@ function commands.cbreak( _sItem, _sTool )
local tChances = { 0.2, 0.4, 0.55, 0.8, 1 } local tChances = { 0.2, 0.4, 0.55, 0.8, 1 }
if math.random() <= tChances[ toolLevel + 1 ] then if math.random() <= tChances[ toolLevel + 1 ] then
room.items[ sItem ] = nil room.items[ sItem ] = nil
print( "The "..tItem.aliases[1].." dies." ) print( "The " .. tItem.aliases[1] .. " dies." )
if tItem.drops then if tItem.drops then
for n, sDrop in pairs( tItem.drops ) do for _, sDrop in pairs( tItem.drops ) do
if not room.items[sDrop] then if not room.items[sDrop] then
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." ) print( "The " .. tItem.aliases[1] .. " dropped " .. sDrop .. "." )
room.items[sDrop] = items[sDrop] room.items[sDrop] = items[sDrop]
end end
end end
@ -1033,23 +1033,23 @@ function commands.cbreak( _sItem, _sTool )
room.nMonsters = room.nMonsters - 1 room.nMonsters = room.nMonsters - 1
end end
else else
print( "The "..tItem.aliases[1].." is injured by your blow." ) print( "The " .. tItem.aliases[1] .. " is injured by your blow." )
end end
if tItem.hitDrops then if tItem.hitDrops then
for n, sDrop in pairs( tItem.hitDrops ) do for _, sDrop in pairs( tItem.hitDrops ) do
if not room.items[sDrop] then if not room.items[sDrop] then
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." ) print( "The " .. tItem.aliases[1] .. " dropped " .. sDrop .. "." )
room.items[sDrop] = items[sDrop] room.items[sDrop] = items[sDrop]
end end
end end
end end
else else
print( "You can't break "..sItem.."." ) print( "You can't break " .. sItem .. "." )
end end
else else
print( "You don't see a ".._sItem.." here." ) print( "You don't see a " .. _sItem .. " here." )
end end
end end
@ -1071,18 +1071,17 @@ function commands.craft( _sItem )
return return
end end
local room = getRoom( x,y,z )
local sItem = findItem( items, _sItem ) local sItem = findItem( items, _sItem )
local tRecipe = (sItem and tRecipes[ sItem ]) or nil local tRecipe = sItem and tRecipes[ sItem ] or nil
if tRecipe then if tRecipe then
for n,sReq in ipairs( tRecipe ) do for _, sReq in ipairs( tRecipe ) do
if inventory[sReq] == nil then if inventory[sReq] == nil then
print( "You don't have the items you need to craft "..sItem.."." ) print( "You don't have the items you need to craft " .. sItem .. "." )
return return
end end
end end
for n,sReq in ipairs( tRecipe ) do for _, sReq in ipairs( tRecipe ) do
inventory[sReq] = nil inventory[sReq] = nil
end end
inventory[ sItem ] = items[ sItem ] inventory[ sItem ] = items[ sItem ]
@ -1091,7 +1090,7 @@ function commands.craft( _sItem )
end end
print( "Crafted." ) print( "Crafted." )
else else
print( "You don't know how to make "..(sItem or _sItem).."." ) print( "You don't know how to make " .. (sItem or _sItem) .. "." )
end end
end end
@ -1116,12 +1115,12 @@ function commands.build( _sThing, _sMaterial )
else else
sMaterial = findItem( inventory, _sMaterial ) sMaterial = findItem( inventory, _sMaterial )
if not sMaterial then if not sMaterial then
print( "You don't have any ".._sMaterial ) print( "You don't have any " .. _sMaterial )
return return
end end
if inventory[sMaterial].material ~= true then if inventory[sMaterial].material ~= true then
print( sMaterial.." is not a good building material." ) print( sMaterial .. " is not a good building material." )
return return
end end
end end
@ -1131,12 +1130,12 @@ function commands.build( _sThing, _sMaterial )
alias = string.match( _sThing, "a ([%a ]+)" ) alias = string.match( _sThing, "a ([%a ]+)" )
end end
local room = getRoom( x,y,z ) local room = getRoom( x, y, z )
inventory[sMaterial] = nil inventory[sMaterial] = nil
room.items[ _sThing ] = { room.items[ _sThing ] = {
heavy = true, heavy = true,
aliases = { alias }, aliases = { alias },
desc = "As you look at your creation (made from "..sMaterial.."), you feel a swelling sense of pride.", desc = "As you look at your creation (made from " .. sMaterial .. "), you feel a swelling sense of pride.",
} }
print( "Your construction is complete." ) print( "Your construction is complete." )
@ -1159,7 +1158,7 @@ function commands.eat( _sItem )
local sItem = findItem( inventory, _sItem ) local sItem = findItem( inventory, _sItem )
if not sItem then if not sItem then
print( "You don't have any ".._sItem.."." ) print( "You don't have any " .. _sItem .. "." )
return return
end end
@ -1173,7 +1172,7 @@ function commands.eat( _sItem )
bInjured = false bInjured = false
end end
else else
print( "You can't eat "..sItem.."." ) print( "You can't eat " .. sItem .. "." )
end end
end end
@ -1196,7 +1195,7 @@ function commands.badinput()
"That doesn't make any sense.", "That doesn't make any sense.",
"What?", "What?",
} }
print( tResponses[ math.random(1,#tResponses) ] ) print( tResponses[ math.random(1, #tResponses) ] )
end end
function commands.noinput() function commands.noinput()
@ -1207,32 +1206,32 @@ function commands.noinput()
"Don't be shy.", "Don't be shy.",
"Use your words.", "Use your words.",
} }
print( tResponses[ math.random(1,#tResponses) ] ) print( tResponses[ math.random(1, #tResponses) ] )
end end
local function simulate() local function simulate()
local bNewMonstersThisRoom = false local bNewMonstersThisRoom = false
-- Spawn monsters in nearby rooms -- Spawn monsters in nearby rooms
for sx = -2,2 do for sx = -2, 2 do
for sy = -1,1 do for sy = -1, 1 do
for sz = -2,2 do for sz = -2, 2 do
local h = y + sy local h = y + sy
if h >= -3 and h <= 0 then if h >= -3 and h <= 0 then
local room = getRoom( x + sx, h, z + sz ) local room = getRoom( x + sx, h, z + sz )
-- Spawn monsters -- Spawn monsters
if room.nMonsters < 2 and if room.nMonsters < 2 and
((h == 0 and not isSunny() and not room.items["a torch"]) or room.dark) and (h == 0 and not isSunny() and not room.items["a torch"] or room.dark) and
math.random(1,6) == 1 then math.random(1, 6) == 1 then
local sMonster = tMonsters[ math.random(1,#tMonsters) ] local sMonster = tMonsters[ math.random(1, #tMonsters) ]
if room.items[ sMonster ] == nil then if room.items[ sMonster ] == nil then
room.items[ sMonster ] = items[ sMonster ] room.items[ sMonster ] = items[ sMonster ]
room.nMonsters = room.nMonsters + 1 room.nMonsters = room.nMonsters + 1
if sx == 0 and sy == 0 and sz == 0 and not room.dark then if sx == 0 and sy == 0 and sz == 0 and not room.dark then
print( "From the shadows, "..sMonster.." appears." ) print( "From the shadows, " .. sMonster .. " appears." )
bNewMonstersThisRoom = true bNewMonstersThisRoom = true
end end
end end
@ -1240,11 +1239,11 @@ local function simulate()
-- Burn monsters -- Burn monsters
if h == 0 and isSunny() then if h == 0 and isSunny() then
for n,sMonster in ipairs( tMonsters ) do for _, sMonster in ipairs( tMonsters ) do
if room.items[sMonster] and items[sMonster].nocturnal then if room.items[sMonster] and items[sMonster].nocturnal then
room.items[sMonster] = nil room.items[sMonster] = nil
if sx == 0 and sy == 0 and sz == 0 and not room.dark then if sx == 0 and sy == 0 and sz == 0 and not room.dark then
print( "With the sun high in the sky, the "..items[sMonster].aliases[1].." bursts into flame and dies." ) print( "With the sun high in the sky, the " .. items[sMonster].aliases[1] .. " bursts into flame and dies." )
end end
room.nMonsters = room.nMonsters - 1 room.nMonsters = room.nMonsters - 1
end end
@ -1258,10 +1257,10 @@ local function simulate()
-- Make monsters attack -- Make monsters attack
local room = getRoom( x, y, z ) local room = getRoom( x, y, z )
if nTimeInRoom >= 2 and not bNewMonstersThisRoom then if nTimeInRoom >= 2 and not bNewMonstersThisRoom then
for n,sMonster in ipairs( tMonsters ) do for _, sMonster in ipairs( tMonsters ) do
if room.items[sMonster] then if room.items[sMonster] then
if math.random(1,4) == 1 and if math.random(1, 4) == 1 and
not (y == 0 and isSunny() and (sMonster == "a spider")) then not (y == 0 and isSunny() and sMonster == "a spider") then
if sMonster == "a creeper" then if sMonster == "a creeper" then
if room.dark then if room.dark then
print( "A creeper explodes." ) print( "A creeper explodes." )
@ -1272,9 +1271,9 @@ local function simulate()
room.nMonsters = room.nMonsters - 1 room.nMonsters = room.nMonsters - 1
else else
if room.dark then if room.dark then
print( "A "..items[sMonster].aliases[1].." attacks you." ) print( "A " .. items[sMonster].aliases[1] .. " attacks you." )
else else
print( "The "..items[sMonster].aliases[1].." attacks you." ) print( "The " .. items[sMonster].aliases[1] .. " attacks you." )
end end
end end

View File

@ -23,7 +23,7 @@ elseif sCommand == "play" or sCommand == nil then
if sName == nil then if sName == nil then
-- No disc specified, pick one at random -- No disc specified, pick one at random
local tNames = {} local tNames = {}
for n,sName in ipairs( peripheral.getNames() ) do for _, sName in ipairs( peripheral.getNames() ) do
if disk.isPresent( sName ) and disk.hasAudio( sName ) then if disk.isPresent( sName ) and disk.hasAudio( sName ) then
table.insert( tNames, sName ) table.insert( tNames, sName )
end end
@ -32,15 +32,15 @@ elseif sCommand == "play" or sCommand == nil then
print( "No Music Discs in attached disk drives" ) print( "No Music Discs in attached disk drives" )
return return
end end
sName = tNames[ math.random(1,#tNames) ] sName = tNames[ math.random(1, #tNames) ]
end end
-- Play the disc -- Play the disc
if disk.isPresent( sName ) and disk.hasAudio( sName ) then if disk.isPresent( sName ) and disk.hasAudio( sName ) then
print( "Playing "..disk.getAudioTitle( sName ) ) print( "Playing " .. disk.getAudioTitle( sName ) )
disk.playAudio( sName ) disk.playAudio( sName )
else else
print( "No Music Disc in disk drive: "..sName ) print( "No Music Disc in disk drive: " .. sName )
return return
end end

View File

@ -1,5 +1,5 @@
if term.isColour() then if term.isColour() then
term.setTextColour( 2^math.random(0,15) ) term.setTextColour( 2 ^ math.random(0, 15) )
end end
textutils.slowPrint( "Hello World!" ) textutils.slowPrint( "Hello World!" )
term.setTextColour( colours.white ) term.setTextColour( colours.white )

View File

@ -1,16 +1,14 @@
-- Display the start screen -- Display the start screen
local w,h = term.getSize() local w, h = term.getSize()
local titleColour, headingColour, textColour, wormColour, fruitColour local headingColour, textColour, wormColour, fruitColour
if term.isColour() then if term.isColour() then
titleColour = colours.red
headingColour = colours.yellow headingColour = colours.yellow
textColour = colours.white textColour = colours.white
wormColour = colours.green wormColour = colours.green
fruitColour = colours.red fruitColour = colours.red
else else
titleColour = colours.white
headingColour = colours.white headingColour = colours.white
textColour = colours.white textColour = colours.white
wormColour = colours.white wormColour = colours.white
@ -18,30 +16,28 @@ else
end end
local function printCentred( y, s ) local function printCentred( y, s )
local x = math.floor((w - string.len(s)) / 2) local x = math.floor((w - #s) / 2)
term.setCursorPos(x,y) term.setCursorPos(x, y)
--term.clearLine() --term.clearLine()
term.write( s ) term.write( s )
end end
local xVel,yVel = 1,0 local xVel, yVel = 1, 0
local xPos, yPos = math.floor(w/2), math.floor(h/2) local xPos, yPos = math.floor(w / 2), math.floor(h / 2)
local pxVel, pyVel = nil, nil local pxVel, pyVel = nil, nil
local nLength = 1
local nExtraLength = 6 local nExtraLength = 6
local bRunning = true local bRunning = true
local tailX,tailY = xPos,yPos local tailX, tailY = xPos, yPos
local nScore = 0 local nScore = 0
local nDifficulty = 2 local nDifficulty = 2
local nSpeed, nInterval local nSpeed, nInterval
-- Setup the screen -- Setup the screen
local screen = {} local screen = {}
for x=1,w do for x = 1, w do
screen[x] = {} screen[x] = {}
for y=1,h do for y = 1, h do
screen[x][y] = {} screen[x][y] = {}
end end
end end
@ -58,17 +54,17 @@ local tFruits = {
"q", "r", "s", "t", "u", "v", "w", "x", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z", "y", "z",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
"@", "$", "%", "#", "&", "!", "?", "+", "*", "~" "@", "$", "%", "#", "&", "!", "?", "+", "*", "~",
} }
local function addFruit() local function addFruit()
while true do while true do
local x = math.random(1,w) local x = math.random(1, w)
local y = math.random(2,h) local y = math.random(2, h)
local fruit = screen[x][y] local fruit = screen[x][y]
if fruit.snake == nil and fruit.wall == nil and fruit.fruit == nil then if fruit.snake == nil and fruit.wall == nil and fruit.fruit == nil then
screen[x][y] = { fruit = true } screen[x][y] = { fruit = true }
term.setCursorPos(x,y) term.setCursorPos(x, y)
term.setBackgroundColour( fruitColour ) term.setBackgroundColour( fruitColour )
term.write(" ") term.write(" ")
term.setBackgroundColour( colours.black ) term.setBackgroundColour( colours.black )
@ -84,26 +80,25 @@ end
local function drawMenu() local function drawMenu()
term.setTextColour( headingColour ) term.setTextColour( headingColour )
term.setCursorPos(1,1) term.setCursorPos(1, 1)
term.write( "SCORE " ) term.write( "SCORE " )
term.setTextColour( textColour ) term.setTextColour( textColour )
term.setCursorPos(7,1) term.setCursorPos(7, 1)
term.write( tostring(nScore) ) term.write( tostring(nScore) )
term.setTextColour( headingColour ) term.setTextColour( headingColour )
term.setCursorPos(w-11,1) term.setCursorPos(w - 11, 1)
term.write( "DIFFICULTY ") term.write( "DIFFICULTY ")
term.setTextColour( textColour ) term.setTextColour( textColour )
term.setCursorPos(w,1) term.setCursorPos(w, 1)
term.write( tostring(nDifficulty or "?") ) term.write( tostring(nDifficulty or "?") )
term.setTextColour( colours.white ) term.setTextColour( colours.white )
end end
local function update( ) local function update( )
local x,y = xPos,yPos
if pxVel and pyVel then if pxVel and pyVel then
xVel, yVel = pxVel, pyVel xVel, yVel = pxVel, pyVel
pxVel, pyVel = nil, nil pxVel, pyVel = nil, nil
@ -113,7 +108,7 @@ local function update( )
if nExtraLength == 0 then if nExtraLength == 0 then
local tail = screen[tailX][tailY] local tail = screen[tailX][tailY]
screen[tailX][tailY] = {} screen[tailX][tailY] = {}
term.setCursorPos(tailX,tailY) term.setCursorPos(tailX, tailY)
term.write(" ") term.write(" ")
tailX = tail.nextX tailX = tail.nextX
tailY = tail.nextY tailY = tail.nextY
@ -154,7 +149,7 @@ local function update( )
end end
term.setCursorPos(xPos,yPos) term.setCursorPos(xPos, yPos)
term.setBackgroundColour( wormColour ) term.setBackgroundColour( wormColour )
term.write(" ") term.write(" ")
term.setBackgroundColour( colours.black ) term.setBackgroundColour( colours.black )
@ -169,20 +164,20 @@ local function drawFrontend()
--printCentred( math.floor(h/2) - 4, " W O R M " ) --printCentred( math.floor(h/2) - 4, " W O R M " )
term.setTextColour( headingColour ) term.setTextColour( headingColour )
printCentred( math.floor(h/2) - 3, "" ) printCentred( math.floor(h / 2) - 3, "" )
printCentred( math.floor(h/2) - 2, " SELECT DIFFICULTY " ) printCentred( math.floor(h / 2) - 2, " SELECT DIFFICULTY " )
printCentred( math.floor(h/2) - 1, "" ) printCentred( math.floor(h / 2) - 1, "" )
printCentred( math.floor(h/2) + 0, " " ) printCentred( math.floor(h / 2) + 0, " " )
printCentred( math.floor(h/2) + 1, " " ) printCentred( math.floor(h / 2) + 1, " " )
printCentred( math.floor(h/2) + 2, " " ) printCentred( math.floor(h / 2) + 2, " " )
printCentred( math.floor(h/2) - 1 + nDifficulty, " [ ] " ) printCentred( math.floor(h / 2) - 1 + nDifficulty, " [ ] " )
term.setTextColour( textColour ) term.setTextColour( textColour )
printCentred( math.floor(h/2) + 0, "EASY" ) printCentred( math.floor(h / 2) + 0, "EASY" )
printCentred( math.floor(h/2) + 1, "MEDIUM" ) printCentred( math.floor(h / 2) + 1, "MEDIUM" )
printCentred( math.floor(h/2) + 2, "HARD" ) printCentred( math.floor(h / 2) + 2, "HARD" )
printCentred( math.floor(h/2) + 3, "" ) printCentred( math.floor(h / 2) + 3, "" )
term.setTextColour( colours.white ) term.setTextColour( colours.white )
end end
@ -190,7 +185,7 @@ end
drawMenu() drawMenu()
drawFrontend() drawFrontend()
while true do while true do
local e,key = os.pullEvent( "key" ) local _, key = os.pullEvent( "key" )
if key == keys.up or key == keys.w then if key == keys.up or key == keys.w then
-- Up -- Up
if nDifficulty > 1 then if nDifficulty > 1 then
@ -228,7 +223,7 @@ addFruit()
-- Play the game -- Play the game
local timer = os.startTimer(0) local timer = os.startTimer(0)
while bRunning do while bRunning do
local event, p1, p2 = os.pullEvent() local event, p1 = os.pullEvent()
if event == "timer" and p1 == timer then if event == "timer" and p1 == timer then
timer = os.startTimer(nInterval) timer = os.startTimer(nInterval)
update( false ) update( false )
@ -238,23 +233,23 @@ while bRunning do
if key == keys.up or key == keys.w then if key == keys.up or key == keys.w then
-- Up -- Up
if yVel == 0 then if yVel == 0 then
pxVel,pyVel = 0,-1 pxVel, pyVel = 0, -1
end end
elseif key == keys.down or key == keys.s then elseif key == keys.down or key == keys.s then
-- Down -- Down
if yVel == 0 then if yVel == 0 then
pxVel,pyVel = 0,1 pxVel, pyVel = 0, 1
end end
elseif key == keys.left or key == keys.a then elseif key == keys.left or key == keys.a then
-- Left -- Left
if xVel == 0 then if xVel == 0 then
pxVel,pyVel = -1,0 pxVel, pyVel = -1, 0
end end
elseif key == keys.right or key == keys.d then elseif key == keys.right or key == keys.d then
-- Right -- Right
if xVel == 0 then if xVel == 0 then
pxVel,pyVel = 1,0 pxVel, pyVel = 1, 0
end end
end end
@ -263,25 +258,25 @@ end
-- Display the gameover screen -- Display the gameover screen
term.setTextColour( headingColour ) term.setTextColour( headingColour )
printCentred( math.floor(h/2) - 2, " " ) printCentred( math.floor(h / 2) - 2, " " )
printCentred( math.floor(h/2) - 1, " G A M E O V E R " ) printCentred( math.floor(h / 2) - 1, " G A M E O V E R " )
term.setTextColour( textColour ) term.setTextColour( textColour )
printCentred( math.floor(h/2) + 0, " " ) printCentred( math.floor(h / 2) + 0, " " )
printCentred( math.floor(h/2) + 1, " FINAL SCORE "..nScore.." " ) printCentred( math.floor(h / 2) + 1, " FINAL SCORE " .. nScore .. " " )
printCentred( math.floor(h/2) + 2, " " ) printCentred( math.floor(h / 2) + 2, " " )
term.setTextColour( colours.white ) term.setTextColour( colours.white )
local timer = os.startTimer(2.5) local timer = os.startTimer(2.5)
repeat repeat
local e,p = os.pullEvent() local e, p = os.pullEvent()
if e == "timer" and p == timer then if e == "timer" and p == timer then
term.setTextColour( textColour ) term.setTextColour( textColour )
printCentred( math.floor(h/2) + 2, " PRESS ANY KEY " ) printCentred( math.floor(h / 2) + 2, " PRESS ANY KEY " )
printCentred( math.floor(h/2) + 3, " " ) printCentred( math.floor(h / 2) + 3, " " )
term.setTextColour( colours.white ) term.setTextColour( colours.white )
end end
until e == "char" until e == "char"
term.clear() term.clear()
term.setCursorPos(1,1) term.setCursorPos(1, 1)

View File

@ -28,7 +28,7 @@ elseif sCommand == "host" then
-- Find a modem -- Find a modem
local sModemSide = nil local sModemSide = nil
for n,sSide in ipairs( rs.getSides() ) do for _, sSide in ipairs( rs.getSides() ) do
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
sModemSide = sSide sModemSide = sSide
break break
@ -41,7 +41,7 @@ elseif sCommand == "host" then
end end
-- Determine position -- Determine position
local x,y,z local x, y, z
if #tArgs >= 4 then if #tArgs >= 4 then
-- Position is manually specified -- Position is manually specified
x = tonumber(tArgs[2]) x = tonumber(tArgs[2])
@ -51,10 +51,10 @@ elseif sCommand == "host" then
printUsage() printUsage()
return return
end end
print( "Position is "..x..","..y..","..z ) print( "Position is " .. x .. "," .. y .. "," .. z )
else else
-- Position is to be determined using locate -- Position is to be determined using locate
x,y,z = gps.locate( 2, true ) x, y, z = gps.locate( 2, true )
if x == nil then if x == nil then
print( "Run \"gps host <x> <y> <z>\" to set position manually" ) print( "Run \"gps host <x> <y> <z>\" to set position manually" )
return return
@ -63,7 +63,7 @@ elseif sCommand == "host" then
-- Open a channel -- Open a channel
local modem = peripheral.wrap( sModemSide ) local modem = peripheral.wrap( sModemSide )
print( "Opening channel on modem "..sModemSide ) print( "Opening channel on modem " .. sModemSide )
modem.open( gps.CHANNEL_GPS ) modem.open( gps.CHANNEL_GPS )
-- Serve requests indefinately -- Serve requests indefinately
@ -80,10 +80,10 @@ elseif sCommand == "host" then
-- Print the number of requests handled -- Print the number of requests handled
nServed = nServed + 1 nServed = nServed + 1
if nServed > 1 then if nServed > 1 then
local x,y = term.getCursorPos() local _, y = term.getCursorPos()
term.setCursorPos(1,y-1) term.setCursorPos(1, y - 1)
end end
print( nServed.." GPS requests served" ) print( nServed .. " GPS requests served" )
end end
end end
end end

View File

@ -14,7 +14,7 @@ if sTopic == "index" then
end end
local sFile = help.lookup( sTopic ) local sFile = help.lookup( sTopic )
local file = ((sFile ~= nil) and io.open( sFile )) or nil local file = sFile ~= nil and io.open( sFile ) or nil
if file then if file then
local sContents = file:read("*a") local sContents = file:read("*a")
file:close() file:close()

View File

@ -46,9 +46,9 @@ local function get(url)
write( "Connecting to pastebin.com... " ) write( "Connecting to pastebin.com... " )
-- Add a cache buster so that spam protection is re-checked -- Add a cache buster so that spam protection is re-checked
local cacheBuster = ("%x"):format(math.random(0, 2^30)) local cacheBuster = ("%x"):format(math.random(0, 2 ^ 30))
local response, err = http.get( local response, err = http.get(
"https://pastebin.com/raw/"..textutils.urlEncode( paste ).."?cb="..cacheBuster "https://pastebin.com/raw/" .. textutils.urlEncode( paste ) .. "?cb=" .. cacheBuster
) )
if response then if response then
@ -93,11 +93,11 @@ if sCommand == "put" then
local key = "0ec2eb25b6166c0c27a394ae118ad829" local key = "0ec2eb25b6166c0c27a394ae118ad829"
local response = http.post( local response = http.post(
"https://pastebin.com/api/api_post.php", "https://pastebin.com/api/api_post.php",
"api_option=paste&".. "api_option=paste&" ..
"api_dev_key="..key.."&".. "api_dev_key=" .. key .. "&" ..
"api_paste_format=lua&".. "api_paste_format=lua&" ..
"api_paste_name="..textutils.urlEncode(sName).."&".. "api_paste_name=" .. textutils.urlEncode(sName) .. "&" ..
"api_paste_code="..textutils.urlEncode(sText) "api_paste_code=" .. textutils.urlEncode(sText)
) )
if response then if response then
@ -107,8 +107,8 @@ if sCommand == "put" then
response.close() response.close()
local sCode = string.match( sResponse, "[^/]+$" ) local sCode = string.match( sResponse, "[^/]+$" )
print( "Uploaded as "..sResponse ) print( "Uploaded as " .. sResponse )
print( "Run \"pastebin get "..sCode.."\" to download anywhere" ) print( "Run \"pastebin get " .. sCode .. "\" to download anywhere" )
else else
print( "Failed." ) print( "Failed." )
@ -137,7 +137,7 @@ elseif sCommand == "get" then
file.write( res ) file.write( res )
file.close() file.close()
print( "Downloaded as "..sFile ) print( "Downloaded as " .. sFile )
end end
elseif sCommand == "run" then elseif sCommand == "run" then
local sCode = tArgs[2] local sCode = tArgs[2]

View File

@ -6,24 +6,24 @@ if #tArgs > 0 then
end end
if sDrive == nil then if sDrive == nil then
print( "This is computer #"..os.getComputerID() ) print( "This is computer #" .. os.getComputerID() )
local label = os.getComputerLabel() local label = os.getComputerLabel()
if label then if label then
print( "This computer is labelled \""..label.."\"" ) print( "This computer is labelled \"" .. label .. "\"" )
end end
else else
local bData = disk.hasData( sDrive ) local bData = disk.hasData( sDrive )
if not bData then if not bData then
print( "No disk in drive "..sDrive ) print( "No disk in drive " .. sDrive )
return return
end end
print( "The disk is #"..disk.getID( sDrive ) ) print( "The disk is #" .. disk.getID( sDrive ) )
local label = disk.getLabel( sDrive ) local label = disk.getLabel( sDrive )
if label then if label then
print( "The disk is labelled \""..label.."\"" ) print( "The disk is labelled \"" .. label .. "\"" )
end end
end end

View File

@ -14,11 +14,11 @@ local function checkDrive( sDrive )
-- Check the disk exists -- Check the disk exists
local bData = disk.hasData( sDrive ) local bData = disk.hasData( sDrive )
if not bData then if not bData then
print( "No disk in "..sDrive.." drive" ) print( "No disk in " .. sDrive .. " drive" )
return false return false
end end
else else
print( "No disk drive named "..sDrive ) print( "No disk drive named " .. sDrive )
return false return false
end end
return true return true
@ -29,7 +29,7 @@ local function get( sDrive )
if checkDrive( sDrive ) then if checkDrive( sDrive ) then
local sLabel = disk.getLabel( sDrive ) local sLabel = disk.getLabel( sDrive )
if sLabel then if sLabel then
print( "Disk label is \""..sLabel.."\"" ) print( "Disk label is \"" .. sLabel .. "\"" )
else else
print( "No Disk label" ) print( "No Disk label" )
end end
@ -37,7 +37,7 @@ local function get( sDrive )
else else
local sLabel = os.getComputerLabel() local sLabel = os.getComputerLabel()
if sLabel then if sLabel then
print( "Computer label is \""..sLabel.."\"" ) print( "Computer label is \"" .. sLabel .. "\"" )
else else
print( "No Computer label" ) print( "No Computer label" )
end end
@ -50,7 +50,7 @@ local function set( sDrive, sText )
disk.setLabel( sDrive, sText ) disk.setLabel( sDrive, sText )
local sLabel = disk.getLabel( sDrive ) local sLabel = disk.getLabel( sDrive )
if sLabel then if sLabel then
print( "Disk label set to \""..sLabel.."\"" ) print( "Disk label set to \"" .. sLabel .. "\"" )
else else
print( "Disk label cleared" ) print( "Disk label cleared" )
end end
@ -59,7 +59,7 @@ local function set( sDrive, sText )
os.setComputerLabel( sText ) os.setComputerLabel( sText )
local sLabel = os.getComputerLabel() local sLabel = os.getComputerLabel()
if sLabel then if sLabel then
print( "Computer label set to \""..sLabel.."\"" ) print( "Computer label set to \"" .. sLabel .. "\"" )
else else
print( "Computer label cleared" ) print( "Computer label cleared" )
end end

View File

@ -18,7 +18,7 @@ local tFiles = {}
local tDirs = {} local tDirs = {}
local bShowHidden = settings.get( "list.show_hidden" ) local bShowHidden = settings.get( "list.show_hidden" )
for n, sItem in pairs( tAll ) do for _, sItem in pairs( tAll ) do
if bShowHidden or string.sub( sItem, 1, 1 ) ~= "." then if bShowHidden or string.sub( sItem, 1, 1 ) ~= "." then
local sPath = fs.combine( sDir, sItem ) local sPath = fs.combine( sDir, sItem )
if fs.isDir( sPath ) then if fs.isDir( sPath ) then

View File

@ -67,7 +67,7 @@ while bRunning do
local nForcePrint = 0 local nForcePrint = 0
local func, e = load( s, "=lua", "t", tEnv ) local func, e = load( s, "=lua", "t", tEnv )
local func2, e2 = load( "return _echo("..s..");", "=lua", "t", tEnv ) local func2 = load( "return _echo(" .. s .. ");", "=lua", "t", tEnv )
if not func then if not func then
if func2 then if func2 then
func = func2 func = func2
@ -84,7 +84,7 @@ while bRunning do
local tResults = table.pack( pcall( func ) ) local tResults = table.pack( pcall( func ) )
if tResults[1] then if tResults[1] then
local n = 1 local n = 1
while n < tResults.n or (n <= nForcePrint) do while n < tResults.n or n <= nForcePrint do
local value = tResults[ n + 1 ] local value = tResults[ n + 1 ]
if type( value ) == "table" then if type( value ) == "table" then
local metatable = getmetatable( value ) local metatable = getmetatable( value )

View File

@ -8,9 +8,9 @@ end
for _, v in ipairs( tArgs ) do for _, v in ipairs( tArgs ) do
local sNewDir = shell.resolve( v ) local sNewDir = shell.resolve( v )
if fs.exists( sNewDir ) and not fs.isDir( sNewDir ) then if fs.exists( sNewDir ) and not fs.isDir( sNewDir ) then
printError( v..": Destination exists" ) printError( v .. ": Destination exists" )
elseif fs.isReadOnly( sNewDir ) then elseif fs.isReadOnly( sNewDir ) then
printError( v..": Access denied" ) printError( v .. ": Access denied" )
else else
fs.makeDir( sNewDir ) fs.makeDir( sNewDir )
end end

View File

@ -11,18 +11,18 @@ end
local sName = tArgs[1] local sName = tArgs[1]
if peripheral.getType( sName ) ~= "monitor" then if peripheral.getType( sName ) ~= "monitor" then
print( "No monitor named ".. sName ) print( "No monitor named " .. sName )
return return
end end
local sProgram = tArgs[2] local sProgram = tArgs[2]
local sPath = shell.resolveProgram( sProgram ) local sPath = shell.resolveProgram( sProgram )
if sPath == nil then if sPath == nil then
print( "No such program: "..sProgram ) print( "No such program: " .. sProgram )
return return
end end
print( "Running "..sProgram.." on monitor "..sName ) print( "Running " .. sProgram .. " on monitor " .. sName )
local monitor = peripheral.wrap( sName ) local monitor = peripheral.wrap( sName )
local previousTerm = term.redirect( monitor ) local previousTerm = term.redirect( monitor )

View File

@ -3,7 +3,7 @@ local tMotd = {}
for sPath in string.gmatch(settings.get( "motd.path" ), "[^:]+") do for sPath in string.gmatch(settings.get( "motd.path" ), "[^:]+") do
if fs.exists(sPath) then if fs.exists(sPath) then
for sLine in io.lines(sPath) do for sLine in io.lines(sPath) do
table.insert(tMotd,sLine) table.insert(tMotd, sLine)
end end
end end
end end
@ -11,5 +11,5 @@ end
if #tMotd == 0 then if #tMotd == 0 then
print("missingno") print("missingno")
else else
print(tMotd[math.random(1,#tMotd)]) print(tMotd[math.random(1, #tMotd)])
end end

View File

@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
local sDest = shell.resolve( tArgs[2] ) local sDest = shell.resolve( tArgs[2] )
local tFiles = fs.find( sSource ) local tFiles = fs.find( sSource )
if #tFiles > 0 then if #tFiles > 0 then
for n,sFile in ipairs( tFiles ) do for _, sFile in ipairs( tFiles ) do
if fs.isDir( sDest ) then if fs.isDir( sDest ) then
fs.move( sFile, fs.combine( sDest, fs.getName(sFile) ) ) fs.move( sFile, fs.combine( sDest, fs.getName(sFile) ) )
elseif #tFiles == 1 then elseif #tFiles == 1 then

View File

@ -1,7 +1,7 @@
local tPeripherals = peripheral.getNames() local tPeripherals = peripheral.getNames()
print( "Attached Peripherals:" ) print( "Attached Peripherals:" )
if #tPeripherals > 0 then if #tPeripherals > 0 then
for n=1,#tPeripherals do for n = 1, #tPeripherals do
local sPeripheral = tPeripherals[n] local sPeripheral = tPeripherals[n]
print( sPeripheral .. " (" .. peripheral.getType( sPeripheral ) .. ")" ) print( sPeripheral .. " (" .. peripheral.getType( sPeripheral ) .. ")" )
end end

View File

@ -4,178 +4,178 @@ This version written by Gopher, at the request of Dan200, for
ComputerCraft v1.6. No particular rights are reserved. ComputerCraft v1.6. No particular rights are reserved.
--]] --]]
local function colorass(c,bw) local function colorass(c, bw)
return term.isColor() and c or bw return term.isColor() and c or bw
end end
local block_s1= { local block_s1 = {
{ {
{ 1,0,0,0, }, { 1, 0, 0, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 0,1,1,0, }, { 0, 1, 1, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","{}"), ch = colorass(" ", "{}"),
fg=colorass(colors.blue,colors.black), fg = colorass(colors.blue, colors.black),
bg=colorass(colors.cyan,colors.white), bg = colorass(colors.cyan, colors.white),
} }
local block_s2= { local block_s2 = {
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 1,0,0,0, }, { 1, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,1,1,0, }, { 0, 1, 1, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","{}"), ch = colorass(" ", "{}"),
fg=colorass(colors.green,colors.black), fg = colorass(colors.green, colors.black),
bg=colorass(colors.lime,colors.white), bg = colorass(colors.lime, colors.white),
} }
local block_line = { local block_line = {
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
}, },
{ {
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 1,1,1,1, }, { 1, 1, 1, 1 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","[]"), ch = colorass(" ", "[]"),
fg=colorass(colors.pink,colors.black), fg = colorass(colors.pink, colors.black),
bg=colorass(colors.red,colors.white), bg = colorass(colors.red, colors.white),
} }
local block_square = { local block_square = {
{ {
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","[]"), ch = colorass(" ", "[]"),
fg=colorass(colors.lightBlue,colors.black), fg = colorass(colors.lightBlue, colors.black),
bg=colorass(colors.blue,colors.white), bg = colorass(colors.blue, colors.white),
} }
local block_L1 = { local block_L1 = {
{ {
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 1,1,1,0, }, { 1, 1, 1, 0 },
{ 1,0,0,0, }, { 1, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,1,0, }, { 0, 1, 1, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,0,1,0, }, { 0, 0, 1, 0 },
{ 1,1,1,0, }, { 1, 1, 1, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","()"), ch = colorass(" ", "()"),
fg=colorass(colors.orange,colors.black), fg = colorass(colors.orange, colors.black),
bg=colorass(colors.yellow,colors.white), bg = colorass(colors.yellow, colors.white),
} }
local block_L2 = { local block_L2 = {
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 1,1,1,0, }, { 1, 1, 1, 0 },
{ 0,0,1,0, }, { 0, 0, 1, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,1,1,0, }, { 0, 1, 1, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 1,0,0,0, }, { 1, 0, 0, 0 },
{ 1,1,1,0, }, { 1, 1, 1, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","()"), ch = colorass(" ", "()"),
fg=colorass(colors.brown,colors.black), fg = colorass(colors.brown, colors.black),
bg=colorass(colors.orange,colors.white), bg = colorass(colors.orange, colors.white),
} }
local block_T = { local block_T = {
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 1,1,0,0, }, { 1, 1, 0, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 1,1,1,0, }, { 1, 1, 1, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,1,1,0, }, { 0, 1, 1, 0 },
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
{ {
{ 0,1,0,0, }, { 0, 1, 0, 0 },
{ 1,1,1,0, }, { 1, 1, 1, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
{ 0,0,0,0, }, { 0, 0, 0, 0 },
}, },
ch=colorass(" ","<>"), ch = colorass(" ", "<>"),
fg=colorass(colors.cyan,colors.black), fg = colorass(colors.cyan, colors.black),
bg=colorass(colors.purple,colors.white), bg = colorass(colors.purple, colors.white),
} }
local blocks={ block_line, block_square, block_s1, block_s2, block_L1, block_L2, block_T} local blocks = { block_line, block_square, block_s1, block_s2, block_L1, block_L2, block_T}
local points={4,10,30,120} local points = {4, 10, 30, 120}
local function lpad(text,amt) local function lpad(text, amt)
text=tostring(text) text = tostring(text)
return string.rep(" ",amt-#text)..text return string.rep(" ", amt - #text) .. text
end end
local width,height=term.getSize() local width, height = term.getSize()
if height<19 or width<26 then if height < 19 or width < 26 then
print("Your screen is too small to play :(") print("Your screen is too small to play :(")
return return
end end
local speedsByLevel={ local speedsByLevel = {
1.2, 1.2,
1.0, 1.0,
.8, .8,
@ -187,23 +187,23 @@ local speedsByLevel={
.2, .2,
.15, .15,
.1, .1,
.05,} .05, }
local level=1 local level = 1
local function playGame() local function playGame()
local score=0 local score = 0
local lines=0 local lines = 0
local initialLevel=level local initialLevel = level
local next=blocks[math.random(1,#blocks)] local next = blocks[math.random(1, #blocks)]
local pit={} local pit = {}
local heightAdjust=0 local heightAdjust = 0
if height<=19 then if height <= 19 then
heightAdjust=1 heightAdjust = 1
end end
@ -215,56 +215,56 @@ local function playGame()
term.setTextColor(colors.black) term.setTextColor(colors.black)
term.setBackgroundColor(colorass(colors.lightGray, colors.white)) term.setBackgroundColor(colorass(colors.lightGray, colors.white))
term.setCursorPos(22,2) term.setCursorPos(22, 2)
term.write("Score") --score term.write("Score") --score
term.setCursorPos(22,5) term.setCursorPos(22, 5)
term.write("Level") --level term.write("Level") --level
term.setCursorPos(22,8) term.setCursorPos(22, 8)
term.write("Lines") --lines term.write("Lines") --lines
term.setCursorPos(22,12) term.setCursorPos(22, 12)
term.write("Next") --next term.write("Next") --next
term.setCursorPos(21,1) term.setCursorPos(21, 1)
term.write(" ") term.write(" ")
term.setCursorPos(21,2) term.setCursorPos(21, 2)
term.write(" ") --score term.write(" ") --score
term.setCursorPos(21,3) term.setCursorPos(21, 3)
term.write(" ") term.write(" ")
term.setCursorPos(21,4) term.setCursorPos(21, 4)
term.write(" ") term.write(" ")
term.setCursorPos(21,5) term.setCursorPos(21, 5)
term.write(" ") --level term.write(" ") --level
term.setCursorPos(21,6) term.setCursorPos(21, 6)
term.write(" ") term.write(" ")
term.setCursorPos(21,7) term.setCursorPos(21, 7)
term.write(" ") term.write(" ")
term.setCursorPos(21,8) term.setCursorPos(21, 8)
term.write(" ") --lines term.write(" ") --lines
term.setCursorPos(21,9) term.setCursorPos(21, 9)
term.write(" ") term.write(" ")
term.setCursorPos(21,10) term.setCursorPos(21, 10)
term.write(" ") term.write(" ")
term.setCursorPos(21,11) term.setCursorPos(21, 11)
term.write(" ") term.write(" ")
term.setCursorPos(21,12) term.setCursorPos(21, 12)
term.write(" ") --next term.write(" ") --next
term.setCursorPos(26,12) term.setCursorPos(26, 12)
term.write(" ") --next term.write(" ") --next
term.setCursorPos(21,13) term.setCursorPos(21, 13)
term.write(" ") term.write(" ")
term.setCursorPos(21,14) term.setCursorPos(21, 14)
term.write(" ") term.write(" ")
term.setCursorPos(21,15) term.setCursorPos(21, 15)
term.write(" ") term.write(" ")
term.setCursorPos(21,16) term.setCursorPos(21, 16)
term.write(" ") term.write(" ")
term.setCursorPos(21,17) term.setCursorPos(21, 17)
term.write(" ") term.write(" ")
term.setCursorPos(21,18) term.setCursorPos(21, 18)
term.write(" ") term.write(" ")
term.setCursorPos(21,19) term.setCursorPos(21, 19)
term.write(" ") term.write(" ")
term.setCursorPos(21,20) term.setCursorPos(21, 20)
term.write(" ") term.write(" ")
end end
@ -272,47 +272,47 @@ local function playGame()
term.setTextColor(colors.white) term.setTextColor(colors.white)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.setCursorPos(22,3) term.setCursorPos(22, 3)
term.write(lpad(score,5)) --score term.write(lpad(score, 5)) --score
term.setCursorPos(22,6) term.setCursorPos(22, 6)
term.write(lpad(level,5)) --level term.write(lpad(level, 5)) --level
term.setCursorPos(22,9) term.setCursorPos(22, 9)
term.write(lpad(lines,5)) --lines term.write(lpad(lines, 5)) --lines
end end
local function drawBlockAt(block,xp,yp,rot) local function drawBlockAt(block, xp, yp, rot)
term.setTextColor(block.fg) term.setTextColor(block.fg)
term.setBackgroundColor(block.bg) term.setBackgroundColor(block.bg)
for y=1,4 do for y = 1, 4 do
for x=1,4 do for x = 1, 4 do
if block[rot][y][x]==1 then if block[rot][y][x] == 1 then
term.setCursorPos((xp+x)*2-3,yp+y-1-heightAdjust) term.setCursorPos((xp + x) * 2 - 3, yp + y - 1 - heightAdjust)
term.write(block.ch) term.write(block.ch)
end end
end end
end end
end end
local function eraseBlockAt(block,xp,yp,rot) local function eraseBlockAt(block, xp, yp, rot)
term.setTextColor(colors.white) term.setTextColor(colors.white)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
for y=1,4 do for y = 1, 4 do
for x=1,4 do for x = 1, 4 do
if block[rot][y][x]==1 then if block[rot][y][x] == 1 then
term.setCursorPos((xp+x)*2-3,yp+y-1-heightAdjust) term.setCursorPos((xp + x) * 2 - 3, yp + y - 1 - heightAdjust)
term.write(" ") term.write(" ")
end end
end end
end end
end end
local function testBlockAt(block,xp,yp,rot) local function testBlockAt(block, xp, yp, rot)
for y=1,4 do for y = 1, 4 do
local ty=yp+y-1 local ty = yp + y - 1
for x=1,4 do for x = 1, 4 do
local tx=xp+x-1 local tx = xp + x - 1
if block[rot][y][x]==1 then if block[rot][y][x] == 1 then
if tx>10 or tx<1 or ty>20 or pit[ty][tx]~=0 then if tx > 10 or tx < 1 or ty > 20 or pit[ty][tx] ~= 0 then
return true return true
end end
end end
@ -320,11 +320,11 @@ local function playGame()
end end
end end
local function pitBlock(block,xp,yp,rot) local function pitBlock(block, xp, yp, rot)
for y=1,4 do for y = 1, 4 do
for x=1,4 do for x = 1, 4 do
if block[rot][y][x]==1 then if block[rot][y][x] == 1 then
pit[yp+y-1][xp+x-1]=block pit[yp + y - 1][xp + x - 1] = block
end end
end end
end end
@ -332,10 +332,10 @@ local function playGame()
local function clearPit() local function clearPit()
for row=1,20 do for row = 1, 20 do
pit[row]={} pit[row] = {}
for col=1,10 do for col = 1, 10 do
pit[row][col]=0 pit[row][col] = 0
end end
end end
end end
@ -350,24 +350,24 @@ local function playGame()
local halt=false local halt = false
local dropSpeed=speedsByLevel[math.min(level,12)] local dropSpeed = speedsByLevel[math.min(level, 12)]
local curBlock=next local curBlock = next
next=blocks[math.random(1,7)] next = blocks[math.random(1, 7)]
local curX, curY, curRot=4, 1, 1 local curX, curY, curRot = 4, 1, 1
local dropTimer=os.startTimer(dropSpeed) local dropTimer = os.startTimer(dropSpeed)
drawBlockAt(next,11.5,15+heightAdjust,1) drawBlockAt(next, 11.5, 15 + heightAdjust, 1)
drawBlockAt(curBlock,curX,curY,curRot) drawBlockAt(curBlock, curX, curY, curRot)
local function redrawPit() local function redrawPit()
for r=1+heightAdjust,20 do for r = 1 + heightAdjust, 20 do
term.setCursorPos(1,r-heightAdjust) term.setCursorPos(1, r - heightAdjust)
for c=1,10 do for c = 1, 10 do
if pit[r][c]==0 then if pit[r][c] == 0 then
term.setTextColor(colors.black) term.setTextColor(colors.black)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.write(" ") term.write(" ")
@ -381,8 +381,8 @@ local function playGame()
end end
local function hidePit() local function hidePit()
for r=1+heightAdjust,20 do for r = 1 + heightAdjust, 20 do
term.setCursorPos(1,r-heightAdjust) term.setCursorPos(1, r - heightAdjust)
term.setTextColor(colors.black) term.setTextColor(colors.black)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.write(" ") term.write(" ")
@ -390,56 +390,56 @@ local function playGame()
end end
local function msgBox(message) local function msgBox(message)
local x=math.floor((17-#message)/2) local x = math.floor((17 - #message) / 2)
term.setBackgroundColor(colorass(colors.lightGray,colors.white)) term.setBackgroundColor(colorass(colors.lightGray, colors.white))
term.setTextColor(colors.black) term.setTextColor(colors.black)
term.setCursorPos(x,9) term.setCursorPos(x, 9)
term.write("+"..string.rep("-",#message+2).."+") term.write("+" .. string.rep("-", #message + 2) .. "+")
term.setCursorPos(x,10) term.setCursorPos(x, 10)
term.write("|") term.write("|")
term.setCursorPos(x+#message+3,10) term.setCursorPos(x + #message + 3, 10)
term.write("|") term.write("|")
term.setCursorPos(x,11) term.setCursorPos(x, 11)
term.write("+"..string.rep("-",#message+2).."+") term.write("+" .. string.rep("-", #message + 2) .. "+")
term.setTextColor(colors.white) term.setTextColor(colors.white)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.setCursorPos(x+1,10) term.setCursorPos(x + 1, 10)
term.write(" "..message.." ") term.write(" " .. message .. " ")
end end
local function clearRows() local function clearRows()
local rows={} local rows = {}
for r=1,20 do for r = 1, 20 do
local count=0 local count = 0
for c=1,10 do for c = 1, 10 do
if pit[r][c]~=0 then if pit[r][c] ~= 0 then
count=count+1 count = count + 1
else else
break break
end end
end end
if count==10 then if count == 10 then
rows[#rows+1]=r rows[#rows + 1] = r
end end
end end
if #rows>0 then if #rows > 0 then
for i=1,4 do for _ = 1, 4 do
sleep(.1) sleep(.1)
for r=1,#rows do for r = 1, #rows do
r=rows[r] r = rows[r]
term.setCursorPos(1,r-heightAdjust) term.setCursorPos(1, r - heightAdjust)
for c=1,10 do for c = 1, 10 do
term.setTextColor(pit[r][c].bg) term.setTextColor(pit[r][c].bg)
term.setBackgroundColor(pit[r][c].fg) term.setBackgroundColor(pit[r][c].fg)
term.write(pit[r][c].ch) term.write(pit[r][c].ch)
end end
end end
sleep(.1) sleep(.1)
for r=1,#rows do for r = 1, #rows do
r=rows[r] r = rows[r]
term.setCursorPos(1,r-heightAdjust) term.setCursorPos(1, r - heightAdjust)
for c=1,10 do for c = 1, 10 do
term.setTextColor(pit[r][c].fg) term.setTextColor(pit[r][c].fg)
term.setBackgroundColor(pit[r][c].bg) term.setBackgroundColor(pit[r][c].bg)
term.write(pit[r][c].ch) term.write(pit[r][c].ch)
@ -448,155 +448,154 @@ local function playGame()
end end
--now remove the rows and drop everythign else --now remove the rows and drop everythign else
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
for r=1,#rows do for r = 1, #rows do
r=rows[r] r = rows[r]
term.setCursorPos(1,r-heightAdjust) term.setCursorPos(1, r - heightAdjust)
term.write(" ") term.write(" ")
end end
sleep(.25) sleep(.25)
for r=1,#rows do for r = 1, #rows do
table.remove(pit,rows[r]) table.remove(pit, rows[r])
table.insert(pit,1,{0,0,0,0,0,0,0,0,0,0}) table.insert(pit, 1, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
end end
redrawPit() redrawPit()
lines=lines+#rows lines = lines + #rows
score=score+points[#rows]*math.min(level,20) score = score + points[#rows] * math.min(level, 20)
level=math.floor(lines/10)+initialLevel level = math.floor(lines / 10) + initialLevel
dropSpeed=speedsByLevel[math.min(level,12)] dropSpeed = speedsByLevel[math.min(level, 12)]
updateNumbers() updateNumbers()
end end
sleep(.25) sleep(.25)
end end
local function blockFall() local function blockFall()
local result = false if testBlockAt(curBlock, curX, curY + 1, curRot) then
if testBlockAt(curBlock,curX,curY+1,curRot) then pitBlock(curBlock, curX, curY, curRot)
pitBlock(curBlock,curX,curY,curRot)
--detect rows that clear --detect rows that clear
clearRows() clearRows()
curBlock=next curBlock = next
curX=4 curX = 4
curY=1 curY = 1
curRot=1 curRot = 1
if testBlockAt(curBlock,curX,curY,curRot) then if testBlockAt(curBlock, curX, curY, curRot) then
halt=true halt = true
end end
drawBlockAt(curBlock,curX,curY,curRot) drawBlockAt(curBlock, curX, curY, curRot)
eraseBlockAt(next,11.5,15+heightAdjust,1) eraseBlockAt(next, 11.5, 15 + heightAdjust, 1)
next=blocks[math.random(1,7)] next = blocks[math.random(1, 7)]
drawBlockAt(next,11.5,15+heightAdjust,1) drawBlockAt(next, 11.5, 15 + heightAdjust, 1)
return true return true
else else
eraseBlockAt(curBlock,curX,curY,curRot) eraseBlockAt(curBlock, curX, curY, curRot)
curY=curY+1 curY = curY + 1
drawBlockAt(curBlock,curX,curY,curRot) drawBlockAt(curBlock, curX, curY, curRot)
return false return false
end end
end end
while not halt do while not halt do
local e={os.pullEvent()} local e = {os.pullEvent()}
if e[1]=="timer" then if e[1] == "timer" then
if e[2]==dropTimer then if e[2] == dropTimer then
blockFall() blockFall()
dropTimer=os.startTimer(dropSpeed) dropTimer = os.startTimer(dropSpeed)
end end
elseif e[1]=="key" then elseif e[1] == "key" then
local key=e[2] local key = e[2]
local dx,dy,dr=0,0,0 local dx, dy, dr = 0, 0, 0
if key==keys.left or key==keys.a then if key == keys.left or key == keys.a then
dx=-1 dx = -1
elseif key==keys.right or key==keys.d then elseif key == keys.right or key == keys.d then
dx=1 dx = 1
elseif key==keys.up or key==keys.w then elseif key == keys.up or key == keys.w then
dr=1 dr = 1
elseif key==keys.down or key==keys.s then elseif key == keys.down or key == keys.s then
while not blockFall() do end while not blockFall() do end
dropTimer=os.startTimer(dropSpeed) dropTimer = os.startTimer(dropSpeed)
elseif key==keys.space then elseif key == keys.space then
hidePit() hidePit()
msgBox("Paused") msgBox("Paused")
while ({os.pullEvent("key")})[2]~=keys.space do end while ({os.pullEvent("key")})[2] ~= keys.space do end
redrawPit() redrawPit()
drawBlockAt(curBlock,curX,curY,curRot) drawBlockAt(curBlock, curX, curY, curRot)
dropTimer=os.startTimer(dropSpeed) dropTimer = os.startTimer(dropSpeed)
end end
if dx+dr~=0 then if dx + dr ~= 0 then
if not testBlockAt(curBlock,curX+dx,curY+dy,(dr>0 and curRot%#curBlock+dr or curRot)) then if not testBlockAt(curBlock, curX + dx, curY + dy, dr > 0 and curRot % #curBlock + dr or curRot) then
eraseBlockAt(curBlock,curX,curY,curRot) eraseBlockAt(curBlock, curX, curY, curRot)
curX=curX+dx curX = curX + dx
curY=curY+dy curY = curY + dy
curRot=dr==0 and curRot or (curRot%#curBlock+dr) curRot = dr == 0 and curRot or curRot % #curBlock + dr
drawBlockAt(curBlock,curX,curY,curRot) drawBlockAt(curBlock, curX, curY, curRot)
end end
end end
elseif e[1]=="term_resize" then elseif e[1] == "term_resize" then
local w,h=term.getSize() local _, h = term.getSize()
if h==20 then if h == 20 then
heightAdjust=0 heightAdjust = 0
else else
heightAdjust=1 heightAdjust = 1
end end
redrawPit() redrawPit()
drawBlockAt(curBlock,curX,curY,curRot) drawBlockAt(curBlock, curX, curY, curRot)
end end
end end
msgBox("Game Over!") msgBox("Game Over!")
while true do while true do
local _,k=os.pullEvent("key") local _, k = os.pullEvent("key")
if k==keys.space or k==keys.enter then if k == keys.space or k == keys.enter then
break break
end end
end end
level = math.min(level,9) level = math.min(level, 9)
end end
local selected=1 local selected = 1
local playersDetected=false local playersDetected = false
local function drawMenu() local function drawMenu()
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.setTextColor(colorass(colors.red,colors.white)) term.setTextColor(colorass(colors.red, colors.white))
term.clear() term.clear()
local cx,cy=math.floor(width/2),math.floor(height/2) local cx, cy = math.floor(width / 2), math.floor(height / 2)
term.setCursorPos(cx-6,cy-2) term.setCursorPos(cx - 6, cy - 2)
term.write("F A L L I N G") term.write("F A L L I N G")
if playersDetected then if playersDetected then
if selected==0 then if selected == 0 then
term.setTextColor(colorass(colors.blue,colors.black)) term.setTextColor(colorass(colors.blue, colors.black))
term.setBackgroundColor(colorass(colors.gray,colors.white)) term.setBackgroundColor(colorass(colors.gray, colors.white))
else else
term.setTextColor(colorass(colors.lightBlue,colors.white)) term.setTextColor(colorass(colors.lightBlue, colors.white))
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
end end
term.setCursorPos(cx-12,cy) term.setCursorPos(cx - 12, cy)
term.write(" Play head-to-head game! ") term.write(" Play head-to-head game! ")
end end
term.setCursorPos(cx-10,cy+1) term.setCursorPos(cx - 10, cy + 1)
if selected==1 then if selected == 1 then
term.setTextColor(colorass(colors.blue,colors.black)) term.setTextColor(colorass(colors.blue, colors.black))
term.setBackgroundColor(colorass(colors.lightGray,colors.white)) term.setBackgroundColor(colorass(colors.lightGray, colors.white))
else else
term.setTextColor(colorass(colors.lightBlue,colors.white)) term.setTextColor(colorass(colors.lightBlue, colors.white))
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
end end
term.write(" Play from level: <" .. level .. "> ") term.write(" Play from level: <" .. level .. "> ")
term.setCursorPos(cx-3,cy+3) term.setCursorPos(cx - 3, cy + 3)
if selected==2 then if selected == 2 then
term.setTextColor(colorass(colors.blue,colors.black)) term.setTextColor(colorass(colors.blue, colors.black))
term.setBackgroundColor(colorass(colors.lightGray,colors.white)) term.setBackgroundColor(colorass(colors.lightGray, colors.white))
else else
term.setTextColor(colorass(colors.lightBlue,colors.white)) term.setTextColor(colorass(colors.lightBlue, colors.white))
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
end end
term.write(" Quit ") term.write(" Quit ")
@ -607,28 +606,28 @@ local function runMenu()
drawMenu() drawMenu()
while true do while true do
local event={os.pullEvent()} local event = {os.pullEvent()}
if event[1]=="key" then if event[1] == "key" then
local key=event[2] local key = event[2]
if key==keys.right or key==keys.d and selected==1 then if key == keys.right or key == keys.d and selected == 1 then
level=math.min(level+1,9) level = math.min(level + 1, 9)
drawMenu() drawMenu()
elseif key==keys.left or key==keys.a and selected==1 then elseif key == keys.left or key == keys.a and selected == 1 then
level=math.max(level-1,1) level = math.max(level - 1, 1)
drawMenu() drawMenu()
elseif key>=keys.one and key<=keys.nine and selected==1 then elseif key >= keys.one and key <= keys.nine and selected == 1 then
level=(key-keys.one) + 1 level = key - keys.one + 1
drawMenu() drawMenu()
elseif key==keys.up or key==keys.w then elseif key == keys.up or key == keys.w then
selected=selected-1 selected = selected - 1
if selected==0 then if selected == 0 then
selected=2 selected = 2
end end
drawMenu() drawMenu()
elseif key==keys.down or key==keys.s then elseif key == keys.down or key == keys.s then
selected=selected%2+1 selected = selected % 2 + 1
drawMenu() drawMenu()
elseif key==keys.enter or key==keys.space then elseif key == keys.enter or key == keys.space then
break --begin play! break --begin play!
end end
end end
@ -637,7 +636,7 @@ end
while true do while true do
runMenu() runMenu()
if selected==2 then if selected == 2 then
break break
end end
@ -648,4 +647,4 @@ end
term.setTextColor(colors.white) term.setTextColor(colors.white)
term.setBackgroundColor(colors.black) term.setBackgroundColor(colors.black)
term.clear() term.clear()
term.setCursorPos(1,1) term.setCursorPos(1, 1)

View File

@ -9,7 +9,7 @@ end
local sOpenedModem = nil local sOpenedModem = nil
local function openModem() local function openModem()
for n,sModem in ipairs( peripheral.getNames() ) do for _, sModem in ipairs( peripheral.getNames() ) do
if peripheral.getType( sModem ) == "modem" then if peripheral.getType( sModem ) == "modem" then
if not rednet.isOpen( sModem ) then if not rednet.isOpen( sModem ) then
rednet.open( sModem ) rednet.open( sModem )
@ -94,7 +94,7 @@ if sCommand == "host" then
end end
local function printUsers() local function printUsers()
local x,y = term.getCursorPos() local _, y = term.getCursorPos()
term.setCursorPos( 1, y - 1 ) term.setCursorPos( 1, y - 1 )
term.clearLine() term.clearLine()
if nUsers == 1 then if nUsers == 1 then
@ -108,13 +108,13 @@ if sCommand == "host" then
local ok, error = pcall( function() local ok, error = pcall( function()
parallel.waitForAny( function() parallel.waitForAny( function()
while true do while true do
local sEvent, timer = os.pullEvent( "timer" ) local _, timer = os.pullEvent( "timer" )
local nUserID = tPingPongTimer[ timer ] local nUserID = tPingPongTimer[ timer ]
if nUserID and tUsers[ nUserID ] then if nUserID and tUsers[ nUserID ] then
local tUser = tUsers[ nUserID ] local tUser = tUsers[ nUserID ]
if tUser then if tUser then
if not tUser.bPingPonged then if not tUser.bPingPonged then
send( "* "..tUser.sUsername.." has timed out" ) send( "* " .. tUser.sUsername .. " has timed out" )
tUsers[ nUserID ] = nil tUsers[ nUserID ] = nil
nUsers = nUsers - 1 nUsers = nUsers - 1
printUsers() printUsers()
@ -130,17 +130,17 @@ if sCommand == "host" then
local tCommands local tCommands
tCommands = { tCommands = {
["me"] = function( tUser, sContent ) ["me"] = function( tUser, sContent )
if string.len(sContent) > 0 then if #sContent > 0 then
send( "* "..tUser.sUsername.." "..sContent ) send( "* " .. tUser.sUsername .. " " .. sContent )
else else
send( "* Usage: /me [words]", tUser.nUserID ) send( "* Usage: /me [words]", tUser.nUserID )
end end
end, end,
["nick"] = function( tUser, sContent ) ["nick"] = function( tUser, sContent )
if string.len(sContent) > 0 then if #sContent > 0 then
local sOldName = tUser.sUsername local sOldName = tUser.sUsername
tUser.sUsername = sContent tUser.sUsername = sContent
send( "* "..sOldName.." is now known as "..tUser.sUsername ) send( "* " .. sOldName .. " is now known as " .. tUser.sUsername )
else else
send( "* Usage: /nick [nickname]", tUser.nUserID ) send( "* Usage: /nick [nickname]", tUser.nUserID )
end end
@ -148,7 +148,7 @@ if sCommand == "host" then
["users"] = function( tUser, sContent ) ["users"] = function( tUser, sContent )
send( "* Connected Users:", tUser.nUserID ) send( "* Connected Users:", tUser.nUserID )
local sUsers = "*" local sUsers = "*"
for nUserID, tUser in pairs( tUsers ) do for _, tUser in pairs( tUsers ) do
sUsers = sUsers .. " " .. tUser.sUsername sUsers = sUsers .. " " .. tUser.sUsername
end end
send( sUsers, tUser.nUserID ) send( sUsers, tUser.nUserID )
@ -156,10 +156,10 @@ if sCommand == "host" then
["help"] = function( tUser, sContent ) ["help"] = function( tUser, sContent )
send( "* Available commands:", tUser.nUserID ) send( "* Available commands:", tUser.nUserID )
local sCommands = "*" local sCommands = "*"
for sCommand, fnCommand in pairs( tCommands ) do for sCommand in pairs( tCommands ) do
sCommands = sCommands .. " /" .. sCommand sCommands = sCommands .. " /" .. sCommand
end end
send( sCommands.." /logout", tUser.nUserID ) send( sCommands .. " /logout", tUser.nUserID )
end, end,
} }
@ -177,7 +177,7 @@ if sCommand == "host" then
} }
nUsers = nUsers + 1 nUsers = nUsers + 1
printUsers() printUsers()
send( "* "..sUsername.." has joined the chat" ) send( "* " .. sUsername .. " has joined the chat" )
ping( nUserID ) ping( nUserID )
end end
@ -187,7 +187,7 @@ if sCommand == "host" then
local tUser = tUsers[ nUserID ] local tUser = tUsers[ nUserID ]
if tUser and tUser.nID == nSenderID then if tUser and tUser.nID == nSenderID then
if tMessage.sType == "logout" then if tMessage.sType == "logout" then
send( "* "..tUser.sUsername.." has left the chat" ) send( "* " .. tUser.sUsername .. " has left the chat" )
tUsers[ nUserID ] = nil tUsers[ nUserID ] = nil
nUsers = nUsers - 1 nUsers = nUsers - 1
printUsers() printUsers()
@ -199,13 +199,13 @@ if sCommand == "host" then
if sCommand then if sCommand then
local fnCommand = tCommands[ sCommand ] local fnCommand = tCommands[ sCommand ]
if fnCommand then if fnCommand then
local sContent = string.sub( sMessage, string.len(sCommand)+3 ) local sContent = string.sub( sMessage, #sCommand + 3 )
fnCommand( tUser, sContent ) fnCommand( tUser, sContent )
else else
send( "* Unrecognised command: /"..sCommand, tUser.nUserID ) send( "* Unrecognised command: /" .. sCommand, tUser.nUserID )
end end
else else
send( "<"..tUser.sUsername.."> "..tMessage.sText ) send( "<" .. tUser.sUsername .. "> " .. tMessage.sText )
end end
end end
@ -284,12 +284,12 @@ elseif sCommand == "join" then
end end
-- Handle messages -- Handle messages
local w,h = term.getSize() local w, h = term.getSize()
local parentTerm = term.current() local parentTerm = term.current()
local titleWindow = window.create( parentTerm, 1, 1, w, 1, true ) local titleWindow = window.create( parentTerm, 1, 1, w, 1, true )
local historyWindow = window.create( parentTerm, 1, 2, w, h-2, true ) local historyWindow = window.create( parentTerm, 1, 2, w, h - 2, true )
local promptWindow = window.create( parentTerm, 1, h, w, 1, true ) local promptWindow = window.create( parentTerm, 1, h, w, 1, true )
historyWindow.setCursorPos( 1, h-2 ) historyWindow.setCursorPos( 1, h - 2 )
term.clear() term.clear()
term.setTextColour( textColour ) term.setTextColour( textColour )
@ -297,11 +297,10 @@ elseif sCommand == "join" then
promptWindow.restoreCursor() promptWindow.restoreCursor()
local function drawTitle() local function drawTitle()
local x,y = titleWindow.getCursorPos() local w = titleWindow.getSize()
local w,h = titleWindow.getSize() local sTitle = sUsername .. " on " .. sHostname
local sTitle = sUsername.." on "..sHostname
titleWindow.setTextColour( highlightColour ) titleWindow.setTextColour( highlightColour )
titleWindow.setCursorPos( math.floor( w/2 - string.len(sTitle)/2 ), 1 ) titleWindow.setCursorPos( math.floor( w / 2 - #sTitle / 2 ), 1 )
titleWindow.clearLine() titleWindow.clearLine()
titleWindow.write( sTitle ) titleWindow.write( sTitle )
promptWindow.restoreCursor() promptWindow.restoreCursor()
@ -322,7 +321,7 @@ elseif sCommand == "join" then
term.setTextColour( highlightColour ) term.setTextColour( highlightColour )
write( sUsernameBit ) write( sUsernameBit )
term.setTextColour( textColour ) term.setTextColour( textColour )
write( string.sub( sMessage, string.len( sUsernameBit ) + 1 ) ) write( string.sub( sMessage, #sUsernameBit + 1 ) )
else else
write( sMessage ) write( sMessage )
end end
@ -348,9 +347,9 @@ elseif sCommand == "join" then
end end
elseif sEvent == "term_resize" then elseif sEvent == "term_resize" then
local w,h = parentTerm.getSize() local w, h = parentTerm.getSize()
titleWindow.reposition( 1, 1, w, 1 ) titleWindow.reposition( 1, 1, w, 1 )
historyWindow.reposition( 1, 2, w, h-2 ) historyWindow.reposition( 1, 2, w, h - 2 )
promptWindow.reposition( 1, h, w, 1 ) promptWindow.reposition( 1, h, w, 1 )
end end
@ -385,7 +384,7 @@ elseif sCommand == "join" then
function() function()
local tSendHistory = {} local tSendHistory = {}
while true do while true do
promptWindow.setCursorPos( 1,1 ) promptWindow.setCursorPos( 1, 1 )
promptWindow.clearLine() promptWindow.clearLine()
promptWindow.setTextColor( highlightColour ) promptWindow.setTextColor( highlightColour )
promptWindow.write( ": ") promptWindow.write( ": ")
@ -410,7 +409,7 @@ elseif sCommand == "join" then
term.redirect( parentTerm ) term.redirect( parentTerm )
-- Print error notice -- Print error notice
local w,h = term.getSize() local _, h = term.getSize()
term.setCursorPos( 1, h ) term.setCursorPos( 1, h )
term.clearLine() term.clearLine()
term.setCursorBlink( false ) term.setCursorBlink( false )

View File

@ -1,7 +1,7 @@
-- Find modems -- Find modems
local tModems = {} local tModems = {}
for n,sModem in ipairs( peripheral.getNames() ) do for _, sModem in ipairs( peripheral.getNames() ) do
if peripheral.getType( sModem ) == "modem" then if peripheral.getType( sModem ) == "modem" then
table.insert( tModems, sModem ) table.insert( tModems, sModem )
end end
@ -16,14 +16,14 @@ else
end end
local function open( nChannel ) local function open( nChannel )
for n=1,#tModems do for n = 1, #tModems do
local sModem = tModems[n] local sModem = tModems[n]
peripheral.call( sModem, "open", nChannel ) peripheral.call( sModem, "open", nChannel )
end end
end end
local function close( nChannel ) local function close( nChannel )
for n=1,#tModems do for n = 1, #tModems do
local sModem = tModems[n] local sModem = tModems[n]
peripheral.call( sModem, "close", nChannel ) peripheral.call( sModem, "close", nChannel )
end end
@ -51,7 +51,7 @@ local ok, error = pcall( function()
tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = tMessage.nMessageID tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = tMessage.nMessageID
-- Send on all other open modems, to the target and to other repeaters -- Send on all other open modems, to the target and to other repeaters
for n=1,#tModems do for n = 1, #tModems do
local sOtherModem = tModems[n] local sOtherModem = tModems[n]
peripheral.call( sOtherModem, "transmit", rednet.CHANNEL_REPEAT, nReplyChannel, tMessage ) peripheral.call( sOtherModem, "transmit", rednet.CHANNEL_REPEAT, nReplyChannel, tMessage )
peripheral.call( sOtherModem, "transmit", tMessage.nRecipient, nReplyChannel, tMessage ) peripheral.call( sOtherModem, "transmit", tMessage.nRecipient, nReplyChannel, tMessage )
@ -59,7 +59,7 @@ local ok, error = pcall( function()
-- Log the event -- Log the event
nTransmittedMessages = nTransmittedMessages + 1 nTransmittedMessages = nTransmittedMessages + 1
local x,y = term.getCursorPos() local _, y = term.getCursorPos()
term.setCursorPos( 1, y - 1 ) term.setCursorPos( 1, y - 1 )
term.clearLine() term.clearLine()
if nTransmittedMessages == 1 then if nTransmittedMessages == 1 then

View File

@ -17,7 +17,7 @@ if sCommand == "probe" then
local count = 0 local count = 0
local bundledCount = 0 local bundledCount = 0
for n,sSide in ipairs( redstone.getSides() ) do for _, sSide in ipairs( redstone.getSides() ) do
if redstone.getBundledInput( sSide ) > 0 then if redstone.getBundledInput( sSide ) > 0 then
bundledCount = bundledCount + 1 bundledCount = bundledCount + 1
end end
@ -39,12 +39,12 @@ if sCommand == "probe" then
if bundledCount > 0 then if bundledCount > 0 then
print() print()
print( "Bundled inputs:" ) print( "Bundled inputs:" )
for i,sSide in ipairs( redstone.getSides() ) do for _, sSide in ipairs( redstone.getSides() ) do
local nInput = redstone.getBundledInput( sSide ) local nInput = redstone.getBundledInput( sSide )
if nInput ~= 0 then if nInput ~= 0 then
write( sSide..": " ) write( sSide .. ": " )
local count = 0 local count = 0
for sColour,nColour in pairs( colors ) do for sColour, nColour in pairs( colors ) do
if type( nColour ) == "number" and colors.test( nInput, nColour ) then if type( nColour ) == "number" and colors.test( nInput, nColour ) then
if count > 0 then if count > 0 then
write( ", " ) write( ", " )
@ -69,7 +69,7 @@ elseif sCommand == "pulse" then
local sSide = tArgs[2] local sSide = tArgs[2]
local nCount = tonumber( tArgs[3] ) or 1 local nCount = tonumber( tArgs[3] ) or 1
local nPeriod = tonumber( tArgs[4] ) or 0.5 local nPeriod = tonumber( tArgs[4] ) or 0.5
for n=1,nCount do for _ = 1, nCount do
redstone.setOutput( sSide, true ) redstone.setOutput( sSide, true )
sleep( nPeriod / 2 ) sleep( nPeriod / 2 )
redstone.setOutput( sSide, false ) redstone.setOutput( sSide, false )

View File

@ -2,12 +2,12 @@
local tArgs = { ... } local tArgs = { ... }
if #tArgs == 0 then if #tArgs == 0 then
-- "set" -- "set"
local x,y = term.getCursorPos() local _, y = term.getCursorPos()
local tSettings = {} local tSettings = {}
for n,sName in ipairs( settings.getNames() ) do for n, sName in ipairs( settings.getNames() ) do
tSettings[n] = textutils.serialize(sName) .. " is " .. textutils.serialize(settings.get(sName)) tSettings[n] = textutils.serialize(sName) .. " is " .. textutils.serialize(settings.get(sName))
end end
textutils.pagedPrint(table.concat(tSettings,"\n"),y-3) textutils.pagedPrint(table.concat(tSettings, "\n"), y - 3)
elseif #tArgs == 1 then elseif #tArgs == 1 then
-- "set foo" -- "set foo"

View File

@ -9,10 +9,10 @@ if multishell then
end end
local bExit = false local bExit = false
local sDir = (parentShell and parentShell.dir()) or "" local sDir = parentShell and parentShell.dir() or ""
local sPath = (parentShell and parentShell.path()) or ".:/rom/programs" local sPath = parentShell and parentShell.path() or ".:/rom/programs"
local tAliases = (parentShell and parentShell.aliases()) or {} local tAliases = parentShell and parentShell.aliases() or {}
local tCompletionInfo = (parentShell and parentShell.getCompletionInfo()) or {} local tCompletionInfo = parentShell and parentShell.getCompletionInfo() or {}
local tProgramStack = {} local tProgramStack = {}
local shell = {} local shell = {}
@ -33,9 +33,9 @@ local function createShellEnv( sDir )
} }
package.path = "?;?.lua;?/init.lua;/rom/modules/main/?;/rom/modules/main/?.lua;/rom/modules/main/?/init.lua" package.path = "?;?.lua;?/init.lua;/rom/modules/main/?;/rom/modules/main/?.lua;/rom/modules/main/?/init.lua"
if turtle then if turtle then
package.path = package.path..";/rom/modules/turtle/?;/rom/modules/turtle/?.lua;/rom/modules/turtle/?/init.lua" package.path = package.path .. ";/rom/modules/turtle/?;/rom/modules/turtle/?.lua;/rom/modules/turtle/?/init.lua"
elseif command then elseif command then
package.path = package.path..";/rom/modules/command/?;/rom/modules/command/?.lua;/rom/modules/command/?/init.lua" package.path = package.path .. ";/rom/modules/command/?;/rom/modules/command/?.lua;/rom/modules/command/?/init.lua"
end end
package.config = "/\n;\n?\n!\n-" package.config = "/\n;\n?\n!\n-"
package.preload = {} package.preload = {}
@ -52,7 +52,7 @@ local function createShellEnv( sDir )
local sError = "" local sError = ""
for pattern in string.gmatch(package.path, "[^;]+") do for pattern in string.gmatch(package.path, "[^;]+") do
local sPath = string.gsub(pattern, "%?", fname) local sPath = string.gsub(pattern, "%?", fname)
if sPath:sub(1,1) ~= "/" then if sPath:sub(1, 1) ~= "/" then
sPath = fs.combine(sDir, sPath) sPath = fs.combine(sDir, sPath)
end end
if fs.exists(sPath) and not fs.isDir(sPath) then if fs.exists(sPath) and not fs.isDir(sPath) then
@ -70,7 +70,7 @@ local function createShellEnv( sDir )
end end
end end
return nil, sError return nil, sError
end end,
} }
local sentinel = {} local sentinel = {}
@ -125,7 +125,7 @@ local function run( _sCommand, ... )
if multishell then if multishell then
local sTitle = fs.getName( sPath ) local sTitle = fs.getName( sPath )
if sTitle:sub(-4) == ".lua" then if sTitle:sub(-4) == ".lua" then
sTitle = sTitle:sub(1,-5) sTitle = sTitle:sub(1, -5)
end end
multishell.setTitle( multishell.getCurrent(), sTitle ) multishell.setTitle( multishell.getCurrent(), sTitle )
end end
@ -140,7 +140,7 @@ local function run( _sCommand, ... )
if #tProgramStack > 0 then if #tProgramStack > 0 then
local sTitle = fs.getName( tProgramStack[#tProgramStack] ) local sTitle = fs.getName( tProgramStack[#tProgramStack] )
if sTitle:sub(-4) == ".lua" then if sTitle:sub(-4) == ".lua" then
sTitle = sTitle:sub(1,-5) sTitle = sTitle:sub(1, -5)
end end
multishell.setTitle( multishell.getCurrent(), sTitle ) multishell.setTitle( multishell.getCurrent(), sTitle )
else else
@ -272,12 +272,12 @@ function shell.programs( _bIncludeHidden )
sPath = shell.resolve( sPath ) sPath = shell.resolve( sPath )
if fs.isDir( sPath ) then if fs.isDir( sPath ) then
local tList = fs.list( sPath ) local tList = fs.list( sPath )
for n=1,#tList do for n = 1, #tList do
local sFile = tList[n] local sFile = tList[n]
if not fs.isDir( fs.combine( sPath, sFile ) ) and if not fs.isDir( fs.combine( sPath, sFile ) ) and
(_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then (_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then
if #sFile > 4 and sFile:sub(-4) == ".lua" then if #sFile > 4 and sFile:sub(-4) == ".lua" then
sFile = sFile:sub(1,-5) sFile = sFile:sub(1, -5)
end end
tItems[ sFile ] = true tItems[ sFile ] = true
end end
@ -287,7 +287,7 @@ function shell.programs( _bIncludeHidden )
-- Sort and return -- Sort and return
local tItemList = {} local tItemList = {}
for sItem, b in pairs( tItems ) do for sItem in pairs( tItems ) do
table.insert( tItemList, sItem ) table.insert( tItemList, sItem )
end end
table.sort( tItemList ) table.sort( tItemList )
@ -304,7 +304,7 @@ local function completeProgram( sLine )
local tSeen = {} local tSeen = {}
-- Add aliases -- Add aliases
for sAlias, sCommand in pairs( tAliases ) do for sAlias in pairs( tAliases ) do
if #sAlias > #sLine and string.sub( sAlias, 1, #sLine ) == sLine then if #sAlias > #sLine and string.sub( sAlias, 1, #sLine ) == sLine then
local sResult = string.sub( sAlias, #sLine + 1 ) local sResult = string.sub( sAlias, #sLine + 1 )
if not tSeen[ sResult ] then if not tSeen[ sResult ] then
@ -326,7 +326,7 @@ local function completeProgram( sLine )
-- Add programs from the path -- Add programs from the path
local tPrograms = shell.programs() local tPrograms = shell.programs()
for n=1,#tPrograms do for n = 1, #tPrograms do
local sProgram = tPrograms[n] local sProgram = tPrograms[n]
if #sProgram > #sLine and string.sub( sProgram, 1, #sLine ) == sLine then if #sProgram > #sLine and string.sub( sProgram, 1, #sLine ) == sLine then
local sResult = string.sub( sProgram, #sLine + 1 ) local sResult = string.sub( sProgram, #sLine + 1 )
@ -366,7 +366,7 @@ function shell.complete( sLine )
return { " " } return { " " }
else else
local tResults = completeProgram( sBit ) local tResults = completeProgram( sBit )
for n=1,#tResults do for n = 1, #tResults do
local sResult = tResults[n] local sResult = tResults[n]
local sPath = shell.resolveProgram( sBit .. sResult ) local sPath = shell.resolveProgram( sBit .. sResult )
if tCompletionInfo[ sPath ] then if tCompletionInfo[ sPath ] then
@ -397,7 +397,7 @@ function shell.setCompletionFunction( sProgram, fnComplete )
expect(1, sProgram, "string") expect(1, sProgram, "string")
expect(2, fnComplete, "function") expect(2, fnComplete, "function")
tCompletionInfo[ sProgram ] = { tCompletionInfo[ sProgram ] = {
fnComplete = fnComplete fnComplete = fnComplete,
} }
end end

View File

@ -1,3 +1,3 @@
local nTime = os.time() local nTime = os.time()
local nDay = os.day() local nDay = os.day()
print( "The time is "..textutils.formatTime( nTime, false ).." on Day "..nDay ) print( "The time is " .. textutils.formatTime( nTime, false ) .. " on Day " .. nDay )

View File

@ -29,7 +29,7 @@ if turtle.craft( nLimit ) then
end end
if nCrafted > 1 then if nCrafted > 1 then
print( nCrafted.." items crafted" ) print( nCrafted .. " items crafted" )
elseif nCrafted == 1 then elseif nCrafted == 1 then
print( "1 item crafted" ) print( "1 item crafted" )
else else

View File

@ -81,10 +81,10 @@ textutils.slowWrite( "Preparing to get down." )
textutils.slowPrint( "..", 0.75 ) textutils.slowPrint( "..", 0.75 )
local sAudio = nil local sAudio = nil
for n,sName in pairs( peripheral.getNames() ) do for _, sName in pairs( peripheral.getNames() ) do
if disk.hasAudio( sName ) then if disk.hasAudio( sName ) then
disk.playAudio( sName ) disk.playAudio( sName )
print( "Jamming to "..disk.getAudioTitle( sName ) ) print( "Jamming to " .. disk.getAudioTitle( sName ) )
sAudio = sName sAudio = sName
break break
end end
@ -95,7 +95,7 @@ print( "Press any key to stop the groove" )
parallel.waitForAny( parallel.waitForAny(
function() function()
while not bEnd do while not bEnd do
local event, key = os.pullEvent("key") local _, key = os.pullEvent("key")
if key ~= keys.escape then if key ~= keys.escape then
return return
end end
@ -103,7 +103,7 @@ parallel.waitForAny(
end, end,
function() function()
while true do while true do
local fnMove = tMoves[math.random(1,#tMoves)] local fnMove = tMoves[math.random(1, #tMoves)]
fnMove() fnMove()
end end
end end

View File

@ -20,15 +20,15 @@ local depth = 0
local unloaded = 0 local unloaded = 0
local collected = 0 local collected = 0
local xPos,zPos = 0,0 local xPos, zPos = 0, 0
local xDir,zDir = 0,1 local xDir, zDir = 0, 1
local goTo -- Filled in further down local goTo -- Filled in further down
local refuel -- Filled in further down local refuel -- Filled in further down
local function unload( _bKeepOneFuelStack ) local function unload( _bKeepOneFuelStack )
print( "Unloading items..." ) print( "Unloading items..." )
for n=1,16 do for n = 1, 16 do
local nCount = turtle.getItemCount(n) local nCount = turtle.getItemCount(n)
if nCount > 0 then if nCount > 0 then
turtle.select(n) turtle.select(n)
@ -48,11 +48,11 @@ local function unload( _bKeepOneFuelStack )
end end
local function returnSupplies() local function returnSupplies()
local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir local x, y, z, xd, zd = xPos, depth, zPos, xDir, zDir
print( "Returning to surface..." ) print( "Returning to surface..." )
goTo( 0,0,0,0,-1 ) goTo( 0, 0, 0, 0, -1 )
local fuelNeeded = 2*(x+y+z) + 1 local fuelNeeded = 2 * (x + y + z) + 1
if not refuel( fuelNeeded ) then if not refuel( fuelNeeded ) then
unload( true ) unload( true )
print( "Waiting for fuel" ) print( "Waiting for fuel" )
@ -64,13 +64,13 @@ local function returnSupplies()
end end
print( "Resuming mining..." ) print( "Resuming mining..." )
goTo( x,y,z,xd,zd ) goTo( x, y, z, xd, zd )
end end
local function collect() local function collect()
local bFull = true local bFull = true
local nTotalItems = 0 local nTotalItems = 0
for n=1,16 do for n = 1, 16 do
local nCount = turtle.getItemCount(n) local nCount = turtle.getItemCount(n)
if nCount == 0 then if nCount == 0 then
bFull = false bFull = false
@ -81,7 +81,7 @@ local function collect()
if nTotalItems > collected then if nTotalItems > collected then
collected = nTotalItems collected = nTotalItems
if math.fmod(collected + unloaded, 50) == 0 then if math.fmod(collected + unloaded, 50) == 0 then
print( "Mined "..(collected + unloaded).." items." ) print( "Mined " .. collected + unloaded .. " items." )
end end
end end
@ -98,10 +98,9 @@ function refuel( ammount )
return true return true
end end
local needed = ammount or (xPos + zPos + depth + 2) local needed = ammount or xPos + zPos + depth + 2
if turtle.getFuelLevel() < needed then if turtle.getFuelLevel() < needed then
local fueled = false for n = 1, 16 do
for n=1,16 do
if turtle.getItemCount(n) > 0 then if turtle.getItemCount(n) > 0 then
turtle.select(n) turtle.select(n)
if turtle.refuel(1) then if turtle.refuel(1) then
@ -177,7 +176,7 @@ local function tryDown()
depth = depth + 1 depth = depth + 1
if math.fmod( depth, 10 ) == 0 then if math.fmod( depth, 10 ) == 0 then
print( "Descended "..depth.." metres." ) print( "Descended " .. depth .. " metres." )
end end
return true return true
@ -291,8 +290,8 @@ end
local alternate = 0 local alternate = 0
local done = false local done = false
while not done do while not done do
for n=1,size do for n = 1, size do
for m=1,size-1 do for _ = 1, size - 1 do
if not tryForwards() then if not tryForwards() then
done = true done = true
break break
@ -301,8 +300,8 @@ while not done do
if done then if done then
break break
end end
if n<size then if n < size then
if math.fmod(n + alternate,2) == 0 then if math.fmod(n + alternate, 2) == 0 then
turnLeft() turnLeft()
if not tryForwards() then if not tryForwards() then
done = true done = true
@ -324,7 +323,7 @@ while not done do
end end
if size > 1 then if size > 1 then
if math.fmod(size,2) == 0 then if math.fmod(size, 2) == 0 then
turnRight() turnRight()
else else
if alternate == 0 then if alternate == 0 then
@ -345,13 +344,13 @@ end
print( "Returning to surface..." ) print( "Returning to surface..." )
-- Return to where we started -- Return to where we started
goTo( 0,0,0,0,-1 ) goTo( 0, 0, 0, 0, -1 )
unload( false ) unload( false )
goTo( 0,0,0,0,1 ) goTo( 0, 0, 0, 0, 1 )
-- Seal the hole -- Seal the hole
if reseal then if reseal then
turtle.placeDown() turtle.placeDown()
end end
print( "Mined "..(collected + unloaded).." items total." ) print( "Mined " .. collected + unloaded .. " items total." )

View File

@ -50,7 +50,7 @@ while nArg <= #tArgs do
end end
end end
else else
print( "No such direction: "..sDirection ) print( "No such direction: " .. sDirection )
print( "Try: forward, back, up, down" ) print( "Try: forward, back, up, down" )
return return
end end

View File

@ -23,7 +23,7 @@ end
if turtle.getFuelLevel() ~= "unlimited" then if turtle.getFuelLevel() ~= "unlimited" then
for n = 1, 16 do for n = 1, 16 do
-- Stop if we've reached the limit, or are fully refuelled. -- Stop if we've reached the limit, or are fully refuelled.
if (nLimit and nLimit <= 0) or turtle.getFuelLevel() >= turtle.getFuelLimit() then if nLimit and nLimit <= 0 or turtle.getFuelLevel() >= turtle.getFuelLimit() then
break break
end end
@ -36,7 +36,7 @@ if turtle.getFuelLevel() ~= "unlimited" then
end end
end end
end end
print( "Fuel level is "..turtle.getFuelLevel() ) print( "Fuel level is " .. turtle.getFuelLevel() )
if turtle.getFuelLevel() == turtle.getFuelLimit() then if turtle.getFuelLevel() == turtle.getFuelLimit() then
print( "Fuel limit reached" ) print( "Fuel limit reached" )
end end

View File

@ -15,14 +15,12 @@ if length < 1 then
print( "Tunnel length must be positive" ) print( "Tunnel length must be positive" )
return return
end end
local depth = 0
local collected = 0 local collected = 0
local function collect() local function collect()
collected = collected + 1 collected = collected + 1
if math.fmod(collected, 25) == 0 then if math.fmod(collected, 25) == 0 then
print( "Mined "..collected.." items." ) print( "Mined " .. collected .. " items." )
end end
end end
@ -69,7 +67,7 @@ local function refuel()
end end
local function tryRefuel() local function tryRefuel()
for n=1,16 do for n = 1, 16 do
if turtle.getItemCount(n) > 0 then if turtle.getItemCount(n) > 0 then
turtle.select(n) turtle.select(n)
if turtle.refuel(1) then if turtle.refuel(1) then
@ -141,7 +139,7 @@ end
print( "Tunnelling..." ) print( "Tunnelling..." )
for n=1,length do for n = 1, length do
turtle.placeDown() turtle.placeDown()
tryDigUp() tryDigUp()
turtle.turnLeft() turtle.turnLeft()
@ -155,7 +153,7 @@ for n=1,length do
tryDig() tryDig()
turtle.turnLeft() turtle.turnLeft()
if n<length then if n < length then
tryDig() tryDig()
if not tryForward() then if not tryForward() then
print( "Aborting Tunnel." ) print( "Aborting Tunnel." )
@ -185,4 +183,4 @@ turtle.turnRight()
]] ]]
print( "Tunnel complete." ) print( "Tunnel complete." )
print( "Mined "..collected.." items total." ) print( "Mined " .. collected .. " items total." )

View File

@ -31,11 +31,11 @@ while nArg <= #tArgs do
local fnHandler = tHandlers[string.lower(sDirection)] local fnHandler = tHandlers[string.lower(sDirection)]
if fnHandler then if fnHandler then
for n=1,nDistance do for _ = 1, nDistance do
fnHandler( nArg ) fnHandler( nArg )
end end
else else
print( "No such direction: "..sDirection ) print( "No such direction: " .. sDirection )
print( "Try: left, right" ) print( "Try: left, right" )
return return
end end

View File

@ -14,7 +14,7 @@ if #tArgs ~= 1 then
end end
local function unequip( fnEquipFunction ) local function unequip( fnEquipFunction )
for nSlot=1,16 do for nSlot = 1, 16 do
local nOldCount = turtle.getItemCount( nSlot ) local nOldCount = turtle.getItemCount( nSlot )
if nOldCount == 0 then if nOldCount == 0 then
turtle.select( nSlot ) turtle.select( nSlot )

View File

@ -3,24 +3,24 @@ local completion = require "cc.shell.completion"
-- Setup paths -- Setup paths
local sPath = ".:/rom/programs" local sPath = ".:/rom/programs"
if term.isColor() then if term.isColor() then
sPath = sPath..":/rom/programs/advanced" sPath = sPath .. ":/rom/programs/advanced"
end end
if turtle then if turtle then
sPath = sPath..":/rom/programs/turtle" sPath = sPath .. ":/rom/programs/turtle"
else else
sPath = sPath..":/rom/programs/rednet:/rom/programs/fun" sPath = sPath .. ":/rom/programs/rednet:/rom/programs/fun"
if term.isColor() then if term.isColor() then
sPath = sPath..":/rom/programs/fun/advanced" sPath = sPath .. ":/rom/programs/fun/advanced"
end end
end end
if pocket then if pocket then
sPath = sPath..":/rom/programs/pocket" sPath = sPath .. ":/rom/programs/pocket"
end end
if commands then if commands then
sPath = sPath..":/rom/programs/command" sPath = sPath .. ":/rom/programs/command"
end end
if http then if http then
sPath = sPath..":/rom/programs/http" sPath = sPath .. ":/rom/programs/http"
end end
shell.setPath( sPath ) shell.setPath( sPath )
help.setPath( "/rom/help" ) help.setPath( "/rom/help" )
@ -121,7 +121,7 @@ if fs.exists( "/rom/autorun" ) and fs.isDir( "/rom/autorun" ) then
local tFiles = fs.list( "/rom/autorun" ) local tFiles = fs.list( "/rom/autorun" )
for _, sFile in ipairs( tFiles ) do for _, sFile in ipairs( tFiles ) do
if string.sub( sFile, 1, 1 ) ~= "." then if string.sub( sFile, 1, 1 ) ~= "." then
local sPath = "/rom/autorun/"..sFile local sPath = "/rom/autorun/" .. sFile
if not fs.isDir( sPath ) then if not fs.isDir( sPath ) then
shell.run( sPath ) shell.run( sPath )
end end
@ -142,7 +142,7 @@ local function findStartups( sBaseDir )
if tStartups == nil then if tStartups == nil then
tStartups = {} tStartups = {}
end end
for _,v in pairs( fs.list( sBasePath ) ) do for _, v in pairs( fs.list( sBasePath ) ) do
local sPath = "/" .. fs.combine( sBasePath, v ) local sPath = "/" .. fs.combine( sBasePath, v )
if not fs.isDir( sPath ) then if not fs.isDir( sPath ) then
tStartups[ #tStartups + 1 ] = sPath tStartups[ #tStartups + 1 ] = sPath
@ -163,7 +163,7 @@ if settings.get( "shell.allow_startup" ) then
tUserStartups = findStartups( "/" ) tUserStartups = findStartups( "/" )
end end
if settings.get( "shell.allow_disk_startup" ) then if settings.get( "shell.allow_disk_startup" ) then
for n,sName in pairs( peripheral.getNames() ) do for _, sName in pairs( peripheral.getNames() ) do
if disk.isPresent( sName ) and disk.hasData( sName ) then if disk.isPresent( sName ) and disk.hasData( sName ) then
local startups = findStartups( disk.getMountPath( sName ) ) local startups = findStartups( disk.getMountPath( sName ) )
if startups then if startups then
@ -174,7 +174,7 @@ if settings.get( "shell.allow_disk_startup" ) then
end end
end end
if tUserStartups then if tUserStartups then
for _,v in pairs( tUserStartups ) do for _, v in pairs( tUserStartups ) do
shell.run( v ) shell.run( v )
end end
end end

View File

@ -11,19 +11,19 @@
--- Assert an argument to the given function has the specified type. --- Assert an argument to the given function has the specified type.
-- --
-- @tparam string The function's name -- @tparam string func The function's name
-- @tparam int The argument index to this function -- @tparam int idx The argument index to this function
-- @tparam string The type this argument should have. May be 'value' for any -- @tparam string ty The type this argument should have. May be 'value' for
-- non-nil value. -- any non-nil value.
-- @param val The value to check -- @param val val The value to check
-- @raise If this value doesn't match the expected type. -- @throws If this value doesn't match the expected type.
local function check(func, arg, ty, val) local function check(func, idx, ty, val)
if ty == 'value' then if ty == 'value' then
if val == nil then if val == nil then
error(('%s: bad argument #%d (got nil)'):format(func, arg), 3) error(('%s: bad argument #%d (got nil)'):format(func, idx), 3)
end end
elseif type(val) ~= ty then elseif type(val) ~= ty then
return error(('%s: bad argument #%d (expected %s, got %s)'):format(func, arg, ty, type(val)), 3) return error(('%s: bad argument #%d (expected %s, got %s)'):format(func, idx, ty, type(val)), 3)
end end
end end
@ -122,7 +122,7 @@ local error_mt = { __tostring = function(self) return self.message end }
--- Attempt to execute the provided function, gathering a stack trace when it --- Attempt to execute the provided function, gathering a stack trace when it
-- errors. -- errors.
-- --
-- @tparam -- @tparam function() fn The function to run
-- @return[1] true -- @return[1] true
-- @return[2] false -- @return[2] false
-- @return[2] The error object -- @return[2] The error object
@ -170,7 +170,7 @@ end
--- Fail a test with the given message --- Fail a test with the given message
-- --
-- @tparam string message The message to fail with -- @tparam string message The message to fail with
-- @raises An error with the given message -- @throws An error with the given message
local function fail(message) local function fail(message)
check('fail', 1, 'string', message) check('fail', 1, 'string', message)
error(setmetatable({ message = message, fail = true }, error_mt)) error(setmetatable({ message = message, fail = true }, error_mt))
@ -192,7 +192,7 @@ expect_mt.__index = expect_mt
--- Assert that this expectation has the provided value --- Assert that this expectation has the provided value
-- --
-- @param value The value to require this expectation to be equal to -- @param value The value to require this expectation to be equal to
-- @raises If the values are not equal -- @throws If the values are not equal
function expect_mt:equals(value) function expect_mt:equals(value)
if value ~= self.value then if value ~= self.value then
fail(("Expected %s\n but got %s"):format(format(value), format(self.value))) fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
@ -206,7 +206,7 @@ expect_mt.eq = expect_mt.equals
--- Assert that this expectation does not equal the provided value --- Assert that this expectation does not equal the provided value
-- --
-- @param value The value to require this expectation to not be equal to -- @param value The value to require this expectation to not be equal to
-- @raises If the values are equal -- @throws If the values are equal
function expect_mt:not_equals(value) function expect_mt:not_equals(value)
if value == self.value then if value == self.value then
fail(("Expected any value but %s"):format(format(value))) fail(("Expected any value but %s"):format(format(value)))
@ -220,7 +220,7 @@ expect_mt.ne = expect_mt.not_equals
--- Assert that this expectation has something of the provided type --- Assert that this expectation has something of the provided type
-- --
-- @tparam string exp_type The type to require this expectation to have -- @tparam string exp_type The type to require this expectation to have
-- @raises If it does not have that thpe -- @throws If it does not have that thpe
function expect_mt:type(exp_type) function expect_mt:type(exp_type)
local actual_type = type(self.value) local actual_type = type(self.value)
if exp_type ~= actual_type then if exp_type ~= actual_type then
@ -270,7 +270,7 @@ end
-- the provided object. -- the provided object.
-- --
-- @param value The value to check for structural equivalence -- @param value The value to check for structural equivalence
-- @raises If they are not equivalent -- @throws If they are not equivalent
function expect_mt:same(value) function expect_mt:same(value)
if not matches({}, true, self.value, value) then if not matches({}, true, self.value, value) then
fail(("Expected %s\n but got %s"):format(format(value), format(self.value))) fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
@ -283,7 +283,7 @@ end
-- in the provided object. -- in the provided object.
-- --
-- @param value The value to check against -- @param value The value to check against
-- @raises If this does not match the provided value -- @throws If this does not match the provided value
function expect_mt:matches(value) function expect_mt:matches(value)
if not matches({}, false, value, self.value) then if not matches({}, false, value, self.value) then
fail(("Expected %s\nto match %s"):format(format(self.value), format(value))) fail(("Expected %s\nto match %s"):format(format(self.value), format(value)))
@ -296,7 +296,7 @@ end
-- --
-- @tparam[opt] number The exact number of times the function must be called. -- @tparam[opt] number The exact number of times the function must be called.
-- If not given just require the function to be called at least once. -- If not given just require the function to be called at least once.
-- @raises If this function was not called the expected number of times. -- @throws If this function was not called the expected number of times.
function expect_mt:called(times) function expect_mt:called(times)
if getmetatable(self.value) ~= stub_mt or self.value.arguments == nil then if getmetatable(self.value) ~= stub_mt or self.value.arguments == nil then
fail(("Expected stubbed function, got %s"):format(type(self.value))) fail(("Expected stubbed function, got %s"):format(type(self.value)))
@ -380,7 +380,7 @@ local expect = setmetatable( {
-- @return The new expectation -- @return The new expectation
__call = function(_, value) __call = function(_, value)
return setmetatable({ value = value }, expect_mt) return setmetatable({ value = value }, expect_mt)
end end,
}) })
--- The stack of "describe"s. --- The stack of "describe"s.
@ -623,7 +623,7 @@ end
-- And some summary statistics -- And some summary statistics
local actual_count = tests_run - test_status.pending local actual_count = tests_run - test_status.pending
local info = ("Ran %s test(s), of which %s passed (%g%%).") local info = ("Ran %s test(s), of which %s passed (%g%%).")
:format(actual_count, test_status.pass, (test_status.pass / actual_count) * 100) :format(actual_count, test_status.pass, test_status.pass / actual_count * 100)
if test_status.pending > 0 then if test_status.pending > 0 then
info = info .. (" Skipped %d pending test(s)."):format(test_status.pending) info = info .. (" Skipped %d pending test(s)."):format(test_status.pending)

View File

@ -2,7 +2,7 @@ describe("The gps library", function()
describe("gps.locate", function() describe("gps.locate", function()
it("validates arguments", function() it("validates arguments", function()
stub(_G, "commands", { getBlockPosition = function() stub(_G, "commands", { getBlockPosition = function()
end }) end, })
gps.locate() gps.locate()
gps.locate(1) gps.locate(1)

View File

@ -60,10 +60,10 @@ describe("The io library", function()
expect(io.output():seek()):equal(0) expect(io.output():seek()):equal(0)
assert(io.write("alo alo")) assert(io.write("alo alo"))
expect(io.output():seek()):equal(#("alo alo")) expect(io.output():seek()):equal(#"alo alo")
expect(io.output():seek("cur", -3)):equal(#("alo alo") - 3) expect(io.output():seek("cur", -3)):equal(#"alo alo" - 3)
assert(io.write("joao")) assert(io.write("joao"))
expect(io.output():seek("end"):equal(#("alo joao"))) expect(io.output():seek("end"):equal(#"alo joao"))
expect(io.output():seek("set")):equal(0) expect(io.output():seek("set")):equal(0)

View File

@ -70,7 +70,7 @@ describe("The Lua base library", function()
it("does not prefix for unnamed chunks", function() it("does not prefix for unnamed chunks", function()
local info = debug.getinfo(loadstring("return 1"), "S") local info = debug.getinfo(loadstring("return 1"), "S")
expect(info):matches { short_src = '[string "return 1"]', source = "return 1", } expect(info):matches { short_src = '[string "return 1"]', source = "return 1" }
end) end)
it("does not prefix when already prefixed", function() it("does not prefix when already prefixed", function()

View File

@ -5,7 +5,7 @@ describe("cc.shell.completion", function()
it("completes both", function() it("completes both", function()
expect(c.dirOrFile(shell, "rom/")):same { expect(c.dirOrFile(shell, "rom/")):same {
"apis/", "apis", "autorun/", "autorun", "help/", "help", "apis/", "apis", "autorun/", "autorun", "help/", "help",
"modules/", "modules", "motd.txt", "programs/", "programs", "startup.lua" "modules/", "modules", "motd.txt", "programs/", "programs", "startup.lua",
} }
end) end)

View File

@ -10,7 +10,7 @@ describe("The commands program", function()
it("lists commands", function() it("lists commands", function()
local pagedTabulate = stub(textutils, "pagedTabulate", function(x) print(table.unpack(x)) end) local pagedTabulate = stub(textutils, "pagedTabulate", function(x) print(table.unpack(x)) end)
stub(_G, "commands", { stub(_G, "commands", {
list = function() return { "computercraft" } end list = function() return { "computercraft" } end,
}) })
expect(capture(stub, "/rom/programs/command/commands.lua")) expect(capture(stub, "/rom/programs/command/commands.lua"))

View File

@ -15,7 +15,7 @@ describe("The exec program", function()
it("runs a command", function() it("runs a command", function()
stub(_G, "commands", { stub(_G, "commands", {
exec = function() return true, {"Hello World!"} end exec = function() return true, {"Hello World!"} end,
}) })
expect(capture(stub, "/rom/programs/command/exec.lua computercraft")) expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))
@ -23,8 +23,8 @@ describe("The exec program", function()
end) end)
it("reports command failures", function() it("reports command failures", function()
stub(_G,"commands",{ stub(_G, "commands", {
exec = function() return false, {"Hello World!"} end exec = function() return false, {"Hello World!"} end,
}) })
expect(capture(stub, "/rom/programs/command/exec.lua computercraft")) expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))

View File

@ -1,5 +1,4 @@
local capture = require "test_helpers".capture_program local capture = require "test_helpers".capture_program
local testFile = require "test_helpers".testFile
describe("The edit program", function() describe("The edit program", function()

View File

@ -17,7 +17,7 @@ describe("The pastebin program", function()
local tHeader = {} local tHeader = {}
tHeader["Content-Type"] = "text/plain; charset=utf-8" tHeader["Content-Type"] = "text/plain; charset=utf-8"
return tHeader return tHeader
end end,
} }
end, end,
post = function() post = function()
@ -28,7 +28,7 @@ describe("The pastebin program", function()
close = function() close = function()
end, end,
} }
end end,
}) })
end end

View File

@ -14,7 +14,7 @@ describe("The wget program", function()
close = function() close = function()
end, end,
} }
end end,
}) })
end end

View File

@ -6,6 +6,6 @@ describe("The id program", function()
local id = os.getComputerID() local id = os.getComputerID()
expect(capture(stub, "id")) expect(capture(stub, "id"))
:matches { ok = true, output = "This is computer #"..id.."\n", error = "" } :matches { ok = true, output = "This is computer #" .. id .. "\n", error = "" }
end) end)
end) end)

View File

@ -3,10 +3,10 @@ local capture = require "test_helpers".capture_program
describe("The motd program", function() describe("The motd program", function()
it("displays MODT", function() it("displays MODT", function()
local file = fs.open("/modt_check.txt","w") local file = fs.open("/modt_check.txt", "w")
file.write("Hello World!") file.write("Hello World!")
file.close() file.close()
settings.set("motd.path","/modt_check.txt") settings.set("motd.path", "/modt_check.txt")
expect(capture(stub, "motd")) expect(capture(stub, "motd"))
:matches { ok = true, output = "Hello World!\n", error = "" } :matches { ok = true, output = "Hello World!\n", error = "" }

View File

@ -9,7 +9,7 @@ describe("The pocket equip program", function()
it("can equip an upgrade", function() it("can equip an upgrade", function()
stub(_G, "pocket", { stub(_G, "pocket", {
equipBack = function() return true end equipBack = function() return true end,
}) })
expect(capture(stub, "/rom/programs/pocket/equip.lua")) expect(capture(stub, "/rom/programs/pocket/equip.lua"))
@ -18,7 +18,7 @@ describe("The pocket equip program", function()
it("handles when an upgrade cannot be equipped", function() it("handles when an upgrade cannot be equipped", function()
stub(_G, "pocket", { stub(_G, "pocket", {
equipBack = function() return false, "Cannot equip this item." end equipBack = function() return false, "Cannot equip this item." end,
}) })
expect(capture(stub, "/rom/programs/pocket/equip.lua")) expect(capture(stub, "/rom/programs/pocket/equip.lua"))

View File

@ -9,7 +9,7 @@ describe("The pocket unequip program", function()
it("unequips an upgrade", function() it("unequips an upgrade", function()
stub(_G, "pocket", { stub(_G, "pocket", {
unequipBack = function() return true end unequipBack = function() return true end,
}) })
expect(capture(stub, "/rom/programs/pocket/unequip.lua")) expect(capture(stub, "/rom/programs/pocket/unequip.lua"))
@ -18,7 +18,7 @@ describe("The pocket unequip program", function()
it("handles when an upgrade cannot be equipped", function() it("handles when an upgrade cannot be equipped", function()
stub(_G, "pocket", { stub(_G, "pocket", {
unequipBack = function() return false, "Nothing to remove." end unequipBack = function() return false, "Nothing to remove." end,
}) })
expect(capture(stub, "/rom/programs/pocket/unequip.lua")) expect(capture(stub, "/rom/programs/pocket/unequip.lua"))

View File

@ -4,8 +4,8 @@ describe("The set program", function()
it("displays all settings", function() it("displays all settings", function()
settings.clear() settings.clear()
settings.set("Test","Hello World!") settings.set("Test", "Hello World!")
settings.set("123",456) settings.set("123", 456)
expect(capture(stub, "set")) expect(capture(stub, "set"))
:matches { ok = true, output = '"123" is 456\n"Test" is "Hello World!"\n', error = "" } :matches { ok = true, output = '"123" is 456\n"Test" is "Hello World!"\n', error = "" }
@ -13,8 +13,8 @@ describe("The set program", function()
it("displays a single settings", function() it("displays a single settings", function()
settings.clear() settings.clear()
settings.set("Test","Hello World!") settings.set("Test", "Hello World!")
settings.set("123",456) settings.set("123", 456)
expect(capture(stub, "set Test")) expect(capture(stub, "set Test"))
:matches { ok = true, output = '"Test" is "Hello World!"\n', error = "" } :matches { ok = true, output = '"Test" is "Hello World!"\n', error = "" }

View File

@ -7,6 +7,6 @@ describe("The time program", function()
local day = os.day() local day = os.day()
expect(capture(stub, "time")) expect(capture(stub, "time"))
:matches { ok = true, output = "The time is "..time.." on Day "..day.."\n", error = "" } :matches { ok = true, output = "The time is " .. time .. " on Day " .. day .. "\n", error = "" }
end) end)
end) end)

View File

@ -39,7 +39,7 @@ describe("The craft program", function()
it("craft a single item", function() it("craft a single item", function()
local item_count = 2 local item_count = 2
stub(_G,"turtle",{ stub(_G, "turtle", {
craft = function() craft = function()
item_count = 1 item_count = 1
return true return true
@ -54,7 +54,7 @@ describe("The craft program", function()
it("crafts no items", function() it("crafts no items", function()
local item_count = 2 local item_count = 2
stub(_G,"turtle",{ stub(_G, "turtle", {
craft = function() craft = function()
item_count = 1 item_count = 1
return false return false

View File

@ -29,7 +29,7 @@ describe("The turtle equip program", function()
end) end)
it("swaps existing upgrades", function() it("swaps existing upgrades", function()
stub(_G,"turtle",{ stub(_G, "turtle", {
select = function() end, select = function() end,
getItemCount = function() return 1 end, getItemCount = function() return 1 end,
equipLeft = function() return true end, equipLeft = function() return true end,
@ -45,7 +45,7 @@ describe("The turtle equip program", function()
describe("equips a new upgrade", function() describe("equips a new upgrade", function()
local function setup() local function setup()
local item_count = 1 local item_count = 1
stub(_G,"turtle",{ stub(_G, "turtle", {
select = function() end, select = function() end,
getItemCount = function() return item_count end, getItemCount = function() return item_count end,
equipLeft = function() equipLeft = function()
@ -73,7 +73,7 @@ describe("The turtle equip program", function()
end) end)
it("handles when an upgrade cannot be equipped", function() it("handles when an upgrade cannot be equipped", function()
stub(_G,"turtle",{ stub(_G, "turtle", {
select = function() end, select = function() end,
getItemCount = function() return 1 end, getItemCount = function() return 1 end,
equipLeft = function() return false end, equipLeft = function() return false end,

View File

@ -17,7 +17,7 @@ describe("The refuel program", function()
end, end,
getFuelLimit = function() getFuelLimit = function()
return fuel_limit return fuel_limit
end end,
}) })
end end
@ -49,13 +49,13 @@ describe("The refuel program", function()
end) end)
it("reports when the fuel limit is reached", function() it("reports when the fuel limit is reached", function()
setup_turtle(0,5,5) setup_turtle(0, 5, 5)
expect(capture(stub, "/rom/programs/turtle/refuel.lua 5")) expect(capture(stub, "/rom/programs/turtle/refuel.lua 5"))
:matches { ok = true, output = "Fuel level is 5\nFuel limit reached\n", error = "" } :matches { ok = true, output = "Fuel level is 5\nFuel limit reached\n", error = "" }
end) end)
it("reports when the fuel level is unlimited", function() it("reports when the fuel level is unlimited", function()
setup_turtle("unlimited",5,5) setup_turtle("unlimited", 5, 5)
expect(capture(stub, "/rom/programs/turtle/refuel.lua 5")) expect(capture(stub, "/rom/programs/turtle/refuel.lua 5"))
:matches { ok = true, output = "Fuel level is unlimited\n", error = "" } :matches { ok = true, output = "Fuel level is unlimited\n", error = "" }
end) end)

View File

@ -17,11 +17,11 @@ describe("The turtle unequip program", function()
end) end)
it("says when nothing was unequipped", function() it("says when nothing was unequipped", function()
stub(_G,"turtle",{ stub(_G, "turtle", {
select = function() end, select = function() end,
getItemCount = function() return 0 end, getItemCount = function() return 0 end,
equipRight = function() return true end, equipRight = function() return true end,
equipLeft = function() return true end equipLeft = function() return true end,
}) })
expect(capture(stub, "/rom/programs/turtle/unequip.lua left")) expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
@ -32,7 +32,7 @@ describe("The turtle unequip program", function()
it("unequips a upgrade", function() it("unequips a upgrade", function()
local item_count = 0 local item_count = 0
stub(_G,"turtle",{ stub(_G, "turtle", {
select = function() end, select = function() end,
getItemCount = function() return item_count end, getItemCount = function() return item_count end,
equipRight = function() equipRight = function()
@ -42,7 +42,7 @@ describe("The turtle unequip program", function()
equipLeft = function() equipLeft = function()
item_count = 1 item_count = 1
return true return true
end end,
}) })
expect(capture(stub, "/rom/programs/turtle/unequip.lua left")) expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
@ -53,11 +53,11 @@ describe("The turtle unequip program", function()
end) end)
it("fails when the turtle is full", function() it("fails when the turtle is full", function()
stub(_G,"turtle",{ stub(_G, "turtle", {
select = function() end, select = function() end,
getItemCount = function() return 1 end, getItemCount = function() return 1 end,
equipRight = function() return true end, equipRight = function() return true end,
equipLeft = function() return true end equipLeft = function() return true end,
}) })
expect(capture(stub, "/rom/programs/turtle/unequip.lua left")) expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))

Some files were not shown because too many files have changed in this diff Show More