mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-10-15 22:17:39 +00:00
Compare commits
17 Commits
v1.14.4-1.
...
v1.14.4-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0f82a4589b | ||
![]() |
4320a4f851 | ||
![]() |
037cbabb32 | ||
![]() |
0dde859582 | ||
![]() |
e59c043fb6 | ||
![]() |
ae928c4397 | ||
![]() |
da41c65128 | ||
![]() |
4d18234714 | ||
![]() |
d254c6464b | ||
![]() |
3a5d50e572 | ||
![]() |
03b6d2f1ab | ||
![]() |
b0397ed3c5 | ||
![]() |
fa70ebcac2 | ||
![]() |
86e0330100 | ||
![]() |
92567b4d7e | ||
![]() |
0ae70fed13 | ||
![]() |
3b7300543a |
@@ -11,5 +11,8 @@ insert_final_newline = true
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.sexp]
|
||||
indent_size = 2
|
||||
|
||||
[*.properties]
|
||||
insert_final_newline = false
|
||||
|
15
.github/workflows/main-ci.yml
vendored
15
.github/workflows/main-ci.yml
vendored
@@ -4,6 +4,7 @@ on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
@@ -16,3 +17,17 @@ jobs:
|
||||
|
||||
- name: Build with Gradle
|
||||
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
|
||||
|
35
.luacheckrc
35
.luacheckrc
@@ -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' },
|
||||
}
|
13
build.gradle
13
build.gradle
@@ -81,6 +81,10 @@ repositories {
|
||||
name "Amadornes"
|
||||
url "https://maven.amadornes.com/"
|
||||
}
|
||||
maven {
|
||||
name "CraftTweaker"
|
||||
url "https://maven.blamejared.com/"
|
||||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
@@ -95,8 +99,7 @@ dependencies {
|
||||
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
||||
|
||||
compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25:api")
|
||||
// deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
|
||||
// deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
|
||||
compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.14.4:5.0.1.150")
|
||||
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25")
|
||||
|
||||
@@ -136,7 +139,7 @@ jar {
|
||||
|
||||
[compileJava, compileTestJava].forEach {
|
||||
it.configure {
|
||||
options.compilerArgs << "-Xlint" << "-Xlint:-processing" << "-Werror"
|
||||
options.compilerArgs << "-Xlint" << "-Xlint:-processing"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,6 +165,7 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
|
||||
|
||||
// Add the main runtime jar and all non-shadowed dependencies
|
||||
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
|
||||
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
|
||||
doFirst {
|
||||
sourceSets.main.compileClasspath
|
||||
.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.
|
||||
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
|
||||
dontwarn 'module-info'
|
||||
dontwarn 'org.apache.**,org.lwjgl.**'
|
||||
|
@@ -1,5 +1,5 @@
|
||||
# Mod properties
|
||||
mod_version=1.85.1
|
||||
mod_version=1.86.0
|
||||
|
||||
# Minecraft properties (update mods.toml when changing)
|
||||
mc_version=1.14.4
|
||||
|
28
illuaminate.sexp
Normal file
28
illuaminate.sexp
Normal 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))
|
@@ -6,11 +6,9 @@
|
||||
|
||||
package dan200.computercraft;
|
||||
|
||||
import dan200.computercraft.api.filesystem.IMount;
|
||||
import dan200.computercraft.api.turtle.event.TurtleAction;
|
||||
import dan200.computercraft.core.apis.AddressPredicate;
|
||||
import dan200.computercraft.core.apis.http.websocket.Websocket;
|
||||
import dan200.computercraft.core.filesystem.ResourceMount;
|
||||
import dan200.computercraft.shared.Config;
|
||||
import dan200.computercraft.shared.computer.blocks.BlockComputer;
|
||||
import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
|
||||
@@ -194,13 +192,6 @@ public final class ComputerCraft
|
||||
return "${version}";
|
||||
}
|
||||
|
||||
static IMount createResourceMount( String domain, String subPath )
|
||||
{
|
||||
IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
|
||||
ResourceMount mount = new ResourceMount( domain, subPath, manager );
|
||||
return mount.exists( "" ) ? mount : null;
|
||||
}
|
||||
|
||||
public static InputStream getResourceFile( String domain, String subPath )
|
||||
{
|
||||
IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
|
||||
|
@@ -6,6 +6,7 @@
|
||||
|
||||
package dan200.computercraft;
|
||||
|
||||
import com.google.common.collect.MapMaker;
|
||||
import dan200.computercraft.api.ComputerCraftAPI.IComputerCraftAPI;
|
||||
import dan200.computercraft.api.filesystem.IMount;
|
||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||
@@ -20,20 +21,26 @@ import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.core.apis.ApiFactories;
|
||||
import dan200.computercraft.core.filesystem.FileMount;
|
||||
import dan200.computercraft.core.filesystem.ResourceMount;
|
||||
import dan200.computercraft.shared.*;
|
||||
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
|
||||
import dan200.computercraft.shared.util.IDAssigner;
|
||||
import dan200.computercraft.shared.wired.CapabilityWiredElement;
|
||||
import dan200.computercraft.shared.wired.WiredNode;
|
||||
import net.minecraft.resources.IReloadableResourceManager;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.fml.server.ServerLifecycleHooks;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.io.File;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.Map;
|
||||
|
||||
public final class ComputerCraftAPIImpl implements IComputerCraftAPI
|
||||
{
|
||||
@@ -43,6 +50,9 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
|
||||
{
|
||||
}
|
||||
|
||||
private WeakReference<IReloadableResourceManager> currentResources;
|
||||
private final Map<ResourceLocation, ResourceMount> mountCache = new MapMaker().weakValues().concurrencyLevel( 1 ).makeMap();
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getInstalledVersion()
|
||||
@@ -72,7 +82,9 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
|
||||
@Override
|
||||
public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
|
||||
{
|
||||
return ComputerCraft.createResourceMount( domain, subPath );
|
||||
IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
|
||||
ResourceMount mount = ResourceMount.get( domain, subPath, manager );
|
||||
return mount.exists( "" ) ? mount : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -56,9 +56,6 @@ final class ComputerExecutor
|
||||
{
|
||||
private static final int QUEUE_LIMIT = 256;
|
||||
|
||||
private static IMount romMount;
|
||||
private static final Object romMountLock = new Object();
|
||||
|
||||
private final Computer computer;
|
||||
private final List<ILuaAPI> apis = new ArrayList<>();
|
||||
final TimeoutState timeout = new TimeoutState();
|
||||
@@ -329,16 +326,10 @@ final class ComputerExecutor
|
||||
|
||||
private IMount getRomMount()
|
||||
{
|
||||
if( romMount != null ) return romMount;
|
||||
|
||||
synchronized( romMountLock )
|
||||
{
|
||||
if( romMount != null ) return romMount;
|
||||
return romMount = computer.getComputerEnvironment().createResourceMount( "computercraft", "lua/rom" );
|
||||
}
|
||||
return computer.getComputerEnvironment().createResourceMount( "computercraft", "lua/rom" );
|
||||
}
|
||||
|
||||
IWritableMount getRootMount()
|
||||
private IWritableMount getRootMount()
|
||||
{
|
||||
if( rootMount == null )
|
||||
{
|
||||
|
@@ -8,13 +8,16 @@ package dan200.computercraft.core.filesystem;
|
||||
|
||||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.google.common.collect.MapMaker;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.filesystem.IMount;
|
||||
import dan200.computercraft.core.apis.handles.ArrayByteChannel;
|
||||
import net.minecraft.resources.IReloadableResourceManager;
|
||||
import net.minecraft.resources.IResource;
|
||||
import net.minecraft.resources.IResourceManager;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.ResourceLocationException;
|
||||
import net.minecraftforge.resource.IResourceType;
|
||||
import net.minecraftforge.resource.ISelectiveResourceReloadListener;
|
||||
|
||||
@@ -29,7 +32,7 @@ import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class ResourceMount implements IMount
|
||||
public final class ResourceMount implements IMount
|
||||
{
|
||||
/**
|
||||
* Only cache files smaller than 1MiB.
|
||||
@@ -55,6 +58,13 @@ public class ResourceMount implements IMount
|
||||
.<FileEntry, byte[]>weigher( ( k, v ) -> v.length )
|
||||
.build();
|
||||
|
||||
private static final MapMaker CACHE_TEMPLATE = new MapMaker().weakValues().concurrencyLevel( 1 );
|
||||
|
||||
/**
|
||||
* Maintain a cache of currently loaded resource mounts. This cache is invalidated when currentManager changes.
|
||||
*/
|
||||
private static final Map<IReloadableResourceManager, Map<ResourceLocation, ResourceMount>> MOUNT_CACHE = new WeakHashMap<>( 2 );
|
||||
|
||||
private final String namespace;
|
||||
private final String subPath;
|
||||
private final IReloadableResourceManager manager;
|
||||
@@ -62,7 +72,26 @@ public class ResourceMount implements IMount
|
||||
@Nullable
|
||||
private FileEntry root;
|
||||
|
||||
public ResourceMount( String namespace, String subPath, IReloadableResourceManager manager )
|
||||
public static ResourceMount get( String namespace, String subPath, IReloadableResourceManager manager )
|
||||
{
|
||||
Map<ResourceLocation, ResourceMount> cache;
|
||||
|
||||
synchronized( MOUNT_CACHE )
|
||||
{
|
||||
cache = MOUNT_CACHE.get( manager );
|
||||
if( cache == null ) MOUNT_CACHE.put( manager, cache = CACHE_TEMPLATE.makeMap() );
|
||||
}
|
||||
|
||||
ResourceLocation path = new ResourceLocation( namespace, subPath );
|
||||
synchronized( cache )
|
||||
{
|
||||
ResourceMount mount = cache.get( path );
|
||||
if( mount == null ) cache.put( path, mount = new ResourceMount( namespace, subPath, manager ) );
|
||||
return mount;
|
||||
}
|
||||
}
|
||||
|
||||
private ResourceMount( String namespace, String subPath, IReloadableResourceManager manager )
|
||||
{
|
||||
this.namespace = namespace;
|
||||
this.subPath = subPath;
|
||||
@@ -119,7 +148,17 @@ public class ResourceMount implements IMount
|
||||
FileEntry nextEntry = lastEntry.children.get( part );
|
||||
if( nextEntry == null )
|
||||
{
|
||||
lastEntry.children.put( part, nextEntry = new FileEntry( new ResourceLocation( namespace, subPath + "/" + path ) ) );
|
||||
ResourceLocation childPath;
|
||||
try
|
||||
{
|
||||
childPath = new ResourceLocation( namespace, subPath + "/" + path );
|
||||
}
|
||||
catch( ResourceLocationException e )
|
||||
{
|
||||
ComputerCraft.log.warn( "Cannot create resource location for {} ({})", part, e.getMessage() );
|
||||
return;
|
||||
}
|
||||
lastEntry.children.put( part, nextEntry = new FileEntry( childPath ) );
|
||||
}
|
||||
|
||||
lastEntry = nextEntry;
|
||||
|
@@ -11,92 +11,168 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
|
||||
import dan200.computercraft.shared.util.InventoryUtil;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fml.ModContainer;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public final class TurtleUpgrades
|
||||
{
|
||||
private static class Wrapper
|
||||
{
|
||||
final ITurtleUpgrade upgrade;
|
||||
final String id;
|
||||
final String modId;
|
||||
boolean enabled;
|
||||
|
||||
Wrapper( ITurtleUpgrade upgrade )
|
||||
{
|
||||
this.upgrade = upgrade;
|
||||
this.id = upgrade.getUpgradeID().toString();
|
||||
this.modId = ModLoadingContext.get().getActiveNamespace();
|
||||
this.enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static ITurtleUpgrade[] vanilla;
|
||||
|
||||
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 static boolean needsRebuild;
|
||||
|
||||
private TurtleUpgrades() {}
|
||||
|
||||
public static void register( @Nonnull ITurtleUpgrade upgrade )
|
||||
{
|
||||
Objects.requireNonNull( upgrade, "upgrade cannot be null" );
|
||||
rebuild();
|
||||
|
||||
String id = upgrade.getUpgradeID().toString();
|
||||
Wrapper wrapper = new Wrapper( upgrade );
|
||||
String id = wrapper.id;
|
||||
ITurtleUpgrade existing = upgrades.get( id );
|
||||
if( existing != null )
|
||||
{
|
||||
throw new IllegalStateException( "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turle'. UpgradeID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
|
||||
throw new IllegalStateException( "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. Upgrade ID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
|
||||
}
|
||||
|
||||
upgrades.put( id, upgrade );
|
||||
|
||||
ModContainer mc = ModLoadingContext.get().getActiveContainer();
|
||||
if( mc != null && mc.getModId() != null ) upgradeOwners.put( upgrade, mc.getModId() );
|
||||
wrappers.put( upgrade, wrapper );
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
public static ITurtleUpgrade get( String id )
|
||||
{
|
||||
rebuild();
|
||||
return upgrades.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 )
|
||||
{
|
||||
if( stack.isEmpty() ) return null;
|
||||
|
||||
for( ITurtleUpgrade upgrade : upgrades.values() )
|
||||
for( Wrapper wrapper : wrappers.values() )
|
||||
{
|
||||
ItemStack craftingStack = upgrade.getCraftingItem();
|
||||
if( !wrapper.enabled ) continue;
|
||||
|
||||
ItemStack craftingStack = wrapper.upgrade.getCraftingItem();
|
||||
if( !craftingStack.isEmpty() && InventoryUtil.areItemsSimilar( stack, craftingStack ) )
|
||||
{
|
||||
return upgrade;
|
||||
return wrapper.upgrade;
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
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;
|
||||
return Arrays.stream( vanilla ).filter( x -> x != null && wrappers.get( x ).enabled );
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static String getOwner( @Nonnull ITurtleUpgrade upgrade )
|
||||
public static Stream<ITurtleUpgrade> getUpgrades()
|
||||
{
|
||||
return upgradeOwners.get( upgrade );
|
||||
}
|
||||
|
||||
public static Iterable<ITurtleUpgrade> getUpgrades()
|
||||
{
|
||||
return Collections.unmodifiableCollection( upgrades.values() );
|
||||
return wrappers.values().stream().filter( x -> x.enabled ).map( x -> x.upgrade );
|
||||
}
|
||||
|
||||
public static boolean suitableForFamily( ComputerFamily family, ITurtleUpgrade upgrade )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild the cache of turtle upgrades. This is done before querying the cache or registering new upgrades.
|
||||
*/
|
||||
private static void rebuild()
|
||||
{
|
||||
if( !needsRebuild ) return;
|
||||
|
||||
upgrades.clear();
|
||||
for( Wrapper wrapper : wrappers.values() )
|
||||
{
|
||||
if( !wrapper.enabled ) continue;
|
||||
|
||||
ITurtleUpgrade existing = upgrades.get( wrapper.id );
|
||||
if( existing != null )
|
||||
{
|
||||
ComputerCraft.log.error( "Error registering '" + wrapper.upgrade.getUnlocalisedAdjective() + " Turtle'." +
|
||||
" Upgrade ID '" + wrapper.id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
|
||||
continue;
|
||||
}
|
||||
|
||||
upgrades.put( wrapper.id, wrapper.upgrade );
|
||||
}
|
||||
|
||||
needsRebuild = false;
|
||||
}
|
||||
|
||||
public static void enable( ITurtleUpgrade upgrade )
|
||||
{
|
||||
Wrapper wrapper = wrappers.get( upgrade );
|
||||
if( wrapper.enabled ) return;
|
||||
|
||||
wrapper.enabled = true;
|
||||
needsRebuild = true;
|
||||
}
|
||||
|
||||
public static void disable( ITurtleUpgrade upgrade )
|
||||
{
|
||||
Wrapper wrapper = wrappers.get( upgrade );
|
||||
if( !wrapper.enabled ) return;
|
||||
|
||||
wrapper.enabled = false;
|
||||
upgrades.remove( wrapper.id );
|
||||
}
|
||||
|
||||
public static void remove( ITurtleUpgrade upgrade )
|
||||
{
|
||||
wrappers.remove( upgrade );
|
||||
needsRebuild = true;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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 com.blamejared.crafttweaker.api.logger.ILogger;
|
||||
|
||||
/**
|
||||
* Logger which tracks if it has any messages.
|
||||
*/
|
||||
public final class TrackingLogger
|
||||
{
|
||||
private final ILogger logger;
|
||||
private boolean ok = true;
|
||||
|
||||
public TrackingLogger( ILogger logger )
|
||||
{
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
public boolean isOk()
|
||||
{
|
||||
return ok;
|
||||
}
|
||||
|
||||
public void warning( String message )
|
||||
{
|
||||
ok = false;
|
||||
logger.warning( message );
|
||||
}
|
||||
|
||||
public void error( String message )
|
||||
{
|
||||
ok = false;
|
||||
logger.error( message );
|
||||
}
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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 com.blamejared.crafttweaker.api.CraftTweakerAPI;
|
||||
import com.blamejared.crafttweaker.api.annotations.ZenRegister;
|
||||
import com.blamejared.crafttweaker.api.item.IItemStack;
|
||||
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 org.openzen.zencode.java.ZenCodeType;
|
||||
|
||||
@ZenRegister
|
||||
@ZenCodeType.Name( "dan200.computercraft.turtle" )
|
||||
public class TurtleTweaker
|
||||
{
|
||||
/**
|
||||
* Remove a turtle upgrade with the given id.
|
||||
*
|
||||
* @param upgrade The ID of the to remove
|
||||
*/
|
||||
@ZenCodeType.Method
|
||||
public static void removeUpgrade( String upgrade )
|
||||
{
|
||||
CraftTweakerAPI.apply( new RemoveTurtleUpgradeByName( upgrade ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a turtle upgrade crafted with the given item stack".
|
||||
*
|
||||
* @param stack The stack with which the upgrade is crafted.
|
||||
*/
|
||||
@ZenCodeType.Method
|
||||
public static void removeUpgrade( IItemStack stack )
|
||||
{
|
||||
CraftTweakerAPI.apply( new RemoveTurtleUpgradeByItem( stack.getInternal() ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new turtle tool with the given id, which crafts and acts using the given stack.
|
||||
*
|
||||
* @param id The new upgrade's ID
|
||||
* @param stack The stack used for crafting the upgrade and used by the turtle as a tool.
|
||||
*/
|
||||
@ZenCodeType.Method
|
||||
public static void addTool( String id, IItemStack stack )
|
||||
{
|
||||
addTool( id, stack, stack, "tool" );
|
||||
}
|
||||
|
||||
@ZenCodeType.Method
|
||||
public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack )
|
||||
{
|
||||
addTool( id, craftingStack, toolStack, "tool" );
|
||||
}
|
||||
|
||||
@ZenCodeType.Method
|
||||
public static void addTool( String id, IItemStack stack, String kind )
|
||||
{
|
||||
addTool( id, stack, stack, kind );
|
||||
}
|
||||
|
||||
@ZenCodeType.Method
|
||||
public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack, String kind )
|
||||
{
|
||||
CraftTweakerAPI.apply( new AddTurtleTool( id, craftingStack.getInternal(), toolStack.getInternal(), kind ) );
|
||||
}
|
||||
}
|
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* 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 com.blamejared.crafttweaker.api.actions.IUndoableAction;
|
||||
import com.blamejared.crafttweaker.api.logger.ILogger;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.shared.TurtleUpgrades;
|
||||
import dan200.computercraft.shared.integration.crafttweaker.TrackingLogger;
|
||||
import dan200.computercraft.shared.turtle.upgrades.*;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fml.LogicalSide;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Register a new turtle tool.
|
||||
*/
|
||||
public class AddTurtleTool implements IUndoableAction
|
||||
{
|
||||
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;
|
||||
|
||||
private ITurtleUpgrade upgrade;
|
||||
|
||||
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()
|
||||
{
|
||||
ITurtleUpgrade upgrade = this.upgrade;
|
||||
if( upgrade == null )
|
||||
{
|
||||
Factory factory = kinds.get( kind );
|
||||
if( factory == null )
|
||||
{
|
||||
ComputerCraft.log.error( "Unknown turtle upgrade kind '{}' (this should have been rejected by verify!)", kind );
|
||||
return;
|
||||
}
|
||||
|
||||
upgrade = this.upgrade = factory.create( new ResourceLocation( id ), craftItem, toolItem );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
TurtleUpgrades.register( upgrade );
|
||||
}
|
||||
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 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void undo()
|
||||
{
|
||||
if( upgrade != null ) TurtleUpgrades.remove( upgrade );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String describeUndo()
|
||||
{
|
||||
return String.format( "Removing turtle upgrade %s.", id );
|
||||
}
|
||||
|
||||
public boolean validate( ILogger logger )
|
||||
{
|
||||
TrackingLogger trackLog = new TrackingLogger( logger );
|
||||
|
||||
if( craftItem.isEmpty() ) trackLog.warning( "Crafting item stack is empty." );
|
||||
|
||||
if( craftItem.hasTag() && !craftItem.getTag().isEmpty() ) trackLog.warning( "Crafting item has NBT." );
|
||||
if( toolItem.isEmpty() ) trackLog.error( "Tool item stack is empty." );
|
||||
|
||||
if( !kinds.containsKey( kind ) ) trackLog.error( String.format( "Unknown kind '%s'.", kind ) );
|
||||
|
||||
if( TurtleUpgrades.get( id ) != null )
|
||||
{
|
||||
trackLog.error( String.format( "An upgrade with the same name ('%s') has already been registered.", id ) );
|
||||
}
|
||||
|
||||
return trackLog.isOk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldApplyOn( LogicalSide side )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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 com.blamejared.crafttweaker.api.actions.IUndoableAction;
|
||||
import com.blamejared.crafttweaker.api.logger.ILogger;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.shared.TurtleUpgrades;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fml.LogicalSide;
|
||||
|
||||
/**
|
||||
* Removes a turtle upgrade crafted with the given stack.
|
||||
*/
|
||||
public class RemoveTurtleUpgradeByItem implements IUndoableAction
|
||||
{
|
||||
private final ItemStack stack;
|
||||
private ITurtleUpgrade upgrade;
|
||||
|
||||
public RemoveTurtleUpgradeByItem( ItemStack stack )
|
||||
{
|
||||
this.stack = stack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply()
|
||||
{
|
||||
ITurtleUpgrade upgrade = this.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 void undo()
|
||||
{
|
||||
if( this.upgrade != null ) TurtleUpgrades.enable( upgrade );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String describeUndo()
|
||||
{
|
||||
return String.format( "Adding back turtle upgrades crafted with '%s'", stack );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate( ILogger logger )
|
||||
{
|
||||
if( TurtleUpgrades.get( stack ) == null )
|
||||
{
|
||||
logger.error( String.format( "Unknown turtle upgrade crafted with '%s'.", stack ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldApplyOn( LogicalSide side )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -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.actions;
|
||||
|
||||
import com.blamejared.crafttweaker.api.actions.IUndoableAction;
|
||||
import com.blamejared.crafttweaker.api.logger.ILogger;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.shared.TurtleUpgrades;
|
||||
import net.minecraftforge.fml.LogicalSide;
|
||||
|
||||
/**
|
||||
* Removes a turtle upgrade with the given id.
|
||||
*/
|
||||
public class RemoveTurtleUpgradeByName implements IUndoableAction
|
||||
{
|
||||
private final String id;
|
||||
private ITurtleUpgrade upgrade;
|
||||
|
||||
public RemoveTurtleUpgradeByName( String id )
|
||||
{
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply()
|
||||
{
|
||||
ITurtleUpgrade upgrade = this.upgrade = TurtleUpgrades.get( id );
|
||||
if( upgrade != null ) TurtleUpgrades.disable( upgrade );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String describe()
|
||||
{
|
||||
return String.format( "Remove turtle upgrade '%s'", id );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void undo()
|
||||
{
|
||||
if( this.upgrade != null ) TurtleUpgrades.enable( upgrade );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String describeUndo()
|
||||
{
|
||||
return String.format( "Adding back turtle upgrade '%s'", id );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate( ILogger logger )
|
||||
{
|
||||
if( TurtleUpgrades.get( id ) == null )
|
||||
{
|
||||
logger.error( String.format( "Unknown turtle upgrade '%s'.", id ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldApplyOn( LogicalSide side )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
@@ -76,12 +76,10 @@ public class JEIComputerCraft implements IModPlugin
|
||||
List<ItemStack> upgradeItems = new ArrayList<>();
|
||||
for( ComputerFamily family : MAIN_FAMILIES )
|
||||
{
|
||||
for( ITurtleUpgrade upgrade : TurtleUpgrades.getUpgrades() )
|
||||
{
|
||||
if( !TurtleUpgrades.suitableForFamily( family, upgrade ) ) continue;
|
||||
|
||||
upgradeItems.add( TurtleItemFactory.create( -1, null, -1, family, null, upgrade, 0, null ) );
|
||||
}
|
||||
TurtleUpgrades.getUpgrades()
|
||||
.filter( x -> TurtleUpgrades.suitableForFamily( family, x ) )
|
||||
.map( x -> TurtleItemFactory.create( -1, null, -1, family, null, x, 0, null ) )
|
||||
.forEach( upgradeItems::add );
|
||||
|
||||
for( IPocketUpgrade upgrade : PocketUpgrades.getUpgrades() )
|
||||
{
|
||||
|
@@ -53,15 +53,14 @@ class RecipeResolver implements IRecipeManagerPlugin
|
||||
if( initialised ) return;
|
||||
initialised = true;
|
||||
|
||||
for( ITurtleUpgrade upgrade : TurtleUpgrades.getUpgrades() )
|
||||
{
|
||||
TurtleUpgrades.getUpgrades().forEach( upgrade -> {
|
||||
ItemStack stack = upgrade.getCraftingItem();
|
||||
if( stack.isEmpty() ) continue;
|
||||
if( stack.isEmpty() ) return;
|
||||
|
||||
UpgradeInfo info = new UpgradeInfo( stack, upgrade );
|
||||
upgradeItemLookup.computeIfAbsent( stack.getItem(), k -> new ArrayList<>( 1 ) ).add( info );
|
||||
turtleUpgrades.add( info );
|
||||
}
|
||||
} );
|
||||
|
||||
for( IPocketUpgrade upgrade : PocketUpgrades.getUpgrades() )
|
||||
{
|
||||
|
@@ -66,12 +66,10 @@ public class ItemTurtle extends ItemComputerBase implements ITurtleItem
|
||||
ComputerFamily family = getFamily();
|
||||
|
||||
list.add( create( -1, null, -1, null, null, 0, null ) );
|
||||
for( ITurtleUpgrade upgrade : TurtleUpgrades.getVanillaUpgrades() )
|
||||
{
|
||||
if( !TurtleUpgrades.suitableForFamily( family, upgrade ) ) continue;
|
||||
|
||||
list.add( create( -1, null, -1, null, upgrade, 0, null ) );
|
||||
}
|
||||
TurtleUpgrades.getVanillaUpgrades()
|
||||
.filter( x -> TurtleUpgrades.suitableForFamily( family, x ) )
|
||||
.map( x -> create( -1, null, -1, null, x, 0, null ) )
|
||||
.forEach( list::add );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@@ -7,6 +7,7 @@
|
||||
package dan200.computercraft.shared.turtle.upgrades;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
public class TurtleAxe extends TurtleTool
|
||||
@@ -21,6 +22,11 @@ public class TurtleAxe extends TurtleTool
|
||||
super( id, item );
|
||||
}
|
||||
|
||||
public TurtleAxe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||
{
|
||||
super( id, craftItem, toolItem );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getDamageMultiplier()
|
||||
{
|
||||
|
@@ -35,6 +35,11 @@ public class TurtleHoe extends TurtleTool
|
||||
super( id, item );
|
||||
}
|
||||
|
||||
public TurtleHoe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||
{
|
||||
super( id, craftItem, toolItem );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
||||
{
|
||||
|
@@ -35,6 +35,11 @@ public class TurtleShovel extends TurtleTool
|
||||
super( id, item );
|
||||
}
|
||||
|
||||
public TurtleShovel( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||
{
|
||||
super( id, craftItem, toolItem );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
||||
{
|
||||
|
@@ -10,6 +10,7 @@ import dan200.computercraft.shared.turtle.core.TurtlePlayer;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
@@ -26,6 +27,11 @@ public class TurtleSword extends TurtleTool
|
||||
super( id, item );
|
||||
}
|
||||
|
||||
public TurtleSword( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||
{
|
||||
super( id, craftItem, toolItem );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
||||
{
|
||||
|
@@ -63,6 +63,12 @@ public class TurtleTool extends AbstractTurtleUpgrade
|
||||
this.item = new ItemStack( item );
|
||||
}
|
||||
|
||||
public TurtleTool( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||
{
|
||||
super( id, TurtleUpgradeType.Tool, craftItem );
|
||||
this.item = toolItem;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
@OnlyIn( Dist.CLIENT )
|
||||
@@ -77,7 +83,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
|
||||
);
|
||||
Minecraft mc = Minecraft.getInstance();
|
||||
return Pair.of(
|
||||
mc.getItemRenderer().getItemModelMesher().getItemModel( item ),
|
||||
mc.getItemRenderer().getItemModelMesher().getItemModel( getCraftingItem() ),
|
||||
transform
|
||||
);
|
||||
}
|
||||
|
@@ -93,7 +93,7 @@ if _VERSION == "Lua 5.1" then
|
||||
bxor = bit32.bxor,
|
||||
brshift = bit32.arshift,
|
||||
blshift = bit32.lshift,
|
||||
blogic_rshift = bit32.rshift
|
||||
blogic_rshift = bit32.rshift,
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -184,15 +184,15 @@ function sleep( nTime )
|
||||
expect(1, nTime, "number", "nil")
|
||||
local timer = os.startTimer( nTime or 0 )
|
||||
repeat
|
||||
local sEvent, param = os.pullEvent( "timer" )
|
||||
local _, param = os.pullEvent( "timer" )
|
||||
until param == timer
|
||||
end
|
||||
|
||||
function write( sText )
|
||||
expect(1, sText, "string", "number")
|
||||
|
||||
local w,h = term.getSize()
|
||||
local x,y = term.getCursorPos()
|
||||
local w, h = term.getSize()
|
||||
local x, y = term.getCursorPos()
|
||||
|
||||
local nLinesPrinted = 0
|
||||
local function newLine()
|
||||
@@ -207,13 +207,13 @@ function write( sText )
|
||||
end
|
||||
|
||||
-- Print the line with proper word wrapping
|
||||
while string.len(sText) > 0 do
|
||||
while #sText > 0 do
|
||||
local whitespace = string.match( sText, "^[ \t]+" )
|
||||
if whitespace then
|
||||
-- Print whitespace
|
||||
term.write( whitespace )
|
||||
x,y = term.getCursorPos()
|
||||
sText = string.sub( sText, string.len(whitespace) + 1 )
|
||||
x, y = term.getCursorPos()
|
||||
sText = string.sub( sText, #whitespace + 1 )
|
||||
end
|
||||
|
||||
local newline = string.match( sText, "^\n" )
|
||||
@@ -225,24 +225,24 @@ function write( sText )
|
||||
|
||||
local text = string.match( sText, "^[^ \t\n]+" )
|
||||
if text then
|
||||
sText = string.sub( sText, string.len(text) + 1 )
|
||||
if string.len(text) > w then
|
||||
sText = string.sub( sText, #text + 1 )
|
||||
if #text > w then
|
||||
-- Print a multiline word
|
||||
while string.len( text ) > 0 do
|
||||
while #text > 0 do
|
||||
if x > w then
|
||||
newLine()
|
||||
end
|
||||
term.write( text )
|
||||
text = string.sub( text, (w-x) + 2 )
|
||||
x,y = term.getCursorPos()
|
||||
text = string.sub( text, w - x + 2 )
|
||||
x, y = term.getCursorPos()
|
||||
end
|
||||
else
|
||||
-- Print a word normally
|
||||
if x + string.len(text) - 1 > w then
|
||||
if x + #text - 1 > w then
|
||||
newLine()
|
||||
end
|
||||
term.write( text )
|
||||
x,y = term.getCursorPos()
|
||||
x, y = term.getCursorPos()
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -291,7 +291,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
sLine = ""
|
||||
end
|
||||
local nHistoryPos
|
||||
local nPos = #sLine
|
||||
local nPos, nScroll = #sLine, 0
|
||||
if _sReplaceChar then
|
||||
_sReplaceChar = string.sub( _sReplaceChar, 1, 1 )
|
||||
end
|
||||
@@ -299,7 +299,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
local tCompletions
|
||||
local nCompletion
|
||||
local function recomplete()
|
||||
if _fnComplete and nPos == string.len(sLine) then
|
||||
if _fnComplete and nPos == #sLine then
|
||||
tCompletions = _fnComplete( sLine )
|
||||
if tCompletions and #tCompletions > 0 then
|
||||
nCompletion = 1
|
||||
@@ -321,16 +321,20 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
local sx = term.getCursorPos()
|
||||
|
||||
local function redraw( _bClear )
|
||||
local nScroll = 0
|
||||
if sx + nPos >= w then
|
||||
nScroll = (sx + nPos) - w
|
||||
local cursor_pos = nPos - nScroll
|
||||
if sx + cursor_pos >= w then
|
||||
-- We've moved beyond the RHS, ensure we're on the edge.
|
||||
nScroll = sx + nPos - w
|
||||
elseif cursor_pos < 0 then
|
||||
-- We've moved beyond the LHS, ensure we're on the edge.
|
||||
nScroll = nPos
|
||||
end
|
||||
|
||||
local _, cy = term.getCursorPos()
|
||||
term.setCursorPos( sx, cy )
|
||||
local sReplace = (_bClear and " ") or _sReplaceChar
|
||||
local sReplace = _bClear and " " or _sReplaceChar
|
||||
if sReplace then
|
||||
term.write( string.rep( sReplace, math.max( string.len(sLine) - nScroll, 0 ) ) )
|
||||
term.write( string.rep( sReplace, math.max( #sLine - nScroll, 0 ) ) )
|
||||
else
|
||||
term.write( string.sub( sLine, nScroll + 1 ) )
|
||||
end
|
||||
@@ -345,7 +349,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
term.setBackgroundColor( colors.gray )
|
||||
end
|
||||
if sReplace then
|
||||
term.write( string.rep( sReplace, string.len( sCompletion ) ) )
|
||||
term.write( string.rep( sReplace, #sCompletion ) )
|
||||
else
|
||||
term.write( sCompletion )
|
||||
end
|
||||
@@ -373,7 +377,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
-- Find the common prefix of all the other suggestions which start with the same letter as the current one
|
||||
local sCompletion = tCompletions[ nCompletion ]
|
||||
sLine = sLine .. sCompletion
|
||||
nPos = string.len( sLine )
|
||||
nPos = #sLine
|
||||
|
||||
-- Redraw
|
||||
recomplete()
|
||||
@@ -381,7 +385,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
end
|
||||
end
|
||||
while true do
|
||||
local sEvent, param = os.pullEvent()
|
||||
local sEvent, param, param1, param2 = os.pullEvent()
|
||||
if sEvent == "char" then
|
||||
-- Typed key
|
||||
clear()
|
||||
@@ -394,7 +398,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
-- Pasted text
|
||||
clear()
|
||||
sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 )
|
||||
nPos = nPos + string.len( param )
|
||||
nPos = nPos + #param
|
||||
recomplete()
|
||||
redraw()
|
||||
|
||||
@@ -419,7 +423,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
|
||||
elseif param == keys.right then
|
||||
-- Right
|
||||
if nPos < string.len(sLine) then
|
||||
if nPos < #sLine then
|
||||
-- Move right
|
||||
clear()
|
||||
nPos = nPos + 1
|
||||
@@ -470,10 +474,10 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
end
|
||||
if nHistoryPos then
|
||||
sLine = _tHistory[nHistoryPos]
|
||||
nPos = string.len( sLine )
|
||||
nPos, nScroll = #sLine, 0
|
||||
else
|
||||
sLine = ""
|
||||
nPos = 0
|
||||
nPos, nScroll = 0, 0
|
||||
end
|
||||
uncomplete()
|
||||
redraw()
|
||||
@@ -486,6 +490,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
clear()
|
||||
sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 )
|
||||
nPos = nPos - 1
|
||||
if nScroll > 0 then nScroll = nScroll - 1 end
|
||||
recomplete()
|
||||
redraw()
|
||||
end
|
||||
@@ -501,7 +506,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
|
||||
elseif param == keys.delete then
|
||||
-- Delete
|
||||
if nPos < string.len(sLine) then
|
||||
if nPos < #sLine then
|
||||
clear()
|
||||
sLine = string.sub( sLine, 1, nPos ) .. string.sub( sLine, nPos + 2 )
|
||||
recomplete()
|
||||
@@ -510,9 +515,9 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
|
||||
elseif param == keys["end"] then
|
||||
-- End
|
||||
if nPos < string.len(sLine ) then
|
||||
if nPos < #sLine then
|
||||
clear()
|
||||
nPos = string.len(sLine)
|
||||
nPos = #sLine
|
||||
recomplete()
|
||||
redraw()
|
||||
end
|
||||
@@ -525,9 +530,9 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
|
||||
elseif sEvent == "mouse_click" or sEvent == "mouse_drag" and param == 1 then
|
||||
local _, cy = term.getCursorPos()
|
||||
if param2 >= sx and param2 <= w and param2 == cy then
|
||||
-- Then ensure we don't scroll beyond the current line
|
||||
nPos = math.min(math.max(nScroll + x - sx, 0), #sLine)
|
||||
if param1 >= sx and param1 <= w and param2 == cy then
|
||||
-- Ensure we don't scroll beyond the current line
|
||||
nPos = math.min(math.max(nScroll + param1 - sx, 0), #sLine)
|
||||
redraw()
|
||||
end
|
||||
|
||||
@@ -539,7 +544,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
||||
end
|
||||
end
|
||||
|
||||
local cx, cy = term.getCursorPos()
|
||||
local _, cy = term.getCursorPos()
|
||||
term.setCursorBlink( false )
|
||||
term.setCursorPos( w + 1, cy )
|
||||
print()
|
||||
@@ -608,10 +613,10 @@ function os.loadAPI( _sPath )
|
||||
expect(1, _sPath, "string")
|
||||
local sName = fs.getName( _sPath )
|
||||
if sName:sub(-4) == ".lua" then
|
||||
sName = sName:sub(1,-5)
|
||||
sName = sName:sub(1, -5)
|
||||
end
|
||||
if tAPIsLoading[sName] == true then
|
||||
printError( "API "..sName.." is already being loaded" )
|
||||
printError( "API " .. sName .. " is already being loaded" )
|
||||
return false
|
||||
end
|
||||
tAPIsLoading[sName] = true
|
||||
@@ -631,7 +636,7 @@ function os.loadAPI( _sPath )
|
||||
end
|
||||
|
||||
local tAPI = {}
|
||||
for k,v in pairs( tEnv ) do
|
||||
for k, v in pairs( tEnv ) do
|
||||
if k ~= "_ENV" then
|
||||
tAPI[k] = v
|
||||
end
|
||||
@@ -675,7 +680,8 @@ if http then
|
||||
|
||||
local methods = {
|
||||
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 )
|
||||
@@ -770,7 +776,7 @@ if http then
|
||||
if not ok then return ok, err end
|
||||
|
||||
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
|
||||
end
|
||||
end
|
||||
@@ -803,8 +809,8 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
|
||||
expect(3, bIncludeFiles, "boolean", "nil")
|
||||
expect(4, bIncludeDirs, "boolean", "nil")
|
||||
|
||||
bIncludeFiles = (bIncludeFiles ~= false)
|
||||
bIncludeDirs = (bIncludeDirs ~= false)
|
||||
bIncludeFiles = bIncludeFiles ~= false
|
||||
bIncludeDirs = bIncludeDirs ~= false
|
||||
local sDir = sLocation
|
||||
local nStart = 1
|
||||
local nSlash = string.find( sPath, "[/\\]", nStart )
|
||||
@@ -831,13 +837,13 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
|
||||
end
|
||||
if sDir ~= "" then
|
||||
if sPath == "" then
|
||||
table.insert( tResults, (bIncludeDirs and "..") or "../" )
|
||||
table.insert( tResults, bIncludeDirs and ".." or "../" )
|
||||
elseif sPath == "." then
|
||||
table.insert( tResults, (bIncludeDirs and ".") or "./" )
|
||||
table.insert( tResults, bIncludeDirs and "." or "./" )
|
||||
end
|
||||
end
|
||||
local tFiles = fs.list( sDir )
|
||||
for n=1,#tFiles do
|
||||
for n = 1, #tFiles do
|
||||
local sFile = tFiles[n]
|
||||
if #sFile >= #sName and string.sub( sFile, 1, #sName ) == sName then
|
||||
local bIsDir = fs.isDir( fs.combine( sDir, sFile ) )
|
||||
@@ -862,7 +868,7 @@ end
|
||||
-- Load APIs
|
||||
local bAPIError = false
|
||||
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
|
||||
local sPath = fs.combine( "rom/apis", sFile )
|
||||
if not fs.isDir( sPath ) then
|
||||
@@ -876,7 +882,7 @@ end
|
||||
if turtle and fs.isDir( "rom/apis/turtle" ) then
|
||||
-- Load turtle APIs
|
||||
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
|
||||
local sPath = fs.combine( "rom/apis/turtle", sFile )
|
||||
if not fs.isDir( sPath ) then
|
||||
@@ -891,7 +897,7 @@ end
|
||||
if pocket and fs.isDir( "rom/apis/pocket" ) then
|
||||
-- Load pocket APIs
|
||||
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
|
||||
local sPath = fs.combine( "rom/apis/pocket", sFile )
|
||||
if not fs.isDir( sPath ) then
|
||||
@@ -920,7 +926,7 @@ if commands and fs.isDir( "rom/apis/command" ) then
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
end,
|
||||
}
|
||||
setmetatable( commands, tCaseInsensitiveMetatable )
|
||||
setmetatable( commands.async, tCaseInsensitiveMetatable )
|
||||
@@ -936,12 +942,12 @@ if bAPIError then
|
||||
print( "Press any key to continue" )
|
||||
os.pullEvent( "key" )
|
||||
term.clear()
|
||||
term.setCursorPos( 1,1 )
|
||||
term.setCursorPos( 1, 1 )
|
||||
end
|
||||
|
||||
-- Set default settings
|
||||
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( "edit.autocomplete", true )
|
||||
settings.set( "edit.default_extension", "lua" )
|
||||
|
@@ -23,7 +23,7 @@ function combine( ... )
|
||||
for i = 1, select('#', ...) do
|
||||
local c = select(i, ...)
|
||||
expect(i, c, "number")
|
||||
r = bit32.bor(r,c)
|
||||
r = bit32.bor(r, c)
|
||||
end
|
||||
return r
|
||||
end
|
||||
@@ -50,8 +50,8 @@ function packRGB( r, g, b )
|
||||
expect(2, g, "number")
|
||||
expect(3, b, "number")
|
||||
return
|
||||
bit32.band( r * 255, 0xFF ) * 2^16 +
|
||||
bit32.band( g * 255, 0xFF ) * 2^8 +
|
||||
bit32.band( r * 255, 0xFF ) * 2 ^ 16 +
|
||||
bit32.band( g * 255, 0xFF ) * 2 ^ 8 +
|
||||
bit32.band( b * 255, 0xFF )
|
||||
end
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
-- Colours (for lovers of british spelling)
|
||||
local colours = _ENV
|
||||
for k,v in pairs(colors) do
|
||||
for k, v in pairs(colors) do
|
||||
colours[k] = v
|
||||
end
|
||||
|
||||
|
@@ -62,7 +62,7 @@ end
|
||||
|
||||
function stopAudio( name )
|
||||
if not name then
|
||||
for n,sName in ipairs( peripheral.getNames() ) do
|
||||
for _, sName in ipairs( peripheral.getNames() ) do
|
||||
stopAudio( sName )
|
||||
end
|
||||
else
|
||||
|
@@ -13,7 +13,7 @@ local function trilaterate( A, B, C )
|
||||
local d = a2b:length()
|
||||
local ex = a2b:normalize( )
|
||||
local i = ex:dot( a2c )
|
||||
local ey = (a2c - (ex * i)):normalize()
|
||||
local ey = (a2c - ex * i):normalize()
|
||||
local j = ey:dot( a2c )
|
||||
local ez = ex:cross( ey )
|
||||
|
||||
@@ -21,16 +21,16 @@ local function trilaterate( A, B, C )
|
||||
local r2 = B.nDistance
|
||||
local r3 = C.nDistance
|
||||
|
||||
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 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 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
|
||||
local z = math.sqrt( zSquared )
|
||||
local result1 = result + (ez * z)
|
||||
local result2 = result - (ez * z)
|
||||
local result1 = result + ez * z
|
||||
local result2 = result - ez * z
|
||||
|
||||
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
|
||||
@@ -66,7 +66,7 @@ function locate( _nTimeout, _bDebug )
|
||||
|
||||
-- Find a modem
|
||||
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
|
||||
sModemSide = sSide
|
||||
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
|
||||
local tFix = { vPosition = vector.new( tMessage[1], tMessage[2], tMessage[3] ), nDistance = nDistance }
|
||||
if _bDebug then
|
||||
print( tFix.nDistance.." metres from "..tostring( tFix.vPosition ) )
|
||||
print( tFix.nDistance .. " metres from " .. tostring( tFix.vPosition ) )
|
||||
end
|
||||
if tFix.nDistance == 0 then
|
||||
pos1, pos2 = tFix.vPosition, nil
|
||||
@@ -148,12 +148,12 @@ function locate( _nTimeout, _bDebug )
|
||||
if pos1 and pos2 then
|
||||
if _bDebug then
|
||||
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
|
||||
return nil
|
||||
elseif pos1 then
|
||||
if _bDebug then
|
||||
print( "Position is "..pos1.x..","..pos1.y..","..pos1.z )
|
||||
print( "Position is " .. pos1.x .. "," .. pos1.y .. "," .. pos1.z )
|
||||
end
|
||||
return pos1.x, pos1.y, pos1.z
|
||||
else
|
||||
|
@@ -18,8 +18,8 @@ function lookup( _sTopic )
|
||||
sPath = fs.combine( sPath, _sTopic )
|
||||
if fs.exists( sPath ) and not fs.isDir( sPath ) then
|
||||
return sPath
|
||||
elseif fs.exists( sPath..".txt" ) and not fs.isDir( sPath..".txt" ) then
|
||||
return sPath..".txt"
|
||||
elseif fs.exists( sPath .. ".txt" ) and not fs.isDir( sPath .. ".txt" ) then
|
||||
return sPath .. ".txt"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,18 +30,18 @@ end
|
||||
function topics()
|
||||
-- Add index
|
||||
local tItems = {
|
||||
[ "index" ] = true
|
||||
[ "index" ] = true,
|
||||
}
|
||||
|
||||
-- Add topics from the path
|
||||
for sPath in string.gmatch(sPath, "[^:]+") do
|
||||
if fs.isDir( sPath ) then
|
||||
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 not fs.isDir( fs.combine( sPath, sFile ) ) then
|
||||
if #sFile > 4 and sFile:sub(-4) == ".txt" then
|
||||
sFile = sFile:sub(1,-5)
|
||||
sFile = sFile:sub(1, -5)
|
||||
end
|
||||
tItems[ sFile ] = true
|
||||
end
|
||||
@@ -52,7 +52,7 @@ function topics()
|
||||
|
||||
-- Sort and return
|
||||
local tItemList = {}
|
||||
for sItem, b in pairs( tItems ) do
|
||||
for sItem in pairs( tItems ) do
|
||||
table.insert( tItemList, sItem )
|
||||
end
|
||||
table.sort( tItemList )
|
||||
@@ -63,7 +63,7 @@ function completeTopic( sText )
|
||||
expect(1, sText, "string")
|
||||
local tTopics = topics()
|
||||
local tResults = {}
|
||||
for n=1,#tTopics do
|
||||
for n = 1, #tTopics do
|
||||
local sTopic = tTopics[n]
|
||||
if #sTopic > #sText and string.sub( sTopic, 1, #sText ) == sText then
|
||||
table.insert( tResults, string.sub( sTopic, #sText + 1 ) )
|
||||
|
@@ -129,11 +129,11 @@ handleMetatable = {
|
||||
}
|
||||
|
||||
local defaultInput = setmetatable({
|
||||
_handle = { readLine = _G.read }
|
||||
_handle = { readLine = _G.read },
|
||||
}, handleMetatable)
|
||||
|
||||
local defaultOutput = setmetatable({
|
||||
_handle = { write = _G.write }
|
||||
_handle = { write = _G.write },
|
||||
}, handleMetatable)
|
||||
|
||||
local defaultError = setmetatable({
|
||||
@@ -147,7 +147,7 @@ local defaultError = setmetatable({
|
||||
_G.write(...)
|
||||
if term.isColour() then term.setTextColour(oldColour) end
|
||||
end,
|
||||
}
|
||||
},
|
||||
}, handleMetatable)
|
||||
|
||||
local currentInput = defaultInput
|
||||
|
@@ -6,14 +6,14 @@ local function drawPixelInternal( xPos, yPos )
|
||||
end
|
||||
|
||||
local tColourLookup = {}
|
||||
for n=1,16 do
|
||||
tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1)
|
||||
for n = 1, 16 do
|
||||
tColourLookup[ string.byte( "0123456789abcdef", n, n ) ] = 2 ^ (n - 1)
|
||||
end
|
||||
|
||||
local function parseLine( tImageArg, sLine )
|
||||
local tLine = {}
|
||||
for x=1,sLine:len() do
|
||||
tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0
|
||||
for x = 1, sLine:len() do
|
||||
tLine[x] = tColourLookup[ string.byte(sLine, x, x) ] or 0
|
||||
end
|
||||
table.insert( tImageArg, tLine )
|
||||
end
|
||||
@@ -89,7 +89,7 @@ function drawLine( startX, startY, endX, endY, nColour )
|
||||
if xDiff > math.abs(yDiff) then
|
||||
local y = minY
|
||||
local dy = yDiff / xDiff
|
||||
for x=minX,maxX do
|
||||
for x = minX, maxX do
|
||||
drawPixelInternal( x, math.floor( y + 0.5 ) )
|
||||
y = y + dy
|
||||
end
|
||||
@@ -97,12 +97,12 @@ function drawLine( startX, startY, endX, endY, nColour )
|
||||
local x = minX
|
||||
local dx = xDiff / yDiff
|
||||
if maxY >= minY then
|
||||
for y=minY,maxY do
|
||||
for y = minY, maxY do
|
||||
drawPixelInternal( math.floor( x + 0.5 ), y )
|
||||
x = x + dx
|
||||
end
|
||||
else
|
||||
for y=minY,maxY,-1 do
|
||||
for y = minY, maxY, -1 do
|
||||
drawPixelInternal( math.floor( x + 0.5 ), y )
|
||||
x = x - dx
|
||||
end
|
||||
@@ -142,13 +142,13 @@ function drawBox( startX, startY, endX, endY, nColour )
|
||||
maxY = startY
|
||||
end
|
||||
|
||||
for x=minX,maxX do
|
||||
for x = minX, maxX do
|
||||
drawPixelInternal( x, minY )
|
||||
drawPixelInternal( x, maxY )
|
||||
end
|
||||
|
||||
if (maxY - minY) >= 2 then
|
||||
for y=(minY+1),(maxY-1) do
|
||||
if maxY - minY >= 2 then
|
||||
for y = minY + 1, maxY - 1 do
|
||||
drawPixelInternal( minX, y )
|
||||
drawPixelInternal( maxX, y )
|
||||
end
|
||||
@@ -187,8 +187,8 @@ function drawFilledBox( startX, startY, endX, endY, nColour )
|
||||
maxY = startY
|
||||
end
|
||||
|
||||
for x=minX,maxX do
|
||||
for y=minY,maxY do
|
||||
for x = minX, maxX do
|
||||
for y = minY, maxY do
|
||||
drawPixelInternal( x, y )
|
||||
end
|
||||
end
|
||||
@@ -198,9 +198,9 @@ function drawImage( tImage, xPos, yPos )
|
||||
expect(1, tImage, "table")
|
||||
expect(2, xPos, "number")
|
||||
expect(3, yPos, "number")
|
||||
for y=1,#tImage do
|
||||
for y = 1, #tImage do
|
||||
local tLine = tImage[y]
|
||||
for x=1,#tLine do
|
||||
for x = 1, #tLine do
|
||||
if tLine[x] > 0 then
|
||||
term.setBackgroundColor( tLine[x] )
|
||||
drawPixelInternal( x + xPos - 1, y + yPos - 1 )
|
||||
|
@@ -21,7 +21,7 @@ local function runUntilLimit( _routines, _limit )
|
||||
local tFilters = {}
|
||||
local eventData = { n = 0 }
|
||||
while true do
|
||||
for n=1,count do
|
||||
for n = 1, count do
|
||||
local r = _routines[n]
|
||||
if r 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
|
||||
for n=1,count do
|
||||
for n = 1, count do
|
||||
local r = _routines[n]
|
||||
if r and coroutine.status( r ) == "dead" then
|
||||
_routines[n] = nil
|
||||
|
@@ -4,12 +4,12 @@ local native = peripheral
|
||||
|
||||
function getNames()
|
||||
local tResults = {}
|
||||
for n,sSide in ipairs( rs.getSides() ) do
|
||||
for _, sSide in ipairs( rs.getSides() ) do
|
||||
if native.isPresent( sSide ) then
|
||||
table.insert( tResults, sSide )
|
||||
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
||||
local tRemote = native.call( sSide, "getNamesRemote" )
|
||||
for n,sName in ipairs( tRemote ) do
|
||||
for _, sName in ipairs( tRemote ) do
|
||||
table.insert( tResults, sName )
|
||||
end
|
||||
end
|
||||
@@ -23,7 +23,7 @@ function isPresent( _sSide )
|
||||
if native.isPresent( _sSide ) then
|
||||
return true
|
||||
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.call( sSide, "isPresentRemote", _sSide ) then
|
||||
return true
|
||||
@@ -38,7 +38,7 @@ function getType( _sSide )
|
||||
if native.isPresent( _sSide ) then
|
||||
return native.getType( _sSide )
|
||||
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.call( sSide, "isPresentRemote", _sSide ) then
|
||||
return native.call( sSide, "getTypeRemote", _sSide )
|
||||
@@ -53,7 +53,7 @@ function getMethods( _sSide )
|
||||
if native.isPresent( _sSide ) then
|
||||
return native.getMethods( _sSide )
|
||||
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.call( sSide, "isPresentRemote", _sSide ) then
|
||||
return native.call( sSide, "getMethodsRemote", _sSide )
|
||||
@@ -69,7 +69,7 @@ function call( _sSide, _sMethod, ... )
|
||||
if native.isPresent( _sSide ) then
|
||||
return native.call( _sSide, _sMethod, ... )
|
||||
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.call( sSide, "isPresentRemote", _sSide ) then
|
||||
return native.call( sSide, "callRemote", _sSide, _sMethod, ... )
|
||||
@@ -84,7 +84,7 @@ function wrap( _sSide )
|
||||
if peripheral.isPresent( _sSide ) then
|
||||
local tMethods = peripheral.getMethods( _sSide )
|
||||
local tResult = {}
|
||||
for n,sMethod in ipairs( tMethods ) do
|
||||
for _, sMethod in ipairs( tMethods ) do
|
||||
tResult[sMethod] = function( ... )
|
||||
return peripheral.call( _sSide, sMethod, ... )
|
||||
end
|
||||
@@ -98,7 +98,7 @@ function find( sType, fnFilter )
|
||||
expect(1, sType, "string")
|
||||
expect(2, fnFilter, "function", "nil")
|
||||
local tResults = {}
|
||||
for n,sName in ipairs( peripheral.getNames() ) do
|
||||
for _, sName in ipairs( peripheral.getNames() ) do
|
||||
if peripheral.getType( sName ) == sType then
|
||||
local wrapped = peripheral.wrap( sName )
|
||||
if fnFilter == nil or fnFilter( sName, wrapped ) then
|
||||
|
@@ -10,7 +10,7 @@ local tHostnames = {}
|
||||
function open( sModem )
|
||||
expect(1, sModem, "string")
|
||||
if peripheral.getType( sModem ) ~= "modem" then
|
||||
error( "No such modem: "..sModem, 2 )
|
||||
error( "No such modem: " .. sModem, 2 )
|
||||
end
|
||||
peripheral.call( sModem, "open", os.getComputerID() )
|
||||
peripheral.call( sModem, "open", CHANNEL_BROADCAST )
|
||||
@@ -21,13 +21,13 @@ function close( sModem )
|
||||
if sModem then
|
||||
-- Close a specific modem
|
||||
if peripheral.getType( sModem ) ~= "modem" then
|
||||
error( "No such modem: "..sModem, 2 )
|
||||
error( "No such modem: " .. sModem, 2 )
|
||||
end
|
||||
peripheral.call( sModem, "close", os.getComputerID() )
|
||||
peripheral.call( sModem, "close", CHANNEL_BROADCAST )
|
||||
else
|
||||
-- Close all modems
|
||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
||||
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||
if isOpen( sModem ) then
|
||||
close( sModem )
|
||||
end
|
||||
@@ -44,7 +44,7 @@ function isOpen( sModem )
|
||||
end
|
||||
else
|
||||
-- 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
|
||||
return true
|
||||
end
|
||||
@@ -79,10 +79,10 @@ function send( nRecipient, message, sProtocol )
|
||||
sent = true
|
||||
else
|
||||
-- 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
|
||||
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage );
|
||||
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage );
|
||||
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage )
|
||||
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage )
|
||||
sent = true
|
||||
end
|
||||
end
|
||||
|
@@ -17,7 +17,7 @@ local copy
|
||||
function copy( value )
|
||||
if type(value) == "table" then
|
||||
local result = {}
|
||||
for k,v in pairs(value) do
|
||||
for k, v in pairs(value) do
|
||||
result[k] = copy(v)
|
||||
end
|
||||
return result
|
||||
@@ -47,7 +47,7 @@ end
|
||||
|
||||
function getNames()
|
||||
local result = {}
|
||||
for k,v in pairs( tSettings ) do
|
||||
for k in pairs( tSettings ) do
|
||||
result[ #result + 1 ] = k
|
||||
end
|
||||
table.sort(result)
|
||||
@@ -69,7 +69,7 @@ function load( sPath )
|
||||
return false
|
||||
end
|
||||
|
||||
for k,v in pairs(tFile) do
|
||||
for k, v in pairs(tFile) do
|
||||
if type(k) == "string" and
|
||||
(type(v) == "string" or type(v) == "number" or type(v) == "boolean" or type(v) == "table") then
|
||||
set( k, v )
|
||||
|
@@ -1,6 +1,6 @@
|
||||
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 function wrap( _sFunction )
|
||||
@@ -16,11 +16,11 @@ term.redirect = function( target )
|
||||
if target == term or target == _G.term then
|
||||
error( "term is not a recommended redirect target, try term.current() instead", 2 )
|
||||
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( target[k] ) ~= "function" then
|
||||
target[k] = function()
|
||||
error( "Redirect object is missing method "..k..".", 2 )
|
||||
error( "Redirect object is missing method " .. k .. ".", 2 )
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -48,13 +48,13 @@ for _, method in ipairs { "nativePaletteColor", "nativePaletteColour"} do
|
||||
native[method] = nil
|
||||
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
|
||||
term[k] = wrap( k )
|
||||
end
|
||||
end
|
||||
|
||||
local env = _ENV
|
||||
for k,v in pairs( term ) do
|
||||
for k, v in pairs( term ) do
|
||||
env[k] = v
|
||||
end
|
||||
|
@@ -9,14 +9,14 @@ function slowWrite( sText, nRate )
|
||||
local nSleep = 1 / nRate
|
||||
|
||||
sText = tostring( sText )
|
||||
local x,y = term.getCursorPos()
|
||||
local len = string.len( sText )
|
||||
local x, y = term.getCursorPos()
|
||||
local len = #sText
|
||||
|
||||
for n=1,len do
|
||||
for n = 1, len do
|
||||
term.setCursorPos( x, y )
|
||||
sleep( nSleep )
|
||||
local nLines = write( string.sub( sText, 1, n ) )
|
||||
local newX, newY = term.getCursorPos()
|
||||
local _, newY = term.getCursorPos()
|
||||
y = newY - nLines
|
||||
end
|
||||
end
|
||||
@@ -42,7 +42,7 @@ function formatTime( nTime, bTwentyFourHour )
|
||||
end
|
||||
|
||||
local nHour = math.floor(nTime)
|
||||
local nMinute = math.floor((nTime - nHour)*60)
|
||||
local nMinute = math.floor((nTime - nHour) * 60)
|
||||
if sTOD then
|
||||
return string.format( "%d:%02d %s", nHour, nMinute, sTOD )
|
||||
else
|
||||
@@ -54,11 +54,11 @@ local function makePagedScroll( _term, _nFreeLines )
|
||||
local nativeScroll = _term.scroll
|
||||
local nFreeLines = _nFreeLines or 0
|
||||
return function( _n )
|
||||
for n=1,_n do
|
||||
for _ = 1, _n do
|
||||
nativeScroll( 1 )
|
||||
|
||||
if nFreeLines <= 0 then
|
||||
local w,h = _term.getSize()
|
||||
local _, h = _term.getSize()
|
||||
_term.setCursorPos( 1, h )
|
||||
_term.write( "Press any key to continue" )
|
||||
os.pullEvent( "key" )
|
||||
@@ -76,7 +76,7 @@ function pagedPrint( _sText, _nFreeLines )
|
||||
-- Setup a redirector
|
||||
local oldTerm = term.current()
|
||||
local newTerm = {}
|
||||
for k,v in pairs( oldTerm ) do
|
||||
for k, v in pairs( oldTerm ) do
|
||||
newTerm[k] = v
|
||||
end
|
||||
newTerm.scroll = makePagedScroll( oldTerm, _nFreeLines )
|
||||
@@ -108,22 +108,22 @@ local function tabulateCommon( bPaged, ... )
|
||||
expect(i, tAll[i], "number", "table")
|
||||
end
|
||||
|
||||
local w,h = term.getSize()
|
||||
local w, h = term.getSize()
|
||||
local nMaxLen = w / 8
|
||||
for n, t in ipairs( tAll ) do
|
||||
if type(t) == "table" then
|
||||
for nu, sItem in pairs(t) do
|
||||
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
|
||||
nMaxLen = math.max( string.len( sItem ) + 1, nMaxLen )
|
||||
nMaxLen = math.max( #sItem + 1, nMaxLen )
|
||||
end
|
||||
end
|
||||
end
|
||||
local nCols = math.floor( w / nMaxLen )
|
||||
local nLines = 0
|
||||
local function newLine()
|
||||
if bPaged and nLines >= (h-3) then
|
||||
if bPaged and nLines >= h - 3 then
|
||||
pagedPrint()
|
||||
else
|
||||
print()
|
||||
@@ -133,14 +133,14 @@ local function tabulateCommon( bPaged, ... )
|
||||
|
||||
local function drawCols( _t )
|
||||
local nCol = 1
|
||||
for n, s in ipairs( _t ) do
|
||||
for _, s in ipairs( _t ) do
|
||||
if nCol > nCols then
|
||||
nCol = 1
|
||||
newLine()
|
||||
end
|
||||
|
||||
local cx, cy = term.getCursorPos()
|
||||
cx = 1 + ((nCol - 1) * nMaxLen)
|
||||
cx = 1 + (nCol - 1) * nMaxLen
|
||||
term.setCursorPos( cx, cy )
|
||||
term.write( s )
|
||||
|
||||
@@ -148,7 +148,7 @@ local function tabulateCommon( bPaged, ... )
|
||||
end
|
||||
print()
|
||||
end
|
||||
for n, t in ipairs( tAll ) do
|
||||
for _, t in ipairs( tAll ) do
|
||||
if type(t) == "table" then
|
||||
if #t > 0 then
|
||||
drawCols( t )
|
||||
@@ -207,11 +207,11 @@ local function serializeImpl( t, tTracking, sIndent )
|
||||
local sResult = "{\n"
|
||||
local sSubIndent = sIndent .. " "
|
||||
local tSeen = {}
|
||||
for k,v in ipairs(t) do
|
||||
for k, v in ipairs(t) do
|
||||
tSeen[k] = true
|
||||
sResult = sResult .. sSubIndent .. serializeImpl( v, tTracking, sSubIndent ) .. ",\n"
|
||||
end
|
||||
for k,v in pairs(t) do
|
||||
for k, v in pairs(t) do
|
||||
if not tSeen[k] then
|
||||
local sEntry
|
||||
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)
|
||||
|
||||
else
|
||||
error( "Cannot serialize type "..sType, 0 )
|
||||
error( "Cannot serialize type " .. sType, 0 )
|
||||
|
||||
end
|
||||
end
|
||||
@@ -241,7 +241,7 @@ end
|
||||
empty_json_array = setmetatable({}, {
|
||||
__newindex = function()
|
||||
error("attempt to mutate textutils.empty_json_array", 2)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
||||
@@ -264,7 +264,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
||||
local sArrayResult = "["
|
||||
local nObjectSize = 0
|
||||
local nArraySize = 0
|
||||
for k,v in pairs(t) do
|
||||
for k, v in pairs(t) do
|
||||
if type(k) == "string" then
|
||||
local sEntry
|
||||
if bNBTStyle then
|
||||
@@ -280,7 +280,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
||||
nObjectSize = nObjectSize + 1
|
||||
end
|
||||
end
|
||||
for n,v in ipairs(t) do
|
||||
for _, v in ipairs(t) do
|
||||
local sEntry = serializeJSONImpl( v, tTracking, bNBTStyle )
|
||||
if nArraySize == 0 then
|
||||
sArrayResult = sArrayResult .. sEntry
|
||||
@@ -305,7 +305,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
||||
return tostring(t)
|
||||
|
||||
else
|
||||
error( "Cannot serialize type "..sType, 0 )
|
||||
error( "Cannot serialize type " .. sType, 0 )
|
||||
|
||||
end
|
||||
end
|
||||
@@ -317,7 +317,7 @@ end
|
||||
|
||||
function unserialize( s )
|
||||
expect(1, s, "string")
|
||||
local func = load( "return "..s, "unserialize", "t", {} )
|
||||
local func = load( "return " .. s, "unserialize", "t", {} )
|
||||
if func then
|
||||
local ok, result = pcall( func )
|
||||
if ok then
|
||||
@@ -346,7 +346,7 @@ function urlEncode( str )
|
||||
else
|
||||
-- Non-ASCII (encode as UTF-8)
|
||||
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 ) )
|
||||
end
|
||||
end )
|
||||
@@ -388,12 +388,12 @@ function complete( sSearchText, tSearchTable )
|
||||
end
|
||||
|
||||
local sPart = string.sub( sSearchText, nStart )
|
||||
local nPartLength = string.len( sPart )
|
||||
local nPartLength = #sPart
|
||||
|
||||
local tResults = {}
|
||||
local tSeen = {}
|
||||
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 string.find( k, sPart, 1, true ) == 1 then
|
||||
if not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then
|
||||
|
@@ -20,7 +20,7 @@ end
|
||||
|
||||
-- Put commands into environment table
|
||||
local env = _ENV
|
||||
for k,v in pairs( native ) do
|
||||
for k, v in pairs( native ) do
|
||||
if k == "equipLeft" or k == "equipRight" then
|
||||
env[k] = function( ... )
|
||||
local result, err = v( ... )
|
||||
|
@@ -36,17 +36,17 @@ local vector = {
|
||||
)
|
||||
end,
|
||||
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,
|
||||
cross = function( self, o )
|
||||
return vector.new(
|
||||
self.y*o.z - self.z*o.y,
|
||||
self.z*o.x - self.x*o.z,
|
||||
self.x*o.y - self.y*o.x
|
||||
self.y * o.z - self.z * o.y,
|
||||
self.z * o.x - self.x * o.z,
|
||||
self.x * o.y - self.y * o.x
|
||||
)
|
||||
end,
|
||||
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,
|
||||
normalize = function( self )
|
||||
return self:mul( 1 / self:length() )
|
||||
@@ -54,13 +54,13 @@ local vector = {
|
||||
round = function( self, nTolerance )
|
||||
nTolerance = nTolerance or 1.0
|
||||
return vector.new(
|
||||
math.floor( (self.x + (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.x + nTolerance * 0.5) / nTolerance ) * nTolerance,
|
||||
math.floor( (self.y + nTolerance * 0.5) / nTolerance ) * nTolerance,
|
||||
math.floor( (self.z + nTolerance * 0.5) / nTolerance ) * nTolerance
|
||||
)
|
||||
end,
|
||||
tostring = function( self )
|
||||
return self.x..","..self.y..","..self.z
|
||||
return self.x .. "," .. self.y .. "," .. self.z
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ function new( x, y, z )
|
||||
local v = {
|
||||
x = tonumber(x) or 0,
|
||||
y = tonumber(y) or 0,
|
||||
z = tonumber(z) or 0
|
||||
z = tonumber(z) or 0,
|
||||
}
|
||||
setmetatable( v, vmetatable )
|
||||
return v
|
||||
|
@@ -39,8 +39,8 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
local tEmptyColorLines = {}
|
||||
local function createEmptyLines( nWidth )
|
||||
sEmptySpaceLine = string_rep( " ", nWidth )
|
||||
for n=0,15 do
|
||||
local nColor = 2^n
|
||||
for n = 0, 15 do
|
||||
local nColor = 2 ^ n
|
||||
local sHex = tHex[nColor]
|
||||
tEmptyColorLines[nColor] = string_rep( sHex, nWidth )
|
||||
end
|
||||
@@ -49,7 +49,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
createEmptyLines( nWidth )
|
||||
|
||||
-- Setup
|
||||
local bVisible = (bStartVisible ~= false)
|
||||
local bVisible = bStartVisible ~= false
|
||||
local nCursorX = 1
|
||||
local nCursorY = 1
|
||||
local bCursorBlink = false
|
||||
@@ -61,7 +61,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
local sEmptyText = sEmptySpaceLine
|
||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||
for y=1,nHeight do
|
||||
for y = 1, nHeight do
|
||||
tLines[y] = {
|
||||
text = sEmptyText,
|
||||
textColor = sEmptyTextColor,
|
||||
@@ -69,7 +69,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
}
|
||||
end
|
||||
|
||||
for i=0,15 do
|
||||
for i = 0, 15 do
|
||||
local c = 2 ^ i
|
||||
tPalette[c] = { parent.getPaletteColour( c ) }
|
||||
end
|
||||
@@ -100,13 +100,13 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
end
|
||||
|
||||
local function redraw()
|
||||
for n=1,nHeight do
|
||||
for n = 1, nHeight do
|
||||
redrawLine( n )
|
||||
end
|
||||
end
|
||||
|
||||
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] )
|
||||
end
|
||||
end
|
||||
@@ -204,7 +204,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
local sEmptyText = sEmptySpaceLine
|
||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||
for y=1,nHeight do
|
||||
for y = 1, nHeight do
|
||||
tLines[y] = {
|
||||
text = sEmptyText,
|
||||
textColor = sEmptyTextColor,
|
||||
@@ -351,7 +351,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
local sEmptyText = sEmptySpaceLine
|
||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||
for newY=1,nHeight do
|
||||
for newY = 1, nHeight do
|
||||
local y = newY + n
|
||||
if y >= 1 and y <= nHeight then
|
||||
tNewLines[newY] = tLines[y]
|
||||
@@ -451,12 +451,12 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
||||
local sEmptyText = sEmptySpaceLine
|
||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||
for y=1,nNewHeight do
|
||||
for y = 1, nNewHeight do
|
||||
if y > nHeight then
|
||||
tNewLines[y] = {
|
||||
text = sEmptyText,
|
||||
textColor = sEmptyTextColor,
|
||||
backgroundColor = sEmptyBackgroundColor
|
||||
backgroundColor = sEmptyBackgroundColor,
|
||||
}
|
||||
else
|
||||
local tOldLine = tLines[y]
|
||||
|
@@ -1,3 +1,16 @@
|
||||
# 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
|
||||
|
||||
* Fix crashes when using the mouse with advanced computers.
|
||||
|
||||
# New features in CC: Tweaked 1.85.1
|
||||
|
||||
* Add basic mouse support to `read`
|
||||
|
@@ -1,11 +1,10 @@
|
||||
New features in CC: Tweaked 1.85.1
|
||||
New features in CC: Tweaked 1.86.0
|
||||
|
||||
* Add basic mouse support to `read`
|
||||
* 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 turtles not having breaking particles.
|
||||
* Correct rendering of monitors when underwater.
|
||||
* Adjust the position from where turtle performs actions, correcting the behaviour of some interactions.
|
||||
* Fix several crashes when the turtle performs some action.
|
||||
* Fix crash when interacting with Wearable Backpacks.
|
||||
|
||||
Type "help changelog" to see the full version history.
|
||||
|
@@ -1,7 +1,7 @@
|
||||
View the source code at https://github.com/SquidDev-CC/CC-Tweaked
|
||||
View the documentation at https://wiki.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".
|
||||
Want to see hidden files? Run "set list.show_hidden true".
|
||||
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 use "wget run <url>" to run a program 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!
|
||||
|
@@ -2,7 +2,7 @@ local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
||||
|
||||
-- Setup process switching
|
||||
local parentTerm = term.current()
|
||||
local w,h = parentTerm.getSize()
|
||||
local w, h = parentTerm.getSize()
|
||||
|
||||
local tProcesses = {}
|
||||
local nCurrentProcess = nil
|
||||
@@ -55,7 +55,7 @@ local function launchProcess( bFocus, tProgramEnv, sProgramPath, ... )
|
||||
local tProcess = {}
|
||||
tProcess.sTitle = fs.getName( sProgramPath )
|
||||
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
|
||||
tProcess.window = window.create( parentTerm, 1, 1, w, h, false )
|
||||
end
|
||||
@@ -102,7 +102,7 @@ end
|
||||
|
||||
local function cullProcesses()
|
||||
local culled = false
|
||||
for n=#tProcesses,1,-1 do
|
||||
for n = #tProcesses, 1, -1 do
|
||||
culled = culled or cullProcess( n )
|
||||
end
|
||||
return culled
|
||||
@@ -132,7 +132,7 @@ local function redrawMenu()
|
||||
parentTerm.write( "<" )
|
||||
nCharCount = 1
|
||||
end
|
||||
for n=nScrollPos,#tProcesses do
|
||||
for n = nScrollPos, #tProcesses do
|
||||
if n == nCurrentProcess then
|
||||
parentTerm.setTextColor( menuMainTextColor )
|
||||
parentTerm.setBackgroundColor( menuMainBgColor )
|
||||
@@ -165,15 +165,14 @@ local function resizeWindows()
|
||||
local windowY, windowHeight
|
||||
if bShowMenu then
|
||||
windowY = 2
|
||||
windowHeight = h-1
|
||||
windowHeight = h - 1
|
||||
else
|
||||
windowY = 1
|
||||
windowHeight = h
|
||||
end
|
||||
for n=1,#tProcesses do
|
||||
for n = 1, #tProcesses do
|
||||
local tProcess = tProcesses[n]
|
||||
local window = tProcess.window
|
||||
local x,y = tProcess.window.getCursorPos()
|
||||
local x, y = tProcess.window.getCursorPos()
|
||||
if y > windowHeight then
|
||||
tProcess.window.scroll( y - windowHeight )
|
||||
tProcess.window.setCursorPos( x, windowHeight )
|
||||
@@ -232,7 +231,7 @@ function multishell.launch( tProgramEnv, sProgramPath, ... )
|
||||
expect(1, tProgramEnv, "table")
|
||||
expect(2, sProgramPath, "string")
|
||||
local previousTerm = term.current()
|
||||
setMenuVisible( (#tProcesses + 1) >= 2 )
|
||||
setMenuVisible( #tProcesses + 1 >= 2 )
|
||||
local nResult = launchProcess( false, tProgramEnv, sProgramPath, ... )
|
||||
redrawMenu()
|
||||
term.redirect( previousTerm )
|
||||
@@ -258,7 +257,7 @@ while #tProcesses > 0 do
|
||||
local sEvent = tEventData[1]
|
||||
if sEvent == "term_resize" then
|
||||
-- Resize event
|
||||
w,h = parentTerm.getSize()
|
||||
w, h = parentTerm.getSize()
|
||||
resizeWindows()
|
||||
redrawMenu()
|
||||
|
||||
@@ -287,8 +286,8 @@ while #tProcesses > 0 do
|
||||
if nScrollPos ~= 1 then
|
||||
tabStart = 2
|
||||
end
|
||||
for n=nScrollPos,#tProcesses do
|
||||
local tabEnd = tabStart + string.len( tProcesses[n].sTitle ) + 1
|
||||
for n = nScrollPos, #tProcesses do
|
||||
local tabEnd = tabStart + #tProcesses[n].sTitle + 1
|
||||
if x >= tabStart and x <= tabEnd then
|
||||
selectProcess( n )
|
||||
redrawMenu()
|
||||
@@ -299,7 +298,7 @@ while #tProcesses > 0 do
|
||||
end
|
||||
else
|
||||
-- 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
|
||||
setMenuVisible( #tProcesses >= 2 )
|
||||
redrawMenu()
|
||||
@@ -319,7 +318,7 @@ while #tProcesses > 0 do
|
||||
end
|
||||
elseif not (bShowMenu and y == 1) then
|
||||
-- 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
|
||||
setMenuVisible( #tProcesses >= 2 )
|
||||
redrawMenu()
|
||||
@@ -330,7 +329,7 @@ while #tProcesses > 0 do
|
||||
-- Other event
|
||||
-- Passthrough to all processes
|
||||
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 ) )
|
||||
end
|
||||
if cullProcesses() then
|
||||
@@ -342,7 +341,7 @@ while #tProcesses > 0 do
|
||||
if bWindowsResized then
|
||||
-- Pass term_resize to all processes
|
||||
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" )
|
||||
end
|
||||
bWindowsResized = false
|
||||
|
@@ -19,7 +19,7 @@ else
|
||||
local tAliases = shell.aliases()
|
||||
local tList = {}
|
||||
for sAlias, sCommand in pairs( tAliases ) do
|
||||
table.insert( tList, sAlias..":"..sCommand )
|
||||
table.insert( tList, sAlias .. ":" .. sCommand )
|
||||
end
|
||||
table.sort( tList )
|
||||
textutils.pagedTabulate( tList )
|
||||
|
@@ -1,6 +1,6 @@
|
||||
|
||||
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
|
||||
table.insert( tApis, k )
|
||||
end
|
||||
|
@@ -18,7 +18,7 @@ local function printSuccess( text )
|
||||
end
|
||||
|
||||
local sCommand = string.lower( tArgs[1] )
|
||||
for n=2,#tArgs do
|
||||
for n = 2, #tArgs do
|
||||
sCommand = sCommand .. " " .. tArgs[n]
|
||||
end
|
||||
|
||||
@@ -26,14 +26,14 @@ local bResult, tOutput = commands.exec( sCommand )
|
||||
if bResult then
|
||||
printSuccess( "Success" )
|
||||
if #tOutput > 0 then
|
||||
for n=1,#tOutput do
|
||||
for n = 1, #tOutput do
|
||||
print( tOutput[n] )
|
||||
end
|
||||
end
|
||||
else
|
||||
printError( "Failed" )
|
||||
if #tOutput > 0 then
|
||||
for n=1,#tOutput do
|
||||
for n = 1, #tOutput do
|
||||
print( tOutput[n] )
|
||||
end
|
||||
end
|
||||
|
@@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
|
||||
local sDest = shell.resolve( tArgs[2] )
|
||||
local tFiles = fs.find( sSource )
|
||||
if #tFiles > 0 then
|
||||
for n,sFile in ipairs( tFiles ) do
|
||||
for _, sFile in ipairs( tFiles ) do
|
||||
if fs.isDir( sDest ) then
|
||||
fs.copy( sFile, fs.combine( sDest, fs.getName(sFile) ) )
|
||||
elseif #tFiles == 1 then
|
||||
|
@@ -8,7 +8,7 @@ end
|
||||
for i = 1, args.n do
|
||||
local files = fs.find(shell.resolve(args[i]))
|
||||
if #files > 0 then
|
||||
for n, file in ipairs(files) do
|
||||
for _, file in ipairs(files) do
|
||||
local ok, err = pcall(fs.delete, file)
|
||||
if not ok then
|
||||
printError((err:gsub("^pcall: ", "")))
|
||||
|
@@ -10,9 +10,9 @@ if fs.exists( sPath ) then
|
||||
write( fs.getDrive( sPath ) .. " (" )
|
||||
local nSpace = fs.getFreeSpace( sPath )
|
||||
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
|
||||
print( (math.floor( nSpace / 100 ) / 10) .. "KB remaining)" )
|
||||
print( math.floor( nSpace / 100 ) / 10 .. "KB remaining)" )
|
||||
else
|
||||
print( nSpace .. "B remaining)" )
|
||||
end
|
||||
|
@@ -21,9 +21,9 @@ if not fs.exists( sPath ) and not string.find( sPath, "%." ) then
|
||||
end
|
||||
end
|
||||
|
||||
local x,y = 1,1
|
||||
local w,h = term.getSize()
|
||||
local scrollX, scrollY = 0,0
|
||||
local x, y = 1, 1
|
||||
local w, h = term.getSize()
|
||||
local scrollX, scrollY = 0, 0
|
||||
|
||||
local tLines = {}
|
||||
local bRunning = true
|
||||
@@ -62,7 +62,7 @@ end
|
||||
table.insert( tMenuItems, "Exit" )
|
||||
|
||||
local sStatus = "Press Ctrl to access menu"
|
||||
if string.len( sStatus ) > w - 5 then
|
||||
if #sStatus > w - 5 then
|
||||
sStatus = "Press Ctrl for menu"
|
||||
end
|
||||
|
||||
@@ -95,11 +95,11 @@ local function save( _sPath )
|
||||
local function innerSave()
|
||||
file, fileerr = fs.open( _sPath, "w" )
|
||||
if file then
|
||||
for n, sLine in ipairs( tLines ) do
|
||||
for _, sLine in ipairs( tLines ) do
|
||||
file.write( sLine .. "\n" )
|
||||
end
|
||||
else
|
||||
error( "Failed to open ".._sPath )
|
||||
error( "Failed to open " .. _sPath )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -130,7 +130,7 @@ local tKeywords = {
|
||||
["return"] = true,
|
||||
["then"] = true,
|
||||
["true"] = true,
|
||||
["until"]= true,
|
||||
["until"] = true,
|
||||
["while"] = true,
|
||||
}
|
||||
|
||||
@@ -144,13 +144,13 @@ local function tryWrite( sLine, regex, colour )
|
||||
end
|
||||
term.write( match )
|
||||
term.setTextColour( textColour )
|
||||
return string.sub( sLine, string.len(match) + 1 )
|
||||
return string.sub( sLine, #match + 1 )
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local function writeHighlighted( sLine )
|
||||
while string.len(sLine) > 0 do
|
||||
while #sLine > 0 do
|
||||
sLine =
|
||||
tryWrite( sLine, "^%-%-%[%[.-%]%]", commentColour ) or
|
||||
tryWrite( sLine, "^%-%-.*", commentColour ) or
|
||||
@@ -188,7 +188,7 @@ end
|
||||
|
||||
local function recomplete()
|
||||
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 )
|
||||
if tCompletions and #tCompletions > 0 then
|
||||
nCompletion = 1
|
||||
@@ -214,7 +214,7 @@ end
|
||||
|
||||
local function redrawText()
|
||||
local cursorX, cursorY = x, y
|
||||
for y=1,h-1 do
|
||||
for y = 1, h - 1 do
|
||||
term.setCursorPos( 1 - scrollX, y )
|
||||
term.clearLine()
|
||||
|
||||
@@ -248,7 +248,7 @@ local function redrawMenu()
|
||||
term.clearLine()
|
||||
|
||||
-- Draw line numbers
|
||||
term.setCursorPos( w - string.len( "Ln "..y ) + 1, h )
|
||||
term.setCursorPos( w - #( "Ln " .. y ) + 1, h )
|
||||
term.setTextColour( highlightColour )
|
||||
term.write( "Ln " )
|
||||
term.setTextColour( textColour )
|
||||
@@ -258,7 +258,7 @@ local function redrawMenu()
|
||||
if bMenu then
|
||||
-- Draw menu
|
||||
term.setTextColour( textColour )
|
||||
for nItem,sItem in pairs( tMenuItems ) do
|
||||
for nItem, sItem in pairs( tMenuItems ) do
|
||||
if nItem == nMenuItem then
|
||||
term.setTextColour( highlightColour )
|
||||
term.write( "[" )
|
||||
@@ -268,7 +268,7 @@ local function redrawMenu()
|
||||
term.write( "]" )
|
||||
term.setTextColour( textColour )
|
||||
else
|
||||
term.write( " "..sItem.." " )
|
||||
term.write( " " .. sItem .. " " )
|
||||
end
|
||||
end
|
||||
else
|
||||
@@ -287,14 +287,14 @@ local tMenuFuncs = {
|
||||
if bReadOnly then
|
||||
sStatus = "Access denied"
|
||||
else
|
||||
local ok, err, fileerr = save( sPath )
|
||||
local ok, _, fileerr = save( sPath )
|
||||
if ok then
|
||||
sStatus="Saved to "..sPath
|
||||
sStatus = "Saved to " .. sPath
|
||||
else
|
||||
if fileerr then
|
||||
sStatus="Error saving to "..fileerr
|
||||
sStatus = "Error saving to " .. fileerr
|
||||
else
|
||||
sStatus="Error saving to "..sPath
|
||||
sStatus = "Error saving to " .. sPath
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -326,7 +326,7 @@ local tMenuFuncs = {
|
||||
}
|
||||
printerTerminal.scroll = function()
|
||||
if nPage == 1 then
|
||||
printer.setPageTitle( sName.." (page "..nPage..")" )
|
||||
printer.setPageTitle( sName .. " (page " .. nPage .. ")" )
|
||||
end
|
||||
|
||||
while not printer.newPage() do
|
||||
@@ -349,7 +349,7 @@ local tMenuFuncs = {
|
||||
if nPage == 1 then
|
||||
printer.setPageTitle( sName )
|
||||
else
|
||||
printer.setPageTitle( sName.." (page "..nPage..")" )
|
||||
printer.setPageTitle( sName .. " (page " .. nPage .. ")" )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -357,7 +357,7 @@ local tMenuFuncs = {
|
||||
term.redirect( printerTerminal )
|
||||
local ok, error = pcall( function()
|
||||
term.scroll()
|
||||
for n, sLine in ipairs( tLines ) do
|
||||
for _, sLine in ipairs( tLines ) do
|
||||
print( sLine )
|
||||
end
|
||||
end )
|
||||
@@ -374,7 +374,7 @@ local tMenuFuncs = {
|
||||
bMenu = true
|
||||
|
||||
if nPage > 1 then
|
||||
sStatus = "Printed "..nPage.." Pages"
|
||||
sStatus = "Printed " .. nPage .. " Pages"
|
||||
else
|
||||
sStatus = "Printed 1 Page"
|
||||
end
|
||||
@@ -385,20 +385,20 @@ local tMenuFuncs = {
|
||||
end,
|
||||
Run = function()
|
||||
local sTempPath = "/.temp"
|
||||
local ok, err = save( sTempPath )
|
||||
local ok = save( sTempPath )
|
||||
if ok then
|
||||
local nTask = shell.openTab( sTempPath )
|
||||
if nTask then
|
||||
shell.switchTab( nTask )
|
||||
else
|
||||
sStatus="Error starting Task"
|
||||
sStatus = "Error starting Task"
|
||||
end
|
||||
fs.delete( sTempPath )
|
||||
else
|
||||
sStatus="Error saving to "..sTempPath
|
||||
sStatus = "Error saving to " .. sTempPath
|
||||
end
|
||||
redrawMenu()
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
local function doMenuItem( _n )
|
||||
@@ -411,7 +411,7 @@ local function doMenuItem( _n )
|
||||
end
|
||||
|
||||
local function setCursor( newX, newY )
|
||||
local oldX, oldY = x, y
|
||||
local _, oldY = x, y
|
||||
x, y = newX, newY
|
||||
local screenX = x - scrollX
|
||||
local screenY = y - scrollY
|
||||
@@ -431,9 +431,9 @@ local function setCursor( newX, newY )
|
||||
scrollY = y - 1
|
||||
screenY = 1
|
||||
bRedraw = true
|
||||
elseif screenY > h-1 then
|
||||
scrollY = y - (h-1)
|
||||
screenY = h-1
|
||||
elseif screenY > h - 1 then
|
||||
scrollY = y - (h - 1)
|
||||
screenY = h - 1
|
||||
bRedraw = true
|
||||
end
|
||||
|
||||
@@ -456,7 +456,7 @@ load(sPath)
|
||||
|
||||
term.setBackgroundColour( bgColour )
|
||||
term.clear()
|
||||
term.setCursorPos(x,y)
|
||||
term.setCursorPos(x, y)
|
||||
term.setCursorBlink( true )
|
||||
|
||||
recomplete()
|
||||
@@ -468,7 +468,7 @@ local function acceptCompletion()
|
||||
-- Append the completion
|
||||
local sCompletion = tCompletions[ nCompletion ]
|
||||
tLines[y] = tLines[y] .. sCompletion
|
||||
setCursor( x + string.len( sCompletion ), y )
|
||||
setCursor( x + #sCompletion , y )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -476,7 +476,6 @@ end
|
||||
while bRunning do
|
||||
local sEvent, param, param2, param3 = os.pullEvent()
|
||||
if sEvent == "key" then
|
||||
local oldX, oldY = x, y
|
||||
if param == keys.up then
|
||||
-- Up
|
||||
if not bMenu then
|
||||
@@ -491,7 +490,7 @@ while bRunning do
|
||||
elseif y > 1 then
|
||||
-- Move cursor up
|
||||
setCursor(
|
||||
math.min( x, string.len( tLines[y - 1] ) + 1 ),
|
||||
math.min( x, #tLines[y - 1] + 1 ),
|
||||
y - 1
|
||||
)
|
||||
end
|
||||
@@ -512,7 +511,7 @@ while bRunning do
|
||||
elseif y < #tLines then
|
||||
-- Move cursor down
|
||||
setCursor(
|
||||
math.min( x, string.len( tLines[y + 1] ) + 1 ),
|
||||
math.min( x, #tLines[y + 1] + 1 ),
|
||||
y + 1
|
||||
)
|
||||
end
|
||||
@@ -521,13 +520,13 @@ while bRunning do
|
||||
elseif param == keys.tab then
|
||||
-- Tab
|
||||
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
|
||||
acceptCompletion()
|
||||
else
|
||||
-- Indent line
|
||||
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 )
|
||||
end
|
||||
end
|
||||
@@ -543,7 +542,7 @@ while bRunning do
|
||||
newY = 1
|
||||
end
|
||||
setCursor(
|
||||
math.min( x, string.len( tLines[newY] ) + 1 ),
|
||||
math.min( x, #tLines[newY] + 1 ),
|
||||
newY
|
||||
)
|
||||
end
|
||||
@@ -558,7 +557,7 @@ while bRunning do
|
||||
else
|
||||
newY = #tLines
|
||||
end
|
||||
local newX = math.min( x, string.len( tLines[newY] ) + 1 )
|
||||
local newX = math.min( x, #tLines[newY] + 1 )
|
||||
setCursor( newX, newY )
|
||||
end
|
||||
|
||||
@@ -567,7 +566,7 @@ while bRunning do
|
||||
if not bMenu then
|
||||
-- Move cursor to the beginning
|
||||
if x > 1 then
|
||||
setCursor(1,y)
|
||||
setCursor(1, y)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -575,7 +574,7 @@ while bRunning do
|
||||
-- End
|
||||
if not bMenu then
|
||||
-- Move cursor to the end
|
||||
local nLimit = string.len( tLines[y] ) + 1
|
||||
local nLimit = #tLines[y] + 1
|
||||
if x < nLimit then
|
||||
setCursor( nLimit, y )
|
||||
end
|
||||
@@ -587,8 +586,8 @@ while bRunning do
|
||||
if x > 1 then
|
||||
-- Move cursor left
|
||||
setCursor( x - 1, y )
|
||||
elseif x==1 and y>1 then
|
||||
setCursor( string.len( tLines[y-1] ) + 1, y - 1 )
|
||||
elseif x == 1 and y > 1 then
|
||||
setCursor( #tLines[y - 1] + 1, y - 1 )
|
||||
end
|
||||
else
|
||||
-- Move menu left
|
||||
@@ -602,14 +601,14 @@ while bRunning do
|
||||
elseif param == keys.right then
|
||||
-- Right
|
||||
if not bMenu then
|
||||
local nLimit = string.len( tLines[y] ) + 1
|
||||
local nLimit = #tLines[y] + 1
|
||||
if x < nLimit then
|
||||
-- Move cursor right
|
||||
setCursor( x + 1, y )
|
||||
elseif nCompletion and x == string.len(tLines[y]) + 1 then
|
||||
elseif nCompletion and x == #tLines[y] + 1 then
|
||||
-- Accept autocomplete
|
||||
acceptCompletion()
|
||||
elseif x==nLimit and y<#tLines then
|
||||
elseif x == nLimit and y < #tLines then
|
||||
-- Go to next line
|
||||
setCursor( 1, y + 1 )
|
||||
end
|
||||
@@ -625,15 +624,15 @@ while bRunning do
|
||||
elseif param == keys.delete then
|
||||
-- Delete
|
||||
if not bMenu and not bReadOnly then
|
||||
local nLimit = string.len( tLines[y] ) + 1
|
||||
local nLimit = #tLines[y] + 1
|
||||
if x < nLimit then
|
||||
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()
|
||||
redrawLine(y)
|
||||
elseif y<#tLines then
|
||||
tLines[y] = tLines[y] .. tLines[y+1]
|
||||
table.remove( tLines, y+1 )
|
||||
elseif y < #tLines then
|
||||
tLines[y] = tLines[y] .. tLines[y + 1]
|
||||
table.remove( tLines, y + 1 )
|
||||
recomplete()
|
||||
redrawText()
|
||||
end
|
||||
@@ -645,17 +644,17 @@ while bRunning do
|
||||
if x > 1 then
|
||||
-- Remove character
|
||||
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
|
||||
tLines[y] = string.sub(sLine,1,x-5) .. string.sub(sLine,x)
|
||||
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)
|
||||
setCursor( x - 4, y )
|
||||
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 )
|
||||
end
|
||||
elseif y > 1 then
|
||||
-- Remove newline
|
||||
local sPrevLen = string.len( tLines[y-1] )
|
||||
tLines[y-1] = tLines[y-1] .. tLines[y]
|
||||
local sPrevLen = #tLines[y - 1]
|
||||
tLines[y - 1] = tLines[y - 1] .. tLines[y]
|
||||
table.remove( tLines, y )
|
||||
setCursor( sPrevLen + 1, y - 1 )
|
||||
redrawText()
|
||||
@@ -667,12 +666,12 @@ while bRunning do
|
||||
if not bMenu and not bReadOnly then
|
||||
-- Newline
|
||||
local sLine = tLines[y]
|
||||
local _,spaces=string.find(sLine,"^[ ]+")
|
||||
local _, spaces = string.find(sLine, "^[ ]+")
|
||||
if not spaces then
|
||||
spaces=0
|
||||
spaces = 0
|
||||
end
|
||||
tLines[y] = string.sub(sLine,1,x-1)
|
||||
table.insert( tLines, y+1, string.rep(' ',spaces)..string.sub(sLine,x) )
|
||||
tLines[y] = string.sub(sLine, 1, x - 1)
|
||||
table.insert( tLines, y + 1, string.rep(' ', spaces) .. string.sub(sLine, x) )
|
||||
setCursor( spaces + 1, y + 1 )
|
||||
redrawText()
|
||||
|
||||
@@ -698,13 +697,13 @@ while bRunning do
|
||||
if not bMenu and not bReadOnly then
|
||||
-- Input text
|
||||
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 )
|
||||
|
||||
elseif bMenu then
|
||||
-- Select menu items
|
||||
for n,sMenuItem in ipairs( tMenuItems ) do
|
||||
if string.lower(string.sub(sMenuItem,1,1)) == string.lower(param) then
|
||||
for n, sMenuItem in ipairs( tMenuItems ) do
|
||||
if string.lower(string.sub(sMenuItem, 1, 1)) == string.lower(param) then
|
||||
doMenuItem( n )
|
||||
break
|
||||
end
|
||||
@@ -721,18 +720,18 @@ while bRunning do
|
||||
end
|
||||
-- Input text
|
||||
local sLine = tLines[y]
|
||||
tLines[y] = string.sub(sLine,1,x-1) .. param .. string.sub(sLine,x)
|
||||
setCursor( x + string.len( param ), y )
|
||||
tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x)
|
||||
setCursor( x + #param , y )
|
||||
end
|
||||
|
||||
elseif sEvent == "mouse_click" then
|
||||
if not bMenu then
|
||||
if param == 1 then
|
||||
-- Left click
|
||||
local cx,cy = param2, param3
|
||||
local cx, cy = param2, param3
|
||||
if cy < h then
|
||||
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 )
|
||||
end
|
||||
end
|
||||
@@ -750,7 +749,7 @@ while bRunning do
|
||||
|
||||
elseif param == 1 then
|
||||
-- Scroll down
|
||||
local nMaxScroll = #tLines - (h-1)
|
||||
local nMaxScroll = #tLines - (h - 1)
|
||||
if scrollY < nMaxScroll then
|
||||
-- Move cursor down
|
||||
scrollY = scrollY + 1
|
||||
@@ -761,7 +760,7 @@ while bRunning do
|
||||
end
|
||||
|
||||
elseif sEvent == "term_resize" then
|
||||
w,h = term.getSize()
|
||||
w, h = term.getSize()
|
||||
setCursor( x, y )
|
||||
redrawMenu()
|
||||
redrawText()
|
||||
|
@@ -11,7 +11,7 @@ local sDrive = tArgs[1]
|
||||
-- Check the disk exists
|
||||
local bPresent = disk.isPresent( sDrive )
|
||||
if not bPresent then
|
||||
print( "Nothing in "..sDrive.." drive" )
|
||||
print( "Nothing in " .. sDrive .. " drive" )
|
||||
return
|
||||
end
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
------------
|
||||
|
||||
-- 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
|
||||
local leftColour, rightColour = colours.white, nil
|
||||
@@ -16,7 +16,7 @@ local canvasColour = colours.black
|
||||
local canvas = {}
|
||||
|
||||
-- The menu options
|
||||
local mChoices = { "Save","Exit" }
|
||||
local mChoices = { "Save", "Exit" }
|
||||
|
||||
-- The message displayed in the footer bar
|
||||
local fMessage = "Press Ctrl to access menu"
|
||||
@@ -86,8 +86,8 @@ end
|
||||
returns: the colour number of the hex value
|
||||
]]
|
||||
local tColourLookup = {}
|
||||
for n=1,16 do
|
||||
tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1)
|
||||
for n = 1, 16 do
|
||||
tColourLookup[ string.byte( "0123456789abcdef", n, n ) ] = 2 ^ (n - 1)
|
||||
end
|
||||
local function getColourOf( char )
|
||||
-- Values not in the hex table are transparent (canvas coloured)
|
||||
@@ -106,8 +106,8 @@ local function load(path)
|
||||
local sLine = file.readLine()
|
||||
while sLine do
|
||||
local line = {}
|
||||
for x=1,w-2 do
|
||||
line[x] = getColourOf( string.byte(sLine,x,x) )
|
||||
for x = 1, w - 2 do
|
||||
line[x] = getColourOf( string.byte(sLine, x, x) )
|
||||
end
|
||||
table.insert( canvas, line )
|
||||
sLine = file.readLine()
|
||||
@@ -136,10 +136,10 @@ local function save(path)
|
||||
-- Encode (and trim)
|
||||
local tLines = {}
|
||||
local nLastLine = 0
|
||||
for y=1,h-1 do
|
||||
for y = 1, h - 1 do
|
||||
local sLine = ""
|
||||
local nLastChar = 0
|
||||
for x=1,w-2 do
|
||||
for x = 1, w - 2 do
|
||||
local c = getCharOf( getCanvasPixel( x, y ) )
|
||||
sLine = sLine .. c
|
||||
if c ~= " " then
|
||||
@@ -148,13 +148,13 @@ local function save(path)
|
||||
end
|
||||
sLine = string.sub( sLine, 1, nLastChar )
|
||||
tLines[y] = sLine
|
||||
if string.len( sLine ) > 0 then
|
||||
if #sLine > 0 then
|
||||
nLastLine = y
|
||||
end
|
||||
end
|
||||
|
||||
-- Save out
|
||||
for n=1,nLastLine do
|
||||
for n = 1, nLastLine do
|
||||
file.writeLine( tLines[ n ] )
|
||||
end
|
||||
file.close()
|
||||
@@ -174,20 +174,20 @@ local function drawInterface()
|
||||
term.write(fMessage)
|
||||
|
||||
-- Colour Picker
|
||||
for i=1,16 do
|
||||
term.setCursorPos(w-1, i)
|
||||
term.setBackgroundColour( 2^(i-1) )
|
||||
for i = 1, 16 do
|
||||
term.setCursorPos(w - 1, i)
|
||||
term.setBackgroundColour( 2 ^ (i - 1) )
|
||||
term.write(" ")
|
||||
end
|
||||
|
||||
term.setCursorPos(w-1, 17)
|
||||
term.setCursorPos(w - 1, 17)
|
||||
term.setBackgroundColour( canvasColour )
|
||||
term.setTextColour( colours.grey )
|
||||
term.write("\127\127")
|
||||
|
||||
-- Left and Right Selected Colours
|
||||
for i=18,18 do
|
||||
term.setCursorPos(w-1, i)
|
||||
do
|
||||
term.setCursorPos(w - 1, 18)
|
||||
if leftColour ~= nil then
|
||||
term.setBackgroundColour( leftColour )
|
||||
term.write(" ")
|
||||
@@ -208,8 +208,8 @@ local function drawInterface()
|
||||
|
||||
-- Padding
|
||||
term.setBackgroundColour( canvasColour )
|
||||
for i=20,h-1 do
|
||||
term.setCursorPos(w-1, i)
|
||||
for i = 20, h - 1 do
|
||||
term.setCursorPos(w - 1, i)
|
||||
term.write(" ")
|
||||
end
|
||||
end
|
||||
@@ -237,7 +237,7 @@ end
|
||||
returns: nil
|
||||
]]
|
||||
local function drawCanvasLine( y )
|
||||
for x = 1, w-2 do
|
||||
for x = 1, w - 2 do
|
||||
drawCanvasPixel( x, y )
|
||||
end
|
||||
end
|
||||
@@ -247,7 +247,7 @@ end
|
||||
returns: nil
|
||||
]]
|
||||
local function drawCanvas()
|
||||
for y = 1, h-1 do
|
||||
for y = 1, h - 1 do
|
||||
drawCanvasLine( y )
|
||||
end
|
||||
end
|
||||
@@ -263,25 +263,25 @@ local function accessMenu()
|
||||
term.setBackgroundColour(colours.black)
|
||||
while true do
|
||||
-- Draw the menu
|
||||
term.setCursorPos(1,h)
|
||||
term.setCursorPos(1, h)
|
||||
term.clearLine()
|
||||
term.setTextColour(colours.white)
|
||||
for k,v in pairs(mChoices) do
|
||||
if selection==k then
|
||||
for k, v in pairs(mChoices) do
|
||||
if selection == k then
|
||||
term.setTextColour(colours.yellow)
|
||||
local ox,_ = term.getCursorPos()
|
||||
term.write("["..string.rep(" ",#v).."]")
|
||||
term.setCursorPos(ox+1,h)
|
||||
local ox = term.getCursorPos()
|
||||
term.write("[" .. string.rep(" ", #v) .. "]")
|
||||
term.setCursorPos(ox + 1, h)
|
||||
term.setTextColour(colours.white)
|
||||
term.write(v)
|
||||
term.setCursorPos(term.getCursorPos()+1,h)
|
||||
term.setCursorPos(term.getCursorPos() + 1, h)
|
||||
else
|
||||
term.write(" "..v.." ")
|
||||
term.write(" " .. v .. " ")
|
||||
end
|
||||
end
|
||||
|
||||
-- Handle input in the menu
|
||||
local id,key = os.pullEvent("key")
|
||||
local id, key = os.pullEvent("key")
|
||||
if id == "key" then
|
||||
-- S and E are shortcuts
|
||||
if key == keys.s then
|
||||
@@ -308,23 +308,23 @@ local function accessMenu()
|
||||
|
||||
elseif key == keys.enter then
|
||||
-- Select an option
|
||||
if mChoices[selection]=="Save" then
|
||||
if mChoices[selection] == "Save" then
|
||||
if bReadOnly then
|
||||
fMessage = "Access denied"
|
||||
return false
|
||||
end
|
||||
local success, err = save(sPath)
|
||||
if success then
|
||||
fMessage = "Saved to "..sPath
|
||||
fMessage = "Saved to " .. sPath
|
||||
else
|
||||
if err then
|
||||
fMessage = "Error saving to "..err
|
||||
fMessage = "Error saving to " .. err
|
||||
else
|
||||
fMessage = "Error saving to "..sPath
|
||||
fMessage = "Error saving to " .. sPath
|
||||
end
|
||||
end
|
||||
return false
|
||||
elseif mChoices[selection]=="Exit" then
|
||||
elseif mChoices[selection] == "Exit" then
|
||||
return true
|
||||
end
|
||||
elseif key == keys.leftCtrl or keys == keys.rightCtrl then
|
||||
@@ -343,19 +343,19 @@ end
|
||||
local function handleEvents()
|
||||
local programActive = true
|
||||
while programActive do
|
||||
local id,p1,p2,p3 = os.pullEvent()
|
||||
if id=="mouse_click" or id=="mouse_drag" then
|
||||
if p2 >= w-1 and p3 >= 1 and p3 <= 17 then
|
||||
local id, p1, p2, p3 = os.pullEvent()
|
||||
if id == "mouse_click" or id == "mouse_drag" then
|
||||
if p2 >= w - 1 and p3 >= 1 and p3 <= 17 then
|
||||
if id ~= "mouse_drag" then
|
||||
-- Selecting an items in the colour picker
|
||||
if p3 <= 16 then
|
||||
if p1==1 then
|
||||
leftColour = 2^(p3-1)
|
||||
if p1 == 1 then
|
||||
leftColour = 2 ^ (p3 - 1)
|
||||
else
|
||||
rightColour = 2^(p3-1)
|
||||
rightColour = 2 ^ (p3 - 1)
|
||||
end
|
||||
else
|
||||
if p1==1 then
|
||||
if p1 == 1 then
|
||||
leftColour = nil
|
||||
else
|
||||
rightColour = nil
|
||||
@@ -364,12 +364,12 @@ local function handleEvents()
|
||||
--drawCanvas()
|
||||
drawInterface()
|
||||
end
|
||||
elseif p2 < w-1 and p3 <= h-1 then
|
||||
elseif p2 < w - 1 and p3 <= h - 1 then
|
||||
-- Clicking on the canvas
|
||||
local paintColour = nil
|
||||
if p1==1 then
|
||||
if p1 == 1 then
|
||||
paintColour = leftColour
|
||||
elseif p1==2 then
|
||||
elseif p1 == 2 then
|
||||
paintColour = rightColour
|
||||
end
|
||||
if not canvas[p3] then
|
||||
@@ -379,13 +379,13 @@ local function handleEvents()
|
||||
|
||||
drawCanvasPixel( p2, p3 )
|
||||
end
|
||||
elseif id=="key" then
|
||||
if p1==keys.leftCtrl or p1==keys.rightCtrl then
|
||||
elseif id == "key" then
|
||||
if p1 == keys.leftCtrl or p1 == keys.rightCtrl then
|
||||
programActive = not accessMenu()
|
||||
drawInterface()
|
||||
end
|
||||
elseif id=="term_resize" then
|
||||
w,h = term.getSize()
|
||||
elseif id == "term_resize" then
|
||||
w, h = term.getSize()
|
||||
drawCanvas()
|
||||
drawInterface()
|
||||
end
|
||||
@@ -404,4 +404,4 @@ handleEvents()
|
||||
term.setBackgroundColour(colours.black)
|
||||
term.setTextColour(colours.white)
|
||||
term.clear()
|
||||
term.setCursorPos(1,1)
|
||||
term.setCursorPos(1, 1)
|
||||
|
@@ -3,12 +3,12 @@
|
||||
--Clearing Screen--
|
||||
|
||||
--Vars--
|
||||
local TermW,TermH = term.getSize()
|
||||
local TermW, TermH = term.getSize()
|
||||
|
||||
local sLevelTitle
|
||||
local tScreen
|
||||
local oScreen
|
||||
local SizeW,SizeH
|
||||
local SizeW, SizeH
|
||||
local aExits
|
||||
local fExit
|
||||
local nSpeed
|
||||
@@ -18,14 +18,14 @@ local fSpeedS
|
||||
local bPaused
|
||||
local Tick
|
||||
local Blocks
|
||||
local XOrgin,YOrgin
|
||||
local XOrgin, YOrgin
|
||||
local fLevel
|
||||
|
||||
local function reset()
|
||||
sLevelTitle = ""
|
||||
tScreen = {}
|
||||
oScreen = {}
|
||||
SizeW,SizeH = TermW,TermH
|
||||
SizeW, SizeH = TermW, TermH
|
||||
aExits = 0
|
||||
fExit = "nop"
|
||||
nSpeed = 0.6
|
||||
@@ -35,7 +35,7 @@ local function reset()
|
||||
bPaused = false
|
||||
Tick = os.startTimer(Speed)
|
||||
Blocks = 0
|
||||
XOrgin,YOrgin = 1,1
|
||||
XOrgin, YOrgin = 1, 1
|
||||
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.setTextColor(colors.white)
|
||||
@@ -60,22 +60,22 @@ local tArgs = { ... }
|
||||
|
||||
--Functions--
|
||||
local function printCentred( yc, stg )
|
||||
local xc = math.floor((TermW - string.len(stg)) / 2) + 1
|
||||
term.setCursorPos(xc,yc)
|
||||
local xc = math.floor((TermW - #stg) / 2) + 1
|
||||
term.setCursorPos(xc, yc)
|
||||
term.write( stg )
|
||||
end
|
||||
|
||||
local function centerOrgin()
|
||||
XOrgin = math.floor((TermW/2)-(SizeW/2))
|
||||
YOrgin = math.floor((TermH/2)-(SizeH/2))
|
||||
XOrgin = math.floor(TermW / 2 - SizeW / 2)
|
||||
YOrgin = math.floor(TermH / 2 - SizeH / 2)
|
||||
end
|
||||
|
||||
local function reMap()
|
||||
tScreen = nil
|
||||
tScreen = {}
|
||||
for x=1,SizeW do
|
||||
for x = 1, SizeW do
|
||||
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" }
|
||||
end
|
||||
end
|
||||
@@ -83,7 +83,7 @@ end
|
||||
|
||||
local function tablecopy(t)
|
||||
local t2 = {}
|
||||
for k,v in pairs(t) do
|
||||
for k, v in pairs(t) do
|
||||
t2[k] = v
|
||||
end
|
||||
return t2
|
||||
@@ -92,17 +92,17 @@ end
|
||||
local function buMap()
|
||||
oScreen = nil
|
||||
oScreen = {}
|
||||
for x=1,SizeW do
|
||||
for x = 1, SizeW do
|
||||
oScreen[x] = {}
|
||||
for y=1,SizeH do
|
||||
for y = 1, SizeH do
|
||||
oScreen[x][y] = tablecopy(tScreen[x][y])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function addRobot(x,y,side,color)
|
||||
local function addRobot(x, y, side, color)
|
||||
local obj = tScreen[x][y]
|
||||
local data = side..color
|
||||
local data = side .. color
|
||||
if obj.wall == nil and obj.robot == nil then
|
||||
tScreen[x][y].robot = data
|
||||
else
|
||||
@@ -112,9 +112,9 @@ local function addRobot(x,y,side,color)
|
||||
end
|
||||
end
|
||||
|
||||
local function addStart(x,y,side,color)
|
||||
local function addStart(x, y, side, color)
|
||||
local obj = tScreen[x][y]
|
||||
local data = side..color
|
||||
local data = side .. color
|
||||
if obj.wall == nil and obj.space == nil then
|
||||
tScreen[x][y].start = data
|
||||
else
|
||||
@@ -122,10 +122,10 @@ local function addStart(x,y,side,color)
|
||||
obj.space = nil
|
||||
tScreen[x][y].start = data
|
||||
end
|
||||
aExits = aExits+1
|
||||
aExits = aExits + 1
|
||||
end
|
||||
|
||||
local function addGround(x,y)
|
||||
local function addGround(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
|
||||
tScreen[x][y].ground = true
|
||||
@@ -139,7 +139,7 @@ local function addGround(x,y)
|
||||
end
|
||||
end
|
||||
|
||||
local function addExit(x,y,cl)
|
||||
local function addExit(x, y, cl)
|
||||
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
|
||||
tScreen[x][y].exit = cl
|
||||
@@ -153,10 +153,10 @@ local function addExit(x,y,cl)
|
||||
end
|
||||
end
|
||||
|
||||
local function addWall(x,y)
|
||||
local function addWall(x, y)
|
||||
local obj = tScreen[x][y]
|
||||
if obj == nil then
|
||||
return error("Here X"..x.." Y"..y)
|
||||
return error("Here X" .. x .. " Y" .. y)
|
||||
end
|
||||
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
|
||||
@@ -171,16 +171,15 @@ local function addWall(x,y)
|
||||
end
|
||||
|
||||
local function loadLevel(nNum)
|
||||
sLevelTitle = "Level "..nNum
|
||||
sLevelTitle = "Level " .. nNum
|
||||
if nNum == nil then return error("nNum == nil") end
|
||||
local sDir = fs.getDir( shell.getRunningProgram() )
|
||||
local sLevelD = sDir .. "/levels/" .. tostring(nNum)..".dat"
|
||||
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : "..sLevelD) end
|
||||
fLevel = fs.open(sLevelD,"r")
|
||||
local Line = 0
|
||||
local sLevelD = sDir .. "/levels/" .. tostring(nNum) .. ".dat"
|
||||
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : " .. sLevelD) end
|
||||
fLevel = fs.open(sLevelD, "r")
|
||||
local wl = true
|
||||
Blocks = tonumber(string.sub(fLevel.readLine(),1,1))
|
||||
local xSize = string.len(fLevel.readLine())+2
|
||||
Blocks = tonumber(string.sub(fLevel.readLine(), 1, 1))
|
||||
local xSize = #fLevel.readLine() + 2
|
||||
local Lines = 3
|
||||
while wl do
|
||||
local wLine = fLevel.readLine()
|
||||
@@ -188,43 +187,43 @@ local function loadLevel(nNum)
|
||||
fLevel.close()
|
||||
wl = false
|
||||
else
|
||||
xSize = math.max(string.len(wLine)+2,xSize)
|
||||
xSize = math.max(#wLine + 2, xSize)
|
||||
Lines = Lines + 1
|
||||
end
|
||||
end
|
||||
SizeW,SizeH = xSize,Lines
|
||||
SizeW, SizeH = xSize, Lines
|
||||
reMap()
|
||||
fLevel = fs.open(sLevelD,"r")
|
||||
fLevel = fs.open(sLevelD, "r")
|
||||
fLevel.readLine()
|
||||
for Line=2,Lines-1 do
|
||||
for Line = 2, Lines - 1 do
|
||||
local sLine = fLevel.readLine()
|
||||
local chars = string.len(sLine)
|
||||
local chars = #sLine
|
||||
for char = 1, chars do
|
||||
local el = string.sub(sLine,char,char)
|
||||
local el = string.sub(sLine, char, char)
|
||||
if el == "8" then
|
||||
addGround(char+1,Line)
|
||||
addGround(char + 1, Line)
|
||||
elseif el == "0" then
|
||||
addStart(char+1,Line,"a","a")
|
||||
addStart(char + 1, Line, "a", "a")
|
||||
elseif el == "1" then
|
||||
addStart(char+1,Line,"b","a")
|
||||
addStart(char + 1, Line, "b", "a")
|
||||
elseif el == "2" then
|
||||
addStart(char+1,Line,"c","a")
|
||||
addStart(char + 1, Line, "c", "a")
|
||||
elseif el == "3" then
|
||||
addStart(char+1,Line,"d","a")
|
||||
addStart(char + 1, Line, "d", "a")
|
||||
elseif el == "4" then
|
||||
addStart(char+1,Line,"a","b")
|
||||
addStart(char + 1, Line, "a", "b")
|
||||
elseif el == "5" then
|
||||
addStart(char+1,Line,"b","b")
|
||||
addStart(char + 1, Line, "b", "b")
|
||||
elseif el == "6" then
|
||||
addStart(char+1,Line,"c","b")
|
||||
addStart(char + 1, Line, "c", "b")
|
||||
elseif el == "9" then
|
||||
addStart(char+1,Line,"d","b")
|
||||
addStart(char + 1, Line, "d", "b")
|
||||
elseif el == "b" then
|
||||
addExit(char+1,Line,"a")
|
||||
addExit(char + 1, Line, "a")
|
||||
elseif el == "e" then
|
||||
addExit(char+1,Line,"b")
|
||||
addExit(char + 1, Line, "b")
|
||||
elseif el == "7" then
|
||||
addWall(char+1,Line)
|
||||
addWall(char + 1, Line)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -233,29 +232,29 @@ end
|
||||
|
||||
local function drawStars()
|
||||
--CCR Background By : RamiLego--
|
||||
local cStar,cStarG,crStar,crStarB = colors.lightGray,colors.gray,".","*"
|
||||
local DStar,BStar,nStar,gStar = 14,10,16,3
|
||||
local TermW,TermH = term.getSize()
|
||||
local cStar, cStarG, crStar, crStarB = colors.lightGray, colors.gray, ".", "*"
|
||||
local DStar, BStar, nStar, gStar = 14, 10, 16, 3
|
||||
local TermW, TermH = term.getSize()
|
||||
|
||||
term.clear()
|
||||
term.setCursorPos(1,1)
|
||||
for x=1,TermW do
|
||||
for y=1,TermH do
|
||||
local StarT = math.random(1,30)
|
||||
term.setCursorPos(1, 1)
|
||||
for x = 1, TermW do
|
||||
for y = 1, TermH do
|
||||
local StarT = math.random(1, 30)
|
||||
if StarT == DStar then
|
||||
term.setCursorPos(x,y)
|
||||
term.setCursorPos(x, y)
|
||||
term.setTextColor(cStar)
|
||||
write(crStar)
|
||||
elseif StarT == BStar then
|
||||
term.setCursorPos(x,y)
|
||||
term.setCursorPos(x, y)
|
||||
term.setTextColor(cStar)
|
||||
write(crStarB)
|
||||
elseif StarT == nStar then
|
||||
term.setCursorPos(x,y)
|
||||
term.setCursorPos(x, y)
|
||||
term.setTextColor(cStarG)
|
||||
write(crStar)
|
||||
elseif StarT == gStar then
|
||||
term.setCursorPos(x,y)
|
||||
term.setCursorPos(x, y)
|
||||
term.setTextColor(cStarG)
|
||||
write(crStarB)
|
||||
end
|
||||
@@ -264,15 +263,15 @@ local function drawStars()
|
||||
end
|
||||
|
||||
local function drawMap()
|
||||
for x=1,SizeW do
|
||||
for y=1,SizeH do
|
||||
for x = 1, SizeW do
|
||||
for y = 1, SizeH do
|
||||
|
||||
local obj = tScreen[x][y]
|
||||
if obj.ground == true then
|
||||
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cG)
|
||||
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cG)
|
||||
end
|
||||
if obj.wall == true then
|
||||
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cW)
|
||||
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cW)
|
||||
end
|
||||
|
||||
local ex = tostring(tScreen[x][y].exit)
|
||||
@@ -290,13 +289,13 @@ local function drawMap()
|
||||
end
|
||||
term.setBackgroundColor(cG)
|
||||
term.setTextColor(ex)
|
||||
term.setCursorPos(XOrgin+x,YOrgin+y+1)
|
||||
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
|
||||
print("X")
|
||||
end
|
||||
|
||||
local st = tostring(tScreen[x][y].start)
|
||||
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
|
||||
Cr = cR1
|
||||
elseif Cr == "b" then
|
||||
@@ -311,9 +310,9 @@ local function drawMap()
|
||||
|
||||
term.setTextColor(Cr)
|
||||
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
|
||||
print("^")
|
||||
elseif sSide == "b" then
|
||||
@@ -328,12 +327,12 @@ local function drawMap()
|
||||
end
|
||||
|
||||
if obj.space == true then
|
||||
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cS)
|
||||
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cS)
|
||||
end
|
||||
|
||||
local rb = tostring(tScreen[x][y].robot)
|
||||
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
|
||||
Cr = cR1
|
||||
elseif Cr == "b" then
|
||||
@@ -347,8 +346,8 @@ local function drawMap()
|
||||
end
|
||||
term.setBackgroundColor(Cr)
|
||||
term.setTextColor(colors.white)
|
||||
term.setCursorPos(XOrgin+x,YOrgin+y+1)
|
||||
local sSide = string.sub(rb,1,1)
|
||||
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
|
||||
local sSide = string.sub(rb, 1, 1)
|
||||
if sSide == "a" then
|
||||
print("^")
|
||||
elseif sSide == "b" then
|
||||
@@ -365,7 +364,7 @@ local function drawMap()
|
||||
end
|
||||
end
|
||||
|
||||
local function isBrick(x,y)
|
||||
local function isBrick(x, y)
|
||||
local brb = tostring(tScreen[x][y].robot)
|
||||
local bobj = oScreen[x][y]
|
||||
if (brb == "zz" or brb == "nil") and not bobj.wall == true then
|
||||
@@ -377,134 +376,134 @@ end
|
||||
|
||||
local function gRender(sContext)
|
||||
if sContext == "start" then
|
||||
for x=1,SizeW do
|
||||
for y=1,SizeH do
|
||||
for x = 1, SizeW do
|
||||
for y = 1, SizeH do
|
||||
local st = tostring(tScreen[x][y].start)
|
||||
if not(st == "zz" or st == "nil") then
|
||||
local Cr = string.sub(st,2,2)
|
||||
local sSide = string.sub(st,1,1)
|
||||
addRobot(x,y,sSide,Cr)
|
||||
local Cr = string.sub(st, 2, 2)
|
||||
local sSide = string.sub(st, 1, 1)
|
||||
addRobot(x, y, sSide, Cr)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif sContext == "tick" then
|
||||
buMap()
|
||||
for x=1,SizeW do
|
||||
for y=1,SizeH do
|
||||
for x = 1, SizeW do
|
||||
for y = 1, SizeH do
|
||||
local rb = tostring(oScreen[x][y].robot)
|
||||
if not(rb == "zz" or rb == "nil") then
|
||||
local Cr = string.sub(rb,2,2)
|
||||
local sSide = string.sub(rb,1,1)
|
||||
local Cr = string.sub(rb, 2, 2)
|
||||
local sSide = string.sub(rb, 1, 1)
|
||||
local sobj = oScreen[x][y]
|
||||
if sobj.space == true then
|
||||
tScreen[x][y].robot = "zz"
|
||||
if not sSide == "g" then
|
||||
addRobot(x,y,"g",Cr)
|
||||
addRobot(x, y, "g", Cr)
|
||||
end
|
||||
elseif sobj.exit == Cr then
|
||||
if sSide == "a" or sSide == "b" or sSide == "c" or sSide == "d" then
|
||||
tScreen[x][y].robot = "zz"
|
||||
addRobot(x,y,"g",Cr)
|
||||
aExits = aExits-1
|
||||
addRobot(x, y, "g", Cr)
|
||||
aExits = aExits - 1
|
||||
end
|
||||
elseif sSide == "a" then
|
||||
local obj = isBrick(x,y-1)
|
||||
local obj = isBrick(x, y - 1)
|
||||
tScreen[x][y].robot = "zz"
|
||||
if not obj == true then
|
||||
addRobot(x,y-1,sSide,Cr)
|
||||
addRobot(x, y - 1, sSide, Cr)
|
||||
else
|
||||
local obj2 = isBrick(x-1,y)
|
||||
local obj3 = isBrick(x+1,y)
|
||||
local obj2 = isBrick(x - 1, y)
|
||||
local obj3 = isBrick(x + 1, y)
|
||||
if not obj2 == true and not obj3 == true then
|
||||
if Cr == "a" then
|
||||
addRobot(x,y,"d",Cr)
|
||||
addRobot(x, y, "d", Cr)
|
||||
elseif Cr == "b" then
|
||||
addRobot(x,y,"b",Cr)
|
||||
addRobot(x, y, "b", Cr)
|
||||
end
|
||||
elseif obj == true and obj2 == true and obj3 == true then
|
||||
addRobot(x,y,"c",Cr)
|
||||
addRobot(x, y, "c", Cr)
|
||||
else
|
||||
if obj3 == true then
|
||||
addRobot(x,y,"d",Cr)
|
||||
addRobot(x, y, "d", Cr)
|
||||
elseif obj2 == true then
|
||||
addRobot(x,y,"b",Cr)
|
||||
addRobot(x, y, "b", Cr)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif sSide == "b" then
|
||||
local obj = isBrick(x+1,y)
|
||||
local obj = isBrick(x + 1, y)
|
||||
tScreen[x][y].robot = "zz"
|
||||
if not obj == true then
|
||||
addRobot(x+1,y,sSide,Cr)
|
||||
addRobot(x + 1, y, sSide, Cr)
|
||||
else
|
||||
local obj2 = isBrick(x,y-1)
|
||||
local obj3 = isBrick(x,y+1)
|
||||
local obj2 = isBrick(x, y - 1)
|
||||
local obj3 = isBrick(x, y + 1)
|
||||
if not obj2 == true and not obj3 == true then
|
||||
if Cr == "a" then
|
||||
addRobot(x,y,"a",Cr)
|
||||
addRobot(x, y, "a", Cr)
|
||||
elseif Cr == "b" then
|
||||
addRobot(x,y,"c",Cr)
|
||||
addRobot(x, y, "c", Cr)
|
||||
end
|
||||
elseif obj == true and obj2 == true and obj3 == true then
|
||||
addRobot(x,y,"d",Cr)
|
||||
addRobot(x, y, "d", Cr)
|
||||
else
|
||||
if obj3 == true then
|
||||
addRobot(x,y,"a",Cr)
|
||||
addRobot(x, y, "a", Cr)
|
||||
elseif obj2 == true then
|
||||
addRobot(x,y,"c",Cr)
|
||||
addRobot(x, y, "c", Cr)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif sSide == "c" then
|
||||
local obj = isBrick(x,y+1)
|
||||
local obj = isBrick(x, y + 1)
|
||||
tScreen[x][y].robot = "zz"
|
||||
if not obj == true then
|
||||
addRobot(x,y+1,sSide,Cr)
|
||||
addRobot(x, y + 1, sSide, Cr)
|
||||
else
|
||||
local obj2 = isBrick(x-1,y)
|
||||
local obj3 = isBrick(x+1,y)
|
||||
local obj2 = isBrick(x - 1, y)
|
||||
local obj3 = isBrick(x + 1, y)
|
||||
if not obj2 == true and not obj3 == true then
|
||||
if Cr == "a" then
|
||||
addRobot(x,y,"b",Cr)
|
||||
addRobot(x, y, "b", Cr)
|
||||
elseif Cr == "b" then
|
||||
addRobot(x,y,"d",Cr)
|
||||
addRobot(x, y, "d", Cr)
|
||||
end
|
||||
elseif obj == true and obj2 == true and obj3 == true then
|
||||
addRobot(x,y,"a",Cr)
|
||||
addRobot(x, y, "a", Cr)
|
||||
else
|
||||
if obj3 == true then
|
||||
addRobot(x,y,"d",Cr)
|
||||
addRobot(x, y, "d", Cr)
|
||||
elseif obj2 == true then
|
||||
addRobot(x,y,"b",Cr)
|
||||
addRobot(x, y, "b", Cr)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif sSide == "d" then
|
||||
local obj = isBrick(x-1,y)
|
||||
local obj = isBrick(x - 1, y)
|
||||
tScreen[x][y].robot = "zz"
|
||||
if not obj == true then
|
||||
addRobot(x-1,y,sSide,Cr)
|
||||
addRobot(x - 1, y, sSide, Cr)
|
||||
else
|
||||
local obj2 = isBrick(x,y-1)
|
||||
local obj3 = isBrick(x,y+1)
|
||||
local obj2 = isBrick(x, y - 1)
|
||||
local obj3 = isBrick(x, y + 1)
|
||||
if not obj2 == true and not obj3 == true then
|
||||
if Cr == "a" then
|
||||
addRobot(x,y,"c",Cr)
|
||||
addRobot(x, y, "c", Cr)
|
||||
elseif Cr == "b" then
|
||||
addRobot(x,y,"a",Cr)
|
||||
addRobot(x, y, "a", Cr)
|
||||
end
|
||||
elseif obj == true and obj2 == true and obj3 == true then
|
||||
addRobot(x,y,"b",Cr)
|
||||
addRobot(x, y, "b", Cr)
|
||||
else
|
||||
if obj3 == true then
|
||||
addRobot(x,y,"a",Cr)
|
||||
addRobot(x, y, "a", Cr)
|
||||
elseif obj2 == true then
|
||||
addRobot(x,y,"c",Cr)
|
||||
addRobot(x, y, "c", Cr)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
addRobot(x,y,sSide,"g")
|
||||
addRobot(x, y, sSide, "g")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -515,15 +514,15 @@ end
|
||||
function InterFace.drawBar()
|
||||
term.setBackgroundColor( colors.black )
|
||||
term.setTextColor( InterFace.cTitle )
|
||||
printCentred( 1, " "..sLevelTitle.." " )
|
||||
printCentred( 1, " " .. sLevelTitle .. " " )
|
||||
|
||||
term.setCursorPos(1,1)
|
||||
term.setCursorPos(1, 1)
|
||||
term.setBackgroundColor( cW )
|
||||
write( " " )
|
||||
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.setTextColour(InterFace.cSpeedD)
|
||||
write(" <<" )
|
||||
@@ -540,7 +539,7 @@ function InterFace.drawBar()
|
||||
end
|
||||
write(" >>")
|
||||
|
||||
term.setCursorPos( TermW-1, 1 )
|
||||
term.setCursorPos( TermW - 1, 1 )
|
||||
term.setBackgroundColor( colors.black )
|
||||
term.setTextColour( InterFace.cExit )
|
||||
write(" X")
|
||||
@@ -548,35 +547,35 @@ function InterFace.drawBar()
|
||||
end
|
||||
|
||||
function InterFace.render()
|
||||
local id,p1,p2,p3 = os.pullEvent()
|
||||
local id, p1, p2, p3 = os.pullEvent()
|
||||
if id == "mouse_click" then
|
||||
if p3 == 1 and p2 == TermW then
|
||||
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"
|
||||
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
|
||||
fSpeedS = false
|
||||
Speed = (bPaused and 0) or nSpeed
|
||||
Speed = bPaused and 0 or nSpeed
|
||||
if Speed > 0 then
|
||||
Tick = os.startTimer(Speed)
|
||||
else
|
||||
Tick = nil
|
||||
end
|
||||
InterFace.drawBar()
|
||||
elseif p3 == TermH and p2 >= TermW-1 then
|
||||
elseif p3 == TermH and p2 >= TermW - 1 then
|
||||
bPaused = false
|
||||
fSpeedS = not fSpeedS
|
||||
Speed = (fSpeedS and fSpeed) or nSpeed
|
||||
Speed = fSpeedS and fSpeed or nSpeed
|
||||
Tick = os.startTimer(Speed)
|
||||
InterFace.drawBar()
|
||||
elseif p3-1 < YOrgin+SizeH+1 and p3-1 > YOrgin and
|
||||
p2 < XOrgin+SizeW+1 and p2 > XOrgin then
|
||||
local eobj = tScreen[p2-XOrgin][p3-YOrgin-1]
|
||||
local erobj = tostring(tScreen[p2-XOrgin][p3-YOrgin-1].robot)
|
||||
elseif p3 - 1 < YOrgin + SizeH + 1 and p3 - 1 > YOrgin and
|
||||
p2 < XOrgin + SizeW + 1 and p2 > XOrgin then
|
||||
local eobj = tScreen[p2 - XOrgin][p3 - YOrgin - 1]
|
||||
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
|
||||
addWall(p2-XOrgin,p3-YOrgin-1)
|
||||
Blocks = Blocks-1
|
||||
addWall(p2 - XOrgin, p3 - YOrgin - 1)
|
||||
Blocks = Blocks - 1
|
||||
InterFace.drawBar()
|
||||
drawMap()
|
||||
end
|
||||
@@ -596,7 +595,6 @@ local function startG(LevelN)
|
||||
drawStars()
|
||||
loadLevel(LevelN)
|
||||
centerOrgin()
|
||||
local create = true
|
||||
drawMap()
|
||||
InterFace.drawBar()
|
||||
gRender("start")
|
||||
@@ -637,17 +635,17 @@ if ok and not sStartLevel then
|
||||
term.clear()
|
||||
drawStars()
|
||||
term.setTextColor( colors.red )
|
||||
printCentred( TermH/2 - 1, " REDIRECTION " )
|
||||
printCentred( TermH/2 - 0, " ComputerCraft Edition " )
|
||||
printCentred( TermH / 2 - 1, " REDIRECTION " )
|
||||
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
|
||||
term.setTextColor( colors.yellow )
|
||||
printCentred( TermH/2 + 2, " Click to Begin " )
|
||||
printCentred( TermH / 2 + 2, " Click to Begin " )
|
||||
os.pullEvent( "mouse_click" )
|
||||
end )
|
||||
end
|
||||
|
||||
--Game--
|
||||
if ok then
|
||||
ok,err = pcall( function()
|
||||
ok, err = pcall( function()
|
||||
local nLevel
|
||||
if sStartLevel then
|
||||
nLevel = tonumber( sStartLevel )
|
||||
@@ -670,18 +668,18 @@ if ok then
|
||||
drawStars()
|
||||
term.setTextColor( colors.red )
|
||||
if TermW >= 40 then
|
||||
printCentred( TermH/2 - 1, " Thank you for playing Redirection " )
|
||||
printCentred( TermH/2 - 0, " ComputerCraft Edition " )
|
||||
printCentred( TermH/2 + 2, " Check out the full game: " )
|
||||
printCentred( TermH / 2 - 1, " Thank you for playing Redirection " )
|
||||
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
|
||||
printCentred( TermH / 2 + 2, " Check out the full game: " )
|
||||
term.setTextColor( colors.yellow )
|
||||
printCentred( TermH/2 + 3, " http://www.redirectiongame.com " )
|
||||
printCentred( TermH / 2 + 3, " http://www.redirectiongame.com " )
|
||||
else
|
||||
printCentred( TermH/2 - 2, " Thank you for " )
|
||||
printCentred( TermH/2 - 1, " playing Redirection " )
|
||||
printCentred( TermH/2 - 0, " ComputerCraft Edition " )
|
||||
printCentred( TermH/2 + 2, " Check out the full game: " )
|
||||
printCentred( TermH / 2 - 2, " Thank you for " )
|
||||
printCentred( TermH / 2 - 1, " playing Redirection " )
|
||||
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
|
||||
printCentred( TermH / 2 + 2, " Check out the full game: " )
|
||||
term.setTextColor( colors.yellow )
|
||||
printCentred( TermH/2 + 3, " www.redirectiongame.com " )
|
||||
printCentred( TermH / 2 + 3, " www.redirectiongame.com " )
|
||||
end
|
||||
parallel.waitForAll(
|
||||
function() sleep(2) end,
|
||||
@@ -691,7 +689,7 @@ if ok then
|
||||
end
|
||||
|
||||
--Clear and exit--
|
||||
term.setCursorPos(1,1)
|
||||
term.setCursorPos(1, 1)
|
||||
term.setTextColor(colors.white)
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.clear()
|
||||
|
@@ -112,7 +112,7 @@ local items = {
|
||||
desc = "A perfect handle for torches or a pickaxe.",
|
||||
},
|
||||
["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.",
|
||||
},
|
||||
["a furnace"] = {
|
||||
@@ -270,7 +270,7 @@ local tAnimals = {
|
||||
}
|
||||
|
||||
local tMonsters = {
|
||||
"a creeper", "a skeleton", "a zombie", "a spider"
|
||||
"a creeper", "a skeleton", "a zombie", "a spider",
|
||||
}
|
||||
|
||||
local tRecipes = {
|
||||
@@ -309,8 +309,8 @@ local tGoWest = {
|
||||
local nGoWest = 0
|
||||
|
||||
local bRunning = true
|
||||
local tMap = { { {}, }, }
|
||||
local x,y,z = 0,0,0
|
||||
local tMap = { { {} } }
|
||||
local x, y, z = 0, 0, 0
|
||||
local inventory = {
|
||||
["no tea"] = items["no tea"],
|
||||
}
|
||||
@@ -338,11 +338,11 @@ local tDayCycle = {
|
||||
}
|
||||
|
||||
local function getTimeOfDay()
|
||||
return math.fmod( math.floor(nTurn/3), #tDayCycle ) + 1
|
||||
return math.fmod( math.floor(nTurn / 3), #tDayCycle ) + 1
|
||||
end
|
||||
|
||||
local function isSunny()
|
||||
return (getTimeOfDay() < 10)
|
||||
return getTimeOfDay() < 10
|
||||
end
|
||||
|
||||
local function getRoom( x, y, z, dontCreate )
|
||||
@@ -364,21 +364,21 @@ local function getRoom( x, y, z, dontCreate )
|
||||
room.trees = hasTrees( room.nBiome )
|
||||
|
||||
-- Add animals
|
||||
if math.random(1,3) == 1 then
|
||||
for n = 1,math.random(1,2) do
|
||||
if math.random(1, 3) == 1 then
|
||||
for _ = 1, math.random(1, 2) do
|
||||
local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ]
|
||||
room.items[ sAnimal ] = items[ sAnimal ]
|
||||
end
|
||||
end
|
||||
|
||||
-- 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" ]
|
||||
end
|
||||
if math.random(1,8) == 1 then
|
||||
if math.random(1, 8) == 1 then
|
||||
room.items[ "some coal" ] = items[ "some coal" ]
|
||||
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" ]
|
||||
end
|
||||
|
||||
@@ -389,7 +389,7 @@ local function getRoom( x, y, z, dontCreate )
|
||||
["east"] = true,
|
||||
["west"] = true,
|
||||
}
|
||||
if math.random(1,8) == 1 then
|
||||
if math.random(1, 8) == 1 then
|
||||
room.exits["down"] = true
|
||||
room.items["a cave entrance"] = items["a cave entrance"]
|
||||
end
|
||||
@@ -404,7 +404,7 @@ local function getRoom( x, y, z, dontCreate )
|
||||
room.exits[sDir] = true
|
||||
end
|
||||
else
|
||||
if math.random(1,3) == 1 then
|
||||
if math.random(1, 3) == 1 then
|
||||
room.exits[sDir] = true
|
||||
end
|
||||
end
|
||||
@@ -431,13 +431,13 @@ local function getRoom( x, y, z, dontCreate )
|
||||
|
||||
-- Add ores
|
||||
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" ]
|
||||
end
|
||||
if math.random(1,8) == 1 then
|
||||
if math.random(1, 8) == 1 then
|
||||
room.items[ "some iron" ] = items[ "some iron" ]
|
||||
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" ]
|
||||
end
|
||||
|
||||
@@ -478,7 +478,7 @@ local function findItem( _tList, _sQuery )
|
||||
return sItem
|
||||
end
|
||||
if tItem.aliases ~= nil then
|
||||
for n, sAlias in pairs( tItem.aliases ) do
|
||||
for _, sAlias in pairs( tItem.aliases ) do
|
||||
if sAlias == _sQuery then
|
||||
return sItem
|
||||
end
|
||||
@@ -613,7 +613,7 @@ local function doCommand( text )
|
||||
end
|
||||
|
||||
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 .. "$" ) }
|
||||
if #tCaptures ~= 0 then
|
||||
local fnCommand = commands[ sCommand ]
|
||||
@@ -634,7 +634,7 @@ function commands.wait()
|
||||
end
|
||||
|
||||
function commands.look( _sTarget )
|
||||
local room = getRoom( x,y,z )
|
||||
local room = getRoom( x, y, z )
|
||||
if room.dark then
|
||||
print( "It is pitch dark." )
|
||||
return
|
||||
@@ -648,7 +648,7 @@ function commands.look( _sTarget )
|
||||
else
|
||||
io.write( "You are underground. " )
|
||||
if next( room.exits ) ~= nil then
|
||||
print( "You can travel "..itemize( room.exits ).."." )
|
||||
print( "You can travel " .. itemize( room.exits ) .. "." )
|
||||
else
|
||||
print()
|
||||
end
|
||||
@@ -679,16 +679,16 @@ function commands.look( _sTarget )
|
||||
end
|
||||
|
||||
if tItem then
|
||||
print( tItem.desc or ("You see nothing special about "..sItem..".") )
|
||||
print( tItem.desc or "You see nothing special about " .. sItem .. "." )
|
||||
else
|
||||
print( "You don't see any ".._sTarget.." here." )
|
||||
print( "You don't see any " .. _sTarget .. " here." )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function commands.go( _sDir )
|
||||
local room = getRoom( x,y,z )
|
||||
local room = getRoom( x, y, z )
|
||||
if _sDir == nil then
|
||||
print( "Go where?" )
|
||||
return
|
||||
@@ -735,7 +735,7 @@ function commands.go( _sDir )
|
||||
end
|
||||
|
||||
function commands.dig( _sDir, _sTool )
|
||||
local room = getRoom( x,y,z )
|
||||
local room = getRoom( x, y, z )
|
||||
if _sDir == nil then
|
||||
print( "Dig where?" )
|
||||
return
|
||||
@@ -746,13 +746,13 @@ function commands.dig( _sDir, _sTool )
|
||||
if _sTool ~= nil then
|
||||
sTool = findItem( inventory, _sTool )
|
||||
if not sTool then
|
||||
print( "You're not carrying a ".._sTool.."." )
|
||||
print( "You're not carrying a " .. _sTool .. "." )
|
||||
return
|
||||
end
|
||||
tTool = inventory[ sTool ]
|
||||
end
|
||||
|
||||
local bActuallyDigging = (room.exits[ _sDir ] ~= true)
|
||||
local bActuallyDigging = room.exits[ _sDir ] ~= true
|
||||
if bActuallyDigging then
|
||||
if sTool == nil or tTool.toolType ~= "pick" then
|
||||
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
|
||||
inventory[ "some dirt" ] = items[ "some dirt" ]
|
||||
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
|
||||
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
|
||||
|
||||
@@ -848,7 +848,7 @@ function commands.drop( _sItem )
|
||||
return
|
||||
end
|
||||
|
||||
local room = getRoom( x,y,z )
|
||||
local room = getRoom( x, y, z )
|
||||
local sItem = findItem( inventory, _sItem )
|
||||
if sItem then
|
||||
local tItem = inventory[ sItem ]
|
||||
@@ -860,7 +860,7 @@ function commands.drop( _sItem )
|
||||
print( "Dropped." )
|
||||
end
|
||||
else
|
||||
print( "You don't have a ".._sItem.."." )
|
||||
print( "You don't have a " .. _sItem .. "." )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -871,7 +871,7 @@ function commands.place( _sItem )
|
||||
end
|
||||
|
||||
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
|
||||
inventory["a torch"] = nil
|
||||
room.items["a torch"] = items["a torch"]
|
||||
@@ -898,12 +898,12 @@ function commands.take( _sItem )
|
||||
return
|
||||
end
|
||||
|
||||
local room = getRoom( x,y,z )
|
||||
local room = getRoom( x, y, z )
|
||||
local sItem = findItem( room.items, _sItem )
|
||||
if sItem then
|
||||
local tItem = room.items[ sItem ]
|
||||
if tItem.heavy == true then
|
||||
print( "You can't carry "..sItem.."." )
|
||||
print( "You can't carry " .. sItem .. "." )
|
||||
elseif tItem.ore == true then
|
||||
print( "You need to mine this ore." )
|
||||
else
|
||||
@@ -923,7 +923,7 @@ function commands.take( _sItem )
|
||||
end
|
||||
end
|
||||
else
|
||||
print( "You don't see a ".._sItem.." here." )
|
||||
print( "You don't see a " .. _sItem .. " here." )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -933,7 +933,7 @@ function commands.mine( _sItem, _sTool )
|
||||
return
|
||||
end
|
||||
if _sTool == nil then
|
||||
print( "Mine ".._sItem.." with what?" )
|
||||
print( "Mine " .. _sItem .. " with what?" )
|
||||
return
|
||||
end
|
||||
commands.cbreak( _sItem, _sTool )
|
||||
@@ -957,12 +957,12 @@ function commands.cbreak( _sItem, _sTool )
|
||||
if _sTool ~= nil then
|
||||
sTool = findItem( inventory, _sTool )
|
||||
if sTool == nil then
|
||||
print( "You're not carrying a ".._sTool.."." )
|
||||
print( "You're not carrying a " .. _sTool .. "." )
|
||||
return
|
||||
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
|
||||
print( "The tree breaks into blocks of wood, which you pick up." )
|
||||
inventory[ "some wood" ] = items[ "some wood" ]
|
||||
@@ -990,18 +990,18 @@ function commands.cbreak( _sItem, _sTool )
|
||||
local tTool = inventory[ sTool ]
|
||||
if tTool.tool 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
|
||||
print( "You need a different kind of tool to break this ore." )
|
||||
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 ]
|
||||
if tItem.infinite ~= true then
|
||||
room.items[ sItem ] = nil
|
||||
end
|
||||
end
|
||||
else
|
||||
print( "You can't break "..sItem.." with "..sTool..".")
|
||||
print( "You can't break " .. sItem .. " with " .. sTool .. ".")
|
||||
end
|
||||
|
||||
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 }
|
||||
if math.random() <= tChances[ toolLevel + 1 ] then
|
||||
room.items[ sItem ] = nil
|
||||
print( "The "..tItem.aliases[1].." dies." )
|
||||
print( "The " .. tItem.aliases[1] .. " dies." )
|
||||
|
||||
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
|
||||
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
|
||||
print( "The " .. tItem.aliases[1] .. " dropped " .. sDrop .. "." )
|
||||
room.items[sDrop] = items[sDrop]
|
||||
end
|
||||
end
|
||||
@@ -1033,23 +1033,23 @@ function commands.cbreak( _sItem, _sTool )
|
||||
room.nMonsters = room.nMonsters - 1
|
||||
end
|
||||
else
|
||||
print( "The "..tItem.aliases[1].." is injured by your blow." )
|
||||
print( "The " .. tItem.aliases[1] .. " is injured by your blow." )
|
||||
end
|
||||
|
||||
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
|
||||
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
|
||||
print( "The " .. tItem.aliases[1] .. " dropped " .. sDrop .. "." )
|
||||
room.items[sDrop] = items[sDrop]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
else
|
||||
print( "You can't break "..sItem.."." )
|
||||
print( "You can't break " .. sItem .. "." )
|
||||
end
|
||||
else
|
||||
print( "You don't see a ".._sItem.." here." )
|
||||
print( "You don't see a " .. _sItem .. " here." )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1071,18 +1071,17 @@ function commands.craft( _sItem )
|
||||
return
|
||||
end
|
||||
|
||||
local room = getRoom( x,y,z )
|
||||
local sItem = findItem( items, _sItem )
|
||||
local tRecipe = (sItem and tRecipes[ sItem ]) or nil
|
||||
local tRecipe = sItem and tRecipes[ sItem ] or nil
|
||||
if tRecipe then
|
||||
for n,sReq in ipairs( tRecipe ) do
|
||||
for _, sReq in ipairs( tRecipe ) do
|
||||
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
|
||||
end
|
||||
end
|
||||
|
||||
for n,sReq in ipairs( tRecipe ) do
|
||||
for _, sReq in ipairs( tRecipe ) do
|
||||
inventory[sReq] = nil
|
||||
end
|
||||
inventory[ sItem ] = items[ sItem ]
|
||||
@@ -1091,7 +1090,7 @@ function commands.craft( _sItem )
|
||||
end
|
||||
print( "Crafted." )
|
||||
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
|
||||
|
||||
@@ -1116,12 +1115,12 @@ function commands.build( _sThing, _sMaterial )
|
||||
else
|
||||
sMaterial = findItem( inventory, _sMaterial )
|
||||
if not sMaterial then
|
||||
print( "You don't have any ".._sMaterial )
|
||||
print( "You don't have any " .. _sMaterial )
|
||||
return
|
||||
end
|
||||
|
||||
if inventory[sMaterial].material ~= true then
|
||||
print( sMaterial.." is not a good building material." )
|
||||
print( sMaterial .. " is not a good building material." )
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -1131,12 +1130,12 @@ function commands.build( _sThing, _sMaterial )
|
||||
alias = string.match( _sThing, "a ([%a ]+)" )
|
||||
end
|
||||
|
||||
local room = getRoom( x,y,z )
|
||||
local room = getRoom( x, y, z )
|
||||
inventory[sMaterial] = nil
|
||||
room.items[ _sThing ] = {
|
||||
heavy = true,
|
||||
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." )
|
||||
@@ -1159,7 +1158,7 @@ function commands.eat( _sItem )
|
||||
|
||||
local sItem = findItem( inventory, _sItem )
|
||||
if not sItem then
|
||||
print( "You don't have any ".._sItem.."." )
|
||||
print( "You don't have any " .. _sItem .. "." )
|
||||
return
|
||||
end
|
||||
|
||||
@@ -1173,7 +1172,7 @@ function commands.eat( _sItem )
|
||||
bInjured = false
|
||||
end
|
||||
else
|
||||
print( "You can't eat "..sItem.."." )
|
||||
print( "You can't eat " .. sItem .. "." )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1196,7 +1195,7 @@ function commands.badinput()
|
||||
"That doesn't make any sense.",
|
||||
"What?",
|
||||
}
|
||||
print( tResponses[ math.random(1,#tResponses) ] )
|
||||
print( tResponses[ math.random(1, #tResponses) ] )
|
||||
end
|
||||
|
||||
function commands.noinput()
|
||||
@@ -1207,32 +1206,32 @@ function commands.noinput()
|
||||
"Don't be shy.",
|
||||
"Use your words.",
|
||||
}
|
||||
print( tResponses[ math.random(1,#tResponses) ] )
|
||||
print( tResponses[ math.random(1, #tResponses) ] )
|
||||
end
|
||||
|
||||
local function simulate()
|
||||
local bNewMonstersThisRoom = false
|
||||
|
||||
-- Spawn monsters in nearby rooms
|
||||
for sx = -2,2 do
|
||||
for sy = -1,1 do
|
||||
for sz = -2,2 do
|
||||
for sx = -2, 2 do
|
||||
for sy = -1, 1 do
|
||||
for sz = -2, 2 do
|
||||
local h = y + sy
|
||||
if h >= -3 and h <= 0 then
|
||||
local room = getRoom( x + sx, h, z + sz )
|
||||
|
||||
-- Spawn monsters
|
||||
if room.nMonsters < 2 and
|
||||
((h == 0 and not isSunny() and not room.items["a torch"]) or room.dark) and
|
||||
math.random(1,6) == 1 then
|
||||
(h == 0 and not isSunny() and not room.items["a torch"] or room.dark) and
|
||||
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
|
||||
room.items[ sMonster ] = items[ sMonster ]
|
||||
room.nMonsters = room.nMonsters + 1
|
||||
|
||||
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
|
||||
end
|
||||
end
|
||||
@@ -1240,11 +1239,11 @@ local function simulate()
|
||||
|
||||
-- Burn monsters
|
||||
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
|
||||
room.items[sMonster] = nil
|
||||
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
|
||||
room.nMonsters = room.nMonsters - 1
|
||||
end
|
||||
@@ -1258,10 +1257,10 @@ local function simulate()
|
||||
-- Make monsters attack
|
||||
local room = getRoom( x, y, z )
|
||||
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 math.random(1,4) == 1 and
|
||||
not (y == 0 and isSunny() and (sMonster == "a spider")) then
|
||||
if math.random(1, 4) == 1 and
|
||||
not (y == 0 and isSunny() and sMonster == "a spider") then
|
||||
if sMonster == "a creeper" then
|
||||
if room.dark then
|
||||
print( "A creeper explodes." )
|
||||
@@ -1272,9 +1271,9 @@ local function simulate()
|
||||
room.nMonsters = room.nMonsters - 1
|
||||
else
|
||||
if room.dark then
|
||||
print( "A "..items[sMonster].aliases[1].." attacks you." )
|
||||
print( "A " .. items[sMonster].aliases[1] .. " attacks you." )
|
||||
else
|
||||
print( "The "..items[sMonster].aliases[1].." attacks you." )
|
||||
print( "The " .. items[sMonster].aliases[1] .. " attacks you." )
|
||||
end
|
||||
end
|
||||
|
||||
|
@@ -23,7 +23,7 @@ elseif sCommand == "play" or sCommand == nil then
|
||||
if sName == nil then
|
||||
-- No disc specified, pick one at random
|
||||
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
|
||||
table.insert( tNames, sName )
|
||||
end
|
||||
@@ -32,15 +32,15 @@ elseif sCommand == "play" or sCommand == nil then
|
||||
print( "No Music Discs in attached disk drives" )
|
||||
return
|
||||
end
|
||||
sName = tNames[ math.random(1,#tNames) ]
|
||||
sName = tNames[ math.random(1, #tNames) ]
|
||||
end
|
||||
|
||||
-- Play the disc
|
||||
if disk.isPresent( sName ) and disk.hasAudio( sName ) then
|
||||
print( "Playing "..disk.getAudioTitle( sName ) )
|
||||
print( "Playing " .. disk.getAudioTitle( sName ) )
|
||||
disk.playAudio( sName )
|
||||
else
|
||||
print( "No Music Disc in disk drive: "..sName )
|
||||
print( "No Music Disc in disk drive: " .. sName )
|
||||
return
|
||||
end
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
if term.isColour() then
|
||||
term.setTextColour( 2^math.random(0,15) )
|
||||
term.setTextColour( 2 ^ math.random(0, 15) )
|
||||
end
|
||||
textutils.slowPrint( "Hello World!" )
|
||||
term.setTextColour( colours.white )
|
||||
|
@@ -1,16 +1,14 @@
|
||||
|
||||
-- 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
|
||||
titleColour = colours.red
|
||||
headingColour = colours.yellow
|
||||
textColour = colours.white
|
||||
wormColour = colours.green
|
||||
fruitColour = colours.red
|
||||
else
|
||||
titleColour = colours.white
|
||||
headingColour = colours.white
|
||||
textColour = colours.white
|
||||
wormColour = colours.white
|
||||
@@ -18,30 +16,28 @@ else
|
||||
end
|
||||
|
||||
local function printCentred( y, s )
|
||||
local x = math.floor((w - string.len(s)) / 2)
|
||||
term.setCursorPos(x,y)
|
||||
local x = math.floor((w - #s) / 2)
|
||||
term.setCursorPos(x, y)
|
||||
--term.clearLine()
|
||||
term.write( s )
|
||||
end
|
||||
|
||||
local xVel,yVel = 1,0
|
||||
local xPos, yPos = math.floor(w/2), math.floor(h/2)
|
||||
local xVel, yVel = 1, 0
|
||||
local xPos, yPos = math.floor(w / 2), math.floor(h / 2)
|
||||
local pxVel, pyVel = nil, nil
|
||||
|
||||
local nLength = 1
|
||||
local nExtraLength = 6
|
||||
local bRunning = true
|
||||
|
||||
local tailX,tailY = xPos,yPos
|
||||
local tailX, tailY = xPos, yPos
|
||||
local nScore = 0
|
||||
local nDifficulty = 2
|
||||
local nSpeed, nInterval
|
||||
|
||||
-- Setup the screen
|
||||
local screen = {}
|
||||
for x=1,w do
|
||||
for x = 1, w do
|
||||
screen[x] = {}
|
||||
for y=1,h do
|
||||
for y = 1, h do
|
||||
screen[x][y] = {}
|
||||
end
|
||||
end
|
||||
@@ -58,17 +54,17 @@ local tFruits = {
|
||||
"q", "r", "s", "t", "u", "v", "w", "x",
|
||||
"y", "z",
|
||||
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
|
||||
"@", "$", "%", "#", "&", "!", "?", "+", "*", "~"
|
||||
"@", "$", "%", "#", "&", "!", "?", "+", "*", "~",
|
||||
}
|
||||
|
||||
local function addFruit()
|
||||
while true do
|
||||
local x = math.random(1,w)
|
||||
local y = math.random(2,h)
|
||||
local x = math.random(1, w)
|
||||
local y = math.random(2, h)
|
||||
local fruit = screen[x][y]
|
||||
if fruit.snake == nil and fruit.wall == nil and fruit.fruit == nil then
|
||||
screen[x][y] = { fruit = true }
|
||||
term.setCursorPos(x,y)
|
||||
term.setCursorPos(x, y)
|
||||
term.setBackgroundColour( fruitColour )
|
||||
term.write(" ")
|
||||
term.setBackgroundColour( colours.black )
|
||||
@@ -84,26 +80,25 @@ end
|
||||
|
||||
local function drawMenu()
|
||||
term.setTextColour( headingColour )
|
||||
term.setCursorPos(1,1)
|
||||
term.setCursorPos(1, 1)
|
||||
term.write( "SCORE " )
|
||||
|
||||
term.setTextColour( textColour )
|
||||
term.setCursorPos(7,1)
|
||||
term.setCursorPos(7, 1)
|
||||
term.write( tostring(nScore) )
|
||||
|
||||
term.setTextColour( headingColour )
|
||||
term.setCursorPos(w-11,1)
|
||||
term.setCursorPos(w - 11, 1)
|
||||
term.write( "DIFFICULTY ")
|
||||
|
||||
term.setTextColour( textColour )
|
||||
term.setCursorPos(w,1)
|
||||
term.setCursorPos(w, 1)
|
||||
term.write( tostring(nDifficulty or "?") )
|
||||
|
||||
term.setTextColour( colours.white )
|
||||
end
|
||||
|
||||
local function update( )
|
||||
local x,y = xPos,yPos
|
||||
if pxVel and pyVel then
|
||||
xVel, yVel = pxVel, pyVel
|
||||
pxVel, pyVel = nil, nil
|
||||
@@ -113,7 +108,7 @@ local function update( )
|
||||
if nExtraLength == 0 then
|
||||
local tail = screen[tailX][tailY]
|
||||
screen[tailX][tailY] = {}
|
||||
term.setCursorPos(tailX,tailY)
|
||||
term.setCursorPos(tailX, tailY)
|
||||
term.write(" ")
|
||||
tailX = tail.nextX
|
||||
tailY = tail.nextY
|
||||
@@ -154,7 +149,7 @@ local function update( )
|
||||
|
||||
end
|
||||
|
||||
term.setCursorPos(xPos,yPos)
|
||||
term.setCursorPos(xPos, yPos)
|
||||
term.setBackgroundColour( wormColour )
|
||||
term.write(" ")
|
||||
term.setBackgroundColour( colours.black )
|
||||
@@ -169,20 +164,20 @@ local function drawFrontend()
|
||||
--printCentred( math.floor(h/2) - 4, " W O R M " )
|
||||
|
||||
term.setTextColour( headingColour )
|
||||
printCentred( math.floor(h/2) - 3, "" )
|
||||
printCentred( math.floor(h/2) - 2, " SELECT DIFFICULTY " )
|
||||
printCentred( math.floor(h/2) - 1, "" )
|
||||
printCentred( math.floor(h / 2) - 3, "" )
|
||||
printCentred( math.floor(h / 2) - 2, " SELECT DIFFICULTY " )
|
||||
printCentred( math.floor(h / 2) - 1, "" )
|
||||
|
||||
printCentred( math.floor(h/2) + 0, " " )
|
||||
printCentred( math.floor(h/2) + 1, " " )
|
||||
printCentred( math.floor(h/2) + 2, " " )
|
||||
printCentred( math.floor(h/2) - 1 + nDifficulty, " [ ] " )
|
||||
printCentred( math.floor(h / 2) + 0, " " )
|
||||
printCentred( math.floor(h / 2) + 1, " " )
|
||||
printCentred( math.floor(h / 2) + 2, " " )
|
||||
printCentred( math.floor(h / 2) - 1 + nDifficulty, " [ ] " )
|
||||
|
||||
term.setTextColour( textColour )
|
||||
printCentred( math.floor(h/2) + 0, "EASY" )
|
||||
printCentred( math.floor(h/2) + 1, "MEDIUM" )
|
||||
printCentred( math.floor(h/2) + 2, "HARD" )
|
||||
printCentred( math.floor(h/2) + 3, "" )
|
||||
printCentred( math.floor(h / 2) + 0, "EASY" )
|
||||
printCentred( math.floor(h / 2) + 1, "MEDIUM" )
|
||||
printCentred( math.floor(h / 2) + 2, "HARD" )
|
||||
printCentred( math.floor(h / 2) + 3, "" )
|
||||
|
||||
term.setTextColour( colours.white )
|
||||
end
|
||||
@@ -190,7 +185,7 @@ end
|
||||
drawMenu()
|
||||
drawFrontend()
|
||||
while true do
|
||||
local e,key = os.pullEvent( "key" )
|
||||
local _, key = os.pullEvent( "key" )
|
||||
if key == keys.up or key == keys.w then
|
||||
-- Up
|
||||
if nDifficulty > 1 then
|
||||
@@ -228,7 +223,7 @@ addFruit()
|
||||
-- Play the game
|
||||
local timer = os.startTimer(0)
|
||||
while bRunning do
|
||||
local event, p1, p2 = os.pullEvent()
|
||||
local event, p1 = os.pullEvent()
|
||||
if event == "timer" and p1 == timer then
|
||||
timer = os.startTimer(nInterval)
|
||||
update( false )
|
||||
@@ -238,23 +233,23 @@ while bRunning do
|
||||
if key == keys.up or key == keys.w then
|
||||
-- Up
|
||||
if yVel == 0 then
|
||||
pxVel,pyVel = 0,-1
|
||||
pxVel, pyVel = 0, -1
|
||||
end
|
||||
elseif key == keys.down or key == keys.s then
|
||||
-- Down
|
||||
if yVel == 0 then
|
||||
pxVel,pyVel = 0,1
|
||||
pxVel, pyVel = 0, 1
|
||||
end
|
||||
elseif key == keys.left or key == keys.a then
|
||||
-- Left
|
||||
if xVel == 0 then
|
||||
pxVel,pyVel = -1,0
|
||||
pxVel, pyVel = -1, 0
|
||||
end
|
||||
|
||||
elseif key == keys.right or key == keys.d then
|
||||
-- Right
|
||||
if xVel == 0 then
|
||||
pxVel,pyVel = 1,0
|
||||
pxVel, pyVel = 1, 0
|
||||
end
|
||||
|
||||
end
|
||||
@@ -263,25 +258,25 @@ end
|
||||
|
||||
-- Display the gameover screen
|
||||
term.setTextColour( headingColour )
|
||||
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) - 2, " " )
|
||||
printCentred( math.floor(h / 2) - 1, " G A M E O V E R " )
|
||||
|
||||
term.setTextColour( textColour )
|
||||
printCentred( math.floor(h/2) + 0, " " )
|
||||
printCentred( math.floor(h/2) + 1, " FINAL SCORE "..nScore.." " )
|
||||
printCentred( math.floor(h/2) + 2, " " )
|
||||
printCentred( math.floor(h / 2) + 0, " " )
|
||||
printCentred( math.floor(h / 2) + 1, " FINAL SCORE " .. nScore .. " " )
|
||||
printCentred( math.floor(h / 2) + 2, " " )
|
||||
term.setTextColour( colours.white )
|
||||
|
||||
local timer = os.startTimer(2.5)
|
||||
repeat
|
||||
local e,p = os.pullEvent()
|
||||
local e, p = os.pullEvent()
|
||||
if e == "timer" and p == timer then
|
||||
term.setTextColour( textColour )
|
||||
printCentred( math.floor(h/2) + 2, " PRESS ANY KEY " )
|
||||
printCentred( math.floor(h/2) + 3, " " )
|
||||
printCentred( math.floor(h / 2) + 2, " PRESS ANY KEY " )
|
||||
printCentred( math.floor(h / 2) + 3, " " )
|
||||
term.setTextColour( colours.white )
|
||||
end
|
||||
until e == "char"
|
||||
|
||||
term.clear()
|
||||
term.setCursorPos(1,1)
|
||||
term.setCursorPos(1, 1)
|
||||
|
@@ -28,7 +28,7 @@ elseif sCommand == "host" then
|
||||
|
||||
-- Find a modem
|
||||
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
|
||||
sModemSide = sSide
|
||||
break
|
||||
@@ -41,7 +41,7 @@ elseif sCommand == "host" then
|
||||
end
|
||||
|
||||
-- Determine position
|
||||
local x,y,z
|
||||
local x, y, z
|
||||
if #tArgs >= 4 then
|
||||
-- Position is manually specified
|
||||
x = tonumber(tArgs[2])
|
||||
@@ -51,10 +51,10 @@ elseif sCommand == "host" then
|
||||
printUsage()
|
||||
return
|
||||
end
|
||||
print( "Position is "..x..","..y..","..z )
|
||||
print( "Position is " .. x .. "," .. y .. "," .. z )
|
||||
else
|
||||
-- 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
|
||||
print( "Run \"gps host <x> <y> <z>\" to set position manually" )
|
||||
return
|
||||
@@ -63,7 +63,7 @@ elseif sCommand == "host" then
|
||||
|
||||
-- Open a channel
|
||||
local modem = peripheral.wrap( sModemSide )
|
||||
print( "Opening channel on modem "..sModemSide )
|
||||
print( "Opening channel on modem " .. sModemSide )
|
||||
modem.open( gps.CHANNEL_GPS )
|
||||
|
||||
-- Serve requests indefinately
|
||||
@@ -80,10 +80,10 @@ elseif sCommand == "host" then
|
||||
-- Print the number of requests handled
|
||||
nServed = nServed + 1
|
||||
if nServed > 1 then
|
||||
local x,y = term.getCursorPos()
|
||||
term.setCursorPos(1,y-1)
|
||||
local _, y = term.getCursorPos()
|
||||
term.setCursorPos(1, y - 1)
|
||||
end
|
||||
print( nServed.." GPS requests served" )
|
||||
print( nServed .. " GPS requests served" )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -14,7 +14,7 @@ if sTopic == "index" then
|
||||
end
|
||||
|
||||
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
|
||||
local sContents = file:read("*a")
|
||||
file:close()
|
||||
|
@@ -46,9 +46,9 @@ local function get(url)
|
||||
|
||||
write( "Connecting to pastebin.com... " )
|
||||
-- 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(
|
||||
"https://pastebin.com/raw/"..textutils.urlEncode( paste ).."?cb="..cacheBuster
|
||||
"https://pastebin.com/raw/" .. textutils.urlEncode( paste ) .. "?cb=" .. cacheBuster
|
||||
)
|
||||
|
||||
if response then
|
||||
@@ -93,11 +93,11 @@ if sCommand == "put" then
|
||||
local key = "0ec2eb25b6166c0c27a394ae118ad829"
|
||||
local response = http.post(
|
||||
"https://pastebin.com/api/api_post.php",
|
||||
"api_option=paste&"..
|
||||
"api_dev_key="..key.."&"..
|
||||
"api_paste_format=lua&"..
|
||||
"api_paste_name="..textutils.urlEncode(sName).."&"..
|
||||
"api_paste_code="..textutils.urlEncode(sText)
|
||||
"api_option=paste&" ..
|
||||
"api_dev_key=" .. key .. "&" ..
|
||||
"api_paste_format=lua&" ..
|
||||
"api_paste_name=" .. textutils.urlEncode(sName) .. "&" ..
|
||||
"api_paste_code=" .. textutils.urlEncode(sText)
|
||||
)
|
||||
|
||||
if response then
|
||||
@@ -107,8 +107,8 @@ if sCommand == "put" then
|
||||
response.close()
|
||||
|
||||
local sCode = string.match( sResponse, "[^/]+$" )
|
||||
print( "Uploaded as "..sResponse )
|
||||
print( "Run \"pastebin get "..sCode.."\" to download anywhere" )
|
||||
print( "Uploaded as " .. sResponse )
|
||||
print( "Run \"pastebin get " .. sCode .. "\" to download anywhere" )
|
||||
|
||||
else
|
||||
print( "Failed." )
|
||||
@@ -137,7 +137,7 @@ elseif sCommand == "get" then
|
||||
file.write( res )
|
||||
file.close()
|
||||
|
||||
print( "Downloaded as "..sFile )
|
||||
print( "Downloaded as " .. sFile )
|
||||
end
|
||||
elseif sCommand == "run" then
|
||||
local sCode = tArgs[2]
|
||||
|
@@ -6,24 +6,24 @@ if #tArgs > 0 then
|
||||
end
|
||||
|
||||
if sDrive == nil then
|
||||
print( "This is computer #"..os.getComputerID() )
|
||||
print( "This is computer #" .. os.getComputerID() )
|
||||
|
||||
local label = os.getComputerLabel()
|
||||
if label then
|
||||
print( "This computer is labelled \""..label.."\"" )
|
||||
print( "This computer is labelled \"" .. label .. "\"" )
|
||||
end
|
||||
|
||||
else
|
||||
local bData = disk.hasData( sDrive )
|
||||
if not bData then
|
||||
print( "No disk in drive "..sDrive )
|
||||
print( "No disk in drive " .. sDrive )
|
||||
return
|
||||
end
|
||||
|
||||
print( "The disk is #"..disk.getID( sDrive ) )
|
||||
print( "The disk is #" .. disk.getID( sDrive ) )
|
||||
|
||||
local label = disk.getLabel( sDrive )
|
||||
if label then
|
||||
print( "The disk is labelled \""..label.."\"" )
|
||||
print( "The disk is labelled \"" .. label .. "\"" )
|
||||
end
|
||||
end
|
||||
|
@@ -14,11 +14,11 @@ local function checkDrive( sDrive )
|
||||
-- Check the disk exists
|
||||
local bData = disk.hasData( sDrive )
|
||||
if not bData then
|
||||
print( "No disk in "..sDrive.." drive" )
|
||||
print( "No disk in " .. sDrive .. " drive" )
|
||||
return false
|
||||
end
|
||||
else
|
||||
print( "No disk drive named "..sDrive )
|
||||
print( "No disk drive named " .. sDrive )
|
||||
return false
|
||||
end
|
||||
return true
|
||||
@@ -29,7 +29,7 @@ local function get( sDrive )
|
||||
if checkDrive( sDrive ) then
|
||||
local sLabel = disk.getLabel( sDrive )
|
||||
if sLabel then
|
||||
print( "Disk label is \""..sLabel.."\"" )
|
||||
print( "Disk label is \"" .. sLabel .. "\"" )
|
||||
else
|
||||
print( "No Disk label" )
|
||||
end
|
||||
@@ -37,7 +37,7 @@ local function get( sDrive )
|
||||
else
|
||||
local sLabel = os.getComputerLabel()
|
||||
if sLabel then
|
||||
print( "Computer label is \""..sLabel.."\"" )
|
||||
print( "Computer label is \"" .. sLabel .. "\"" )
|
||||
else
|
||||
print( "No Computer label" )
|
||||
end
|
||||
@@ -50,7 +50,7 @@ local function set( sDrive, sText )
|
||||
disk.setLabel( sDrive, sText )
|
||||
local sLabel = disk.getLabel( sDrive )
|
||||
if sLabel then
|
||||
print( "Disk label set to \""..sLabel.."\"" )
|
||||
print( "Disk label set to \"" .. sLabel .. "\"" )
|
||||
else
|
||||
print( "Disk label cleared" )
|
||||
end
|
||||
@@ -59,7 +59,7 @@ local function set( sDrive, sText )
|
||||
os.setComputerLabel( sText )
|
||||
local sLabel = os.getComputerLabel()
|
||||
if sLabel then
|
||||
print( "Computer label set to \""..sLabel.."\"" )
|
||||
print( "Computer label set to \"" .. sLabel .. "\"" )
|
||||
else
|
||||
print( "Computer label cleared" )
|
||||
end
|
||||
|
@@ -18,7 +18,7 @@ local tFiles = {}
|
||||
local tDirs = {}
|
||||
|
||||
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
|
||||
local sPath = fs.combine( sDir, sItem )
|
||||
if fs.isDir( sPath ) then
|
||||
|
@@ -67,7 +67,7 @@ while bRunning do
|
||||
|
||||
local nForcePrint = 0
|
||||
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 func2 then
|
||||
func = func2
|
||||
@@ -84,7 +84,7 @@ while bRunning do
|
||||
local tResults = table.pack( pcall( func ) )
|
||||
if tResults[1] then
|
||||
local n = 1
|
||||
while n < tResults.n or (n <= nForcePrint) do
|
||||
while n < tResults.n or n <= nForcePrint do
|
||||
local value = tResults[ n + 1 ]
|
||||
if type( value ) == "table" then
|
||||
local metatable = getmetatable( value )
|
||||
|
@@ -8,9 +8,9 @@ end
|
||||
for _, v in ipairs( tArgs ) do
|
||||
local sNewDir = shell.resolve( v )
|
||||
if fs.exists( sNewDir ) and not fs.isDir( sNewDir ) then
|
||||
printError( v..": Destination exists" )
|
||||
printError( v .. ": Destination exists" )
|
||||
elseif fs.isReadOnly( sNewDir ) then
|
||||
printError( v..": Access denied" )
|
||||
printError( v .. ": Access denied" )
|
||||
else
|
||||
fs.makeDir( sNewDir )
|
||||
end
|
||||
|
@@ -11,18 +11,18 @@ end
|
||||
|
||||
local sName = tArgs[1]
|
||||
if peripheral.getType( sName ) ~= "monitor" then
|
||||
print( "No monitor named ".. sName )
|
||||
print( "No monitor named " .. sName )
|
||||
return
|
||||
end
|
||||
|
||||
local sProgram = tArgs[2]
|
||||
local sPath = shell.resolveProgram( sProgram )
|
||||
if sPath == nil then
|
||||
print( "No such program: "..sProgram )
|
||||
print( "No such program: " .. sProgram )
|
||||
return
|
||||
end
|
||||
|
||||
print( "Running "..sProgram.." on monitor "..sName )
|
||||
print( "Running " .. sProgram .. " on monitor " .. sName )
|
||||
|
||||
local monitor = peripheral.wrap( sName )
|
||||
local previousTerm = term.redirect( monitor )
|
||||
|
@@ -3,7 +3,7 @@ local tMotd = {}
|
||||
for sPath in string.gmatch(settings.get( "motd.path" ), "[^:]+") do
|
||||
if fs.exists(sPath) then
|
||||
for sLine in io.lines(sPath) do
|
||||
table.insert(tMotd,sLine)
|
||||
table.insert(tMotd, sLine)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -11,5 +11,5 @@ end
|
||||
if #tMotd == 0 then
|
||||
print("missingno")
|
||||
else
|
||||
print(tMotd[math.random(1,#tMotd)])
|
||||
print(tMotd[math.random(1, #tMotd)])
|
||||
end
|
||||
|
@@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
|
||||
local sDest = shell.resolve( tArgs[2] )
|
||||
local tFiles = fs.find( sSource )
|
||||
if #tFiles > 0 then
|
||||
for n,sFile in ipairs( tFiles ) do
|
||||
for _, sFile in ipairs( tFiles ) do
|
||||
if fs.isDir( sDest ) then
|
||||
fs.move( sFile, fs.combine( sDest, fs.getName(sFile) ) )
|
||||
elseif #tFiles == 1 then
|
||||
|
@@ -1,7 +1,7 @@
|
||||
local tPeripherals = peripheral.getNames()
|
||||
print( "Attached Peripherals:" )
|
||||
if #tPeripherals > 0 then
|
||||
for n=1,#tPeripherals do
|
||||
for n = 1, #tPeripherals do
|
||||
local sPeripheral = tPeripherals[n]
|
||||
print( sPeripheral .. " (" .. peripheral.getType( sPeripheral ) .. ")" )
|
||||
end
|
||||
|
@@ -4,178 +4,178 @@ This version written by Gopher, at the request of Dan200, for
|
||||
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
|
||||
end
|
||||
|
||||
local block_s1= {
|
||||
local block_s1 = {
|
||||
{
|
||||
{ 1,0,0,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,0,0,0, },
|
||||
{ 0,1,1,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 1, 1, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","{}"),
|
||||
fg=colorass(colors.blue,colors.black),
|
||||
bg=colorass(colors.cyan,colors.white),
|
||||
ch = colorass(" ", "{}"),
|
||||
fg = colorass(colors.blue, colors.black),
|
||||
bg = colorass(colors.cyan, colors.white),
|
||||
}
|
||||
local block_s2= {
|
||||
local block_s2 = {
|
||||
{
|
||||
{ 0,1,0,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 1,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,0,0,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 0,1,1,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 1, 1, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","{}"),
|
||||
fg=colorass(colors.green,colors.black),
|
||||
bg=colorass(colors.lime,colors.white),
|
||||
ch = colorass(" ", "{}"),
|
||||
fg = colorass(colors.green, colors.black),
|
||||
bg = colorass(colors.lime, colors.white),
|
||||
}
|
||||
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, },
|
||||
{ 1,1,1,1, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 1 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","[]"),
|
||||
fg=colorass(colors.pink,colors.black),
|
||||
bg=colorass(colors.red,colors.white),
|
||||
ch = colorass(" ", "[]"),
|
||||
fg = colorass(colors.pink, colors.black),
|
||||
bg = colorass(colors.red, colors.white),
|
||||
}
|
||||
local block_square = {
|
||||
{
|
||||
{ 1,1,0,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","[]"),
|
||||
fg=colorass(colors.lightBlue,colors.black),
|
||||
bg=colorass(colors.blue,colors.white),
|
||||
ch = colorass(" ", "[]"),
|
||||
fg = colorass(colors.lightBlue, colors.black),
|
||||
bg = colorass(colors.blue, colors.white),
|
||||
}
|
||||
local block_L1 = {
|
||||
{
|
||||
{ 1,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,0,0,0, },
|
||||
{ 1,1,1,0, },
|
||||
{ 1,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 0 },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,1,1,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 1, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,0,1,0, },
|
||||
{ 1,1,1,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 1, 1, 1, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","()"),
|
||||
fg=colorass(colors.orange,colors.black),
|
||||
bg=colorass(colors.yellow,colors.white),
|
||||
ch = colorass(" ", "()"),
|
||||
fg = colorass(colors.orange, colors.black),
|
||||
bg = colorass(colors.yellow, colors.white),
|
||||
}
|
||||
local block_L2 = {
|
||||
{
|
||||
{ 0,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,0,0,0, },
|
||||
{ 1,1,1,0, },
|
||||
{ 0,0,1,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 0 },
|
||||
{ 0, 0, 1, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,1,1,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 1, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 1,0,0,0, },
|
||||
{ 1,1,1,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 1, 0, 0, 0 },
|
||||
{ 1, 1, 1, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","()"),
|
||||
fg=colorass(colors.brown,colors.black),
|
||||
bg=colorass(colors.orange,colors.white),
|
||||
ch = colorass(" ", "()"),
|
||||
fg = colorass(colors.brown, colors.black),
|
||||
bg = colorass(colors.orange, colors.white),
|
||||
}
|
||||
local block_T = {
|
||||
{
|
||||
{ 0,1,0,0, },
|
||||
{ 1,1,0,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 1, 1, 0, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,0,0,0, },
|
||||
{ 1,1,1,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,1,0,0, },
|
||||
{ 0,1,1,0, },
|
||||
{ 0,1,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 1, 1, 0 },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
{
|
||||
{ 0,1,0,0, },
|
||||
{ 1,1,1,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0,0,0,0, },
|
||||
{ 0, 1, 0, 0 },
|
||||
{ 1, 1, 1, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
},
|
||||
ch=colorass(" ","<>"),
|
||||
fg=colorass(colors.cyan,colors.black),
|
||||
bg=colorass(colors.purple,colors.white),
|
||||
ch = colorass(" ", "<>"),
|
||||
fg = colorass(colors.cyan, colors.black),
|
||||
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)
|
||||
text=tostring(text)
|
||||
return string.rep(" ",amt-#text)..text
|
||||
local function lpad(text, amt)
|
||||
text = tostring(text)
|
||||
return string.rep(" ", amt - #text) .. text
|
||||
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 :(")
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
local speedsByLevel={
|
||||
local speedsByLevel = {
|
||||
1.2,
|
||||
1.0,
|
||||
.8,
|
||||
@@ -187,23 +187,23 @@ local speedsByLevel={
|
||||
.2,
|
||||
.15,
|
||||
.1,
|
||||
.05,}
|
||||
.05, }
|
||||
|
||||
local level=1
|
||||
local level = 1
|
||||
|
||||
local function playGame()
|
||||
local score=0
|
||||
local lines=0
|
||||
local initialLevel=level
|
||||
local next=blocks[math.random(1,#blocks)]
|
||||
local score = 0
|
||||
local lines = 0
|
||||
local initialLevel = level
|
||||
local next = blocks[math.random(1, #blocks)]
|
||||
|
||||
local pit={}
|
||||
local pit = {}
|
||||
|
||||
|
||||
local heightAdjust=0
|
||||
local heightAdjust = 0
|
||||
|
||||
if height<=19 then
|
||||
heightAdjust=1
|
||||
if height <= 19 then
|
||||
heightAdjust = 1
|
||||
end
|
||||
|
||||
|
||||
@@ -215,56 +215,56 @@ local function playGame()
|
||||
|
||||
term.setTextColor(colors.black)
|
||||
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||
term.setCursorPos(22,2)
|
||||
term.setCursorPos(22, 2)
|
||||
term.write("Score") --score
|
||||
term.setCursorPos(22,5)
|
||||
term.setCursorPos(22, 5)
|
||||
term.write("Level") --level
|
||||
term.setCursorPos(22,8)
|
||||
term.setCursorPos(22, 8)
|
||||
term.write("Lines") --lines
|
||||
term.setCursorPos(22,12)
|
||||
term.setCursorPos(22, 12)
|
||||
term.write("Next") --next
|
||||
|
||||
term.setCursorPos(21,1)
|
||||
term.setCursorPos(21, 1)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,2)
|
||||
term.setCursorPos(21, 2)
|
||||
term.write(" ") --score
|
||||
term.setCursorPos(21,3)
|
||||
term.setCursorPos(21, 3)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,4)
|
||||
term.setCursorPos(21, 4)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,5)
|
||||
term.setCursorPos(21, 5)
|
||||
term.write(" ") --level
|
||||
term.setCursorPos(21,6)
|
||||
term.setCursorPos(21, 6)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,7)
|
||||
term.setCursorPos(21, 7)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,8)
|
||||
term.setCursorPos(21, 8)
|
||||
term.write(" ") --lines
|
||||
term.setCursorPos(21,9)
|
||||
term.setCursorPos(21, 9)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,10)
|
||||
term.setCursorPos(21, 10)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,11)
|
||||
term.setCursorPos(21, 11)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,12)
|
||||
term.setCursorPos(21, 12)
|
||||
term.write(" ") --next
|
||||
term.setCursorPos(26,12)
|
||||
term.setCursorPos(26, 12)
|
||||
term.write(" ") --next
|
||||
term.setCursorPos(21,13)
|
||||
term.setCursorPos(21, 13)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,14)
|
||||
term.setCursorPos(21, 14)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,15)
|
||||
term.setCursorPos(21, 15)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,16)
|
||||
term.setCursorPos(21, 16)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,17)
|
||||
term.setCursorPos(21, 17)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,18)
|
||||
term.setCursorPos(21, 18)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,19)
|
||||
term.setCursorPos(21, 19)
|
||||
term.write(" ")
|
||||
term.setCursorPos(21,20)
|
||||
term.setCursorPos(21, 20)
|
||||
term.write(" ")
|
||||
end
|
||||
|
||||
@@ -272,47 +272,47 @@ local function playGame()
|
||||
term.setTextColor(colors.white)
|
||||
term.setBackgroundColor(colors.black)
|
||||
|
||||
term.setCursorPos(22,3)
|
||||
term.write(lpad(score,5)) --score
|
||||
term.setCursorPos(22,6)
|
||||
term.write(lpad(level,5)) --level
|
||||
term.setCursorPos(22,9)
|
||||
term.write(lpad(lines,5)) --lines
|
||||
term.setCursorPos(22, 3)
|
||||
term.write(lpad(score, 5)) --score
|
||||
term.setCursorPos(22, 6)
|
||||
term.write(lpad(level, 5)) --level
|
||||
term.setCursorPos(22, 9)
|
||||
term.write(lpad(lines, 5)) --lines
|
||||
end
|
||||
|
||||
local function drawBlockAt(block,xp,yp,rot)
|
||||
local function drawBlockAt(block, xp, yp, rot)
|
||||
term.setTextColor(block.fg)
|
||||
term.setBackgroundColor(block.bg)
|
||||
for y=1,4 do
|
||||
for x=1,4 do
|
||||
if block[rot][y][x]==1 then
|
||||
term.setCursorPos((xp+x)*2-3,yp+y-1-heightAdjust)
|
||||
for y = 1, 4 do
|
||||
for x = 1, 4 do
|
||||
if block[rot][y][x] == 1 then
|
||||
term.setCursorPos((xp + x) * 2 - 3, yp + y - 1 - heightAdjust)
|
||||
term.write(block.ch)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function eraseBlockAt(block,xp,yp,rot)
|
||||
local function eraseBlockAt(block, xp, yp, rot)
|
||||
term.setTextColor(colors.white)
|
||||
term.setBackgroundColor(colors.black)
|
||||
for y=1,4 do
|
||||
for x=1,4 do
|
||||
if block[rot][y][x]==1 then
|
||||
term.setCursorPos((xp+x)*2-3,yp+y-1-heightAdjust)
|
||||
for y = 1, 4 do
|
||||
for x = 1, 4 do
|
||||
if block[rot][y][x] == 1 then
|
||||
term.setCursorPos((xp + x) * 2 - 3, yp + y - 1 - heightAdjust)
|
||||
term.write(" ")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function testBlockAt(block,xp,yp,rot)
|
||||
for y=1,4 do
|
||||
local ty=yp+y-1
|
||||
for x=1,4 do
|
||||
local tx=xp+x-1
|
||||
if block[rot][y][x]==1 then
|
||||
if tx>10 or tx<1 or ty>20 or pit[ty][tx]~=0 then
|
||||
local function testBlockAt(block, xp, yp, rot)
|
||||
for y = 1, 4 do
|
||||
local ty = yp + y - 1
|
||||
for x = 1, 4 do
|
||||
local tx = xp + x - 1
|
||||
if block[rot][y][x] == 1 then
|
||||
if tx > 10 or tx < 1 or ty > 20 or pit[ty][tx] ~= 0 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
@@ -320,11 +320,11 @@ local function playGame()
|
||||
end
|
||||
end
|
||||
|
||||
local function pitBlock(block,xp,yp,rot)
|
||||
for y=1,4 do
|
||||
for x=1,4 do
|
||||
if block[rot][y][x]==1 then
|
||||
pit[yp+y-1][xp+x-1]=block
|
||||
local function pitBlock(block, xp, yp, rot)
|
||||
for y = 1, 4 do
|
||||
for x = 1, 4 do
|
||||
if block[rot][y][x] == 1 then
|
||||
pit[yp + y - 1][xp + x - 1] = block
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -332,10 +332,10 @@ local function playGame()
|
||||
|
||||
|
||||
local function clearPit()
|
||||
for row=1,20 do
|
||||
pit[row]={}
|
||||
for col=1,10 do
|
||||
pit[row][col]=0
|
||||
for row = 1, 20 do
|
||||
pit[row] = {}
|
||||
for col = 1, 10 do
|
||||
pit[row][col] = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -350,24 +350,24 @@ local function playGame()
|
||||
|
||||
|
||||
|
||||
local halt=false
|
||||
local dropSpeed=speedsByLevel[math.min(level,12)]
|
||||
local halt = false
|
||||
local dropSpeed = speedsByLevel[math.min(level, 12)]
|
||||
|
||||
|
||||
local curBlock=next
|
||||
next=blocks[math.random(1,7)]
|
||||
local curBlock = next
|
||||
next = blocks[math.random(1, 7)]
|
||||
|
||||
local curX, curY, curRot=4, 1, 1
|
||||
local dropTimer=os.startTimer(dropSpeed)
|
||||
local curX, curY, curRot = 4, 1, 1
|
||||
local dropTimer = os.startTimer(dropSpeed)
|
||||
|
||||
drawBlockAt(next,11.5,15+heightAdjust,1)
|
||||
drawBlockAt(curBlock,curX,curY,curRot)
|
||||
drawBlockAt(next, 11.5, 15 + heightAdjust, 1)
|
||||
drawBlockAt(curBlock, curX, curY, curRot)
|
||||
|
||||
local function redrawPit()
|
||||
for r=1+heightAdjust,20 do
|
||||
term.setCursorPos(1,r-heightAdjust)
|
||||
for c=1,10 do
|
||||
if pit[r][c]==0 then
|
||||
for r = 1 + heightAdjust, 20 do
|
||||
term.setCursorPos(1, r - heightAdjust)
|
||||
for c = 1, 10 do
|
||||
if pit[r][c] == 0 then
|
||||
term.setTextColor(colors.black)
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.write(" ")
|
||||
@@ -381,8 +381,8 @@ local function playGame()
|
||||
end
|
||||
|
||||
local function hidePit()
|
||||
for r=1+heightAdjust,20 do
|
||||
term.setCursorPos(1,r-heightAdjust)
|
||||
for r = 1 + heightAdjust, 20 do
|
||||
term.setCursorPos(1, r - heightAdjust)
|
||||
term.setTextColor(colors.black)
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.write(" ")
|
||||
@@ -390,56 +390,56 @@ local function playGame()
|
||||
end
|
||||
|
||||
local function msgBox(message)
|
||||
local x=math.floor((17-#message)/2)
|
||||
term.setBackgroundColor(colorass(colors.lightGray,colors.white))
|
||||
local x = math.floor((17 - #message) / 2)
|
||||
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||
term.setTextColor(colors.black)
|
||||
term.setCursorPos(x,9)
|
||||
term.write("+"..string.rep("-",#message+2).."+")
|
||||
term.setCursorPos(x,10)
|
||||
term.setCursorPos(x, 9)
|
||||
term.write("+" .. string.rep("-", #message + 2) .. "+")
|
||||
term.setCursorPos(x, 10)
|
||||
term.write("|")
|
||||
term.setCursorPos(x+#message+3,10)
|
||||
term.setCursorPos(x + #message + 3, 10)
|
||||
term.write("|")
|
||||
term.setCursorPos(x,11)
|
||||
term.write("+"..string.rep("-",#message+2).."+")
|
||||
term.setCursorPos(x, 11)
|
||||
term.write("+" .. string.rep("-", #message + 2) .. "+")
|
||||
term.setTextColor(colors.white)
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.setCursorPos(x+1,10)
|
||||
term.write(" "..message.." ")
|
||||
term.setCursorPos(x + 1, 10)
|
||||
term.write(" " .. message .. " ")
|
||||
end
|
||||
|
||||
local function clearRows()
|
||||
local rows={}
|
||||
for r=1,20 do
|
||||
local count=0
|
||||
for c=1,10 do
|
||||
if pit[r][c]~=0 then
|
||||
count=count+1
|
||||
local rows = {}
|
||||
for r = 1, 20 do
|
||||
local count = 0
|
||||
for c = 1, 10 do
|
||||
if pit[r][c] ~= 0 then
|
||||
count = count + 1
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
if count==10 then
|
||||
rows[#rows+1]=r
|
||||
if count == 10 then
|
||||
rows[#rows + 1] = r
|
||||
end
|
||||
end
|
||||
|
||||
if #rows>0 then
|
||||
for i=1,4 do
|
||||
if #rows > 0 then
|
||||
for _ = 1, 4 do
|
||||
sleep(.1)
|
||||
for r=1,#rows do
|
||||
r=rows[r]
|
||||
term.setCursorPos(1,r-heightAdjust)
|
||||
for c=1,10 do
|
||||
for r = 1, #rows do
|
||||
r = rows[r]
|
||||
term.setCursorPos(1, r - heightAdjust)
|
||||
for c = 1, 10 do
|
||||
term.setTextColor(pit[r][c].bg)
|
||||
term.setBackgroundColor(pit[r][c].fg)
|
||||
term.write(pit[r][c].ch)
|
||||
end
|
||||
end
|
||||
sleep(.1)
|
||||
for r=1,#rows do
|
||||
r=rows[r]
|
||||
term.setCursorPos(1,r-heightAdjust)
|
||||
for c=1,10 do
|
||||
for r = 1, #rows do
|
||||
r = rows[r]
|
||||
term.setCursorPos(1, r - heightAdjust)
|
||||
for c = 1, 10 do
|
||||
term.setTextColor(pit[r][c].fg)
|
||||
term.setBackgroundColor(pit[r][c].bg)
|
||||
term.write(pit[r][c].ch)
|
||||
@@ -448,155 +448,154 @@ local function playGame()
|
||||
end
|
||||
--now remove the rows and drop everythign else
|
||||
term.setBackgroundColor(colors.black)
|
||||
for r=1,#rows do
|
||||
r=rows[r]
|
||||
term.setCursorPos(1,r-heightAdjust)
|
||||
for r = 1, #rows do
|
||||
r = rows[r]
|
||||
term.setCursorPos(1, r - heightAdjust)
|
||||
term.write(" ")
|
||||
end
|
||||
sleep(.25)
|
||||
for r=1,#rows do
|
||||
table.remove(pit,rows[r])
|
||||
table.insert(pit,1,{0,0,0,0,0,0,0,0,0,0})
|
||||
for r = 1, #rows do
|
||||
table.remove(pit, rows[r])
|
||||
table.insert(pit, 1, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
|
||||
end
|
||||
redrawPit()
|
||||
lines=lines+#rows
|
||||
score=score+points[#rows]*math.min(level,20)
|
||||
level=math.floor(lines/10)+initialLevel
|
||||
dropSpeed=speedsByLevel[math.min(level,12)]
|
||||
lines = lines + #rows
|
||||
score = score + points[#rows] * math.min(level, 20)
|
||||
level = math.floor(lines / 10) + initialLevel
|
||||
dropSpeed = speedsByLevel[math.min(level, 12)]
|
||||
updateNumbers()
|
||||
end
|
||||
sleep(.25)
|
||||
end
|
||||
|
||||
local function blockFall()
|
||||
local result = false
|
||||
if testBlockAt(curBlock,curX,curY+1,curRot) then
|
||||
pitBlock(curBlock,curX,curY,curRot)
|
||||
if testBlockAt(curBlock, curX, curY + 1, curRot) then
|
||||
pitBlock(curBlock, curX, curY, curRot)
|
||||
--detect rows that clear
|
||||
clearRows()
|
||||
|
||||
curBlock=next
|
||||
curX=4
|
||||
curY=1
|
||||
curRot=1
|
||||
if testBlockAt(curBlock,curX,curY,curRot) then
|
||||
halt=true
|
||||
curBlock = next
|
||||
curX = 4
|
||||
curY = 1
|
||||
curRot = 1
|
||||
if testBlockAt(curBlock, curX, curY, curRot) then
|
||||
halt = true
|
||||
end
|
||||
drawBlockAt(curBlock,curX,curY,curRot)
|
||||
eraseBlockAt(next,11.5,15+heightAdjust,1)
|
||||
next=blocks[math.random(1,7)]
|
||||
drawBlockAt(next,11.5,15+heightAdjust,1)
|
||||
drawBlockAt(curBlock, curX, curY, curRot)
|
||||
eraseBlockAt(next, 11.5, 15 + heightAdjust, 1)
|
||||
next = blocks[math.random(1, 7)]
|
||||
drawBlockAt(next, 11.5, 15 + heightAdjust, 1)
|
||||
return true
|
||||
else
|
||||
eraseBlockAt(curBlock,curX,curY,curRot)
|
||||
curY=curY+1
|
||||
drawBlockAt(curBlock,curX,curY,curRot)
|
||||
eraseBlockAt(curBlock, curX, curY, curRot)
|
||||
curY = curY + 1
|
||||
drawBlockAt(curBlock, curX, curY, curRot)
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
while not halt do
|
||||
local e={os.pullEvent()}
|
||||
if e[1]=="timer" then
|
||||
if e[2]==dropTimer then
|
||||
local e = {os.pullEvent()}
|
||||
if e[1] == "timer" then
|
||||
if e[2] == dropTimer then
|
||||
blockFall()
|
||||
dropTimer=os.startTimer(dropSpeed)
|
||||
dropTimer = os.startTimer(dropSpeed)
|
||||
end
|
||||
elseif e[1]=="key" then
|
||||
local key=e[2]
|
||||
local dx,dy,dr=0,0,0
|
||||
if key==keys.left or key==keys.a then
|
||||
dx=-1
|
||||
elseif key==keys.right or key==keys.d then
|
||||
dx=1
|
||||
elseif key==keys.up or key==keys.w then
|
||||
dr=1
|
||||
elseif key==keys.down or key==keys.s then
|
||||
elseif e[1] == "key" then
|
||||
local key = e[2]
|
||||
local dx, dy, dr = 0, 0, 0
|
||||
if key == keys.left or key == keys.a then
|
||||
dx = -1
|
||||
elseif key == keys.right or key == keys.d then
|
||||
dx = 1
|
||||
elseif key == keys.up or key == keys.w then
|
||||
dr = 1
|
||||
elseif key == keys.down or key == keys.s then
|
||||
while not blockFall() do end
|
||||
dropTimer=os.startTimer(dropSpeed)
|
||||
elseif key==keys.space then
|
||||
dropTimer = os.startTimer(dropSpeed)
|
||||
elseif key == keys.space then
|
||||
hidePit()
|
||||
msgBox("Paused")
|
||||
while ({os.pullEvent("key")})[2]~=keys.space do end
|
||||
while ({os.pullEvent("key")})[2] ~= keys.space do end
|
||||
redrawPit()
|
||||
drawBlockAt(curBlock,curX,curY,curRot)
|
||||
dropTimer=os.startTimer(dropSpeed)
|
||||
drawBlockAt(curBlock, curX, curY, curRot)
|
||||
dropTimer = os.startTimer(dropSpeed)
|
||||
end
|
||||
if dx+dr~=0 then
|
||||
if not testBlockAt(curBlock,curX+dx,curY+dy,(dr>0 and curRot%#curBlock+dr or curRot)) then
|
||||
eraseBlockAt(curBlock,curX,curY,curRot)
|
||||
curX=curX+dx
|
||||
curY=curY+dy
|
||||
curRot=dr==0 and curRot or (curRot%#curBlock+dr)
|
||||
drawBlockAt(curBlock,curX,curY,curRot)
|
||||
if dx + dr ~= 0 then
|
||||
if not testBlockAt(curBlock, curX + dx, curY + dy, dr > 0 and curRot % #curBlock + dr or curRot) then
|
||||
eraseBlockAt(curBlock, curX, curY, curRot)
|
||||
curX = curX + dx
|
||||
curY = curY + dy
|
||||
curRot = dr == 0 and curRot or curRot % #curBlock + dr
|
||||
drawBlockAt(curBlock, curX, curY, curRot)
|
||||
end
|
||||
end
|
||||
elseif e[1]=="term_resize" then
|
||||
local w,h=term.getSize()
|
||||
if h==20 then
|
||||
heightAdjust=0
|
||||
elseif e[1] == "term_resize" then
|
||||
local _, h = term.getSize()
|
||||
if h == 20 then
|
||||
heightAdjust = 0
|
||||
else
|
||||
heightAdjust=1
|
||||
heightAdjust = 1
|
||||
end
|
||||
redrawPit()
|
||||
drawBlockAt(curBlock,curX,curY,curRot)
|
||||
drawBlockAt(curBlock, curX, curY, curRot)
|
||||
end
|
||||
end
|
||||
|
||||
msgBox("Game Over!")
|
||||
while true do
|
||||
local _,k=os.pullEvent("key")
|
||||
if k==keys.space or k==keys.enter then
|
||||
local _, k = os.pullEvent("key")
|
||||
if k == keys.space or k == keys.enter then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
level = math.min(level,9)
|
||||
level = math.min(level, 9)
|
||||
end
|
||||
|
||||
|
||||
local selected=1
|
||||
local playersDetected=false
|
||||
local selected = 1
|
||||
local playersDetected = false
|
||||
|
||||
local function drawMenu()
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.setTextColor(colorass(colors.red,colors.white))
|
||||
term.setTextColor(colorass(colors.red, colors.white))
|
||||
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")
|
||||
|
||||
if playersDetected then
|
||||
if selected==0 then
|
||||
term.setTextColor(colorass(colors.blue,colors.black))
|
||||
term.setBackgroundColor(colorass(colors.gray,colors.white))
|
||||
if selected == 0 then
|
||||
term.setTextColor(colorass(colors.blue, colors.black))
|
||||
term.setBackgroundColor(colorass(colors.gray, colors.white))
|
||||
else
|
||||
term.setTextColor(colorass(colors.lightBlue,colors.white))
|
||||
term.setTextColor(colorass(colors.lightBlue, colors.white))
|
||||
term.setBackgroundColor(colors.black)
|
||||
end
|
||||
term.setCursorPos(cx-12,cy)
|
||||
term.setCursorPos(cx - 12, cy)
|
||||
term.write(" Play head-to-head game! ")
|
||||
end
|
||||
|
||||
term.setCursorPos(cx-10,cy+1)
|
||||
if selected==1 then
|
||||
term.setTextColor(colorass(colors.blue,colors.black))
|
||||
term.setBackgroundColor(colorass(colors.lightGray,colors.white))
|
||||
term.setCursorPos(cx - 10, cy + 1)
|
||||
if selected == 1 then
|
||||
term.setTextColor(colorass(colors.blue, colors.black))
|
||||
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||
else
|
||||
term.setTextColor(colorass(colors.lightBlue,colors.white))
|
||||
term.setTextColor(colorass(colors.lightBlue, colors.white))
|
||||
term.setBackgroundColor(colors.black)
|
||||
end
|
||||
term.write(" Play from level: <" .. level .. "> ")
|
||||
|
||||
term.setCursorPos(cx-3,cy+3)
|
||||
if selected==2 then
|
||||
term.setTextColor(colorass(colors.blue,colors.black))
|
||||
term.setBackgroundColor(colorass(colors.lightGray,colors.white))
|
||||
term.setCursorPos(cx - 3, cy + 3)
|
||||
if selected == 2 then
|
||||
term.setTextColor(colorass(colors.blue, colors.black))
|
||||
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||
else
|
||||
term.setTextColor(colorass(colors.lightBlue,colors.white))
|
||||
term.setTextColor(colorass(colors.lightBlue, colors.white))
|
||||
term.setBackgroundColor(colors.black)
|
||||
end
|
||||
term.write(" Quit ")
|
||||
@@ -607,28 +606,28 @@ local function runMenu()
|
||||
drawMenu()
|
||||
|
||||
while true do
|
||||
local event={os.pullEvent()}
|
||||
if event[1]=="key" then
|
||||
local key=event[2]
|
||||
if key==keys.right or key==keys.d and selected==1 then
|
||||
level=math.min(level+1,9)
|
||||
local event = {os.pullEvent()}
|
||||
if event[1] == "key" then
|
||||
local key = event[2]
|
||||
if key == keys.right or key == keys.d and selected == 1 then
|
||||
level = math.min(level + 1, 9)
|
||||
drawMenu()
|
||||
elseif key==keys.left or key==keys.a and selected==1 then
|
||||
level=math.max(level-1,1)
|
||||
elseif key == keys.left or key == keys.a and selected == 1 then
|
||||
level = math.max(level - 1, 1)
|
||||
drawMenu()
|
||||
elseif key>=keys.one and key<=keys.nine and selected==1 then
|
||||
level=(key-keys.one) + 1
|
||||
elseif key >= keys.one and key <= keys.nine and selected == 1 then
|
||||
level = key - keys.one + 1
|
||||
drawMenu()
|
||||
elseif key==keys.up or key==keys.w then
|
||||
selected=selected-1
|
||||
if selected==0 then
|
||||
selected=2
|
||||
elseif key == keys.up or key == keys.w then
|
||||
selected = selected - 1
|
||||
if selected == 0 then
|
||||
selected = 2
|
||||
end
|
||||
drawMenu()
|
||||
elseif key==keys.down or key==keys.s then
|
||||
selected=selected%2+1
|
||||
elseif key == keys.down or key == keys.s then
|
||||
selected = selected % 2 + 1
|
||||
drawMenu()
|
||||
elseif key==keys.enter or key==keys.space then
|
||||
elseif key == keys.enter or key == keys.space then
|
||||
break --begin play!
|
||||
end
|
||||
end
|
||||
@@ -637,7 +636,7 @@ end
|
||||
|
||||
while true do
|
||||
runMenu()
|
||||
if selected==2 then
|
||||
if selected == 2 then
|
||||
break
|
||||
end
|
||||
|
||||
@@ -648,4 +647,4 @@ end
|
||||
term.setTextColor(colors.white)
|
||||
term.setBackgroundColor(colors.black)
|
||||
term.clear()
|
||||
term.setCursorPos(1,1)
|
||||
term.setCursorPos(1, 1)
|
||||
|
@@ -9,7 +9,7 @@ end
|
||||
|
||||
local sOpenedModem = nil
|
||||
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 not rednet.isOpen( sModem ) then
|
||||
rednet.open( sModem )
|
||||
@@ -94,7 +94,7 @@ if sCommand == "host" then
|
||||
end
|
||||
|
||||
local function printUsers()
|
||||
local x,y = term.getCursorPos()
|
||||
local _, y = term.getCursorPos()
|
||||
term.setCursorPos( 1, y - 1 )
|
||||
term.clearLine()
|
||||
if nUsers == 1 then
|
||||
@@ -108,13 +108,13 @@ if sCommand == "host" then
|
||||
local ok, error = pcall( function()
|
||||
parallel.waitForAny( function()
|
||||
while true do
|
||||
local sEvent, timer = os.pullEvent( "timer" )
|
||||
local _, timer = os.pullEvent( "timer" )
|
||||
local nUserID = tPingPongTimer[ timer ]
|
||||
if nUserID and tUsers[ nUserID ] then
|
||||
local tUser = tUsers[ nUserID ]
|
||||
if tUser then
|
||||
if not tUser.bPingPonged then
|
||||
send( "* "..tUser.sUsername.." has timed out" )
|
||||
send( "* " .. tUser.sUsername .. " has timed out" )
|
||||
tUsers[ nUserID ] = nil
|
||||
nUsers = nUsers - 1
|
||||
printUsers()
|
||||
@@ -130,17 +130,17 @@ if sCommand == "host" then
|
||||
local tCommands
|
||||
tCommands = {
|
||||
["me"] = function( tUser, sContent )
|
||||
if string.len(sContent) > 0 then
|
||||
send( "* "..tUser.sUsername.." "..sContent )
|
||||
if #sContent > 0 then
|
||||
send( "* " .. tUser.sUsername .. " " .. sContent )
|
||||
else
|
||||
send( "* Usage: /me [words]", tUser.nUserID )
|
||||
end
|
||||
end,
|
||||
["nick"] = function( tUser, sContent )
|
||||
if string.len(sContent) > 0 then
|
||||
if #sContent > 0 then
|
||||
local sOldName = tUser.sUsername
|
||||
tUser.sUsername = sContent
|
||||
send( "* "..sOldName.." is now known as "..tUser.sUsername )
|
||||
send( "* " .. sOldName .. " is now known as " .. tUser.sUsername )
|
||||
else
|
||||
send( "* Usage: /nick [nickname]", tUser.nUserID )
|
||||
end
|
||||
@@ -148,7 +148,7 @@ if sCommand == "host" then
|
||||
["users"] = function( tUser, sContent )
|
||||
send( "* Connected Users:", tUser.nUserID )
|
||||
local sUsers = "*"
|
||||
for nUserID, tUser in pairs( tUsers ) do
|
||||
for _, tUser in pairs( tUsers ) do
|
||||
sUsers = sUsers .. " " .. tUser.sUsername
|
||||
end
|
||||
send( sUsers, tUser.nUserID )
|
||||
@@ -156,10 +156,10 @@ if sCommand == "host" then
|
||||
["help"] = function( tUser, sContent )
|
||||
send( "* Available commands:", tUser.nUserID )
|
||||
local sCommands = "*"
|
||||
for sCommand, fnCommand in pairs( tCommands ) do
|
||||
for sCommand in pairs( tCommands ) do
|
||||
sCommands = sCommands .. " /" .. sCommand
|
||||
end
|
||||
send( sCommands.." /logout", tUser.nUserID )
|
||||
send( sCommands .. " /logout", tUser.nUserID )
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ if sCommand == "host" then
|
||||
}
|
||||
nUsers = nUsers + 1
|
||||
printUsers()
|
||||
send( "* "..sUsername.." has joined the chat" )
|
||||
send( "* " .. sUsername .. " has joined the chat" )
|
||||
ping( nUserID )
|
||||
end
|
||||
|
||||
@@ -187,7 +187,7 @@ if sCommand == "host" then
|
||||
local tUser = tUsers[ nUserID ]
|
||||
if tUser and tUser.nID == nSenderID then
|
||||
if tMessage.sType == "logout" then
|
||||
send( "* "..tUser.sUsername.." has left the chat" )
|
||||
send( "* " .. tUser.sUsername .. " has left the chat" )
|
||||
tUsers[ nUserID ] = nil
|
||||
nUsers = nUsers - 1
|
||||
printUsers()
|
||||
@@ -199,13 +199,13 @@ if sCommand == "host" then
|
||||
if sCommand then
|
||||
local fnCommand = tCommands[ sCommand ]
|
||||
if fnCommand then
|
||||
local sContent = string.sub( sMessage, string.len(sCommand)+3 )
|
||||
local sContent = string.sub( sMessage, #sCommand + 3 )
|
||||
fnCommand( tUser, sContent )
|
||||
else
|
||||
send( "* Unrecognised command: /"..sCommand, tUser.nUserID )
|
||||
send( "* Unrecognised command: /" .. sCommand, tUser.nUserID )
|
||||
end
|
||||
else
|
||||
send( "<"..tUser.sUsername.."> "..tMessage.sText )
|
||||
send( "<" .. tUser.sUsername .. "> " .. tMessage.sText )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -284,12 +284,12 @@ elseif sCommand == "join" then
|
||||
end
|
||||
|
||||
-- Handle messages
|
||||
local w,h = term.getSize()
|
||||
local w, h = term.getSize()
|
||||
local parentTerm = term.current()
|
||||
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 )
|
||||
historyWindow.setCursorPos( 1, h-2 )
|
||||
historyWindow.setCursorPos( 1, h - 2 )
|
||||
|
||||
term.clear()
|
||||
term.setTextColour( textColour )
|
||||
@@ -297,11 +297,10 @@ elseif sCommand == "join" then
|
||||
promptWindow.restoreCursor()
|
||||
|
||||
local function drawTitle()
|
||||
local x,y = titleWindow.getCursorPos()
|
||||
local w,h = titleWindow.getSize()
|
||||
local sTitle = sUsername.." on "..sHostname
|
||||
local w = titleWindow.getSize()
|
||||
local sTitle = sUsername .. " on " .. sHostname
|
||||
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.write( sTitle )
|
||||
promptWindow.restoreCursor()
|
||||
@@ -322,7 +321,7 @@ elseif sCommand == "join" then
|
||||
term.setTextColour( highlightColour )
|
||||
write( sUsernameBit )
|
||||
term.setTextColour( textColour )
|
||||
write( string.sub( sMessage, string.len( sUsernameBit ) + 1 ) )
|
||||
write( string.sub( sMessage, #sUsernameBit + 1 ) )
|
||||
else
|
||||
write( sMessage )
|
||||
end
|
||||
@@ -348,9 +347,9 @@ elseif sCommand == "join" then
|
||||
end
|
||||
|
||||
elseif sEvent == "term_resize" then
|
||||
local w,h = parentTerm.getSize()
|
||||
local w, h = parentTerm.getSize()
|
||||
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 )
|
||||
|
||||
end
|
||||
@@ -385,7 +384,7 @@ elseif sCommand == "join" then
|
||||
function()
|
||||
local tSendHistory = {}
|
||||
while true do
|
||||
promptWindow.setCursorPos( 1,1 )
|
||||
promptWindow.setCursorPos( 1, 1 )
|
||||
promptWindow.clearLine()
|
||||
promptWindow.setTextColor( highlightColour )
|
||||
promptWindow.write( ": ")
|
||||
@@ -410,7 +409,7 @@ elseif sCommand == "join" then
|
||||
term.redirect( parentTerm )
|
||||
|
||||
-- Print error notice
|
||||
local w,h = term.getSize()
|
||||
local _, h = term.getSize()
|
||||
term.setCursorPos( 1, h )
|
||||
term.clearLine()
|
||||
term.setCursorBlink( false )
|
||||
|
@@ -1,7 +1,7 @@
|
||||
|
||||
-- Find modems
|
||||
local tModems = {}
|
||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
||||
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||
if peripheral.getType( sModem ) == "modem" then
|
||||
table.insert( tModems, sModem )
|
||||
end
|
||||
@@ -16,14 +16,14 @@ else
|
||||
end
|
||||
|
||||
local function open( nChannel )
|
||||
for n=1,#tModems do
|
||||
for n = 1, #tModems do
|
||||
local sModem = tModems[n]
|
||||
peripheral.call( sModem, "open", nChannel )
|
||||
end
|
||||
end
|
||||
|
||||
local function close( nChannel )
|
||||
for n=1,#tModems do
|
||||
for n = 1, #tModems do
|
||||
local sModem = tModems[n]
|
||||
peripheral.call( sModem, "close", nChannel )
|
||||
end
|
||||
@@ -51,7 +51,7 @@ local ok, error = pcall( function()
|
||||
tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = tMessage.nMessageID
|
||||
|
||||
-- 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]
|
||||
peripheral.call( sOtherModem, "transmit", rednet.CHANNEL_REPEAT, nReplyChannel, tMessage )
|
||||
peripheral.call( sOtherModem, "transmit", tMessage.nRecipient, nReplyChannel, tMessage )
|
||||
@@ -59,7 +59,7 @@ local ok, error = pcall( function()
|
||||
|
||||
-- Log the event
|
||||
nTransmittedMessages = nTransmittedMessages + 1
|
||||
local x,y = term.getCursorPos()
|
||||
local _, y = term.getCursorPos()
|
||||
term.setCursorPos( 1, y - 1 )
|
||||
term.clearLine()
|
||||
if nTransmittedMessages == 1 then
|
||||
|
@@ -17,7 +17,7 @@ if sCommand == "probe" then
|
||||
|
||||
local count = 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
|
||||
bundledCount = bundledCount + 1
|
||||
end
|
||||
@@ -39,12 +39,12 @@ if sCommand == "probe" then
|
||||
if bundledCount > 0 then
|
||||
print()
|
||||
print( "Bundled inputs:" )
|
||||
for i,sSide in ipairs( redstone.getSides() ) do
|
||||
for _, sSide in ipairs( redstone.getSides() ) do
|
||||
local nInput = redstone.getBundledInput( sSide )
|
||||
if nInput ~= 0 then
|
||||
write( sSide..": " )
|
||||
write( sSide .. ": " )
|
||||
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 count > 0 then
|
||||
write( ", " )
|
||||
@@ -69,7 +69,7 @@ elseif sCommand == "pulse" then
|
||||
local sSide = tArgs[2]
|
||||
local nCount = tonumber( tArgs[3] ) or 1
|
||||
local nPeriod = tonumber( tArgs[4] ) or 0.5
|
||||
for n=1,nCount do
|
||||
for _ = 1, nCount do
|
||||
redstone.setOutput( sSide, true )
|
||||
sleep( nPeriod / 2 )
|
||||
redstone.setOutput( sSide, false )
|
||||
|
@@ -2,12 +2,12 @@
|
||||
local tArgs = { ... }
|
||||
if #tArgs == 0 then
|
||||
-- "set"
|
||||
local x,y = term.getCursorPos()
|
||||
local _, y = term.getCursorPos()
|
||||
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))
|
||||
end
|
||||
textutils.pagedPrint(table.concat(tSettings,"\n"),y-3)
|
||||
textutils.pagedPrint(table.concat(tSettings, "\n"), y - 3)
|
||||
|
||||
elseif #tArgs == 1 then
|
||||
-- "set foo"
|
||||
|
@@ -9,10 +9,10 @@ if multishell then
|
||||
end
|
||||
|
||||
local bExit = false
|
||||
local sDir = (parentShell and parentShell.dir()) or ""
|
||||
local sPath = (parentShell and parentShell.path()) or ".:/rom/programs"
|
||||
local tAliases = (parentShell and parentShell.aliases()) or {}
|
||||
local tCompletionInfo = (parentShell and parentShell.getCompletionInfo()) or {}
|
||||
local sDir = parentShell and parentShell.dir() or ""
|
||||
local sPath = parentShell and parentShell.path() or ".:/rom/programs"
|
||||
local tAliases = parentShell and parentShell.aliases() or {}
|
||||
local tCompletionInfo = parentShell and parentShell.getCompletionInfo() or {}
|
||||
local tProgramStack = {}
|
||||
|
||||
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"
|
||||
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
|
||||
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
|
||||
package.config = "/\n;\n?\n!\n-"
|
||||
package.preload = {}
|
||||
@@ -52,7 +52,7 @@ local function createShellEnv( sDir )
|
||||
local sError = ""
|
||||
for pattern in string.gmatch(package.path, "[^;]+") do
|
||||
local sPath = string.gsub(pattern, "%?", fname)
|
||||
if sPath:sub(1,1) ~= "/" then
|
||||
if sPath:sub(1, 1) ~= "/" then
|
||||
sPath = fs.combine(sDir, sPath)
|
||||
end
|
||||
if fs.exists(sPath) and not fs.isDir(sPath) then
|
||||
@@ -70,7 +70,7 @@ local function createShellEnv( sDir )
|
||||
end
|
||||
end
|
||||
return nil, sError
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
local sentinel = {}
|
||||
@@ -125,7 +125,7 @@ local function run( _sCommand, ... )
|
||||
if multishell then
|
||||
local sTitle = fs.getName( sPath )
|
||||
if sTitle:sub(-4) == ".lua" then
|
||||
sTitle = sTitle:sub(1,-5)
|
||||
sTitle = sTitle:sub(1, -5)
|
||||
end
|
||||
multishell.setTitle( multishell.getCurrent(), sTitle )
|
||||
end
|
||||
@@ -140,7 +140,7 @@ local function run( _sCommand, ... )
|
||||
if #tProgramStack > 0 then
|
||||
local sTitle = fs.getName( tProgramStack[#tProgramStack] )
|
||||
if sTitle:sub(-4) == ".lua" then
|
||||
sTitle = sTitle:sub(1,-5)
|
||||
sTitle = sTitle:sub(1, -5)
|
||||
end
|
||||
multishell.setTitle( multishell.getCurrent(), sTitle )
|
||||
else
|
||||
@@ -272,12 +272,12 @@ function shell.programs( _bIncludeHidden )
|
||||
sPath = shell.resolve( sPath )
|
||||
if fs.isDir( sPath ) then
|
||||
local tList = fs.list( sPath )
|
||||
for n=1,#tList do
|
||||
for n = 1, #tList do
|
||||
local sFile = tList[n]
|
||||
if not fs.isDir( fs.combine( sPath, sFile ) ) and
|
||||
(_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then
|
||||
if #sFile > 4 and sFile:sub(-4) == ".lua" then
|
||||
sFile = sFile:sub(1,-5)
|
||||
sFile = sFile:sub(1, -5)
|
||||
end
|
||||
tItems[ sFile ] = true
|
||||
end
|
||||
@@ -287,7 +287,7 @@ function shell.programs( _bIncludeHidden )
|
||||
|
||||
-- Sort and return
|
||||
local tItemList = {}
|
||||
for sItem, b in pairs( tItems ) do
|
||||
for sItem in pairs( tItems ) do
|
||||
table.insert( tItemList, sItem )
|
||||
end
|
||||
table.sort( tItemList )
|
||||
@@ -304,7 +304,7 @@ local function completeProgram( sLine )
|
||||
local tSeen = {}
|
||||
|
||||
-- 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
|
||||
local sResult = string.sub( sAlias, #sLine + 1 )
|
||||
if not tSeen[ sResult ] then
|
||||
@@ -326,7 +326,7 @@ local function completeProgram( sLine )
|
||||
|
||||
-- Add programs from the path
|
||||
local tPrograms = shell.programs()
|
||||
for n=1,#tPrograms do
|
||||
for n = 1, #tPrograms do
|
||||
local sProgram = tPrograms[n]
|
||||
if #sProgram > #sLine and string.sub( sProgram, 1, #sLine ) == sLine then
|
||||
local sResult = string.sub( sProgram, #sLine + 1 )
|
||||
@@ -366,7 +366,7 @@ function shell.complete( sLine )
|
||||
return { " " }
|
||||
else
|
||||
local tResults = completeProgram( sBit )
|
||||
for n=1,#tResults do
|
||||
for n = 1, #tResults do
|
||||
local sResult = tResults[n]
|
||||
local sPath = shell.resolveProgram( sBit .. sResult )
|
||||
if tCompletionInfo[ sPath ] then
|
||||
@@ -397,7 +397,7 @@ function shell.setCompletionFunction( sProgram, fnComplete )
|
||||
expect(1, sProgram, "string")
|
||||
expect(2, fnComplete, "function")
|
||||
tCompletionInfo[ sProgram ] = {
|
||||
fnComplete = fnComplete
|
||||
fnComplete = fnComplete,
|
||||
}
|
||||
end
|
||||
|
||||
|
@@ -1,3 +1,3 @@
|
||||
local nTime = os.time()
|
||||
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 )
|
||||
|
@@ -29,7 +29,7 @@ if turtle.craft( nLimit ) then
|
||||
end
|
||||
|
||||
if nCrafted > 1 then
|
||||
print( nCrafted.." items crafted" )
|
||||
print( nCrafted .. " items crafted" )
|
||||
elseif nCrafted == 1 then
|
||||
print( "1 item crafted" )
|
||||
else
|
||||
|
@@ -81,10 +81,10 @@ textutils.slowWrite( "Preparing to get down." )
|
||||
textutils.slowPrint( "..", 0.75 )
|
||||
|
||||
local sAudio = nil
|
||||
for n,sName in pairs( peripheral.getNames() ) do
|
||||
for _, sName in pairs( peripheral.getNames() ) do
|
||||
if disk.hasAudio( sName ) then
|
||||
disk.playAudio( sName )
|
||||
print( "Jamming to "..disk.getAudioTitle( sName ) )
|
||||
print( "Jamming to " .. disk.getAudioTitle( sName ) )
|
||||
sAudio = sName
|
||||
break
|
||||
end
|
||||
@@ -95,7 +95,7 @@ print( "Press any key to stop the groove" )
|
||||
parallel.waitForAny(
|
||||
function()
|
||||
while not bEnd do
|
||||
local event, key = os.pullEvent("key")
|
||||
local _, key = os.pullEvent("key")
|
||||
if key ~= keys.escape then
|
||||
return
|
||||
end
|
||||
@@ -103,7 +103,7 @@ parallel.waitForAny(
|
||||
end,
|
||||
function()
|
||||
while true do
|
||||
local fnMove = tMoves[math.random(1,#tMoves)]
|
||||
local fnMove = tMoves[math.random(1, #tMoves)]
|
||||
fnMove()
|
||||
end
|
||||
end
|
||||
|
@@ -20,15 +20,15 @@ local depth = 0
|
||||
local unloaded = 0
|
||||
local collected = 0
|
||||
|
||||
local xPos,zPos = 0,0
|
||||
local xDir,zDir = 0,1
|
||||
local xPos, zPos = 0, 0
|
||||
local xDir, zDir = 0, 1
|
||||
|
||||
local goTo -- Filled in further down
|
||||
local refuel -- Filled in further down
|
||||
|
||||
local function unload( _bKeepOneFuelStack )
|
||||
print( "Unloading items..." )
|
||||
for n=1,16 do
|
||||
for n = 1, 16 do
|
||||
local nCount = turtle.getItemCount(n)
|
||||
if nCount > 0 then
|
||||
turtle.select(n)
|
||||
@@ -48,11 +48,11 @@ local function unload( _bKeepOneFuelStack )
|
||||
end
|
||||
|
||||
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..." )
|
||||
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
|
||||
unload( true )
|
||||
print( "Waiting for fuel" )
|
||||
@@ -64,13 +64,13 @@ local function returnSupplies()
|
||||
end
|
||||
|
||||
print( "Resuming mining..." )
|
||||
goTo( x,y,z,xd,zd )
|
||||
goTo( x, y, z, xd, zd )
|
||||
end
|
||||
|
||||
local function collect()
|
||||
local bFull = true
|
||||
local nTotalItems = 0
|
||||
for n=1,16 do
|
||||
for n = 1, 16 do
|
||||
local nCount = turtle.getItemCount(n)
|
||||
if nCount == 0 then
|
||||
bFull = false
|
||||
@@ -81,7 +81,7 @@ local function collect()
|
||||
if nTotalItems > collected then
|
||||
collected = nTotalItems
|
||||
if math.fmod(collected + unloaded, 50) == 0 then
|
||||
print( "Mined "..(collected + unloaded).." items." )
|
||||
print( "Mined " .. collected + unloaded .. " items." )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -98,10 +98,9 @@ function refuel( ammount )
|
||||
return true
|
||||
end
|
||||
|
||||
local needed = ammount or (xPos + zPos + depth + 2)
|
||||
local needed = ammount or xPos + zPos + depth + 2
|
||||
if turtle.getFuelLevel() < needed then
|
||||
local fueled = false
|
||||
for n=1,16 do
|
||||
for n = 1, 16 do
|
||||
if turtle.getItemCount(n) > 0 then
|
||||
turtle.select(n)
|
||||
if turtle.refuel(1) then
|
||||
@@ -177,7 +176,7 @@ local function tryDown()
|
||||
|
||||
depth = depth + 1
|
||||
if math.fmod( depth, 10 ) == 0 then
|
||||
print( "Descended "..depth.." metres." )
|
||||
print( "Descended " .. depth .. " metres." )
|
||||
end
|
||||
|
||||
return true
|
||||
@@ -291,8 +290,8 @@ end
|
||||
local alternate = 0
|
||||
local done = false
|
||||
while not done do
|
||||
for n=1,size do
|
||||
for m=1,size-1 do
|
||||
for n = 1, size do
|
||||
for _ = 1, size - 1 do
|
||||
if not tryForwards() then
|
||||
done = true
|
||||
break
|
||||
@@ -301,8 +300,8 @@ while not done do
|
||||
if done then
|
||||
break
|
||||
end
|
||||
if n<size then
|
||||
if math.fmod(n + alternate,2) == 0 then
|
||||
if n < size then
|
||||
if math.fmod(n + alternate, 2) == 0 then
|
||||
turnLeft()
|
||||
if not tryForwards() then
|
||||
done = true
|
||||
@@ -324,7 +323,7 @@ while not done do
|
||||
end
|
||||
|
||||
if size > 1 then
|
||||
if math.fmod(size,2) == 0 then
|
||||
if math.fmod(size, 2) == 0 then
|
||||
turnRight()
|
||||
else
|
||||
if alternate == 0 then
|
||||
@@ -345,13 +344,13 @@ end
|
||||
print( "Returning to surface..." )
|
||||
|
||||
-- Return to where we started
|
||||
goTo( 0,0,0,0,-1 )
|
||||
goTo( 0, 0, 0, 0, -1 )
|
||||
unload( false )
|
||||
goTo( 0,0,0,0,1 )
|
||||
goTo( 0, 0, 0, 0, 1 )
|
||||
|
||||
-- Seal the hole
|
||||
if reseal then
|
||||
turtle.placeDown()
|
||||
end
|
||||
|
||||
print( "Mined "..(collected + unloaded).." items total." )
|
||||
print( "Mined " .. collected + unloaded .. " items total." )
|
||||
|
@@ -50,7 +50,7 @@ while nArg <= #tArgs do
|
||||
end
|
||||
end
|
||||
else
|
||||
print( "No such direction: "..sDirection )
|
||||
print( "No such direction: " .. sDirection )
|
||||
print( "Try: forward, back, up, down" )
|
||||
return
|
||||
end
|
||||
|
@@ -23,7 +23,7 @@ end
|
||||
if turtle.getFuelLevel() ~= "unlimited" then
|
||||
for n = 1, 16 do
|
||||
-- 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
|
||||
end
|
||||
|
||||
@@ -36,7 +36,7 @@ if turtle.getFuelLevel() ~= "unlimited" then
|
||||
end
|
||||
end
|
||||
end
|
||||
print( "Fuel level is "..turtle.getFuelLevel() )
|
||||
print( "Fuel level is " .. turtle.getFuelLevel() )
|
||||
if turtle.getFuelLevel() == turtle.getFuelLimit() then
|
||||
print( "Fuel limit reached" )
|
||||
end
|
||||
|
@@ -15,14 +15,12 @@ if length < 1 then
|
||||
print( "Tunnel length must be positive" )
|
||||
return
|
||||
end
|
||||
|
||||
local depth = 0
|
||||
local collected = 0
|
||||
|
||||
local function collect()
|
||||
collected = collected + 1
|
||||
if math.fmod(collected, 25) == 0 then
|
||||
print( "Mined "..collected.." items." )
|
||||
print( "Mined " .. collected .. " items." )
|
||||
end
|
||||
end
|
||||
|
||||
@@ -69,7 +67,7 @@ local function refuel()
|
||||
end
|
||||
|
||||
local function tryRefuel()
|
||||
for n=1,16 do
|
||||
for n = 1, 16 do
|
||||
if turtle.getItemCount(n) > 0 then
|
||||
turtle.select(n)
|
||||
if turtle.refuel(1) then
|
||||
@@ -141,7 +139,7 @@ end
|
||||
|
||||
print( "Tunnelling..." )
|
||||
|
||||
for n=1,length do
|
||||
for n = 1, length do
|
||||
turtle.placeDown()
|
||||
tryDigUp()
|
||||
turtle.turnLeft()
|
||||
@@ -155,7 +153,7 @@ for n=1,length do
|
||||
tryDig()
|
||||
turtle.turnLeft()
|
||||
|
||||
if n<length then
|
||||
if n < length then
|
||||
tryDig()
|
||||
if not tryForward() then
|
||||
print( "Aborting Tunnel." )
|
||||
@@ -185,4 +183,4 @@ turtle.turnRight()
|
||||
]]
|
||||
|
||||
print( "Tunnel complete." )
|
||||
print( "Mined "..collected.." items total." )
|
||||
print( "Mined " .. collected .. " items total." )
|
||||
|
@@ -31,11 +31,11 @@ while nArg <= #tArgs do
|
||||
|
||||
local fnHandler = tHandlers[string.lower(sDirection)]
|
||||
if fnHandler then
|
||||
for n=1,nDistance do
|
||||
for _ = 1, nDistance do
|
||||
fnHandler( nArg )
|
||||
end
|
||||
else
|
||||
print( "No such direction: "..sDirection )
|
||||
print( "No such direction: " .. sDirection )
|
||||
print( "Try: left, right" )
|
||||
return
|
||||
end
|
||||
|
@@ -14,7 +14,7 @@ if #tArgs ~= 1 then
|
||||
end
|
||||
|
||||
local function unequip( fnEquipFunction )
|
||||
for nSlot=1,16 do
|
||||
for nSlot = 1, 16 do
|
||||
local nOldCount = turtle.getItemCount( nSlot )
|
||||
if nOldCount == 0 then
|
||||
turtle.select( nSlot )
|
||||
|
@@ -3,24 +3,24 @@ local completion = require "cc.shell.completion"
|
||||
-- Setup paths
|
||||
local sPath = ".:/rom/programs"
|
||||
if term.isColor() then
|
||||
sPath = sPath..":/rom/programs/advanced"
|
||||
sPath = sPath .. ":/rom/programs/advanced"
|
||||
end
|
||||
if turtle then
|
||||
sPath = sPath..":/rom/programs/turtle"
|
||||
sPath = sPath .. ":/rom/programs/turtle"
|
||||
else
|
||||
sPath = sPath..":/rom/programs/rednet:/rom/programs/fun"
|
||||
sPath = sPath .. ":/rom/programs/rednet:/rom/programs/fun"
|
||||
if term.isColor() then
|
||||
sPath = sPath..":/rom/programs/fun/advanced"
|
||||
sPath = sPath .. ":/rom/programs/fun/advanced"
|
||||
end
|
||||
end
|
||||
if pocket then
|
||||
sPath = sPath..":/rom/programs/pocket"
|
||||
sPath = sPath .. ":/rom/programs/pocket"
|
||||
end
|
||||
if commands then
|
||||
sPath = sPath..":/rom/programs/command"
|
||||
sPath = sPath .. ":/rom/programs/command"
|
||||
end
|
||||
if http then
|
||||
sPath = sPath..":/rom/programs/http"
|
||||
sPath = sPath .. ":/rom/programs/http"
|
||||
end
|
||||
shell.setPath( sPath )
|
||||
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" )
|
||||
for _, sFile in ipairs( tFiles ) do
|
||||
if string.sub( sFile, 1, 1 ) ~= "." then
|
||||
local sPath = "/rom/autorun/"..sFile
|
||||
local sPath = "/rom/autorun/" .. sFile
|
||||
if not fs.isDir( sPath ) then
|
||||
shell.run( sPath )
|
||||
end
|
||||
@@ -142,7 +142,7 @@ local function findStartups( sBaseDir )
|
||||
if tStartups == nil then
|
||||
tStartups = {}
|
||||
end
|
||||
for _,v in pairs( fs.list( sBasePath ) ) do
|
||||
for _, v in pairs( fs.list( sBasePath ) ) do
|
||||
local sPath = "/" .. fs.combine( sBasePath, v )
|
||||
if not fs.isDir( sPath ) then
|
||||
tStartups[ #tStartups + 1 ] = sPath
|
||||
@@ -163,7 +163,7 @@ if settings.get( "shell.allow_startup" ) then
|
||||
tUserStartups = findStartups( "/" )
|
||||
end
|
||||
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
|
||||
local startups = findStartups( disk.getMountPath( sName ) )
|
||||
if startups then
|
||||
@@ -174,7 +174,7 @@ if settings.get( "shell.allow_disk_startup" ) then
|
||||
end
|
||||
end
|
||||
if tUserStartups then
|
||||
for _,v in pairs( tUserStartups ) do
|
||||
for _, v in pairs( tUserStartups ) do
|
||||
shell.run( v )
|
||||
end
|
||||
end
|
||||
|
@@ -31,7 +31,7 @@ public class ResourceMountTest
|
||||
SimpleReloadableResourceManager manager = new SimpleReloadableResourceManager( ResourcePackType.SERVER_DATA, null );
|
||||
manager.addResourcePack( new FolderPack( new File( "src/main/resources" ) ) );
|
||||
|
||||
mount = new ResourceMount( "computercraft", "lua/rom", manager );
|
||||
mount = ResourceMount.get( "computercraft", "lua/rom", manager );
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -11,19 +11,19 @@
|
||||
|
||||
--- Assert an argument to the given function has the specified type.
|
||||
--
|
||||
-- @tparam string The function's name
|
||||
-- @tparam int The argument index to this function
|
||||
-- @tparam string The type this argument should have. May be 'value' for any
|
||||
-- non-nil value.
|
||||
-- @param val The value to check
|
||||
-- @raise If this value doesn't match the expected type.
|
||||
local function check(func, arg, ty, val)
|
||||
-- @tparam string func The function's name
|
||||
-- @tparam int idx The argument index to this function
|
||||
-- @tparam string ty The type this argument should have. May be 'value' for
|
||||
-- any non-nil value.
|
||||
-- @param val val The value to check
|
||||
-- @throws If this value doesn't match the expected type.
|
||||
local function check(func, idx, ty, val)
|
||||
if ty == 'value' 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
|
||||
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
|
||||
|
||||
@@ -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
|
||||
-- errors.
|
||||
--
|
||||
-- @tparam
|
||||
-- @tparam function() fn The function to run
|
||||
-- @return[1] true
|
||||
-- @return[2] false
|
||||
-- @return[2] The error object
|
||||
@@ -170,7 +170,7 @@ end
|
||||
--- Fail a test with the given message
|
||||
--
|
||||
-- @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)
|
||||
check('fail', 1, 'string', message)
|
||||
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
|
||||
--
|
||||
-- @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)
|
||||
if value ~= self.value then
|
||||
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
|
||||
--
|
||||
-- @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)
|
||||
if value == self.value then
|
||||
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
|
||||
--
|
||||
-- @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)
|
||||
local actual_type = type(self.value)
|
||||
if exp_type ~= actual_type then
|
||||
@@ -270,7 +270,7 @@ end
|
||||
-- the provided object.
|
||||
--
|
||||
-- @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)
|
||||
if not matches({}, true, self.value, value) then
|
||||
fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
|
||||
@@ -283,7 +283,7 @@ end
|
||||
-- in the provided object.
|
||||
--
|
||||
-- @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)
|
||||
if not matches({}, false, value, self.value) then
|
||||
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.
|
||||
-- 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)
|
||||
if getmetatable(self.value) ~= stub_mt or self.value.arguments == nil then
|
||||
fail(("Expected stubbed function, got %s"):format(type(self.value)))
|
||||
@@ -380,7 +380,7 @@ local expect = setmetatable( {
|
||||
-- @return The new expectation
|
||||
__call = function(_, value)
|
||||
return setmetatable({ value = value }, expect_mt)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
--- The stack of "describe"s.
|
||||
@@ -623,7 +623,7 @@ end
|
||||
-- And some summary statistics
|
||||
local actual_count = tests_run - test_status.pending
|
||||
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
|
||||
info = info .. (" Skipped %d pending test(s)."):format(test_status.pending)
|
||||
|
@@ -2,7 +2,7 @@ describe("The gps library", function()
|
||||
describe("gps.locate", function()
|
||||
it("validates arguments", function()
|
||||
stub(_G, "commands", { getBlockPosition = function()
|
||||
end })
|
||||
end, })
|
||||
|
||||
gps.locate()
|
||||
gps.locate(1)
|
||||
|
@@ -60,10 +60,10 @@ describe("The io library", function()
|
||||
|
||||
expect(io.output():seek()):equal(0)
|
||||
assert(io.write("alo alo"))
|
||||
expect(io.output():seek()):equal(#("alo alo"))
|
||||
expect(io.output():seek("cur", -3)):equal(#("alo alo") - 3)
|
||||
expect(io.output():seek()):equal(#"alo alo")
|
||||
expect(io.output():seek("cur", -3)):equal(#"alo alo" - 3)
|
||||
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)
|
||||
|
||||
|
@@ -70,7 +70,7 @@ describe("The Lua base library", function()
|
||||
|
||||
it("does not prefix for unnamed chunks", function()
|
||||
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)
|
||||
|
||||
it("does not prefix when already prefixed", function()
|
||||
|
@@ -5,7 +5,7 @@ describe("cc.shell.completion", function()
|
||||
it("completes both", function()
|
||||
expect(c.dirOrFile(shell, "rom/")):same {
|
||||
"apis/", "apis", "autorun/", "autorun", "help/", "help",
|
||||
"modules/", "modules", "motd.txt", "programs/", "programs", "startup.lua"
|
||||
"modules/", "modules", "motd.txt", "programs/", "programs", "startup.lua",
|
||||
}
|
||||
end)
|
||||
|
||||
|
@@ -10,7 +10,7 @@ describe("The commands program", function()
|
||||
it("lists commands", function()
|
||||
local pagedTabulate = stub(textutils, "pagedTabulate", function(x) print(table.unpack(x)) end)
|
||||
stub(_G, "commands", {
|
||||
list = function() return { "computercraft" } end
|
||||
list = function() return { "computercraft" } end,
|
||||
})
|
||||
|
||||
expect(capture(stub, "/rom/programs/command/commands.lua"))
|
||||
|
@@ -15,7 +15,7 @@ describe("The exec program", function()
|
||||
|
||||
it("runs a command", function()
|
||||
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"))
|
||||
@@ -23,8 +23,8 @@ describe("The exec program", function()
|
||||
end)
|
||||
|
||||
it("reports command failures", function()
|
||||
stub(_G,"commands",{
|
||||
exec = function() return false, {"Hello World!"} end
|
||||
stub(_G, "commands", {
|
||||
exec = function() return false, {"Hello World!"} end,
|
||||
})
|
||||
|
||||
expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))
|
||||
|
@@ -1,5 +1,4 @@
|
||||
local capture = require "test_helpers".capture_program
|
||||
local testFile = require "test_helpers".testFile
|
||||
|
||||
describe("The edit program", function()
|
||||
|
||||
|
@@ -17,7 +17,7 @@ describe("The pastebin program", function()
|
||||
local tHeader = {}
|
||||
tHeader["Content-Type"] = "text/plain; charset=utf-8"
|
||||
return tHeader
|
||||
end
|
||||
end,
|
||||
}
|
||||
end,
|
||||
post = function()
|
||||
@@ -28,7 +28,7 @@ describe("The pastebin program", function()
|
||||
close = function()
|
||||
end,
|
||||
}
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
|
@@ -14,7 +14,7 @@ describe("The wget program", function()
|
||||
close = function()
|
||||
end,
|
||||
}
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
|
@@ -6,6 +6,6 @@ describe("The id program", function()
|
||||
local id = os.getComputerID()
|
||||
|
||||
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)
|
||||
|
@@ -3,10 +3,10 @@ local capture = require "test_helpers".capture_program
|
||||
describe("The motd program", 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.close()
|
||||
settings.set("motd.path","/modt_check.txt")
|
||||
settings.set("motd.path", "/modt_check.txt")
|
||||
|
||||
expect(capture(stub, "motd"))
|
||||
:matches { ok = true, output = "Hello World!\n", error = "" }
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user