mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-06-26 07:02:55 +00:00
Merge branch 'master' into mc-1.14.x
Unfortunately we can't apply the config changes due to backwards compatibility. This'll be something we may need to PR into Forge. CraftTweaker support still needs to be added.
This commit is contained in:
commit
037cbabb32
@ -11,5 +11,8 @@ insert_final_newline = true
|
|||||||
[*.md]
|
[*.md]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[*.sexp]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
[*.properties]
|
[*.properties]
|
||||||
insert_final_newline = false
|
insert_final_newline = false
|
||||||
|
15
.github/workflows/main-ci.yml
vendored
15
.github/workflows/main-ci.yml
vendored
@ -4,6 +4,7 @@ on: [push, pull_request]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
name: Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@ -16,3 +17,17 @@ jobs:
|
|||||||
|
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
run: ./gradlew build --no-daemon
|
run: ./gradlew build --no-daemon
|
||||||
|
|
||||||
|
lint-lua:
|
||||||
|
name: Lint Lua
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Lint Lua code
|
||||||
|
run: |
|
||||||
|
test -d bin || mkdir bin
|
||||||
|
test -f bin/illuaminate || wget -q -Obin/illuaminate https://squiddev.cc/illuaminate/bin/illuaminate
|
||||||
|
chmod +x bin/illuaminate
|
||||||
|
bin/illuaminate lint
|
||||||
|
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' },
|
|
||||||
}
|
|
11
build.gradle
11
build.gradle
@ -81,6 +81,10 @@ repositories {
|
|||||||
name "Amadornes"
|
name "Amadornes"
|
||||||
url "https://maven.amadornes.com/"
|
url "https://maven.amadornes.com/"
|
||||||
}
|
}
|
||||||
|
maven {
|
||||||
|
name "CraftTweaker"
|
||||||
|
url "https://maven.blamejared.com/"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
@ -95,8 +99,7 @@ dependencies {
|
|||||||
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
|
||||||
|
|
||||||
compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25:api")
|
compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25:api")
|
||||||
// deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
|
compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.14.4:5.0.1.150")
|
||||||
// deobfProvided "MCMultiPart2:MCMultiPart:2.5.3"
|
|
||||||
|
|
||||||
runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25")
|
runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.25")
|
||||||
|
|
||||||
@ -162,6 +165,7 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
|
|||||||
|
|
||||||
// Add the main runtime jar and all non-shadowed dependencies
|
// Add the main runtime jar and all non-shadowed dependencies
|
||||||
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
|
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
|
||||||
|
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
|
||||||
doFirst {
|
doFirst {
|
||||||
sourceSets.main.compileClasspath
|
sourceSets.main.compileClasspath
|
||||||
.filter { !it.name.contains("Cobalt") }
|
.filter { !it.name.contains("Cobalt") }
|
||||||
@ -177,9 +181,6 @@ task proguard(type: ProGuardTask, dependsOn: jar) {
|
|||||||
// Preserve ComputerCraft classes - we only want to strip shadowed files.
|
// Preserve ComputerCraft classes - we only want to strip shadowed files.
|
||||||
keep 'class dan200.computercraft.** { *; }'
|
keep 'class dan200.computercraft.** { *; }'
|
||||||
|
|
||||||
// Preserve the constructors in Cobalt library class, as we init them via reflection
|
|
||||||
keepclassmembers 'class org.squiddev.cobalt.lib.** { <init>(...); }'
|
|
||||||
|
|
||||||
// LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard
|
// LWJGL and Apache bundle Java 9 versions, which is great, but rather breaks Proguard
|
||||||
dontwarn 'module-info'
|
dontwarn 'module-info'
|
||||||
dontwarn 'org.apache.**,org.lwjgl.**'
|
dontwarn 'org.apache.**,org.lwjgl.**'
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Mod properties
|
# Mod properties
|
||||||
mod_version=1.85.2
|
mod_version=1.86.0
|
||||||
|
|
||||||
# Minecraft properties (update mods.toml when changing)
|
# Minecraft properties (update mods.toml when changing)
|
||||||
mc_version=1.14.4
|
mc_version=1.14.4
|
||||||
|
28
illuaminate.sexp
Normal file
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))
|
@ -17,11 +17,33 @@ import net.minecraftforge.fml.ModLoadingContext;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public final class TurtleUpgrades
|
public final class TurtleUpgrades
|
||||||
{
|
{
|
||||||
|
public static class Wrapper
|
||||||
|
{
|
||||||
|
final ITurtleUpgrade upgrade;
|
||||||
|
final int legacyId;
|
||||||
|
final String id;
|
||||||
|
final String modId;
|
||||||
|
boolean enabled;
|
||||||
|
|
||||||
|
public Wrapper( ITurtleUpgrade upgrade )
|
||||||
|
{
|
||||||
|
ModContainer mc = ModLoadingContext.get().getActiveContainer();
|
||||||
|
|
||||||
|
this.upgrade = upgrade;
|
||||||
|
this.id = upgrade.getUpgradeID().toString();
|
||||||
|
this.modId = mc != null && mc.getModId() != null ? mc.getModId() : null;
|
||||||
|
this.enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ITurtleUpgrade[] vanilla;
|
||||||
|
|
||||||
private static final Map<String, ITurtleUpgrade> upgrades = new HashMap<>();
|
private static final Map<String, ITurtleUpgrade> upgrades = new HashMap<>();
|
||||||
private static final IdentityHashMap<ITurtleUpgrade, String> upgradeOwners = new IdentityHashMap<>();
|
private static final IdentityHashMap<ITurtleUpgrade, Wrapper> wrappers = new IdentityHashMap<>();
|
||||||
|
|
||||||
private TurtleUpgrades() {}
|
private TurtleUpgrades() {}
|
||||||
|
|
||||||
@ -29,7 +51,8 @@ public final class TurtleUpgrades
|
|||||||
{
|
{
|
||||||
Objects.requireNonNull( upgrade, "upgrade cannot be null" );
|
Objects.requireNonNull( upgrade, "upgrade cannot be null" );
|
||||||
|
|
||||||
String id = upgrade.getUpgradeID().toString();
|
Wrapper wrapper = new Wrapper( upgrade );
|
||||||
|
String id = wrapper.id;
|
||||||
ITurtleUpgrade existing = upgrades.get( id );
|
ITurtleUpgrade existing = upgrades.get( id );
|
||||||
if( existing != null )
|
if( existing != null )
|
||||||
{
|
{
|
||||||
@ -37,17 +60,28 @@ public final class TurtleUpgrades
|
|||||||
}
|
}
|
||||||
|
|
||||||
upgrades.put( id, upgrade );
|
upgrades.put( id, upgrade );
|
||||||
|
wrappers.put( upgrade, wrapper );
|
||||||
ModContainer mc = ModLoadingContext.get().getActiveContainer();
|
|
||||||
if( mc != null && mc.getModId() != null ) upgradeOwners.put( upgrade, mc.getModId() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
public static ITurtleUpgrade get( String id )
|
public static ITurtleUpgrade get( String id )
|
||||||
{
|
{
|
||||||
return upgrades.get( id );
|
return upgrades.get( id );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static ITurtleUpgrade get( int id )
|
||||||
|
{
|
||||||
|
return legacyUpgrades.get( id );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static String getOwner( @Nonnull ITurtleUpgrade upgrade )
|
||||||
|
{
|
||||||
|
Wrapper wrapper = wrappers.get( upgrade );
|
||||||
|
return wrapper != null ? wrapper.modId : null;
|
||||||
|
}
|
||||||
|
|
||||||
public static ITurtleUpgrade get( @Nonnull ItemStack stack )
|
public static ITurtleUpgrade get( @Nonnull ItemStack stack )
|
||||||
{
|
{
|
||||||
if( stack.isEmpty() ) return null;
|
if( stack.isEmpty() ) return null;
|
||||||
@ -64,30 +98,27 @@ public final class TurtleUpgrades
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Iterable<ITurtleUpgrade> getVanillaUpgrades()
|
public static Stream<ITurtleUpgrade> getVanillaUpgrades()
|
||||||
{
|
{
|
||||||
List<ITurtleUpgrade> vanilla = new ArrayList<>();
|
if( vanilla == null )
|
||||||
|
{
|
||||||
|
vanilla = new ITurtleUpgrade[] {
|
||||||
|
// ComputerCraft upgrades
|
||||||
|
ComputerCraft.TurtleUpgrades.wirelessModemNormal,
|
||||||
|
ComputerCraft.TurtleUpgrades.wirelessModemAdvanced,
|
||||||
|
ComputerCraft.TurtleUpgrades.speaker,
|
||||||
|
|
||||||
|
// Vanilla Minecraft upgrades
|
||||||
|
ComputerCraft.TurtleUpgrades.diamondPickaxe,
|
||||||
|
ComputerCraft.TurtleUpgrades.diamondAxe,
|
||||||
|
ComputerCraft.TurtleUpgrades.diamondSword,
|
||||||
|
ComputerCraft.TurtleUpgrades.diamondShovel,
|
||||||
|
ComputerCraft.TurtleUpgrades.diamondHoe,
|
||||||
|
ComputerCraft.TurtleUpgrades.craftingTable,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// ComputerCraft upgrades
|
return Arrays.stream( vanilla ).filter( x -> x != null && wrappers.get( x ).enabled );
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.wirelessModemNormal );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.wirelessModemAdvanced );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.speaker );
|
|
||||||
|
|
||||||
// Vanilla Minecraft upgrades
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.diamondPickaxe );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.diamondAxe );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.diamondSword );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.diamondShovel );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.diamondHoe );
|
|
||||||
vanilla.add( ComputerCraft.TurtleUpgrades.craftingTable );
|
|
||||||
return vanilla;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static String getOwner( @Nonnull ITurtleUpgrade upgrade )
|
|
||||||
{
|
|
||||||
return upgradeOwners.get( upgrade );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Iterable<ITurtleUpgrade> getUpgrades()
|
public static Iterable<ITurtleUpgrade> getUpgrades()
|
||||||
@ -99,4 +130,14 @@ public final class TurtleUpgrades
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void disable( ITurtleUpgrade upgrade )
|
||||||
|
{
|
||||||
|
Wrapper wrapper = wrappers.get( upgrade );
|
||||||
|
if( !wrapper.enabled ) return;
|
||||||
|
|
||||||
|
wrapper.enabled = false;
|
||||||
|
upgrades.remove( wrapper.id );
|
||||||
|
if( wrapper.legacyId >= 0 ) legacyUpgrades.remove( wrapper.legacyId );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||||
|
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
|
||||||
|
* Send enquiries to dratcliffe@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dan200.computercraft.shared.integration.crafttweaker;
|
||||||
|
|
||||||
|
import crafttweaker.CraftTweakerAPI;
|
||||||
|
import crafttweaker.annotations.ModOnly;
|
||||||
|
import crafttweaker.annotations.ZenDoc;
|
||||||
|
import crafttweaker.annotations.ZenRegister;
|
||||||
|
import crafttweaker.api.item.IItemStack;
|
||||||
|
import crafttweaker.api.minecraft.CraftTweakerMC;
|
||||||
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
import dan200.computercraft.shared.integration.crafttweaker.actions.AddTurtleTool;
|
||||||
|
import dan200.computercraft.shared.integration.crafttweaker.actions.RemoveTurtleUpgradeByItem;
|
||||||
|
import dan200.computercraft.shared.integration.crafttweaker.actions.RemoveTurtleUpgradeByName;
|
||||||
|
import stanhebben.zenscript.annotations.ZenClass;
|
||||||
|
import stanhebben.zenscript.annotations.ZenMethod;
|
||||||
|
|
||||||
|
@ZenRegister
|
||||||
|
@ZenClass( "dan200.computercraft.turtle" )
|
||||||
|
@ModOnly( ComputerCraft.MOD_ID )
|
||||||
|
public class TurtleTweaker
|
||||||
|
{
|
||||||
|
@ZenMethod
|
||||||
|
@ZenDoc( "Remove a turtle upgrade with the given id" )
|
||||||
|
public static void removeUpgrade( String upgrade )
|
||||||
|
{
|
||||||
|
CraftTweakerAPI.apply( new RemoveTurtleUpgradeByName( upgrade ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ZenMethod
|
||||||
|
@ZenDoc( "Remove a turtle upgrade crafted with the given item stack" )
|
||||||
|
public static void removeUpgrade( IItemStack stack )
|
||||||
|
{
|
||||||
|
CraftTweakerAPI.apply( new RemoveTurtleUpgradeByItem( CraftTweakerMC.getItemStack( stack ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ZenMethod
|
||||||
|
@ZenDoc( "Add a new turtle tool with the given id, which crafts and acts using the given stack." )
|
||||||
|
public static void addTool( String id, IItemStack stack )
|
||||||
|
{
|
||||||
|
addTool( id, stack, stack, "tool" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ZenMethod
|
||||||
|
@ZenDoc( "Add a new turtle tool with the given id, which is crafted with one item, and uses another." )
|
||||||
|
public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack )
|
||||||
|
{
|
||||||
|
addTool( id, craftingStack, toolStack, "tool" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ZenMethod
|
||||||
|
@ZenDoc( "Add a new turtle tool with the given id, which crafts and acts using the given stack. You may also" +
|
||||||
|
"specify a 'kind' of tool, which limits what blocks the turtle can break (for instance, an 'axe' may only break wood)." )
|
||||||
|
public static void addTool( String id, IItemStack stack, String kind )
|
||||||
|
{
|
||||||
|
addTool( id, stack, stack, kind );
|
||||||
|
}
|
||||||
|
|
||||||
|
@ZenMethod
|
||||||
|
@ZenDoc( "Add a new turtle tool with the given id, which is crafted with one item, and uses another. You may also" +
|
||||||
|
"specify a 'kind' of tool, which limits what blocks the turtle can break (for instance, an 'axe' may only break wood)." )
|
||||||
|
public static void addTool( String id, IItemStack craftingStack, IItemStack toolStack, String kind )
|
||||||
|
{
|
||||||
|
CraftTweakerAPI.apply( new AddTurtleTool( id, CraftTweakerMC.getItemStack( craftingStack ), CraftTweakerMC.getItemStack( toolStack ), kind ) );
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||||
|
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
|
||||||
|
* Send enquiries to dratcliffe@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dan200.computercraft.shared.integration.crafttweaker.actions;
|
||||||
|
|
||||||
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
import dan200.computercraft.shared.TurtleUpgrades;
|
||||||
|
import dan200.computercraft.shared.turtle.upgrades.*;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new turtle tool.
|
||||||
|
*/
|
||||||
|
public class AddTurtleTool implements IAction
|
||||||
|
{
|
||||||
|
private interface Factory
|
||||||
|
{
|
||||||
|
TurtleTool create( ResourceLocation location, ItemStack craftItem, ItemStack toolItem );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Map<String, Factory> kinds = new HashMap<>();
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
kinds.put( "tool", TurtleTool::new );
|
||||||
|
kinds.put( "axe", TurtleAxe::new );
|
||||||
|
kinds.put( "hoe", TurtleHoe::new );
|
||||||
|
kinds.put( "shovel", TurtleShovel::new );
|
||||||
|
kinds.put( "sword", TurtleSword::new );
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private final ItemStack craftItem;
|
||||||
|
private final ItemStack toolItem;
|
||||||
|
private final String kind;
|
||||||
|
|
||||||
|
public AddTurtleTool( String id, ItemStack craftItem, ItemStack toolItem, String kind )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.craftItem = craftItem;
|
||||||
|
this.toolItem = toolItem;
|
||||||
|
this.kind = kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply()
|
||||||
|
{
|
||||||
|
Factory factory = kinds.get( kind );
|
||||||
|
if( factory == null )
|
||||||
|
{
|
||||||
|
ComputerCraft.log.error( "Unknown turtle upgrade kind '{}' (this should have been rejected by verify!)", kind );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
TurtleUpgrades.register( factory.create( new ResourceLocation( id ), craftItem, toolItem ) );
|
||||||
|
}
|
||||||
|
catch( RuntimeException e )
|
||||||
|
{
|
||||||
|
ComputerCraft.log.error( "Registration of turtle tool failed", e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String describe()
|
||||||
|
{
|
||||||
|
return String.format( "Add new turtle %s '%s' (crafted with '%s', uses a '%s')", kind, id, craftItem, toolItem );
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<String> getValidationProblem()
|
||||||
|
{
|
||||||
|
if( craftItem.isEmpty() ) return Optional.of( "Crafting item stack is empty." );
|
||||||
|
if( craftItem.hasTagCompound() && !craftItem.getTagCompound().isEmpty() )
|
||||||
|
{
|
||||||
|
return Optional.of( "Crafting item has NBT." );
|
||||||
|
}
|
||||||
|
if( toolItem.isEmpty() ) return Optional.of( "Tool item stack is empty." );
|
||||||
|
if( !kinds.containsKey( kind ) ) return Optional.of( String.format( "Unknown kind '%s'.", kind ) );
|
||||||
|
|
||||||
|
if( TurtleUpgrades.get( id ) != null )
|
||||||
|
{
|
||||||
|
return Optional.of( String.format( "An upgrade with the same name ('%s') has already been registered.", id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||||
|
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
|
||||||
|
* Send enquiries to dratcliffe@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dan200.computercraft.shared.integration.crafttweaker.actions;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An extension of {@link IAction} with a single validation function, rather than two.
|
||||||
|
*/
|
||||||
|
public interface IAction extends crafttweaker.IAction
|
||||||
|
{
|
||||||
|
default Optional<String> getValidationProblem()
|
||||||
|
{
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default boolean validate()
|
||||||
|
{
|
||||||
|
return !getValidationProblem().isPresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String describeInvalid()
|
||||||
|
{
|
||||||
|
return getValidationProblem().orElse( "No problems found." );
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||||
|
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
|
||||||
|
* Send enquiries to dratcliffe@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dan200.computercraft.shared.integration.crafttweaker.actions;
|
||||||
|
|
||||||
|
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||||
|
import dan200.computercraft.shared.TurtleUpgrades;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a turtle upgrade crafted with the given stack.
|
||||||
|
*/
|
||||||
|
public class RemoveTurtleUpgradeByItem implements IAction
|
||||||
|
{
|
||||||
|
private final ItemStack stack;
|
||||||
|
|
||||||
|
public RemoveTurtleUpgradeByItem( ItemStack stack )
|
||||||
|
{
|
||||||
|
this.stack = stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply()
|
||||||
|
{
|
||||||
|
ITurtleUpgrade upgrade = TurtleUpgrades.get( stack );
|
||||||
|
if( upgrade != null ) TurtleUpgrades.disable( upgrade );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String describe()
|
||||||
|
{
|
||||||
|
return String.format( "Remove turtle upgrades crafted with '%s'", stack );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<String> getValidationProblem()
|
||||||
|
{
|
||||||
|
if( TurtleUpgrades.get( stack ) == null )
|
||||||
|
{
|
||||||
|
return Optional.of( String.format( "Unknown turtle upgrade crafted with '%s'.", stack ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||||
|
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
|
||||||
|
* Send enquiries to dratcliffe@gmail.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
package dan200.computercraft.shared.integration.crafttweaker.actions;
|
||||||
|
|
||||||
|
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||||
|
import dan200.computercraft.shared.TurtleUpgrades;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a turtle upgrade with the given id.
|
||||||
|
*/
|
||||||
|
public class RemoveTurtleUpgradeByName implements IAction
|
||||||
|
{
|
||||||
|
private final String id;
|
||||||
|
|
||||||
|
public RemoveTurtleUpgradeByName( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply()
|
||||||
|
{
|
||||||
|
ITurtleUpgrade upgrade = TurtleUpgrades.get( id );
|
||||||
|
if( upgrade != null ) TurtleUpgrades.disable( upgrade );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String describe()
|
||||||
|
{
|
||||||
|
return String.format( "Remove turtle upgrade '%s'", id );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<String> getValidationProblem()
|
||||||
|
{
|
||||||
|
if( TurtleUpgrades.get( id ) == null )
|
||||||
|
{
|
||||||
|
return Optional.of( String.format( "Unknown turtle upgrade '%s'.", id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@
|
|||||||
package dan200.computercraft.shared.turtle.upgrades;
|
package dan200.computercraft.shared.turtle.upgrades;
|
||||||
|
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
public class TurtleAxe extends TurtleTool
|
public class TurtleAxe extends TurtleTool
|
||||||
@ -21,6 +22,11 @@ public class TurtleAxe extends TurtleTool
|
|||||||
super( id, item );
|
super( id, item );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TurtleAxe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||||
|
{
|
||||||
|
super( id, craftItem, toolItem );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected float getDamageMultiplier()
|
protected float getDamageMultiplier()
|
||||||
{
|
{
|
||||||
|
@ -35,6 +35,11 @@ public class TurtleHoe extends TurtleTool
|
|||||||
super( id, item );
|
super( id, item );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TurtleHoe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||||
|
{
|
||||||
|
super( id, craftItem, toolItem );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
||||||
{
|
{
|
||||||
|
@ -35,6 +35,11 @@ public class TurtleShovel extends TurtleTool
|
|||||||
super( id, item );
|
super( id, item );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TurtleShovel( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||||
|
{
|
||||||
|
super( id, craftItem, toolItem );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
||||||
{
|
{
|
||||||
|
@ -10,6 +10,7 @@ import dan200.computercraft.shared.turtle.core.TurtlePlayer;
|
|||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
@ -26,6 +27,11 @@ public class TurtleSword extends TurtleTool
|
|||||||
super( id, item );
|
super( id, item );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TurtleSword( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||||
|
{
|
||||||
|
super( id, craftItem, toolItem );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
|
||||||
{
|
{
|
||||||
|
@ -63,6 +63,12 @@ public class TurtleTool extends AbstractTurtleUpgrade
|
|||||||
this.item = new ItemStack( item );
|
this.item = new ItemStack( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TurtleTool( ResourceLocation id, ItemStack craftItem, ItemStack toolItem )
|
||||||
|
{
|
||||||
|
super( id, -1, TurtleUpgradeType.Tool, craftItem );
|
||||||
|
this.item = toolItem;
|
||||||
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
@OnlyIn( Dist.CLIENT )
|
@OnlyIn( Dist.CLIENT )
|
||||||
@ -77,7 +83,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
|
|||||||
);
|
);
|
||||||
Minecraft mc = Minecraft.getInstance();
|
Minecraft mc = Minecraft.getInstance();
|
||||||
return Pair.of(
|
return Pair.of(
|
||||||
mc.getItemRenderer().getItemModelMesher().getItemModel( item ),
|
mc.getItemRenderer().getItemModelMesher().getItemModel( getCraftingItem() ),
|
||||||
transform
|
transform
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ if _VERSION == "Lua 5.1" then
|
|||||||
bxor = bit32.bxor,
|
bxor = bit32.bxor,
|
||||||
brshift = bit32.arshift,
|
brshift = bit32.arshift,
|
||||||
blshift = bit32.lshift,
|
blshift = bit32.lshift,
|
||||||
blogic_rshift = bit32.rshift
|
blogic_rshift = bit32.rshift,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -184,15 +184,15 @@ function sleep( nTime )
|
|||||||
expect(1, nTime, "number", "nil")
|
expect(1, nTime, "number", "nil")
|
||||||
local timer = os.startTimer( nTime or 0 )
|
local timer = os.startTimer( nTime or 0 )
|
||||||
repeat
|
repeat
|
||||||
local sEvent, param = os.pullEvent( "timer" )
|
local _, param = os.pullEvent( "timer" )
|
||||||
until param == timer
|
until param == timer
|
||||||
end
|
end
|
||||||
|
|
||||||
function write( sText )
|
function write( sText )
|
||||||
expect(1, sText, "string", "number")
|
expect(1, sText, "string", "number")
|
||||||
|
|
||||||
local w,h = term.getSize()
|
local w, h = term.getSize()
|
||||||
local x,y = term.getCursorPos()
|
local x, y = term.getCursorPos()
|
||||||
|
|
||||||
local nLinesPrinted = 0
|
local nLinesPrinted = 0
|
||||||
local function newLine()
|
local function newLine()
|
||||||
@ -207,13 +207,13 @@ function write( sText )
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Print the line with proper word wrapping
|
-- Print the line with proper word wrapping
|
||||||
while string.len(sText) > 0 do
|
while #sText > 0 do
|
||||||
local whitespace = string.match( sText, "^[ \t]+" )
|
local whitespace = string.match( sText, "^[ \t]+" )
|
||||||
if whitespace then
|
if whitespace then
|
||||||
-- Print whitespace
|
-- Print whitespace
|
||||||
term.write( whitespace )
|
term.write( whitespace )
|
||||||
x,y = term.getCursorPos()
|
x, y = term.getCursorPos()
|
||||||
sText = string.sub( sText, string.len(whitespace) + 1 )
|
sText = string.sub( sText, #whitespace + 1 )
|
||||||
end
|
end
|
||||||
|
|
||||||
local newline = string.match( sText, "^\n" )
|
local newline = string.match( sText, "^\n" )
|
||||||
@ -225,24 +225,24 @@ function write( sText )
|
|||||||
|
|
||||||
local text = string.match( sText, "^[^ \t\n]+" )
|
local text = string.match( sText, "^[^ \t\n]+" )
|
||||||
if text then
|
if text then
|
||||||
sText = string.sub( sText, string.len(text) + 1 )
|
sText = string.sub( sText, #text + 1 )
|
||||||
if string.len(text) > w then
|
if #text > w then
|
||||||
-- Print a multiline word
|
-- Print a multiline word
|
||||||
while string.len( text ) > 0 do
|
while #text > 0 do
|
||||||
if x > w then
|
if x > w then
|
||||||
newLine()
|
newLine()
|
||||||
end
|
end
|
||||||
term.write( text )
|
term.write( text )
|
||||||
text = string.sub( text, (w-x) + 2 )
|
text = string.sub( text, w - x + 2 )
|
||||||
x,y = term.getCursorPos()
|
x, y = term.getCursorPos()
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Print a word normally
|
-- Print a word normally
|
||||||
if x + string.len(text) - 1 > w then
|
if x + #text - 1 > w then
|
||||||
newLine()
|
newLine()
|
||||||
end
|
end
|
||||||
term.write( text )
|
term.write( text )
|
||||||
x,y = term.getCursorPos()
|
x, y = term.getCursorPos()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -299,7 +299,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
|||||||
local tCompletions
|
local tCompletions
|
||||||
local nCompletion
|
local nCompletion
|
||||||
local function recomplete()
|
local function recomplete()
|
||||||
if _fnComplete and nPos == string.len(sLine) then
|
if _fnComplete and nPos == #sLine then
|
||||||
tCompletions = _fnComplete( sLine )
|
tCompletions = _fnComplete( sLine )
|
||||||
if tCompletions and #tCompletions > 0 then
|
if tCompletions and #tCompletions > 0 then
|
||||||
nCompletion = 1
|
nCompletion = 1
|
||||||
@ -332,7 +332,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
|||||||
|
|
||||||
local _, cy = term.getCursorPos()
|
local _, cy = term.getCursorPos()
|
||||||
term.setCursorPos( sx, cy )
|
term.setCursorPos( sx, cy )
|
||||||
local sReplace = (_bClear and " ") or _sReplaceChar
|
local sReplace = _bClear and " " or _sReplaceChar
|
||||||
if sReplace then
|
if sReplace then
|
||||||
term.write( string.rep( sReplace, math.max( #sLine - nScroll, 0 ) ) )
|
term.write( string.rep( sReplace, math.max( #sLine - nScroll, 0 ) ) )
|
||||||
else
|
else
|
||||||
@ -544,7 +544,7 @@ function read( _sReplaceChar, _tHistory, _fnComplete, _sDefault )
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local cx, cy = term.getCursorPos()
|
local _, cy = term.getCursorPos()
|
||||||
term.setCursorBlink( false )
|
term.setCursorBlink( false )
|
||||||
term.setCursorPos( w + 1, cy )
|
term.setCursorPos( w + 1, cy )
|
||||||
print()
|
print()
|
||||||
@ -613,10 +613,10 @@ function os.loadAPI( _sPath )
|
|||||||
expect(1, _sPath, "string")
|
expect(1, _sPath, "string")
|
||||||
local sName = fs.getName( _sPath )
|
local sName = fs.getName( _sPath )
|
||||||
if sName:sub(-4) == ".lua" then
|
if sName:sub(-4) == ".lua" then
|
||||||
sName = sName:sub(1,-5)
|
sName = sName:sub(1, -5)
|
||||||
end
|
end
|
||||||
if tAPIsLoading[sName] == true then
|
if tAPIsLoading[sName] == true then
|
||||||
printError( "API "..sName.." is already being loaded" )
|
printError( "API " .. sName .. " is already being loaded" )
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
tAPIsLoading[sName] = true
|
tAPIsLoading[sName] = true
|
||||||
@ -636,7 +636,7 @@ function os.loadAPI( _sPath )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local tAPI = {}
|
local tAPI = {}
|
||||||
for k,v in pairs( tEnv ) do
|
for k, v in pairs( tEnv ) do
|
||||||
if k ~= "_ENV" then
|
if k ~= "_ENV" then
|
||||||
tAPI[k] = v
|
tAPI[k] = v
|
||||||
end
|
end
|
||||||
@ -680,7 +680,8 @@ if http then
|
|||||||
|
|
||||||
local methods = {
|
local methods = {
|
||||||
GET = true, POST = true, HEAD = true,
|
GET = true, POST = true, HEAD = true,
|
||||||
OPTIONS = true, PUT = true, DELETE = true
|
OPTIONS = true, PUT = true, DELETE = true,
|
||||||
|
PATCH = true, TRACE = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
local function checkKey( options, key, ty, opt )
|
local function checkKey( options, key, ty, opt )
|
||||||
@ -775,7 +776,7 @@ if http then
|
|||||||
if not ok then return ok, err end
|
if not ok then return ok, err end
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local event, url, ok, err = os.pullEvent( "http_check" )
|
local _, url, ok, err = os.pullEvent( "http_check" )
|
||||||
if url == _url then return ok, err end
|
if url == _url then return ok, err end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -808,8 +809,8 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
|
|||||||
expect(3, bIncludeFiles, "boolean", "nil")
|
expect(3, bIncludeFiles, "boolean", "nil")
|
||||||
expect(4, bIncludeDirs, "boolean", "nil")
|
expect(4, bIncludeDirs, "boolean", "nil")
|
||||||
|
|
||||||
bIncludeFiles = (bIncludeFiles ~= false)
|
bIncludeFiles = bIncludeFiles ~= false
|
||||||
bIncludeDirs = (bIncludeDirs ~= false)
|
bIncludeDirs = bIncludeDirs ~= false
|
||||||
local sDir = sLocation
|
local sDir = sLocation
|
||||||
local nStart = 1
|
local nStart = 1
|
||||||
local nSlash = string.find( sPath, "[/\\]", nStart )
|
local nSlash = string.find( sPath, "[/\\]", nStart )
|
||||||
@ -836,13 +837,13 @@ function fs.complete( sPath, sLocation, bIncludeFiles, bIncludeDirs )
|
|||||||
end
|
end
|
||||||
if sDir ~= "" then
|
if sDir ~= "" then
|
||||||
if sPath == "" then
|
if sPath == "" then
|
||||||
table.insert( tResults, (bIncludeDirs and "..") or "../" )
|
table.insert( tResults, bIncludeDirs and ".." or "../" )
|
||||||
elseif sPath == "." then
|
elseif sPath == "." then
|
||||||
table.insert( tResults, (bIncludeDirs and ".") or "./" )
|
table.insert( tResults, bIncludeDirs and "." or "./" )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local tFiles = fs.list( sDir )
|
local tFiles = fs.list( sDir )
|
||||||
for n=1,#tFiles do
|
for n = 1, #tFiles do
|
||||||
local sFile = tFiles[n]
|
local sFile = tFiles[n]
|
||||||
if #sFile >= #sName and string.sub( sFile, 1, #sName ) == sName then
|
if #sFile >= #sName and string.sub( sFile, 1, #sName ) == sName then
|
||||||
local bIsDir = fs.isDir( fs.combine( sDir, sFile ) )
|
local bIsDir = fs.isDir( fs.combine( sDir, sFile ) )
|
||||||
@ -867,7 +868,7 @@ end
|
|||||||
-- Load APIs
|
-- Load APIs
|
||||||
local bAPIError = false
|
local bAPIError = false
|
||||||
local tApis = fs.list( "rom/apis" )
|
local tApis = fs.list( "rom/apis" )
|
||||||
for n,sFile in ipairs( tApis ) do
|
for _, sFile in ipairs( tApis ) do
|
||||||
if string.sub( sFile, 1, 1 ) ~= "." then
|
if string.sub( sFile, 1, 1 ) ~= "." then
|
||||||
local sPath = fs.combine( "rom/apis", sFile )
|
local sPath = fs.combine( "rom/apis", sFile )
|
||||||
if not fs.isDir( sPath ) then
|
if not fs.isDir( sPath ) then
|
||||||
@ -881,7 +882,7 @@ end
|
|||||||
if turtle and fs.isDir( "rom/apis/turtle" ) then
|
if turtle and fs.isDir( "rom/apis/turtle" ) then
|
||||||
-- Load turtle APIs
|
-- Load turtle APIs
|
||||||
local tApis = fs.list( "rom/apis/turtle" )
|
local tApis = fs.list( "rom/apis/turtle" )
|
||||||
for n,sFile in ipairs( tApis ) do
|
for _, sFile in ipairs( tApis ) do
|
||||||
if string.sub( sFile, 1, 1 ) ~= "." then
|
if string.sub( sFile, 1, 1 ) ~= "." then
|
||||||
local sPath = fs.combine( "rom/apis/turtle", sFile )
|
local sPath = fs.combine( "rom/apis/turtle", sFile )
|
||||||
if not fs.isDir( sPath ) then
|
if not fs.isDir( sPath ) then
|
||||||
@ -896,7 +897,7 @@ end
|
|||||||
if pocket and fs.isDir( "rom/apis/pocket" ) then
|
if pocket and fs.isDir( "rom/apis/pocket" ) then
|
||||||
-- Load pocket APIs
|
-- Load pocket APIs
|
||||||
local tApis = fs.list( "rom/apis/pocket" )
|
local tApis = fs.list( "rom/apis/pocket" )
|
||||||
for n,sFile in ipairs( tApis ) do
|
for _, sFile in ipairs( tApis ) do
|
||||||
if string.sub( sFile, 1, 1 ) ~= "." then
|
if string.sub( sFile, 1, 1 ) ~= "." then
|
||||||
local sPath = fs.combine( "rom/apis/pocket", sFile )
|
local sPath = fs.combine( "rom/apis/pocket", sFile )
|
||||||
if not fs.isDir( sPath ) then
|
if not fs.isDir( sPath ) then
|
||||||
@ -925,7 +926,7 @@ if commands and fs.isDir( "rom/apis/command" ) then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
setmetatable( commands, tCaseInsensitiveMetatable )
|
setmetatable( commands, tCaseInsensitiveMetatable )
|
||||||
setmetatable( commands.async, tCaseInsensitiveMetatable )
|
setmetatable( commands.async, tCaseInsensitiveMetatable )
|
||||||
@ -941,12 +942,12 @@ if bAPIError then
|
|||||||
print( "Press any key to continue" )
|
print( "Press any key to continue" )
|
||||||
os.pullEvent( "key" )
|
os.pullEvent( "key" )
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos( 1,1 )
|
term.setCursorPos( 1, 1 )
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set default settings
|
-- Set default settings
|
||||||
settings.set( "shell.allow_startup", true )
|
settings.set( "shell.allow_startup", true )
|
||||||
settings.set( "shell.allow_disk_startup", (commands == nil) )
|
settings.set( "shell.allow_disk_startup", commands == nil )
|
||||||
settings.set( "shell.autocomplete", true )
|
settings.set( "shell.autocomplete", true )
|
||||||
settings.set( "edit.autocomplete", true )
|
settings.set( "edit.autocomplete", true )
|
||||||
settings.set( "edit.default_extension", "lua" )
|
settings.set( "edit.default_extension", "lua" )
|
||||||
|
@ -23,7 +23,7 @@ function combine( ... )
|
|||||||
for i = 1, select('#', ...) do
|
for i = 1, select('#', ...) do
|
||||||
local c = select(i, ...)
|
local c = select(i, ...)
|
||||||
expect(i, c, "number")
|
expect(i, c, "number")
|
||||||
r = bit32.bor(r,c)
|
r = bit32.bor(r, c)
|
||||||
end
|
end
|
||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
@ -50,8 +50,8 @@ function packRGB( r, g, b )
|
|||||||
expect(2, g, "number")
|
expect(2, g, "number")
|
||||||
expect(3, b, "number")
|
expect(3, b, "number")
|
||||||
return
|
return
|
||||||
bit32.band( r * 255, 0xFF ) * 2^16 +
|
bit32.band( r * 255, 0xFF ) * 2 ^ 16 +
|
||||||
bit32.band( g * 255, 0xFF ) * 2^8 +
|
bit32.band( g * 255, 0xFF ) * 2 ^ 8 +
|
||||||
bit32.band( b * 255, 0xFF )
|
bit32.band( b * 255, 0xFF )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
-- Colours (for lovers of british spelling)
|
-- Colours (for lovers of british spelling)
|
||||||
local colours = _ENV
|
local colours = _ENV
|
||||||
for k,v in pairs(colors) do
|
for k, v in pairs(colors) do
|
||||||
colours[k] = v
|
colours[k] = v
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ end
|
|||||||
|
|
||||||
function stopAudio( name )
|
function stopAudio( name )
|
||||||
if not name then
|
if not name then
|
||||||
for n,sName in ipairs( peripheral.getNames() ) do
|
for _, sName in ipairs( peripheral.getNames() ) do
|
||||||
stopAudio( sName )
|
stopAudio( sName )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -13,7 +13,7 @@ local function trilaterate( A, B, C )
|
|||||||
local d = a2b:length()
|
local d = a2b:length()
|
||||||
local ex = a2b:normalize( )
|
local ex = a2b:normalize( )
|
||||||
local i = ex:dot( a2c )
|
local i = ex:dot( a2c )
|
||||||
local ey = (a2c - (ex * i)):normalize()
|
local ey = (a2c - ex * i):normalize()
|
||||||
local j = ey:dot( a2c )
|
local j = ey:dot( a2c )
|
||||||
local ez = ex:cross( ey )
|
local ez = ex:cross( ey )
|
||||||
|
|
||||||
@ -21,16 +21,16 @@ local function trilaterate( A, B, C )
|
|||||||
local r2 = B.nDistance
|
local r2 = B.nDistance
|
||||||
local r3 = C.nDistance
|
local r3 = C.nDistance
|
||||||
|
|
||||||
local x = (r1*r1 - r2*r2 + d*d) / (2*d)
|
local x = (r1 * r1 - r2 * r2 + d * d) / (2 * d)
|
||||||
local y = (r1*r1 - r3*r3 - x*x + (x-i)*(x-i) + j*j) / (2*j)
|
local y = (r1 * r1 - r3 * r3 - x * x + (x - i) * (x - i) + j * j) / (2 * j)
|
||||||
|
|
||||||
local result = A.vPosition + (ex * x) + (ey * y)
|
local result = A.vPosition + ex * x + ey * y
|
||||||
|
|
||||||
local zSquared = r1*r1 - x*x - y*y
|
local zSquared = r1 * r1 - x * x - y * y
|
||||||
if zSquared > 0 then
|
if zSquared > 0 then
|
||||||
local z = math.sqrt( zSquared )
|
local z = math.sqrt( zSquared )
|
||||||
local result1 = result + (ez * z)
|
local result1 = result + ez * z
|
||||||
local result2 = result - (ez * z)
|
local result2 = result - ez * z
|
||||||
|
|
||||||
local rounded1, rounded2 = result1:round( 0.01 ), result2:round( 0.01 )
|
local rounded1, rounded2 = result1:round( 0.01 ), result2:round( 0.01 )
|
||||||
if rounded1.x ~= rounded2.x or rounded1.y ~= rounded2.y or rounded1.z ~= rounded2.z then
|
if rounded1.x ~= rounded2.x or rounded1.y ~= rounded2.y or rounded1.z ~= rounded2.z then
|
||||||
@ -66,7 +66,7 @@ function locate( _nTimeout, _bDebug )
|
|||||||
|
|
||||||
-- Find a modem
|
-- Find a modem
|
||||||
local sModemSide = nil
|
local sModemSide = nil
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
|
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
|
||||||
sModemSide = sSide
|
sModemSide = sSide
|
||||||
break
|
break
|
||||||
@ -109,7 +109,7 @@ function locate( _nTimeout, _bDebug )
|
|||||||
if type(tMessage) == "table" and #tMessage == 3 and tonumber(tMessage[1]) and tonumber(tMessage[2]) and tonumber(tMessage[3]) then
|
if type(tMessage) == "table" and #tMessage == 3 and tonumber(tMessage[1]) and tonumber(tMessage[2]) and tonumber(tMessage[3]) then
|
||||||
local tFix = { vPosition = vector.new( tMessage[1], tMessage[2], tMessage[3] ), nDistance = nDistance }
|
local tFix = { vPosition = vector.new( tMessage[1], tMessage[2], tMessage[3] ), nDistance = nDistance }
|
||||||
if _bDebug then
|
if _bDebug then
|
||||||
print( tFix.nDistance.." metres from "..tostring( tFix.vPosition ) )
|
print( tFix.nDistance .. " metres from " .. tostring( tFix.vPosition ) )
|
||||||
end
|
end
|
||||||
if tFix.nDistance == 0 then
|
if tFix.nDistance == 0 then
|
||||||
pos1, pos2 = tFix.vPosition, nil
|
pos1, pos2 = tFix.vPosition, nil
|
||||||
@ -148,12 +148,12 @@ function locate( _nTimeout, _bDebug )
|
|||||||
if pos1 and pos2 then
|
if pos1 and pos2 then
|
||||||
if _bDebug then
|
if _bDebug then
|
||||||
print( "Ambiguous position" )
|
print( "Ambiguous position" )
|
||||||
print( "Could be "..pos1.x..","..pos1.y..","..pos1.z.." or "..pos2.x..","..pos2.y..","..pos2.z )
|
print( "Could be " .. pos1.x .. "," .. pos1.y .. "," .. pos1.z .. " or " .. pos2.x .. "," .. pos2.y .. "," .. pos2.z )
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
elseif pos1 then
|
elseif pos1 then
|
||||||
if _bDebug then
|
if _bDebug then
|
||||||
print( "Position is "..pos1.x..","..pos1.y..","..pos1.z )
|
print( "Position is " .. pos1.x .. "," .. pos1.y .. "," .. pos1.z )
|
||||||
end
|
end
|
||||||
return pos1.x, pos1.y, pos1.z
|
return pos1.x, pos1.y, pos1.z
|
||||||
else
|
else
|
||||||
|
@ -18,8 +18,8 @@ function lookup( _sTopic )
|
|||||||
sPath = fs.combine( sPath, _sTopic )
|
sPath = fs.combine( sPath, _sTopic )
|
||||||
if fs.exists( sPath ) and not fs.isDir( sPath ) then
|
if fs.exists( sPath ) and not fs.isDir( sPath ) then
|
||||||
return sPath
|
return sPath
|
||||||
elseif fs.exists( sPath..".txt" ) and not fs.isDir( sPath..".txt" ) then
|
elseif fs.exists( sPath .. ".txt" ) and not fs.isDir( sPath .. ".txt" ) then
|
||||||
return sPath..".txt"
|
return sPath .. ".txt"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -30,18 +30,18 @@ end
|
|||||||
function topics()
|
function topics()
|
||||||
-- Add index
|
-- Add index
|
||||||
local tItems = {
|
local tItems = {
|
||||||
[ "index" ] = true
|
[ "index" ] = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Add topics from the path
|
-- Add topics from the path
|
||||||
for sPath in string.gmatch(sPath, "[^:]+") do
|
for sPath in string.gmatch(sPath, "[^:]+") do
|
||||||
if fs.isDir( sPath ) then
|
if fs.isDir( sPath ) then
|
||||||
local tList = fs.list( sPath )
|
local tList = fs.list( sPath )
|
||||||
for n,sFile in pairs( tList ) do
|
for _, sFile in pairs( tList ) do
|
||||||
if string.sub( sFile, 1, 1 ) ~= "." then
|
if string.sub( sFile, 1, 1 ) ~= "." then
|
||||||
if not fs.isDir( fs.combine( sPath, sFile ) ) then
|
if not fs.isDir( fs.combine( sPath, sFile ) ) then
|
||||||
if #sFile > 4 and sFile:sub(-4) == ".txt" then
|
if #sFile > 4 and sFile:sub(-4) == ".txt" then
|
||||||
sFile = sFile:sub(1,-5)
|
sFile = sFile:sub(1, -5)
|
||||||
end
|
end
|
||||||
tItems[ sFile ] = true
|
tItems[ sFile ] = true
|
||||||
end
|
end
|
||||||
@ -52,7 +52,7 @@ function topics()
|
|||||||
|
|
||||||
-- Sort and return
|
-- Sort and return
|
||||||
local tItemList = {}
|
local tItemList = {}
|
||||||
for sItem, b in pairs( tItems ) do
|
for sItem in pairs( tItems ) do
|
||||||
table.insert( tItemList, sItem )
|
table.insert( tItemList, sItem )
|
||||||
end
|
end
|
||||||
table.sort( tItemList )
|
table.sort( tItemList )
|
||||||
@ -63,7 +63,7 @@ function completeTopic( sText )
|
|||||||
expect(1, sText, "string")
|
expect(1, sText, "string")
|
||||||
local tTopics = topics()
|
local tTopics = topics()
|
||||||
local tResults = {}
|
local tResults = {}
|
||||||
for n=1,#tTopics do
|
for n = 1, #tTopics do
|
||||||
local sTopic = tTopics[n]
|
local sTopic = tTopics[n]
|
||||||
if #sTopic > #sText and string.sub( sTopic, 1, #sText ) == sText then
|
if #sTopic > #sText and string.sub( sTopic, 1, #sText ) == sText then
|
||||||
table.insert( tResults, string.sub( sTopic, #sText + 1 ) )
|
table.insert( tResults, string.sub( sTopic, #sText + 1 ) )
|
||||||
|
@ -129,11 +129,11 @@ handleMetatable = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
local defaultInput = setmetatable({
|
local defaultInput = setmetatable({
|
||||||
_handle = { readLine = _G.read }
|
_handle = { readLine = _G.read },
|
||||||
}, handleMetatable)
|
}, handleMetatable)
|
||||||
|
|
||||||
local defaultOutput = setmetatable({
|
local defaultOutput = setmetatable({
|
||||||
_handle = { write = _G.write }
|
_handle = { write = _G.write },
|
||||||
}, handleMetatable)
|
}, handleMetatable)
|
||||||
|
|
||||||
local defaultError = setmetatable({
|
local defaultError = setmetatable({
|
||||||
@ -147,7 +147,7 @@ local defaultError = setmetatable({
|
|||||||
_G.write(...)
|
_G.write(...)
|
||||||
if term.isColour() then term.setTextColour(oldColour) end
|
if term.isColour() then term.setTextColour(oldColour) end
|
||||||
end,
|
end,
|
||||||
}
|
},
|
||||||
}, handleMetatable)
|
}, handleMetatable)
|
||||||
|
|
||||||
local currentInput = defaultInput
|
local currentInput = defaultInput
|
||||||
|
@ -6,14 +6,14 @@ local function drawPixelInternal( xPos, yPos )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local tColourLookup = {}
|
local tColourLookup = {}
|
||||||
for n=1,16 do
|
for n = 1, 16 do
|
||||||
tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1)
|
tColourLookup[ string.byte( "0123456789abcdef", n, n ) ] = 2 ^ (n - 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function parseLine( tImageArg, sLine )
|
local function parseLine( tImageArg, sLine )
|
||||||
local tLine = {}
|
local tLine = {}
|
||||||
for x=1,sLine:len() do
|
for x = 1, sLine:len() do
|
||||||
tLine[x] = tColourLookup[ string.byte(sLine,x,x) ] or 0
|
tLine[x] = tColourLookup[ string.byte(sLine, x, x) ] or 0
|
||||||
end
|
end
|
||||||
table.insert( tImageArg, tLine )
|
table.insert( tImageArg, tLine )
|
||||||
end
|
end
|
||||||
@ -89,7 +89,7 @@ function drawLine( startX, startY, endX, endY, nColour )
|
|||||||
if xDiff > math.abs(yDiff) then
|
if xDiff > math.abs(yDiff) then
|
||||||
local y = minY
|
local y = minY
|
||||||
local dy = yDiff / xDiff
|
local dy = yDiff / xDiff
|
||||||
for x=minX,maxX do
|
for x = minX, maxX do
|
||||||
drawPixelInternal( x, math.floor( y + 0.5 ) )
|
drawPixelInternal( x, math.floor( y + 0.5 ) )
|
||||||
y = y + dy
|
y = y + dy
|
||||||
end
|
end
|
||||||
@ -97,12 +97,12 @@ function drawLine( startX, startY, endX, endY, nColour )
|
|||||||
local x = minX
|
local x = minX
|
||||||
local dx = xDiff / yDiff
|
local dx = xDiff / yDiff
|
||||||
if maxY >= minY then
|
if maxY >= minY then
|
||||||
for y=minY,maxY do
|
for y = minY, maxY do
|
||||||
drawPixelInternal( math.floor( x + 0.5 ), y )
|
drawPixelInternal( math.floor( x + 0.5 ), y )
|
||||||
x = x + dx
|
x = x + dx
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for y=minY,maxY,-1 do
|
for y = minY, maxY, -1 do
|
||||||
drawPixelInternal( math.floor( x + 0.5 ), y )
|
drawPixelInternal( math.floor( x + 0.5 ), y )
|
||||||
x = x - dx
|
x = x - dx
|
||||||
end
|
end
|
||||||
@ -142,13 +142,13 @@ function drawBox( startX, startY, endX, endY, nColour )
|
|||||||
maxY = startY
|
maxY = startY
|
||||||
end
|
end
|
||||||
|
|
||||||
for x=minX,maxX do
|
for x = minX, maxX do
|
||||||
drawPixelInternal( x, minY )
|
drawPixelInternal( x, minY )
|
||||||
drawPixelInternal( x, maxY )
|
drawPixelInternal( x, maxY )
|
||||||
end
|
end
|
||||||
|
|
||||||
if (maxY - minY) >= 2 then
|
if maxY - minY >= 2 then
|
||||||
for y=(minY+1),(maxY-1) do
|
for y = minY + 1, maxY - 1 do
|
||||||
drawPixelInternal( minX, y )
|
drawPixelInternal( minX, y )
|
||||||
drawPixelInternal( maxX, y )
|
drawPixelInternal( maxX, y )
|
||||||
end
|
end
|
||||||
@ -187,8 +187,8 @@ function drawFilledBox( startX, startY, endX, endY, nColour )
|
|||||||
maxY = startY
|
maxY = startY
|
||||||
end
|
end
|
||||||
|
|
||||||
for x=minX,maxX do
|
for x = minX, maxX do
|
||||||
for y=minY,maxY do
|
for y = minY, maxY do
|
||||||
drawPixelInternal( x, y )
|
drawPixelInternal( x, y )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -198,9 +198,9 @@ function drawImage( tImage, xPos, yPos )
|
|||||||
expect(1, tImage, "table")
|
expect(1, tImage, "table")
|
||||||
expect(2, xPos, "number")
|
expect(2, xPos, "number")
|
||||||
expect(3, yPos, "number")
|
expect(3, yPos, "number")
|
||||||
for y=1,#tImage do
|
for y = 1, #tImage do
|
||||||
local tLine = tImage[y]
|
local tLine = tImage[y]
|
||||||
for x=1,#tLine do
|
for x = 1, #tLine do
|
||||||
if tLine[x] > 0 then
|
if tLine[x] > 0 then
|
||||||
term.setBackgroundColor( tLine[x] )
|
term.setBackgroundColor( tLine[x] )
|
||||||
drawPixelInternal( x + xPos - 1, y + yPos - 1 )
|
drawPixelInternal( x + xPos - 1, y + yPos - 1 )
|
||||||
|
@ -21,7 +21,7 @@ local function runUntilLimit( _routines, _limit )
|
|||||||
local tFilters = {}
|
local tFilters = {}
|
||||||
local eventData = { n = 0 }
|
local eventData = { n = 0 }
|
||||||
while true do
|
while true do
|
||||||
for n=1,count do
|
for n = 1, count do
|
||||||
local r = _routines[n]
|
local r = _routines[n]
|
||||||
if r then
|
if r then
|
||||||
if tFilters[r] == nil or tFilters[r] == eventData[1] or eventData[1] == "terminate" then
|
if tFilters[r] == nil or tFilters[r] == eventData[1] or eventData[1] == "terminate" then
|
||||||
@ -41,7 +41,7 @@ local function runUntilLimit( _routines, _limit )
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for n=1,count do
|
for n = 1, count do
|
||||||
local r = _routines[n]
|
local r = _routines[n]
|
||||||
if r and coroutine.status( r ) == "dead" then
|
if r and coroutine.status( r ) == "dead" then
|
||||||
_routines[n] = nil
|
_routines[n] = nil
|
||||||
|
@ -4,12 +4,12 @@ local native = peripheral
|
|||||||
|
|
||||||
function getNames()
|
function getNames()
|
||||||
local tResults = {}
|
local tResults = {}
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if native.isPresent( sSide ) then
|
if native.isPresent( sSide ) then
|
||||||
table.insert( tResults, sSide )
|
table.insert( tResults, sSide )
|
||||||
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
||||||
local tRemote = native.call( sSide, "getNamesRemote" )
|
local tRemote = native.call( sSide, "getNamesRemote" )
|
||||||
for n,sName in ipairs( tRemote ) do
|
for _, sName in ipairs( tRemote ) do
|
||||||
table.insert( tResults, sName )
|
table.insert( tResults, sName )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -23,7 +23,7 @@ function isPresent( _sSide )
|
|||||||
if native.isPresent( _sSide ) then
|
if native.isPresent( _sSide ) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
||||||
if native.call( sSide, "isPresentRemote", _sSide ) then
|
if native.call( sSide, "isPresentRemote", _sSide ) then
|
||||||
return true
|
return true
|
||||||
@ -38,7 +38,7 @@ function getType( _sSide )
|
|||||||
if native.isPresent( _sSide ) then
|
if native.isPresent( _sSide ) then
|
||||||
return native.getType( _sSide )
|
return native.getType( _sSide )
|
||||||
end
|
end
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
||||||
if native.call( sSide, "isPresentRemote", _sSide ) then
|
if native.call( sSide, "isPresentRemote", _sSide ) then
|
||||||
return native.call( sSide, "getTypeRemote", _sSide )
|
return native.call( sSide, "getTypeRemote", _sSide )
|
||||||
@ -53,7 +53,7 @@ function getMethods( _sSide )
|
|||||||
if native.isPresent( _sSide ) then
|
if native.isPresent( _sSide ) then
|
||||||
return native.getMethods( _sSide )
|
return native.getMethods( _sSide )
|
||||||
end
|
end
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
||||||
if native.call( sSide, "isPresentRemote", _sSide ) then
|
if native.call( sSide, "isPresentRemote", _sSide ) then
|
||||||
return native.call( sSide, "getMethodsRemote", _sSide )
|
return native.call( sSide, "getMethodsRemote", _sSide )
|
||||||
@ -69,7 +69,7 @@ function call( _sSide, _sMethod, ... )
|
|||||||
if native.isPresent( _sSide ) then
|
if native.isPresent( _sSide ) then
|
||||||
return native.call( _sSide, _sMethod, ... )
|
return native.call( _sSide, _sMethod, ... )
|
||||||
end
|
end
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
if native.getType( sSide ) == "modem" and not native.call( sSide, "isWireless" ) then
|
||||||
if native.call( sSide, "isPresentRemote", _sSide ) then
|
if native.call( sSide, "isPresentRemote", _sSide ) then
|
||||||
return native.call( sSide, "callRemote", _sSide, _sMethod, ... )
|
return native.call( sSide, "callRemote", _sSide, _sMethod, ... )
|
||||||
@ -84,7 +84,7 @@ function wrap( _sSide )
|
|||||||
if peripheral.isPresent( _sSide ) then
|
if peripheral.isPresent( _sSide ) then
|
||||||
local tMethods = peripheral.getMethods( _sSide )
|
local tMethods = peripheral.getMethods( _sSide )
|
||||||
local tResult = {}
|
local tResult = {}
|
||||||
for n,sMethod in ipairs( tMethods ) do
|
for _, sMethod in ipairs( tMethods ) do
|
||||||
tResult[sMethod] = function( ... )
|
tResult[sMethod] = function( ... )
|
||||||
return peripheral.call( _sSide, sMethod, ... )
|
return peripheral.call( _sSide, sMethod, ... )
|
||||||
end
|
end
|
||||||
@ -98,7 +98,7 @@ function find( sType, fnFilter )
|
|||||||
expect(1, sType, "string")
|
expect(1, sType, "string")
|
||||||
expect(2, fnFilter, "function", "nil")
|
expect(2, fnFilter, "function", "nil")
|
||||||
local tResults = {}
|
local tResults = {}
|
||||||
for n,sName in ipairs( peripheral.getNames() ) do
|
for _, sName in ipairs( peripheral.getNames() ) do
|
||||||
if peripheral.getType( sName ) == sType then
|
if peripheral.getType( sName ) == sType then
|
||||||
local wrapped = peripheral.wrap( sName )
|
local wrapped = peripheral.wrap( sName )
|
||||||
if fnFilter == nil or fnFilter( sName, wrapped ) then
|
if fnFilter == nil or fnFilter( sName, wrapped ) then
|
||||||
|
@ -10,7 +10,7 @@ local tHostnames = {}
|
|||||||
function open( sModem )
|
function open( sModem )
|
||||||
expect(1, sModem, "string")
|
expect(1, sModem, "string")
|
||||||
if peripheral.getType( sModem ) ~= "modem" then
|
if peripheral.getType( sModem ) ~= "modem" then
|
||||||
error( "No such modem: "..sModem, 2 )
|
error( "No such modem: " .. sModem, 2 )
|
||||||
end
|
end
|
||||||
peripheral.call( sModem, "open", os.getComputerID() )
|
peripheral.call( sModem, "open", os.getComputerID() )
|
||||||
peripheral.call( sModem, "open", CHANNEL_BROADCAST )
|
peripheral.call( sModem, "open", CHANNEL_BROADCAST )
|
||||||
@ -21,13 +21,13 @@ function close( sModem )
|
|||||||
if sModem then
|
if sModem then
|
||||||
-- Close a specific modem
|
-- Close a specific modem
|
||||||
if peripheral.getType( sModem ) ~= "modem" then
|
if peripheral.getType( sModem ) ~= "modem" then
|
||||||
error( "No such modem: "..sModem, 2 )
|
error( "No such modem: " .. sModem, 2 )
|
||||||
end
|
end
|
||||||
peripheral.call( sModem, "close", os.getComputerID() )
|
peripheral.call( sModem, "close", os.getComputerID() )
|
||||||
peripheral.call( sModem, "close", CHANNEL_BROADCAST )
|
peripheral.call( sModem, "close", CHANNEL_BROADCAST )
|
||||||
else
|
else
|
||||||
-- Close all modems
|
-- Close all modems
|
||||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||||
if isOpen( sModem ) then
|
if isOpen( sModem ) then
|
||||||
close( sModem )
|
close( sModem )
|
||||||
end
|
end
|
||||||
@ -44,7 +44,7 @@ function isOpen( sModem )
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Check if any modem is open
|
-- Check if any modem is open
|
||||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||||
if isOpen( sModem ) then
|
if isOpen( sModem ) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
@ -79,10 +79,10 @@ function send( nRecipient, message, sProtocol )
|
|||||||
sent = true
|
sent = true
|
||||||
else
|
else
|
||||||
-- Send on all open modems, to the target and to repeaters
|
-- Send on all open modems, to the target and to repeaters
|
||||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||||
if isOpen( sModem ) then
|
if isOpen( sModem ) then
|
||||||
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage );
|
peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage )
|
||||||
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage );
|
peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage )
|
||||||
sent = true
|
sent = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -17,7 +17,7 @@ local copy
|
|||||||
function copy( value )
|
function copy( value )
|
||||||
if type(value) == "table" then
|
if type(value) == "table" then
|
||||||
local result = {}
|
local result = {}
|
||||||
for k,v in pairs(value) do
|
for k, v in pairs(value) do
|
||||||
result[k] = copy(v)
|
result[k] = copy(v)
|
||||||
end
|
end
|
||||||
return result
|
return result
|
||||||
@ -47,7 +47,7 @@ end
|
|||||||
|
|
||||||
function getNames()
|
function getNames()
|
||||||
local result = {}
|
local result = {}
|
||||||
for k,v in pairs( tSettings ) do
|
for k in pairs( tSettings ) do
|
||||||
result[ #result + 1 ] = k
|
result[ #result + 1 ] = k
|
||||||
end
|
end
|
||||||
table.sort(result)
|
table.sort(result)
|
||||||
@ -69,7 +69,7 @@ function load( sPath )
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
for k,v in pairs(tFile) do
|
for k, v in pairs(tFile) do
|
||||||
if type(k) == "string" and
|
if type(k) == "string" and
|
||||||
(type(v) == "string" or type(v) == "number" or type(v) == "boolean" or type(v) == "table") then
|
(type(v) == "string" or type(v) == "number" or type(v) == "boolean" or type(v) == "table") then
|
||||||
set( k, v )
|
set( k, v )
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
||||||
|
|
||||||
local native = (term.native and term.native()) or term
|
local native = term.native and term.native() or term
|
||||||
local redirectTarget = native
|
local redirectTarget = native
|
||||||
|
|
||||||
local function wrap( _sFunction )
|
local function wrap( _sFunction )
|
||||||
@ -16,11 +16,11 @@ term.redirect = function( target )
|
|||||||
if target == term or target == _G.term then
|
if target == term or target == _G.term then
|
||||||
error( "term is not a recommended redirect target, try term.current() instead", 2 )
|
error( "term is not a recommended redirect target, try term.current() instead", 2 )
|
||||||
end
|
end
|
||||||
for k,v in pairs( native ) do
|
for k, v in pairs( native ) do
|
||||||
if type( k ) == "string" and type( v ) == "function" then
|
if type( k ) == "string" and type( v ) == "function" then
|
||||||
if type( target[k] ) ~= "function" then
|
if type( target[k] ) ~= "function" then
|
||||||
target[k] = function()
|
target[k] = function()
|
||||||
error( "Redirect object is missing method "..k..".", 2 )
|
error( "Redirect object is missing method " .. k .. ".", 2 )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -48,13 +48,13 @@ for _, method in ipairs { "nativePaletteColor", "nativePaletteColour"} do
|
|||||||
native[method] = nil
|
native[method] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
for k,v in pairs( native ) do
|
for k, v in pairs( native ) do
|
||||||
if type( k ) == "string" and type( v ) == "function" and term[k] == nil then
|
if type( k ) == "string" and type( v ) == "function" and term[k] == nil then
|
||||||
term[k] = wrap( k )
|
term[k] = wrap( k )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local env = _ENV
|
local env = _ENV
|
||||||
for k,v in pairs( term ) do
|
for k, v in pairs( term ) do
|
||||||
env[k] = v
|
env[k] = v
|
||||||
end
|
end
|
||||||
|
@ -9,14 +9,14 @@ function slowWrite( sText, nRate )
|
|||||||
local nSleep = 1 / nRate
|
local nSleep = 1 / nRate
|
||||||
|
|
||||||
sText = tostring( sText )
|
sText = tostring( sText )
|
||||||
local x,y = term.getCursorPos()
|
local x, y = term.getCursorPos()
|
||||||
local len = string.len( sText )
|
local len = #sText
|
||||||
|
|
||||||
for n=1,len do
|
for n = 1, len do
|
||||||
term.setCursorPos( x, y )
|
term.setCursorPos( x, y )
|
||||||
sleep( nSleep )
|
sleep( nSleep )
|
||||||
local nLines = write( string.sub( sText, 1, n ) )
|
local nLines = write( string.sub( sText, 1, n ) )
|
||||||
local newX, newY = term.getCursorPos()
|
local _, newY = term.getCursorPos()
|
||||||
y = newY - nLines
|
y = newY - nLines
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -42,7 +42,7 @@ function formatTime( nTime, bTwentyFourHour )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local nHour = math.floor(nTime)
|
local nHour = math.floor(nTime)
|
||||||
local nMinute = math.floor((nTime - nHour)*60)
|
local nMinute = math.floor((nTime - nHour) * 60)
|
||||||
if sTOD then
|
if sTOD then
|
||||||
return string.format( "%d:%02d %s", nHour, nMinute, sTOD )
|
return string.format( "%d:%02d %s", nHour, nMinute, sTOD )
|
||||||
else
|
else
|
||||||
@ -54,11 +54,11 @@ local function makePagedScroll( _term, _nFreeLines )
|
|||||||
local nativeScroll = _term.scroll
|
local nativeScroll = _term.scroll
|
||||||
local nFreeLines = _nFreeLines or 0
|
local nFreeLines = _nFreeLines or 0
|
||||||
return function( _n )
|
return function( _n )
|
||||||
for n=1,_n do
|
for _ = 1, _n do
|
||||||
nativeScroll( 1 )
|
nativeScroll( 1 )
|
||||||
|
|
||||||
if nFreeLines <= 0 then
|
if nFreeLines <= 0 then
|
||||||
local w,h = _term.getSize()
|
local _, h = _term.getSize()
|
||||||
_term.setCursorPos( 1, h )
|
_term.setCursorPos( 1, h )
|
||||||
_term.write( "Press any key to continue" )
|
_term.write( "Press any key to continue" )
|
||||||
os.pullEvent( "key" )
|
os.pullEvent( "key" )
|
||||||
@ -76,7 +76,7 @@ function pagedPrint( _sText, _nFreeLines )
|
|||||||
-- Setup a redirector
|
-- Setup a redirector
|
||||||
local oldTerm = term.current()
|
local oldTerm = term.current()
|
||||||
local newTerm = {}
|
local newTerm = {}
|
||||||
for k,v in pairs( oldTerm ) do
|
for k, v in pairs( oldTerm ) do
|
||||||
newTerm[k] = v
|
newTerm[k] = v
|
||||||
end
|
end
|
||||||
newTerm.scroll = makePagedScroll( oldTerm, _nFreeLines )
|
newTerm.scroll = makePagedScroll( oldTerm, _nFreeLines )
|
||||||
@ -108,22 +108,22 @@ local function tabulateCommon( bPaged, ... )
|
|||||||
expect(i, tAll[i], "number", "table")
|
expect(i, tAll[i], "number", "table")
|
||||||
end
|
end
|
||||||
|
|
||||||
local w,h = term.getSize()
|
local w, h = term.getSize()
|
||||||
local nMaxLen = w / 8
|
local nMaxLen = w / 8
|
||||||
for n, t in ipairs( tAll ) do
|
for n, t in ipairs( tAll ) do
|
||||||
if type(t) == "table" then
|
if type(t) == "table" then
|
||||||
for nu, sItem in pairs(t) do
|
for nu, sItem in pairs(t) do
|
||||||
if type( sItem ) ~= "string" then
|
if type( sItem ) ~= "string" then
|
||||||
error( "bad argument #"..n.."."..nu.." (expected string, got " .. type( sItem ) .. ")", 3 )
|
error( "bad argument #" .. n .. "." .. nu .. " (expected string, got " .. type( sItem ) .. ")", 3 )
|
||||||
end
|
end
|
||||||
nMaxLen = math.max( string.len( sItem ) + 1, nMaxLen )
|
nMaxLen = math.max( #sItem + 1, nMaxLen )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local nCols = math.floor( w / nMaxLen )
|
local nCols = math.floor( w / nMaxLen )
|
||||||
local nLines = 0
|
local nLines = 0
|
||||||
local function newLine()
|
local function newLine()
|
||||||
if bPaged and nLines >= (h-3) then
|
if bPaged and nLines >= h - 3 then
|
||||||
pagedPrint()
|
pagedPrint()
|
||||||
else
|
else
|
||||||
print()
|
print()
|
||||||
@ -133,14 +133,14 @@ local function tabulateCommon( bPaged, ... )
|
|||||||
|
|
||||||
local function drawCols( _t )
|
local function drawCols( _t )
|
||||||
local nCol = 1
|
local nCol = 1
|
||||||
for n, s in ipairs( _t ) do
|
for _, s in ipairs( _t ) do
|
||||||
if nCol > nCols then
|
if nCol > nCols then
|
||||||
nCol = 1
|
nCol = 1
|
||||||
newLine()
|
newLine()
|
||||||
end
|
end
|
||||||
|
|
||||||
local cx, cy = term.getCursorPos()
|
local cx, cy = term.getCursorPos()
|
||||||
cx = 1 + ((nCol - 1) * nMaxLen)
|
cx = 1 + (nCol - 1) * nMaxLen
|
||||||
term.setCursorPos( cx, cy )
|
term.setCursorPos( cx, cy )
|
||||||
term.write( s )
|
term.write( s )
|
||||||
|
|
||||||
@ -148,7 +148,7 @@ local function tabulateCommon( bPaged, ... )
|
|||||||
end
|
end
|
||||||
print()
|
print()
|
||||||
end
|
end
|
||||||
for n, t in ipairs( tAll ) do
|
for _, t in ipairs( tAll ) do
|
||||||
if type(t) == "table" then
|
if type(t) == "table" then
|
||||||
if #t > 0 then
|
if #t > 0 then
|
||||||
drawCols( t )
|
drawCols( t )
|
||||||
@ -207,11 +207,11 @@ local function serializeImpl( t, tTracking, sIndent )
|
|||||||
local sResult = "{\n"
|
local sResult = "{\n"
|
||||||
local sSubIndent = sIndent .. " "
|
local sSubIndent = sIndent .. " "
|
||||||
local tSeen = {}
|
local tSeen = {}
|
||||||
for k,v in ipairs(t) do
|
for k, v in ipairs(t) do
|
||||||
tSeen[k] = true
|
tSeen[k] = true
|
||||||
sResult = sResult .. sSubIndent .. serializeImpl( v, tTracking, sSubIndent ) .. ",\n"
|
sResult = sResult .. sSubIndent .. serializeImpl( v, tTracking, sSubIndent ) .. ",\n"
|
||||||
end
|
end
|
||||||
for k,v in pairs(t) do
|
for k, v in pairs(t) do
|
||||||
if not tSeen[k] then
|
if not tSeen[k] then
|
||||||
local sEntry
|
local sEntry
|
||||||
if type(k) == "string" and not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then
|
if type(k) == "string" and not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then
|
||||||
@ -233,7 +233,7 @@ local function serializeImpl( t, tTracking, sIndent )
|
|||||||
return tostring(t)
|
return tostring(t)
|
||||||
|
|
||||||
else
|
else
|
||||||
error( "Cannot serialize type "..sType, 0 )
|
error( "Cannot serialize type " .. sType, 0 )
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -241,7 +241,7 @@ end
|
|||||||
empty_json_array = setmetatable({}, {
|
empty_json_array = setmetatable({}, {
|
||||||
__newindex = function()
|
__newindex = function()
|
||||||
error("attempt to mutate textutils.empty_json_array", 2)
|
error("attempt to mutate textutils.empty_json_array", 2)
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
||||||
@ -264,7 +264,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
|||||||
local sArrayResult = "["
|
local sArrayResult = "["
|
||||||
local nObjectSize = 0
|
local nObjectSize = 0
|
||||||
local nArraySize = 0
|
local nArraySize = 0
|
||||||
for k,v in pairs(t) do
|
for k, v in pairs(t) do
|
||||||
if type(k) == "string" then
|
if type(k) == "string" then
|
||||||
local sEntry
|
local sEntry
|
||||||
if bNBTStyle then
|
if bNBTStyle then
|
||||||
@ -280,7 +280,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
|||||||
nObjectSize = nObjectSize + 1
|
nObjectSize = nObjectSize + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for n,v in ipairs(t) do
|
for _, v in ipairs(t) do
|
||||||
local sEntry = serializeJSONImpl( v, tTracking, bNBTStyle )
|
local sEntry = serializeJSONImpl( v, tTracking, bNBTStyle )
|
||||||
if nArraySize == 0 then
|
if nArraySize == 0 then
|
||||||
sArrayResult = sArrayResult .. sEntry
|
sArrayResult = sArrayResult .. sEntry
|
||||||
@ -305,7 +305,7 @@ local function serializeJSONImpl( t, tTracking, bNBTStyle )
|
|||||||
return tostring(t)
|
return tostring(t)
|
||||||
|
|
||||||
else
|
else
|
||||||
error( "Cannot serialize type "..sType, 0 )
|
error( "Cannot serialize type " .. sType, 0 )
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -317,7 +317,7 @@ end
|
|||||||
|
|
||||||
function unserialize( s )
|
function unserialize( s )
|
||||||
expect(1, s, "string")
|
expect(1, s, "string")
|
||||||
local func = load( "return "..s, "unserialize", "t", {} )
|
local func = load( "return " .. s, "unserialize", "t", {} )
|
||||||
if func then
|
if func then
|
||||||
local ok, result = pcall( func )
|
local ok, result = pcall( func )
|
||||||
if ok then
|
if ok then
|
||||||
@ -346,7 +346,7 @@ function urlEncode( str )
|
|||||||
else
|
else
|
||||||
-- Non-ASCII (encode as UTF-8)
|
-- Non-ASCII (encode as UTF-8)
|
||||||
return
|
return
|
||||||
string.format("%%%02X", 192 + bit32.band( bit32.arshift(n,6), 31 ) ) ..
|
string.format("%%%02X", 192 + bit32.band( bit32.arshift(n, 6), 31 ) ) ..
|
||||||
string.format("%%%02X", 128 + bit32.band( n, 63 ) )
|
string.format("%%%02X", 128 + bit32.band( n, 63 ) )
|
||||||
end
|
end
|
||||||
end )
|
end )
|
||||||
@ -388,12 +388,12 @@ function complete( sSearchText, tSearchTable )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local sPart = string.sub( sSearchText, nStart )
|
local sPart = string.sub( sSearchText, nStart )
|
||||||
local nPartLength = string.len( sPart )
|
local nPartLength = #sPart
|
||||||
|
|
||||||
local tResults = {}
|
local tResults = {}
|
||||||
local tSeen = {}
|
local tSeen = {}
|
||||||
while tTable do
|
while tTable do
|
||||||
for k,v in pairs( tTable ) do
|
for k, v in pairs( tTable ) do
|
||||||
if not tSeen[k] and type(k) == "string" then
|
if not tSeen[k] and type(k) == "string" then
|
||||||
if string.find( k, sPart, 1, true ) == 1 then
|
if string.find( k, sPart, 1, true ) == 1 then
|
||||||
if not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then
|
if not g_tLuaKeywords[k] and string.match( k, "^[%a_][%a%d_]*$" ) then
|
||||||
|
@ -20,7 +20,7 @@ end
|
|||||||
|
|
||||||
-- Put commands into environment table
|
-- Put commands into environment table
|
||||||
local env = _ENV
|
local env = _ENV
|
||||||
for k,v in pairs( native ) do
|
for k, v in pairs( native ) do
|
||||||
if k == "equipLeft" or k == "equipRight" then
|
if k == "equipLeft" or k == "equipRight" then
|
||||||
env[k] = function( ... )
|
env[k] = function( ... )
|
||||||
local result, err = v( ... )
|
local result, err = v( ... )
|
||||||
|
@ -36,17 +36,17 @@ local vector = {
|
|||||||
)
|
)
|
||||||
end,
|
end,
|
||||||
dot = function( self, o )
|
dot = function( self, o )
|
||||||
return self.x*o.x + self.y*o.y + self.z*o.z
|
return self.x * o.x + self.y * o.y + self.z * o.z
|
||||||
end,
|
end,
|
||||||
cross = function( self, o )
|
cross = function( self, o )
|
||||||
return vector.new(
|
return vector.new(
|
||||||
self.y*o.z - self.z*o.y,
|
self.y * o.z - self.z * o.y,
|
||||||
self.z*o.x - self.x*o.z,
|
self.z * o.x - self.x * o.z,
|
||||||
self.x*o.y - self.y*o.x
|
self.x * o.y - self.y * o.x
|
||||||
)
|
)
|
||||||
end,
|
end,
|
||||||
length = function( self )
|
length = function( self )
|
||||||
return math.sqrt( self.x*self.x + self.y*self.y + self.z*self.z )
|
return math.sqrt( self.x * self.x + self.y * self.y + self.z * self.z )
|
||||||
end,
|
end,
|
||||||
normalize = function( self )
|
normalize = function( self )
|
||||||
return self:mul( 1 / self:length() )
|
return self:mul( 1 / self:length() )
|
||||||
@ -54,13 +54,13 @@ local vector = {
|
|||||||
round = function( self, nTolerance )
|
round = function( self, nTolerance )
|
||||||
nTolerance = nTolerance or 1.0
|
nTolerance = nTolerance or 1.0
|
||||||
return vector.new(
|
return vector.new(
|
||||||
math.floor( (self.x + (nTolerance * 0.5)) / nTolerance ) * nTolerance,
|
math.floor( (self.x + nTolerance * 0.5) / nTolerance ) * nTolerance,
|
||||||
math.floor( (self.y + (nTolerance * 0.5)) / nTolerance ) * nTolerance,
|
math.floor( (self.y + nTolerance * 0.5) / nTolerance ) * nTolerance,
|
||||||
math.floor( (self.z + (nTolerance * 0.5)) / nTolerance ) * nTolerance
|
math.floor( (self.z + nTolerance * 0.5) / nTolerance ) * nTolerance
|
||||||
)
|
)
|
||||||
end,
|
end,
|
||||||
tostring = function( self )
|
tostring = function( self )
|
||||||
return self.x..","..self.y..","..self.z
|
return self.x .. "," .. self.y .. "," .. self.z
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ function new( x, y, z )
|
|||||||
local v = {
|
local v = {
|
||||||
x = tonumber(x) or 0,
|
x = tonumber(x) or 0,
|
||||||
y = tonumber(y) or 0,
|
y = tonumber(y) or 0,
|
||||||
z = tonumber(z) or 0
|
z = tonumber(z) or 0,
|
||||||
}
|
}
|
||||||
setmetatable( v, vmetatable )
|
setmetatable( v, vmetatable )
|
||||||
return v
|
return v
|
||||||
|
@ -39,8 +39,8 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
local tEmptyColorLines = {}
|
local tEmptyColorLines = {}
|
||||||
local function createEmptyLines( nWidth )
|
local function createEmptyLines( nWidth )
|
||||||
sEmptySpaceLine = string_rep( " ", nWidth )
|
sEmptySpaceLine = string_rep( " ", nWidth )
|
||||||
for n=0,15 do
|
for n = 0, 15 do
|
||||||
local nColor = 2^n
|
local nColor = 2 ^ n
|
||||||
local sHex = tHex[nColor]
|
local sHex = tHex[nColor]
|
||||||
tEmptyColorLines[nColor] = string_rep( sHex, nWidth )
|
tEmptyColorLines[nColor] = string_rep( sHex, nWidth )
|
||||||
end
|
end
|
||||||
@ -49,7 +49,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
createEmptyLines( nWidth )
|
createEmptyLines( nWidth )
|
||||||
|
|
||||||
-- Setup
|
-- Setup
|
||||||
local bVisible = (bStartVisible ~= false)
|
local bVisible = bStartVisible ~= false
|
||||||
local nCursorX = 1
|
local nCursorX = 1
|
||||||
local nCursorY = 1
|
local nCursorY = 1
|
||||||
local bCursorBlink = false
|
local bCursorBlink = false
|
||||||
@ -61,7 +61,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
local sEmptyText = sEmptySpaceLine
|
local sEmptyText = sEmptySpaceLine
|
||||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||||
for y=1,nHeight do
|
for y = 1, nHeight do
|
||||||
tLines[y] = {
|
tLines[y] = {
|
||||||
text = sEmptyText,
|
text = sEmptyText,
|
||||||
textColor = sEmptyTextColor,
|
textColor = sEmptyTextColor,
|
||||||
@ -69,7 +69,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
for i=0,15 do
|
for i = 0, 15 do
|
||||||
local c = 2 ^ i
|
local c = 2 ^ i
|
||||||
tPalette[c] = { parent.getPaletteColour( c ) }
|
tPalette[c] = { parent.getPaletteColour( c ) }
|
||||||
end
|
end
|
||||||
@ -100,13 +100,13 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function redraw()
|
local function redraw()
|
||||||
for n=1,nHeight do
|
for n = 1, nHeight do
|
||||||
redrawLine( n )
|
redrawLine( n )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function updatePalette()
|
local function updatePalette()
|
||||||
for k,v in pairs( tPalette ) do
|
for k, v in pairs( tPalette ) do
|
||||||
parent.setPaletteColour( k, v[1], v[2], v[3] )
|
parent.setPaletteColour( k, v[1], v[2], v[3] )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -204,7 +204,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
local sEmptyText = sEmptySpaceLine
|
local sEmptyText = sEmptySpaceLine
|
||||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||||
for y=1,nHeight do
|
for y = 1, nHeight do
|
||||||
tLines[y] = {
|
tLines[y] = {
|
||||||
text = sEmptyText,
|
text = sEmptyText,
|
||||||
textColor = sEmptyTextColor,
|
textColor = sEmptyTextColor,
|
||||||
@ -351,7 +351,7 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
local sEmptyText = sEmptySpaceLine
|
local sEmptyText = sEmptySpaceLine
|
||||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||||
for newY=1,nHeight do
|
for newY = 1, nHeight do
|
||||||
local y = newY + n
|
local y = newY + n
|
||||||
if y >= 1 and y <= nHeight then
|
if y >= 1 and y <= nHeight then
|
||||||
tNewLines[newY] = tLines[y]
|
tNewLines[newY] = tLines[y]
|
||||||
@ -451,12 +451,12 @@ function create( parent, nX, nY, nWidth, nHeight, bStartVisible )
|
|||||||
local sEmptyText = sEmptySpaceLine
|
local sEmptyText = sEmptySpaceLine
|
||||||
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
local sEmptyTextColor = tEmptyColorLines[ nTextColor ]
|
||||||
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
local sEmptyBackgroundColor = tEmptyColorLines[ nBackgroundColor ]
|
||||||
for y=1,nNewHeight do
|
for y = 1, nNewHeight do
|
||||||
if y > nHeight then
|
if y > nHeight then
|
||||||
tNewLines[y] = {
|
tNewLines[y] = {
|
||||||
text = sEmptyText,
|
text = sEmptyText,
|
||||||
textColor = sEmptyTextColor,
|
textColor = sEmptyTextColor,
|
||||||
backgroundColor = sEmptyBackgroundColor
|
backgroundColor = sEmptyBackgroundColor,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
local tOldLine = tLines[y]
|
local tOldLine = tLines[y]
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
# New features in CC: Tweaked 1.86.0
|
||||||
|
|
||||||
|
* Add PATCH and TRACE HTTP methods. (jaredallard)
|
||||||
|
* Add more MOTD messages. (JakobDev)
|
||||||
|
* Allow removing and adding turtle upgrades via CraftTweaker.
|
||||||
|
|
||||||
|
And several bug fixes:
|
||||||
|
* Fix crash when interacting with Wearable Backpacks.
|
||||||
|
|
||||||
# New features in CC: Tweaked 1.85.2
|
# New features in CC: Tweaked 1.85.2
|
||||||
|
|
||||||
* Fix crashes when using the mouse with advanced computers.
|
* Fix crashes when using the mouse with advanced computers.
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
New features in CC: Tweaked 1.85.2
|
New features in CC: Tweaked 1.86.0
|
||||||
|
|
||||||
* Fix crashes when using the mouse with advanced computers.
|
* Add PATCH and TRACE HTTP methods. (jaredallard)
|
||||||
|
* Add more MOTD messages. (JakobDev)
|
||||||
|
* Allow removing and adding turtle upgrades via CraftTweaker.
|
||||||
|
|
||||||
|
And several bug fixes:
|
||||||
|
* Fix crash when interacting with Wearable Backpacks.
|
||||||
|
|
||||||
Type "help changelog" to see the full version history.
|
Type "help changelog" to see the full version history.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
View the source code at https://github.com/SquidDev-CC/CC-Tweaked
|
View the source code at https://github.com/SquidDev-CC/CC-Tweaked
|
||||||
View the documentation at https://wiki.computercraft.cc
|
View the documentation at https://wiki.computercraft.cc
|
||||||
Visit the forum at https://forums.computercraft.cc
|
Visit the forum at https://forums.computercraft.cc
|
||||||
You can disable these messages by running "set motd.enable false"
|
You can disable these messages by running "set motd.enable false".
|
||||||
You can create directories with "mkdir".
|
You can create directories with "mkdir".
|
||||||
Want to see hidden files? Run "set list.show_hidden true".
|
Want to see hidden files? Run "set list.show_hidden true".
|
||||||
Run "list" or "ls" to see all files in a directory.
|
Run "list" or "ls" to see all files in a directory.
|
||||||
@ -13,3 +13,22 @@ Use the "edit" program to create and edit your programs.
|
|||||||
You can copy files with "copy" or "cp".
|
You can copy files with "copy" or "cp".
|
||||||
You can use "wget run <url>" to run a program from the internet.
|
You can use "wget run <url>" to run a program from the internet.
|
||||||
You can use "wget" to download a file from the internet.
|
You can use "wget" to download a file from the internet.
|
||||||
|
On an advanced computer you can use "fg" or "bg" to run multiple programs at the same time.
|
||||||
|
Use "type" to see if a path is a file or a directory.
|
||||||
|
Get a list of all programs with "programs".
|
||||||
|
Use an advanced computer to use colours and the mouse.
|
||||||
|
With a speaker you can play sounds.
|
||||||
|
Use "motd" to print the Message of the Day.
|
||||||
|
You can disable the startup from a computer with "set shell.allow_startup false".
|
||||||
|
You can disable the startup from a disk with "set shell.allow_disk_startup false".
|
||||||
|
Programs that are placed in the "startup" folder in the root of a computer are started on boot.
|
||||||
|
Use a modem to connect with other computers.
|
||||||
|
With the "gps" program you can get the position of a computer.
|
||||||
|
Use "monitor" to run a program on a attached monitor.
|
||||||
|
View all attached peripherals with "peripherals".
|
||||||
|
Use "time" to see the in-game time.
|
||||||
|
You can set the label of a computer with "label set".
|
||||||
|
A computer needs a label to keep its files if it got destroyed.
|
||||||
|
You can disable auto completion in the shell with "set shell.autocomplete false".
|
||||||
|
You can disable auto completion in edit with "set edit.autocomplete false".
|
||||||
|
Feeling creative? Use a printer to print a book!
|
||||||
|
@ -2,7 +2,7 @@ local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
|||||||
|
|
||||||
-- Setup process switching
|
-- Setup process switching
|
||||||
local parentTerm = term.current()
|
local parentTerm = term.current()
|
||||||
local w,h = parentTerm.getSize()
|
local w, h = parentTerm.getSize()
|
||||||
|
|
||||||
local tProcesses = {}
|
local tProcesses = {}
|
||||||
local nCurrentProcess = nil
|
local nCurrentProcess = nil
|
||||||
@ -55,7 +55,7 @@ local function launchProcess( bFocus, tProgramEnv, sProgramPath, ... )
|
|||||||
local tProcess = {}
|
local tProcess = {}
|
||||||
tProcess.sTitle = fs.getName( sProgramPath )
|
tProcess.sTitle = fs.getName( sProgramPath )
|
||||||
if bShowMenu then
|
if bShowMenu then
|
||||||
tProcess.window = window.create( parentTerm, 1, 2, w, h-1, false )
|
tProcess.window = window.create( parentTerm, 1, 2, w, h - 1, false )
|
||||||
else
|
else
|
||||||
tProcess.window = window.create( parentTerm, 1, 1, w, h, false )
|
tProcess.window = window.create( parentTerm, 1, 1, w, h, false )
|
||||||
end
|
end
|
||||||
@ -102,7 +102,7 @@ end
|
|||||||
|
|
||||||
local function cullProcesses()
|
local function cullProcesses()
|
||||||
local culled = false
|
local culled = false
|
||||||
for n=#tProcesses,1,-1 do
|
for n = #tProcesses, 1, -1 do
|
||||||
culled = culled or cullProcess( n )
|
culled = culled or cullProcess( n )
|
||||||
end
|
end
|
||||||
return culled
|
return culled
|
||||||
@ -132,7 +132,7 @@ local function redrawMenu()
|
|||||||
parentTerm.write( "<" )
|
parentTerm.write( "<" )
|
||||||
nCharCount = 1
|
nCharCount = 1
|
||||||
end
|
end
|
||||||
for n=nScrollPos,#tProcesses do
|
for n = nScrollPos, #tProcesses do
|
||||||
if n == nCurrentProcess then
|
if n == nCurrentProcess then
|
||||||
parentTerm.setTextColor( menuMainTextColor )
|
parentTerm.setTextColor( menuMainTextColor )
|
||||||
parentTerm.setBackgroundColor( menuMainBgColor )
|
parentTerm.setBackgroundColor( menuMainBgColor )
|
||||||
@ -165,15 +165,14 @@ local function resizeWindows()
|
|||||||
local windowY, windowHeight
|
local windowY, windowHeight
|
||||||
if bShowMenu then
|
if bShowMenu then
|
||||||
windowY = 2
|
windowY = 2
|
||||||
windowHeight = h-1
|
windowHeight = h - 1
|
||||||
else
|
else
|
||||||
windowY = 1
|
windowY = 1
|
||||||
windowHeight = h
|
windowHeight = h
|
||||||
end
|
end
|
||||||
for n=1,#tProcesses do
|
for n = 1, #tProcesses do
|
||||||
local tProcess = tProcesses[n]
|
local tProcess = tProcesses[n]
|
||||||
local window = tProcess.window
|
local x, y = tProcess.window.getCursorPos()
|
||||||
local x,y = tProcess.window.getCursorPos()
|
|
||||||
if y > windowHeight then
|
if y > windowHeight then
|
||||||
tProcess.window.scroll( y - windowHeight )
|
tProcess.window.scroll( y - windowHeight )
|
||||||
tProcess.window.setCursorPos( x, windowHeight )
|
tProcess.window.setCursorPos( x, windowHeight )
|
||||||
@ -232,7 +231,7 @@ function multishell.launch( tProgramEnv, sProgramPath, ... )
|
|||||||
expect(1, tProgramEnv, "table")
|
expect(1, tProgramEnv, "table")
|
||||||
expect(2, sProgramPath, "string")
|
expect(2, sProgramPath, "string")
|
||||||
local previousTerm = term.current()
|
local previousTerm = term.current()
|
||||||
setMenuVisible( (#tProcesses + 1) >= 2 )
|
setMenuVisible( #tProcesses + 1 >= 2 )
|
||||||
local nResult = launchProcess( false, tProgramEnv, sProgramPath, ... )
|
local nResult = launchProcess( false, tProgramEnv, sProgramPath, ... )
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
term.redirect( previousTerm )
|
term.redirect( previousTerm )
|
||||||
@ -258,7 +257,7 @@ while #tProcesses > 0 do
|
|||||||
local sEvent = tEventData[1]
|
local sEvent = tEventData[1]
|
||||||
if sEvent == "term_resize" then
|
if sEvent == "term_resize" then
|
||||||
-- Resize event
|
-- Resize event
|
||||||
w,h = parentTerm.getSize()
|
w, h = parentTerm.getSize()
|
||||||
resizeWindows()
|
resizeWindows()
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
|
|
||||||
@ -287,8 +286,8 @@ while #tProcesses > 0 do
|
|||||||
if nScrollPos ~= 1 then
|
if nScrollPos ~= 1 then
|
||||||
tabStart = 2
|
tabStart = 2
|
||||||
end
|
end
|
||||||
for n=nScrollPos,#tProcesses do
|
for n = nScrollPos, #tProcesses do
|
||||||
local tabEnd = tabStart + string.len( tProcesses[n].sTitle ) + 1
|
local tabEnd = tabStart + #tProcesses[n].sTitle + 1
|
||||||
if x >= tabStart and x <= tabEnd then
|
if x >= tabStart and x <= tabEnd then
|
||||||
selectProcess( n )
|
selectProcess( n )
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
@ -299,7 +298,7 @@ while #tProcesses > 0 do
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Passthrough to current process
|
-- Passthrough to current process
|
||||||
resumeProcess( nCurrentProcess, sEvent, button, x, (bShowMenu and y-1) or y )
|
resumeProcess( nCurrentProcess, sEvent, button, x, bShowMenu and y - 1 or y )
|
||||||
if cullProcess( nCurrentProcess ) then
|
if cullProcess( nCurrentProcess ) then
|
||||||
setMenuVisible( #tProcesses >= 2 )
|
setMenuVisible( #tProcesses >= 2 )
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
@ -319,7 +318,7 @@ while #tProcesses > 0 do
|
|||||||
end
|
end
|
||||||
elseif not (bShowMenu and y == 1) then
|
elseif not (bShowMenu and y == 1) then
|
||||||
-- Passthrough to current process
|
-- Passthrough to current process
|
||||||
resumeProcess( nCurrentProcess, sEvent, p1, x, (bShowMenu and y-1) or y )
|
resumeProcess( nCurrentProcess, sEvent, p1, x, bShowMenu and y - 1 or y )
|
||||||
if cullProcess( nCurrentProcess ) then
|
if cullProcess( nCurrentProcess ) then
|
||||||
setMenuVisible( #tProcesses >= 2 )
|
setMenuVisible( #tProcesses >= 2 )
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
@ -330,7 +329,7 @@ while #tProcesses > 0 do
|
|||||||
-- Other event
|
-- Other event
|
||||||
-- Passthrough to all processes
|
-- Passthrough to all processes
|
||||||
local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event
|
local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event
|
||||||
for n=1,nLimit do
|
for n = 1, nLimit do
|
||||||
resumeProcess( n, table.unpack( tEventData, 1, tEventData.n ) )
|
resumeProcess( n, table.unpack( tEventData, 1, tEventData.n ) )
|
||||||
end
|
end
|
||||||
if cullProcesses() then
|
if cullProcesses() then
|
||||||
@ -342,7 +341,7 @@ while #tProcesses > 0 do
|
|||||||
if bWindowsResized then
|
if bWindowsResized then
|
||||||
-- Pass term_resize to all processes
|
-- Pass term_resize to all processes
|
||||||
local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event
|
local nLimit = #tProcesses -- Storing this ensures any new things spawned don't get the event
|
||||||
for n=1,nLimit do
|
for n = 1, nLimit do
|
||||||
resumeProcess( n, "term_resize" )
|
resumeProcess( n, "term_resize" )
|
||||||
end
|
end
|
||||||
bWindowsResized = false
|
bWindowsResized = false
|
||||||
|
@ -19,7 +19,7 @@ else
|
|||||||
local tAliases = shell.aliases()
|
local tAliases = shell.aliases()
|
||||||
local tList = {}
|
local tList = {}
|
||||||
for sAlias, sCommand in pairs( tAliases ) do
|
for sAlias, sCommand in pairs( tAliases ) do
|
||||||
table.insert( tList, sAlias..":"..sCommand )
|
table.insert( tList, sAlias .. ":" .. sCommand )
|
||||||
end
|
end
|
||||||
table.sort( tList )
|
table.sort( tList )
|
||||||
textutils.pagedTabulate( tList )
|
textutils.pagedTabulate( tList )
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
local tApis = {}
|
local tApis = {}
|
||||||
for k,v in pairs( _G ) do
|
for k, v in pairs( _G ) do
|
||||||
if type(k) == "string" and type(v) == "table" and k ~= "_G" then
|
if type(k) == "string" and type(v) == "table" and k ~= "_G" then
|
||||||
table.insert( tApis, k )
|
table.insert( tApis, k )
|
||||||
end
|
end
|
||||||
|
@ -18,7 +18,7 @@ local function printSuccess( text )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local sCommand = string.lower( tArgs[1] )
|
local sCommand = string.lower( tArgs[1] )
|
||||||
for n=2,#tArgs do
|
for n = 2, #tArgs do
|
||||||
sCommand = sCommand .. " " .. tArgs[n]
|
sCommand = sCommand .. " " .. tArgs[n]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -26,14 +26,14 @@ local bResult, tOutput = commands.exec( sCommand )
|
|||||||
if bResult then
|
if bResult then
|
||||||
printSuccess( "Success" )
|
printSuccess( "Success" )
|
||||||
if #tOutput > 0 then
|
if #tOutput > 0 then
|
||||||
for n=1,#tOutput do
|
for n = 1, #tOutput do
|
||||||
print( tOutput[n] )
|
print( tOutput[n] )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
printError( "Failed" )
|
printError( "Failed" )
|
||||||
if #tOutput > 0 then
|
if #tOutput > 0 then
|
||||||
for n=1,#tOutput do
|
for n = 1, #tOutput do
|
||||||
print( tOutput[n] )
|
print( tOutput[n] )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
|
|||||||
local sDest = shell.resolve( tArgs[2] )
|
local sDest = shell.resolve( tArgs[2] )
|
||||||
local tFiles = fs.find( sSource )
|
local tFiles = fs.find( sSource )
|
||||||
if #tFiles > 0 then
|
if #tFiles > 0 then
|
||||||
for n,sFile in ipairs( tFiles ) do
|
for _, sFile in ipairs( tFiles ) do
|
||||||
if fs.isDir( sDest ) then
|
if fs.isDir( sDest ) then
|
||||||
fs.copy( sFile, fs.combine( sDest, fs.getName(sFile) ) )
|
fs.copy( sFile, fs.combine( sDest, fs.getName(sFile) ) )
|
||||||
elseif #tFiles == 1 then
|
elseif #tFiles == 1 then
|
||||||
|
@ -8,7 +8,7 @@ end
|
|||||||
for i = 1, args.n do
|
for i = 1, args.n do
|
||||||
local files = fs.find(shell.resolve(args[i]))
|
local files = fs.find(shell.resolve(args[i]))
|
||||||
if #files > 0 then
|
if #files > 0 then
|
||||||
for n, file in ipairs(files) do
|
for _, file in ipairs(files) do
|
||||||
local ok, err = pcall(fs.delete, file)
|
local ok, err = pcall(fs.delete, file)
|
||||||
if not ok then
|
if not ok then
|
||||||
printError((err:gsub("^pcall: ", "")))
|
printError((err:gsub("^pcall: ", "")))
|
||||||
|
@ -10,9 +10,9 @@ if fs.exists( sPath ) then
|
|||||||
write( fs.getDrive( sPath ) .. " (" )
|
write( fs.getDrive( sPath ) .. " (" )
|
||||||
local nSpace = fs.getFreeSpace( sPath )
|
local nSpace = fs.getFreeSpace( sPath )
|
||||||
if nSpace >= 1000 * 1000 then
|
if nSpace >= 1000 * 1000 then
|
||||||
print( (math.floor( nSpace / (100 * 1000) ) / 10) .. "MB remaining)" )
|
print( math.floor( nSpace / (100 * 1000) ) / 10 .. "MB remaining)" )
|
||||||
elseif nSpace >= 1000 then
|
elseif nSpace >= 1000 then
|
||||||
print( (math.floor( nSpace / 100 ) / 10) .. "KB remaining)" )
|
print( math.floor( nSpace / 100 ) / 10 .. "KB remaining)" )
|
||||||
else
|
else
|
||||||
print( nSpace .. "B remaining)" )
|
print( nSpace .. "B remaining)" )
|
||||||
end
|
end
|
||||||
|
@ -21,9 +21,9 @@ if not fs.exists( sPath ) and not string.find( sPath, "%." ) then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local x,y = 1,1
|
local x, y = 1, 1
|
||||||
local w,h = term.getSize()
|
local w, h = term.getSize()
|
||||||
local scrollX, scrollY = 0,0
|
local scrollX, scrollY = 0, 0
|
||||||
|
|
||||||
local tLines = {}
|
local tLines = {}
|
||||||
local bRunning = true
|
local bRunning = true
|
||||||
@ -62,7 +62,7 @@ end
|
|||||||
table.insert( tMenuItems, "Exit" )
|
table.insert( tMenuItems, "Exit" )
|
||||||
|
|
||||||
local sStatus = "Press Ctrl to access menu"
|
local sStatus = "Press Ctrl to access menu"
|
||||||
if string.len( sStatus ) > w - 5 then
|
if #sStatus > w - 5 then
|
||||||
sStatus = "Press Ctrl for menu"
|
sStatus = "Press Ctrl for menu"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -95,11 +95,11 @@ local function save( _sPath )
|
|||||||
local function innerSave()
|
local function innerSave()
|
||||||
file, fileerr = fs.open( _sPath, "w" )
|
file, fileerr = fs.open( _sPath, "w" )
|
||||||
if file then
|
if file then
|
||||||
for n, sLine in ipairs( tLines ) do
|
for _, sLine in ipairs( tLines ) do
|
||||||
file.write( sLine .. "\n" )
|
file.write( sLine .. "\n" )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
error( "Failed to open ".._sPath )
|
error( "Failed to open " .. _sPath )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ local tKeywords = {
|
|||||||
["return"] = true,
|
["return"] = true,
|
||||||
["then"] = true,
|
["then"] = true,
|
||||||
["true"] = true,
|
["true"] = true,
|
||||||
["until"]= true,
|
["until"] = true,
|
||||||
["while"] = true,
|
["while"] = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,13 +144,13 @@ local function tryWrite( sLine, regex, colour )
|
|||||||
end
|
end
|
||||||
term.write( match )
|
term.write( match )
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
return string.sub( sLine, string.len(match) + 1 )
|
return string.sub( sLine, #match + 1 )
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local function writeHighlighted( sLine )
|
local function writeHighlighted( sLine )
|
||||||
while string.len(sLine) > 0 do
|
while #sLine > 0 do
|
||||||
sLine =
|
sLine =
|
||||||
tryWrite( sLine, "^%-%-%[%[.-%]%]", commentColour ) or
|
tryWrite( sLine, "^%-%-%[%[.-%]%]", commentColour ) or
|
||||||
tryWrite( sLine, "^%-%-.*", commentColour ) or
|
tryWrite( sLine, "^%-%-.*", commentColour ) or
|
||||||
@ -188,7 +188,7 @@ end
|
|||||||
|
|
||||||
local function recomplete()
|
local function recomplete()
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
if not bMenu and not bReadOnly and x == string.len(sLine) + 1 then
|
if not bMenu and not bReadOnly and x == #sLine + 1 then
|
||||||
tCompletions = complete( sLine )
|
tCompletions = complete( sLine )
|
||||||
if tCompletions and #tCompletions > 0 then
|
if tCompletions and #tCompletions > 0 then
|
||||||
nCompletion = 1
|
nCompletion = 1
|
||||||
@ -214,7 +214,7 @@ end
|
|||||||
|
|
||||||
local function redrawText()
|
local function redrawText()
|
||||||
local cursorX, cursorY = x, y
|
local cursorX, cursorY = x, y
|
||||||
for y=1,h-1 do
|
for y = 1, h - 1 do
|
||||||
term.setCursorPos( 1 - scrollX, y )
|
term.setCursorPos( 1 - scrollX, y )
|
||||||
term.clearLine()
|
term.clearLine()
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ local function redrawMenu()
|
|||||||
term.clearLine()
|
term.clearLine()
|
||||||
|
|
||||||
-- Draw line numbers
|
-- Draw line numbers
|
||||||
term.setCursorPos( w - string.len( "Ln "..y ) + 1, h )
|
term.setCursorPos( w - #( "Ln " .. y ) + 1, h )
|
||||||
term.setTextColour( highlightColour )
|
term.setTextColour( highlightColour )
|
||||||
term.write( "Ln " )
|
term.write( "Ln " )
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
@ -258,7 +258,7 @@ local function redrawMenu()
|
|||||||
if bMenu then
|
if bMenu then
|
||||||
-- Draw menu
|
-- Draw menu
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
for nItem,sItem in pairs( tMenuItems ) do
|
for nItem, sItem in pairs( tMenuItems ) do
|
||||||
if nItem == nMenuItem then
|
if nItem == nMenuItem then
|
||||||
term.setTextColour( highlightColour )
|
term.setTextColour( highlightColour )
|
||||||
term.write( "[" )
|
term.write( "[" )
|
||||||
@ -268,7 +268,7 @@ local function redrawMenu()
|
|||||||
term.write( "]" )
|
term.write( "]" )
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
else
|
else
|
||||||
term.write( " "..sItem.." " )
|
term.write( " " .. sItem .. " " )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -287,14 +287,14 @@ local tMenuFuncs = {
|
|||||||
if bReadOnly then
|
if bReadOnly then
|
||||||
sStatus = "Access denied"
|
sStatus = "Access denied"
|
||||||
else
|
else
|
||||||
local ok, err, fileerr = save( sPath )
|
local ok, _, fileerr = save( sPath )
|
||||||
if ok then
|
if ok then
|
||||||
sStatus="Saved to "..sPath
|
sStatus = "Saved to " .. sPath
|
||||||
else
|
else
|
||||||
if fileerr then
|
if fileerr then
|
||||||
sStatus="Error saving to "..fileerr
|
sStatus = "Error saving to " .. fileerr
|
||||||
else
|
else
|
||||||
sStatus="Error saving to "..sPath
|
sStatus = "Error saving to " .. sPath
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -326,7 +326,7 @@ local tMenuFuncs = {
|
|||||||
}
|
}
|
||||||
printerTerminal.scroll = function()
|
printerTerminal.scroll = function()
|
||||||
if nPage == 1 then
|
if nPage == 1 then
|
||||||
printer.setPageTitle( sName.." (page "..nPage..")" )
|
printer.setPageTitle( sName .. " (page " .. nPage .. ")" )
|
||||||
end
|
end
|
||||||
|
|
||||||
while not printer.newPage() do
|
while not printer.newPage() do
|
||||||
@ -349,7 +349,7 @@ local tMenuFuncs = {
|
|||||||
if nPage == 1 then
|
if nPage == 1 then
|
||||||
printer.setPageTitle( sName )
|
printer.setPageTitle( sName )
|
||||||
else
|
else
|
||||||
printer.setPageTitle( sName.." (page "..nPage..")" )
|
printer.setPageTitle( sName .. " (page " .. nPage .. ")" )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -357,7 +357,7 @@ local tMenuFuncs = {
|
|||||||
term.redirect( printerTerminal )
|
term.redirect( printerTerminal )
|
||||||
local ok, error = pcall( function()
|
local ok, error = pcall( function()
|
||||||
term.scroll()
|
term.scroll()
|
||||||
for n, sLine in ipairs( tLines ) do
|
for _, sLine in ipairs( tLines ) do
|
||||||
print( sLine )
|
print( sLine )
|
||||||
end
|
end
|
||||||
end )
|
end )
|
||||||
@ -374,7 +374,7 @@ local tMenuFuncs = {
|
|||||||
bMenu = true
|
bMenu = true
|
||||||
|
|
||||||
if nPage > 1 then
|
if nPage > 1 then
|
||||||
sStatus = "Printed "..nPage.." Pages"
|
sStatus = "Printed " .. nPage .. " Pages"
|
||||||
else
|
else
|
||||||
sStatus = "Printed 1 Page"
|
sStatus = "Printed 1 Page"
|
||||||
end
|
end
|
||||||
@ -385,20 +385,20 @@ local tMenuFuncs = {
|
|||||||
end,
|
end,
|
||||||
Run = function()
|
Run = function()
|
||||||
local sTempPath = "/.temp"
|
local sTempPath = "/.temp"
|
||||||
local ok, err = save( sTempPath )
|
local ok = save( sTempPath )
|
||||||
if ok then
|
if ok then
|
||||||
local nTask = shell.openTab( sTempPath )
|
local nTask = shell.openTab( sTempPath )
|
||||||
if nTask then
|
if nTask then
|
||||||
shell.switchTab( nTask )
|
shell.switchTab( nTask )
|
||||||
else
|
else
|
||||||
sStatus="Error starting Task"
|
sStatus = "Error starting Task"
|
||||||
end
|
end
|
||||||
fs.delete( sTempPath )
|
fs.delete( sTempPath )
|
||||||
else
|
else
|
||||||
sStatus="Error saving to "..sTempPath
|
sStatus = "Error saving to " .. sTempPath
|
||||||
end
|
end
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
local function doMenuItem( _n )
|
local function doMenuItem( _n )
|
||||||
@ -411,7 +411,7 @@ local function doMenuItem( _n )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function setCursor( newX, newY )
|
local function setCursor( newX, newY )
|
||||||
local oldX, oldY = x, y
|
local _, oldY = x, y
|
||||||
x, y = newX, newY
|
x, y = newX, newY
|
||||||
local screenX = x - scrollX
|
local screenX = x - scrollX
|
||||||
local screenY = y - scrollY
|
local screenY = y - scrollY
|
||||||
@ -431,9 +431,9 @@ local function setCursor( newX, newY )
|
|||||||
scrollY = y - 1
|
scrollY = y - 1
|
||||||
screenY = 1
|
screenY = 1
|
||||||
bRedraw = true
|
bRedraw = true
|
||||||
elseif screenY > h-1 then
|
elseif screenY > h - 1 then
|
||||||
scrollY = y - (h-1)
|
scrollY = y - (h - 1)
|
||||||
screenY = h-1
|
screenY = h - 1
|
||||||
bRedraw = true
|
bRedraw = true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -456,7 +456,7 @@ load(sPath)
|
|||||||
|
|
||||||
term.setBackgroundColour( bgColour )
|
term.setBackgroundColour( bgColour )
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
term.setCursorBlink( true )
|
term.setCursorBlink( true )
|
||||||
|
|
||||||
recomplete()
|
recomplete()
|
||||||
@ -468,7 +468,7 @@ local function acceptCompletion()
|
|||||||
-- Append the completion
|
-- Append the completion
|
||||||
local sCompletion = tCompletions[ nCompletion ]
|
local sCompletion = tCompletions[ nCompletion ]
|
||||||
tLines[y] = tLines[y] .. sCompletion
|
tLines[y] = tLines[y] .. sCompletion
|
||||||
setCursor( x + string.len( sCompletion ), y )
|
setCursor( x + #sCompletion , y )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -476,7 +476,6 @@ end
|
|||||||
while bRunning do
|
while bRunning do
|
||||||
local sEvent, param, param2, param3 = os.pullEvent()
|
local sEvent, param, param2, param3 = os.pullEvent()
|
||||||
if sEvent == "key" then
|
if sEvent == "key" then
|
||||||
local oldX, oldY = x, y
|
|
||||||
if param == keys.up then
|
if param == keys.up then
|
||||||
-- Up
|
-- Up
|
||||||
if not bMenu then
|
if not bMenu then
|
||||||
@ -491,7 +490,7 @@ while bRunning do
|
|||||||
elseif y > 1 then
|
elseif y > 1 then
|
||||||
-- Move cursor up
|
-- Move cursor up
|
||||||
setCursor(
|
setCursor(
|
||||||
math.min( x, string.len( tLines[y - 1] ) + 1 ),
|
math.min( x, #tLines[y - 1] + 1 ),
|
||||||
y - 1
|
y - 1
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@ -512,7 +511,7 @@ while bRunning do
|
|||||||
elseif y < #tLines then
|
elseif y < #tLines then
|
||||||
-- Move cursor down
|
-- Move cursor down
|
||||||
setCursor(
|
setCursor(
|
||||||
math.min( x, string.len( tLines[y + 1] ) + 1 ),
|
math.min( x, #tLines[y + 1] + 1 ),
|
||||||
y + 1
|
y + 1
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@ -521,13 +520,13 @@ while bRunning do
|
|||||||
elseif param == keys.tab then
|
elseif param == keys.tab then
|
||||||
-- Tab
|
-- Tab
|
||||||
if not bMenu and not bReadOnly then
|
if not bMenu and not bReadOnly then
|
||||||
if nCompletion and x == string.len(tLines[y]) + 1 then
|
if nCompletion and x == #tLines[y] + 1 then
|
||||||
-- Accept autocomplete
|
-- Accept autocomplete
|
||||||
acceptCompletion()
|
acceptCompletion()
|
||||||
else
|
else
|
||||||
-- Indent line
|
-- Indent line
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
tLines[y] = string.sub(sLine,1,x-1) .. " " .. string.sub(sLine,x)
|
tLines[y] = string.sub(sLine, 1, x - 1) .. " " .. string.sub(sLine, x)
|
||||||
setCursor( x + 4, y )
|
setCursor( x + 4, y )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -543,7 +542,7 @@ while bRunning do
|
|||||||
newY = 1
|
newY = 1
|
||||||
end
|
end
|
||||||
setCursor(
|
setCursor(
|
||||||
math.min( x, string.len( tLines[newY] ) + 1 ),
|
math.min( x, #tLines[newY] + 1 ),
|
||||||
newY
|
newY
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
@ -558,7 +557,7 @@ while bRunning do
|
|||||||
else
|
else
|
||||||
newY = #tLines
|
newY = #tLines
|
||||||
end
|
end
|
||||||
local newX = math.min( x, string.len( tLines[newY] ) + 1 )
|
local newX = math.min( x, #tLines[newY] + 1 )
|
||||||
setCursor( newX, newY )
|
setCursor( newX, newY )
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -567,7 +566,7 @@ while bRunning do
|
|||||||
if not bMenu then
|
if not bMenu then
|
||||||
-- Move cursor to the beginning
|
-- Move cursor to the beginning
|
||||||
if x > 1 then
|
if x > 1 then
|
||||||
setCursor(1,y)
|
setCursor(1, y)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -575,7 +574,7 @@ while bRunning do
|
|||||||
-- End
|
-- End
|
||||||
if not bMenu then
|
if not bMenu then
|
||||||
-- Move cursor to the end
|
-- Move cursor to the end
|
||||||
local nLimit = string.len( tLines[y] ) + 1
|
local nLimit = #tLines[y] + 1
|
||||||
if x < nLimit then
|
if x < nLimit then
|
||||||
setCursor( nLimit, y )
|
setCursor( nLimit, y )
|
||||||
end
|
end
|
||||||
@ -587,8 +586,8 @@ while bRunning do
|
|||||||
if x > 1 then
|
if x > 1 then
|
||||||
-- Move cursor left
|
-- Move cursor left
|
||||||
setCursor( x - 1, y )
|
setCursor( x - 1, y )
|
||||||
elseif x==1 and y>1 then
|
elseif x == 1 and y > 1 then
|
||||||
setCursor( string.len( tLines[y-1] ) + 1, y - 1 )
|
setCursor( #tLines[y - 1] + 1, y - 1 )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Move menu left
|
-- Move menu left
|
||||||
@ -602,14 +601,14 @@ while bRunning do
|
|||||||
elseif param == keys.right then
|
elseif param == keys.right then
|
||||||
-- Right
|
-- Right
|
||||||
if not bMenu then
|
if not bMenu then
|
||||||
local nLimit = string.len( tLines[y] ) + 1
|
local nLimit = #tLines[y] + 1
|
||||||
if x < nLimit then
|
if x < nLimit then
|
||||||
-- Move cursor right
|
-- Move cursor right
|
||||||
setCursor( x + 1, y )
|
setCursor( x + 1, y )
|
||||||
elseif nCompletion and x == string.len(tLines[y]) + 1 then
|
elseif nCompletion and x == #tLines[y] + 1 then
|
||||||
-- Accept autocomplete
|
-- Accept autocomplete
|
||||||
acceptCompletion()
|
acceptCompletion()
|
||||||
elseif x==nLimit and y<#tLines then
|
elseif x == nLimit and y < #tLines then
|
||||||
-- Go to next line
|
-- Go to next line
|
||||||
setCursor( 1, y + 1 )
|
setCursor( 1, y + 1 )
|
||||||
end
|
end
|
||||||
@ -625,15 +624,15 @@ while bRunning do
|
|||||||
elseif param == keys.delete then
|
elseif param == keys.delete then
|
||||||
-- Delete
|
-- Delete
|
||||||
if not bMenu and not bReadOnly then
|
if not bMenu and not bReadOnly then
|
||||||
local nLimit = string.len( tLines[y] ) + 1
|
local nLimit = #tLines[y] + 1
|
||||||
if x < nLimit then
|
if x < nLimit then
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
tLines[y] = string.sub(sLine,1,x-1) .. string.sub(sLine,x+1)
|
tLines[y] = string.sub(sLine, 1, x - 1) .. string.sub(sLine, x + 1)
|
||||||
recomplete()
|
recomplete()
|
||||||
redrawLine(y)
|
redrawLine(y)
|
||||||
elseif y<#tLines then
|
elseif y < #tLines then
|
||||||
tLines[y] = tLines[y] .. tLines[y+1]
|
tLines[y] = tLines[y] .. tLines[y + 1]
|
||||||
table.remove( tLines, y+1 )
|
table.remove( tLines, y + 1 )
|
||||||
recomplete()
|
recomplete()
|
||||||
redrawText()
|
redrawText()
|
||||||
end
|
end
|
||||||
@ -645,17 +644,17 @@ while bRunning do
|
|||||||
if x > 1 then
|
if x > 1 then
|
||||||
-- Remove character
|
-- Remove character
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
if x > 4 and string.sub(sLine,x-4,x-1) == " " and not string.sub(sLine, 1, x - 1):find("%S") then
|
if x > 4 and string.sub(sLine, x - 4, x - 1) == " " and not string.sub(sLine, 1, x - 1):find("%S") then
|
||||||
tLines[y] = string.sub(sLine,1,x-5) .. string.sub(sLine,x)
|
tLines[y] = string.sub(sLine, 1, x - 5) .. string.sub(sLine, x)
|
||||||
setCursor( x - 4, y )
|
setCursor( x - 4, y )
|
||||||
else
|
else
|
||||||
tLines[y] = string.sub(sLine,1,x-2) .. string.sub(sLine,x)
|
tLines[y] = string.sub(sLine, 1, x - 2) .. string.sub(sLine, x)
|
||||||
setCursor( x - 1, y )
|
setCursor( x - 1, y )
|
||||||
end
|
end
|
||||||
elseif y > 1 then
|
elseif y > 1 then
|
||||||
-- Remove newline
|
-- Remove newline
|
||||||
local sPrevLen = string.len( tLines[y-1] )
|
local sPrevLen = #tLines[y - 1]
|
||||||
tLines[y-1] = tLines[y-1] .. tLines[y]
|
tLines[y - 1] = tLines[y - 1] .. tLines[y]
|
||||||
table.remove( tLines, y )
|
table.remove( tLines, y )
|
||||||
setCursor( sPrevLen + 1, y - 1 )
|
setCursor( sPrevLen + 1, y - 1 )
|
||||||
redrawText()
|
redrawText()
|
||||||
@ -667,12 +666,12 @@ while bRunning do
|
|||||||
if not bMenu and not bReadOnly then
|
if not bMenu and not bReadOnly then
|
||||||
-- Newline
|
-- Newline
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
local _,spaces=string.find(sLine,"^[ ]+")
|
local _, spaces = string.find(sLine, "^[ ]+")
|
||||||
if not spaces then
|
if not spaces then
|
||||||
spaces=0
|
spaces = 0
|
||||||
end
|
end
|
||||||
tLines[y] = string.sub(sLine,1,x-1)
|
tLines[y] = string.sub(sLine, 1, x - 1)
|
||||||
table.insert( tLines, y+1, string.rep(' ',spaces)..string.sub(sLine,x) )
|
table.insert( tLines, y + 1, string.rep(' ', spaces) .. string.sub(sLine, x) )
|
||||||
setCursor( spaces + 1, y + 1 )
|
setCursor( spaces + 1, y + 1 )
|
||||||
redrawText()
|
redrawText()
|
||||||
|
|
||||||
@ -698,13 +697,13 @@ while bRunning do
|
|||||||
if not bMenu and not bReadOnly then
|
if not bMenu and not bReadOnly then
|
||||||
-- Input text
|
-- Input text
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
tLines[y] = string.sub(sLine,1,x-1) .. param .. string.sub(sLine,x)
|
tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x)
|
||||||
setCursor( x + 1, y )
|
setCursor( x + 1, y )
|
||||||
|
|
||||||
elseif bMenu then
|
elseif bMenu then
|
||||||
-- Select menu items
|
-- Select menu items
|
||||||
for n,sMenuItem in ipairs( tMenuItems ) do
|
for n, sMenuItem in ipairs( tMenuItems ) do
|
||||||
if string.lower(string.sub(sMenuItem,1,1)) == string.lower(param) then
|
if string.lower(string.sub(sMenuItem, 1, 1)) == string.lower(param) then
|
||||||
doMenuItem( n )
|
doMenuItem( n )
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@ -721,18 +720,18 @@ while bRunning do
|
|||||||
end
|
end
|
||||||
-- Input text
|
-- Input text
|
||||||
local sLine = tLines[y]
|
local sLine = tLines[y]
|
||||||
tLines[y] = string.sub(sLine,1,x-1) .. param .. string.sub(sLine,x)
|
tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x)
|
||||||
setCursor( x + string.len( param ), y )
|
setCursor( x + #param , y )
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif sEvent == "mouse_click" then
|
elseif sEvent == "mouse_click" then
|
||||||
if not bMenu then
|
if not bMenu then
|
||||||
if param == 1 then
|
if param == 1 then
|
||||||
-- Left click
|
-- Left click
|
||||||
local cx,cy = param2, param3
|
local cx, cy = param2, param3
|
||||||
if cy < h then
|
if cy < h then
|
||||||
local newY = math.min( math.max( scrollY + cy, 1 ), #tLines )
|
local newY = math.min( math.max( scrollY + cy, 1 ), #tLines )
|
||||||
local newX = math.min( math.max( scrollX + cx, 1 ), string.len( tLines[newY] ) + 1 )
|
local newX = math.min( math.max( scrollX + cx, 1 ), #tLines[newY] + 1 )
|
||||||
setCursor( newX, newY )
|
setCursor( newX, newY )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -750,7 +749,7 @@ while bRunning do
|
|||||||
|
|
||||||
elseif param == 1 then
|
elseif param == 1 then
|
||||||
-- Scroll down
|
-- Scroll down
|
||||||
local nMaxScroll = #tLines - (h-1)
|
local nMaxScroll = #tLines - (h - 1)
|
||||||
if scrollY < nMaxScroll then
|
if scrollY < nMaxScroll then
|
||||||
-- Move cursor down
|
-- Move cursor down
|
||||||
scrollY = scrollY + 1
|
scrollY = scrollY + 1
|
||||||
@ -761,7 +760,7 @@ while bRunning do
|
|||||||
end
|
end
|
||||||
|
|
||||||
elseif sEvent == "term_resize" then
|
elseif sEvent == "term_resize" then
|
||||||
w,h = term.getSize()
|
w, h = term.getSize()
|
||||||
setCursor( x, y )
|
setCursor( x, y )
|
||||||
redrawMenu()
|
redrawMenu()
|
||||||
redrawText()
|
redrawText()
|
||||||
|
@ -11,7 +11,7 @@ local sDrive = tArgs[1]
|
|||||||
-- Check the disk exists
|
-- Check the disk exists
|
||||||
local bPresent = disk.isPresent( sDrive )
|
local bPresent = disk.isPresent( sDrive )
|
||||||
if not bPresent then
|
if not bPresent then
|
||||||
print( "Nothing in "..sDrive.." drive" )
|
print( "Nothing in " .. sDrive .. " drive" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
-- The width and height of the terminal
|
-- The width and height of the terminal
|
||||||
local w,h = term.getSize()
|
local w, h = term.getSize()
|
||||||
|
|
||||||
-- The selected colours on the left and right mouse button, and the colour of the canvas
|
-- The selected colours on the left and right mouse button, and the colour of the canvas
|
||||||
local leftColour, rightColour = colours.white, nil
|
local leftColour, rightColour = colours.white, nil
|
||||||
@ -16,7 +16,7 @@ local canvasColour = colours.black
|
|||||||
local canvas = {}
|
local canvas = {}
|
||||||
|
|
||||||
-- The menu options
|
-- The menu options
|
||||||
local mChoices = { "Save","Exit" }
|
local mChoices = { "Save", "Exit" }
|
||||||
|
|
||||||
-- The message displayed in the footer bar
|
-- The message displayed in the footer bar
|
||||||
local fMessage = "Press Ctrl to access menu"
|
local fMessage = "Press Ctrl to access menu"
|
||||||
@ -86,8 +86,8 @@ end
|
|||||||
returns: the colour number of the hex value
|
returns: the colour number of the hex value
|
||||||
]]
|
]]
|
||||||
local tColourLookup = {}
|
local tColourLookup = {}
|
||||||
for n=1,16 do
|
for n = 1, 16 do
|
||||||
tColourLookup[ string.byte( "0123456789abcdef",n,n ) ] = 2^(n-1)
|
tColourLookup[ string.byte( "0123456789abcdef", n, n ) ] = 2 ^ (n - 1)
|
||||||
end
|
end
|
||||||
local function getColourOf( char )
|
local function getColourOf( char )
|
||||||
-- Values not in the hex table are transparent (canvas coloured)
|
-- Values not in the hex table are transparent (canvas coloured)
|
||||||
@ -106,8 +106,8 @@ local function load(path)
|
|||||||
local sLine = file.readLine()
|
local sLine = file.readLine()
|
||||||
while sLine do
|
while sLine do
|
||||||
local line = {}
|
local line = {}
|
||||||
for x=1,w-2 do
|
for x = 1, w - 2 do
|
||||||
line[x] = getColourOf( string.byte(sLine,x,x) )
|
line[x] = getColourOf( string.byte(sLine, x, x) )
|
||||||
end
|
end
|
||||||
table.insert( canvas, line )
|
table.insert( canvas, line )
|
||||||
sLine = file.readLine()
|
sLine = file.readLine()
|
||||||
@ -136,10 +136,10 @@ local function save(path)
|
|||||||
-- Encode (and trim)
|
-- Encode (and trim)
|
||||||
local tLines = {}
|
local tLines = {}
|
||||||
local nLastLine = 0
|
local nLastLine = 0
|
||||||
for y=1,h-1 do
|
for y = 1, h - 1 do
|
||||||
local sLine = ""
|
local sLine = ""
|
||||||
local nLastChar = 0
|
local nLastChar = 0
|
||||||
for x=1,w-2 do
|
for x = 1, w - 2 do
|
||||||
local c = getCharOf( getCanvasPixel( x, y ) )
|
local c = getCharOf( getCanvasPixel( x, y ) )
|
||||||
sLine = sLine .. c
|
sLine = sLine .. c
|
||||||
if c ~= " " then
|
if c ~= " " then
|
||||||
@ -148,13 +148,13 @@ local function save(path)
|
|||||||
end
|
end
|
||||||
sLine = string.sub( sLine, 1, nLastChar )
|
sLine = string.sub( sLine, 1, nLastChar )
|
||||||
tLines[y] = sLine
|
tLines[y] = sLine
|
||||||
if string.len( sLine ) > 0 then
|
if #sLine > 0 then
|
||||||
nLastLine = y
|
nLastLine = y
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Save out
|
-- Save out
|
||||||
for n=1,nLastLine do
|
for n = 1, nLastLine do
|
||||||
file.writeLine( tLines[ n ] )
|
file.writeLine( tLines[ n ] )
|
||||||
end
|
end
|
||||||
file.close()
|
file.close()
|
||||||
@ -174,20 +174,20 @@ local function drawInterface()
|
|||||||
term.write(fMessage)
|
term.write(fMessage)
|
||||||
|
|
||||||
-- Colour Picker
|
-- Colour Picker
|
||||||
for i=1,16 do
|
for i = 1, 16 do
|
||||||
term.setCursorPos(w-1, i)
|
term.setCursorPos(w - 1, i)
|
||||||
term.setBackgroundColour( 2^(i-1) )
|
term.setBackgroundColour( 2 ^ (i - 1) )
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
end
|
end
|
||||||
|
|
||||||
term.setCursorPos(w-1, 17)
|
term.setCursorPos(w - 1, 17)
|
||||||
term.setBackgroundColour( canvasColour )
|
term.setBackgroundColour( canvasColour )
|
||||||
term.setTextColour( colours.grey )
|
term.setTextColour( colours.grey )
|
||||||
term.write("\127\127")
|
term.write("\127\127")
|
||||||
|
|
||||||
-- Left and Right Selected Colours
|
-- Left and Right Selected Colours
|
||||||
for i=18,18 do
|
do
|
||||||
term.setCursorPos(w-1, i)
|
term.setCursorPos(w - 1, 18)
|
||||||
if leftColour ~= nil then
|
if leftColour ~= nil then
|
||||||
term.setBackgroundColour( leftColour )
|
term.setBackgroundColour( leftColour )
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
@ -208,8 +208,8 @@ local function drawInterface()
|
|||||||
|
|
||||||
-- Padding
|
-- Padding
|
||||||
term.setBackgroundColour( canvasColour )
|
term.setBackgroundColour( canvasColour )
|
||||||
for i=20,h-1 do
|
for i = 20, h - 1 do
|
||||||
term.setCursorPos(w-1, i)
|
term.setCursorPos(w - 1, i)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -237,7 +237,7 @@ end
|
|||||||
returns: nil
|
returns: nil
|
||||||
]]
|
]]
|
||||||
local function drawCanvasLine( y )
|
local function drawCanvasLine( y )
|
||||||
for x = 1, w-2 do
|
for x = 1, w - 2 do
|
||||||
drawCanvasPixel( x, y )
|
drawCanvasPixel( x, y )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -247,7 +247,7 @@ end
|
|||||||
returns: nil
|
returns: nil
|
||||||
]]
|
]]
|
||||||
local function drawCanvas()
|
local function drawCanvas()
|
||||||
for y = 1, h-1 do
|
for y = 1, h - 1 do
|
||||||
drawCanvasLine( y )
|
drawCanvasLine( y )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -263,25 +263,25 @@ local function accessMenu()
|
|||||||
term.setBackgroundColour(colours.black)
|
term.setBackgroundColour(colours.black)
|
||||||
while true do
|
while true do
|
||||||
-- Draw the menu
|
-- Draw the menu
|
||||||
term.setCursorPos(1,h)
|
term.setCursorPos(1, h)
|
||||||
term.clearLine()
|
term.clearLine()
|
||||||
term.setTextColour(colours.white)
|
term.setTextColour(colours.white)
|
||||||
for k,v in pairs(mChoices) do
|
for k, v in pairs(mChoices) do
|
||||||
if selection==k then
|
if selection == k then
|
||||||
term.setTextColour(colours.yellow)
|
term.setTextColour(colours.yellow)
|
||||||
local ox,_ = term.getCursorPos()
|
local ox = term.getCursorPos()
|
||||||
term.write("["..string.rep(" ",#v).."]")
|
term.write("[" .. string.rep(" ", #v) .. "]")
|
||||||
term.setCursorPos(ox+1,h)
|
term.setCursorPos(ox + 1, h)
|
||||||
term.setTextColour(colours.white)
|
term.setTextColour(colours.white)
|
||||||
term.write(v)
|
term.write(v)
|
||||||
term.setCursorPos(term.getCursorPos()+1,h)
|
term.setCursorPos(term.getCursorPos() + 1, h)
|
||||||
else
|
else
|
||||||
term.write(" "..v.." ")
|
term.write(" " .. v .. " ")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Handle input in the menu
|
-- Handle input in the menu
|
||||||
local id,key = os.pullEvent("key")
|
local id, key = os.pullEvent("key")
|
||||||
if id == "key" then
|
if id == "key" then
|
||||||
-- S and E are shortcuts
|
-- S and E are shortcuts
|
||||||
if key == keys.s then
|
if key == keys.s then
|
||||||
@ -308,23 +308,23 @@ local function accessMenu()
|
|||||||
|
|
||||||
elseif key == keys.enter then
|
elseif key == keys.enter then
|
||||||
-- Select an option
|
-- Select an option
|
||||||
if mChoices[selection]=="Save" then
|
if mChoices[selection] == "Save" then
|
||||||
if bReadOnly then
|
if bReadOnly then
|
||||||
fMessage = "Access denied"
|
fMessage = "Access denied"
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local success, err = save(sPath)
|
local success, err = save(sPath)
|
||||||
if success then
|
if success then
|
||||||
fMessage = "Saved to "..sPath
|
fMessage = "Saved to " .. sPath
|
||||||
else
|
else
|
||||||
if err then
|
if err then
|
||||||
fMessage = "Error saving to "..err
|
fMessage = "Error saving to " .. err
|
||||||
else
|
else
|
||||||
fMessage = "Error saving to "..sPath
|
fMessage = "Error saving to " .. sPath
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
elseif mChoices[selection]=="Exit" then
|
elseif mChoices[selection] == "Exit" then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
elseif key == keys.leftCtrl or keys == keys.rightCtrl then
|
elseif key == keys.leftCtrl or keys == keys.rightCtrl then
|
||||||
@ -343,19 +343,19 @@ end
|
|||||||
local function handleEvents()
|
local function handleEvents()
|
||||||
local programActive = true
|
local programActive = true
|
||||||
while programActive do
|
while programActive do
|
||||||
local id,p1,p2,p3 = os.pullEvent()
|
local id, p1, p2, p3 = os.pullEvent()
|
||||||
if id=="mouse_click" or id=="mouse_drag" then
|
if id == "mouse_click" or id == "mouse_drag" then
|
||||||
if p2 >= w-1 and p3 >= 1 and p3 <= 17 then
|
if p2 >= w - 1 and p3 >= 1 and p3 <= 17 then
|
||||||
if id ~= "mouse_drag" then
|
if id ~= "mouse_drag" then
|
||||||
-- Selecting an items in the colour picker
|
-- Selecting an items in the colour picker
|
||||||
if p3 <= 16 then
|
if p3 <= 16 then
|
||||||
if p1==1 then
|
if p1 == 1 then
|
||||||
leftColour = 2^(p3-1)
|
leftColour = 2 ^ (p3 - 1)
|
||||||
else
|
else
|
||||||
rightColour = 2^(p3-1)
|
rightColour = 2 ^ (p3 - 1)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if p1==1 then
|
if p1 == 1 then
|
||||||
leftColour = nil
|
leftColour = nil
|
||||||
else
|
else
|
||||||
rightColour = nil
|
rightColour = nil
|
||||||
@ -364,12 +364,12 @@ local function handleEvents()
|
|||||||
--drawCanvas()
|
--drawCanvas()
|
||||||
drawInterface()
|
drawInterface()
|
||||||
end
|
end
|
||||||
elseif p2 < w-1 and p3 <= h-1 then
|
elseif p2 < w - 1 and p3 <= h - 1 then
|
||||||
-- Clicking on the canvas
|
-- Clicking on the canvas
|
||||||
local paintColour = nil
|
local paintColour = nil
|
||||||
if p1==1 then
|
if p1 == 1 then
|
||||||
paintColour = leftColour
|
paintColour = leftColour
|
||||||
elseif p1==2 then
|
elseif p1 == 2 then
|
||||||
paintColour = rightColour
|
paintColour = rightColour
|
||||||
end
|
end
|
||||||
if not canvas[p3] then
|
if not canvas[p3] then
|
||||||
@ -379,13 +379,13 @@ local function handleEvents()
|
|||||||
|
|
||||||
drawCanvasPixel( p2, p3 )
|
drawCanvasPixel( p2, p3 )
|
||||||
end
|
end
|
||||||
elseif id=="key" then
|
elseif id == "key" then
|
||||||
if p1==keys.leftCtrl or p1==keys.rightCtrl then
|
if p1 == keys.leftCtrl or p1 == keys.rightCtrl then
|
||||||
programActive = not accessMenu()
|
programActive = not accessMenu()
|
||||||
drawInterface()
|
drawInterface()
|
||||||
end
|
end
|
||||||
elseif id=="term_resize" then
|
elseif id == "term_resize" then
|
||||||
w,h = term.getSize()
|
w, h = term.getSize()
|
||||||
drawCanvas()
|
drawCanvas()
|
||||||
drawInterface()
|
drawInterface()
|
||||||
end
|
end
|
||||||
@ -404,4 +404,4 @@ handleEvents()
|
|||||||
term.setBackgroundColour(colours.black)
|
term.setBackgroundColour(colours.black)
|
||||||
term.setTextColour(colours.white)
|
term.setTextColour(colours.white)
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
--Clearing Screen--
|
--Clearing Screen--
|
||||||
|
|
||||||
--Vars--
|
--Vars--
|
||||||
local TermW,TermH = term.getSize()
|
local TermW, TermH = term.getSize()
|
||||||
|
|
||||||
local sLevelTitle
|
local sLevelTitle
|
||||||
local tScreen
|
local tScreen
|
||||||
local oScreen
|
local oScreen
|
||||||
local SizeW,SizeH
|
local SizeW, SizeH
|
||||||
local aExits
|
local aExits
|
||||||
local fExit
|
local fExit
|
||||||
local nSpeed
|
local nSpeed
|
||||||
@ -18,14 +18,14 @@ local fSpeedS
|
|||||||
local bPaused
|
local bPaused
|
||||||
local Tick
|
local Tick
|
||||||
local Blocks
|
local Blocks
|
||||||
local XOrgin,YOrgin
|
local XOrgin, YOrgin
|
||||||
local fLevel
|
local fLevel
|
||||||
|
|
||||||
local function reset()
|
local function reset()
|
||||||
sLevelTitle = ""
|
sLevelTitle = ""
|
||||||
tScreen = {}
|
tScreen = {}
|
||||||
oScreen = {}
|
oScreen = {}
|
||||||
SizeW,SizeH = TermW,TermH
|
SizeW, SizeH = TermW, TermH
|
||||||
aExits = 0
|
aExits = 0
|
||||||
fExit = "nop"
|
fExit = "nop"
|
||||||
nSpeed = 0.6
|
nSpeed = 0.6
|
||||||
@ -35,7 +35,7 @@ local function reset()
|
|||||||
bPaused = false
|
bPaused = false
|
||||||
Tick = os.startTimer(Speed)
|
Tick = os.startTimer(Speed)
|
||||||
Blocks = 0
|
Blocks = 0
|
||||||
XOrgin,YOrgin = 1,1
|
XOrgin, YOrgin = 1, 1
|
||||||
|
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
@ -60,22 +60,22 @@ local tArgs = { ... }
|
|||||||
|
|
||||||
--Functions--
|
--Functions--
|
||||||
local function printCentred( yc, stg )
|
local function printCentred( yc, stg )
|
||||||
local xc = math.floor((TermW - string.len(stg)) / 2) + 1
|
local xc = math.floor((TermW - #stg) / 2) + 1
|
||||||
term.setCursorPos(xc,yc)
|
term.setCursorPos(xc, yc)
|
||||||
term.write( stg )
|
term.write( stg )
|
||||||
end
|
end
|
||||||
|
|
||||||
local function centerOrgin()
|
local function centerOrgin()
|
||||||
XOrgin = math.floor((TermW/2)-(SizeW/2))
|
XOrgin = math.floor(TermW / 2 - SizeW / 2)
|
||||||
YOrgin = math.floor((TermH/2)-(SizeH/2))
|
YOrgin = math.floor(TermH / 2 - SizeH / 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function reMap()
|
local function reMap()
|
||||||
tScreen = nil
|
tScreen = nil
|
||||||
tScreen = {}
|
tScreen = {}
|
||||||
for x=1,SizeW do
|
for x = 1, SizeW do
|
||||||
tScreen[x] = {}
|
tScreen[x] = {}
|
||||||
for y=1,SizeH do
|
for y = 1, SizeH do
|
||||||
tScreen[x][y] = { space = true, wall = false, ground = false, robot = "zz", start = "zz", exit = "zz" }
|
tScreen[x][y] = { space = true, wall = false, ground = false, robot = "zz", start = "zz", exit = "zz" }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -83,7 +83,7 @@ end
|
|||||||
|
|
||||||
local function tablecopy(t)
|
local function tablecopy(t)
|
||||||
local t2 = {}
|
local t2 = {}
|
||||||
for k,v in pairs(t) do
|
for k, v in pairs(t) do
|
||||||
t2[k] = v
|
t2[k] = v
|
||||||
end
|
end
|
||||||
return t2
|
return t2
|
||||||
@ -92,17 +92,17 @@ end
|
|||||||
local function buMap()
|
local function buMap()
|
||||||
oScreen = nil
|
oScreen = nil
|
||||||
oScreen = {}
|
oScreen = {}
|
||||||
for x=1,SizeW do
|
for x = 1, SizeW do
|
||||||
oScreen[x] = {}
|
oScreen[x] = {}
|
||||||
for y=1,SizeH do
|
for y = 1, SizeH do
|
||||||
oScreen[x][y] = tablecopy(tScreen[x][y])
|
oScreen[x][y] = tablecopy(tScreen[x][y])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function addRobot(x,y,side,color)
|
local function addRobot(x, y, side, color)
|
||||||
local obj = tScreen[x][y]
|
local obj = tScreen[x][y]
|
||||||
local data = side..color
|
local data = side .. color
|
||||||
if obj.wall == nil and obj.robot == nil then
|
if obj.wall == nil and obj.robot == nil then
|
||||||
tScreen[x][y].robot = data
|
tScreen[x][y].robot = data
|
||||||
else
|
else
|
||||||
@ -112,9 +112,9 @@ local function addRobot(x,y,side,color)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function addStart(x,y,side,color)
|
local function addStart(x, y, side, color)
|
||||||
local obj = tScreen[x][y]
|
local obj = tScreen[x][y]
|
||||||
local data = side..color
|
local data = side .. color
|
||||||
if obj.wall == nil and obj.space == nil then
|
if obj.wall == nil and obj.space == nil then
|
||||||
tScreen[x][y].start = data
|
tScreen[x][y].start = data
|
||||||
else
|
else
|
||||||
@ -122,10 +122,10 @@ local function addStart(x,y,side,color)
|
|||||||
obj.space = nil
|
obj.space = nil
|
||||||
tScreen[x][y].start = data
|
tScreen[x][y].start = data
|
||||||
end
|
end
|
||||||
aExits = aExits+1
|
aExits = aExits + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local function addGround(x,y)
|
local function addGround(x, y)
|
||||||
local obj = tScreen[x][y]
|
local obj = tScreen[x][y]
|
||||||
if obj.space == nil and obj.exit == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
|
if obj.space == nil and obj.exit == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
|
||||||
tScreen[x][y].ground = true
|
tScreen[x][y].ground = true
|
||||||
@ -139,7 +139,7 @@ local function addGround(x,y)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function addExit(x,y,cl)
|
local function addExit(x, y, cl)
|
||||||
local obj = tScreen[x][y]
|
local obj = tScreen[x][y]
|
||||||
if obj.space == nil and obj.ground == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
|
if obj.space == nil and obj.ground == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
|
||||||
tScreen[x][y].exit = cl
|
tScreen[x][y].exit = cl
|
||||||
@ -153,10 +153,10 @@ local function addExit(x,y,cl)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function addWall(x,y)
|
local function addWall(x, y)
|
||||||
local obj = tScreen[x][y]
|
local obj = tScreen[x][y]
|
||||||
if obj == nil then
|
if obj == nil then
|
||||||
return error("Here X"..x.." Y"..y)
|
return error("Here X" .. x .. " Y" .. y)
|
||||||
end
|
end
|
||||||
if obj.space == nil and obj.exit == nil and obj.ground == nil and obj.robot == nil and obj.start == nil then
|
if obj.space == nil and obj.exit == nil and obj.ground == nil and obj.robot == nil and obj.start == nil then
|
||||||
tScreen[x][y].wall = true
|
tScreen[x][y].wall = true
|
||||||
@ -171,16 +171,15 @@ local function addWall(x,y)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function loadLevel(nNum)
|
local function loadLevel(nNum)
|
||||||
sLevelTitle = "Level "..nNum
|
sLevelTitle = "Level " .. nNum
|
||||||
if nNum == nil then return error("nNum == nil") end
|
if nNum == nil then return error("nNum == nil") end
|
||||||
local sDir = fs.getDir( shell.getRunningProgram() )
|
local sDir = fs.getDir( shell.getRunningProgram() )
|
||||||
local sLevelD = sDir .. "/levels/" .. tostring(nNum)..".dat"
|
local sLevelD = sDir .. "/levels/" .. tostring(nNum) .. ".dat"
|
||||||
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : "..sLevelD) end
|
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : " .. sLevelD) end
|
||||||
fLevel = fs.open(sLevelD,"r")
|
fLevel = fs.open(sLevelD, "r")
|
||||||
local Line = 0
|
|
||||||
local wl = true
|
local wl = true
|
||||||
Blocks = tonumber(string.sub(fLevel.readLine(),1,1))
|
Blocks = tonumber(string.sub(fLevel.readLine(), 1, 1))
|
||||||
local xSize = string.len(fLevel.readLine())+2
|
local xSize = #fLevel.readLine() + 2
|
||||||
local Lines = 3
|
local Lines = 3
|
||||||
while wl do
|
while wl do
|
||||||
local wLine = fLevel.readLine()
|
local wLine = fLevel.readLine()
|
||||||
@ -188,43 +187,43 @@ local function loadLevel(nNum)
|
|||||||
fLevel.close()
|
fLevel.close()
|
||||||
wl = false
|
wl = false
|
||||||
else
|
else
|
||||||
xSize = math.max(string.len(wLine)+2,xSize)
|
xSize = math.max(#wLine + 2, xSize)
|
||||||
Lines = Lines + 1
|
Lines = Lines + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
SizeW,SizeH = xSize,Lines
|
SizeW, SizeH = xSize, Lines
|
||||||
reMap()
|
reMap()
|
||||||
fLevel = fs.open(sLevelD,"r")
|
fLevel = fs.open(sLevelD, "r")
|
||||||
fLevel.readLine()
|
fLevel.readLine()
|
||||||
for Line=2,Lines-1 do
|
for Line = 2, Lines - 1 do
|
||||||
local sLine = fLevel.readLine()
|
local sLine = fLevel.readLine()
|
||||||
local chars = string.len(sLine)
|
local chars = #sLine
|
||||||
for char = 1, chars do
|
for char = 1, chars do
|
||||||
local el = string.sub(sLine,char,char)
|
local el = string.sub(sLine, char, char)
|
||||||
if el == "8" then
|
if el == "8" then
|
||||||
addGround(char+1,Line)
|
addGround(char + 1, Line)
|
||||||
elseif el == "0" then
|
elseif el == "0" then
|
||||||
addStart(char+1,Line,"a","a")
|
addStart(char + 1, Line, "a", "a")
|
||||||
elseif el == "1" then
|
elseif el == "1" then
|
||||||
addStart(char+1,Line,"b","a")
|
addStart(char + 1, Line, "b", "a")
|
||||||
elseif el == "2" then
|
elseif el == "2" then
|
||||||
addStart(char+1,Line,"c","a")
|
addStart(char + 1, Line, "c", "a")
|
||||||
elseif el == "3" then
|
elseif el == "3" then
|
||||||
addStart(char+1,Line,"d","a")
|
addStart(char + 1, Line, "d", "a")
|
||||||
elseif el == "4" then
|
elseif el == "4" then
|
||||||
addStart(char+1,Line,"a","b")
|
addStart(char + 1, Line, "a", "b")
|
||||||
elseif el == "5" then
|
elseif el == "5" then
|
||||||
addStart(char+1,Line,"b","b")
|
addStart(char + 1, Line, "b", "b")
|
||||||
elseif el == "6" then
|
elseif el == "6" then
|
||||||
addStart(char+1,Line,"c","b")
|
addStart(char + 1, Line, "c", "b")
|
||||||
elseif el == "9" then
|
elseif el == "9" then
|
||||||
addStart(char+1,Line,"d","b")
|
addStart(char + 1, Line, "d", "b")
|
||||||
elseif el == "b" then
|
elseif el == "b" then
|
||||||
addExit(char+1,Line,"a")
|
addExit(char + 1, Line, "a")
|
||||||
elseif el == "e" then
|
elseif el == "e" then
|
||||||
addExit(char+1,Line,"b")
|
addExit(char + 1, Line, "b")
|
||||||
elseif el == "7" then
|
elseif el == "7" then
|
||||||
addWall(char+1,Line)
|
addWall(char + 1, Line)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -233,29 +232,29 @@ end
|
|||||||
|
|
||||||
local function drawStars()
|
local function drawStars()
|
||||||
--CCR Background By : RamiLego--
|
--CCR Background By : RamiLego--
|
||||||
local cStar,cStarG,crStar,crStarB = colors.lightGray,colors.gray,".","*"
|
local cStar, cStarG, crStar, crStarB = colors.lightGray, colors.gray, ".", "*"
|
||||||
local DStar,BStar,nStar,gStar = 14,10,16,3
|
local DStar, BStar, nStar, gStar = 14, 10, 16, 3
|
||||||
local TermW,TermH = term.getSize()
|
local TermW, TermH = term.getSize()
|
||||||
|
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
for x=1,TermW do
|
for x = 1, TermW do
|
||||||
for y=1,TermH do
|
for y = 1, TermH do
|
||||||
local StarT = math.random(1,30)
|
local StarT = math.random(1, 30)
|
||||||
if StarT == DStar then
|
if StarT == DStar then
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
term.setTextColor(cStar)
|
term.setTextColor(cStar)
|
||||||
write(crStar)
|
write(crStar)
|
||||||
elseif StarT == BStar then
|
elseif StarT == BStar then
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
term.setTextColor(cStar)
|
term.setTextColor(cStar)
|
||||||
write(crStarB)
|
write(crStarB)
|
||||||
elseif StarT == nStar then
|
elseif StarT == nStar then
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
term.setTextColor(cStarG)
|
term.setTextColor(cStarG)
|
||||||
write(crStar)
|
write(crStar)
|
||||||
elseif StarT == gStar then
|
elseif StarT == gStar then
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
term.setTextColor(cStarG)
|
term.setTextColor(cStarG)
|
||||||
write(crStarB)
|
write(crStarB)
|
||||||
end
|
end
|
||||||
@ -264,15 +263,15 @@ local function drawStars()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function drawMap()
|
local function drawMap()
|
||||||
for x=1,SizeW do
|
for x = 1, SizeW do
|
||||||
for y=1,SizeH do
|
for y = 1, SizeH do
|
||||||
|
|
||||||
local obj = tScreen[x][y]
|
local obj = tScreen[x][y]
|
||||||
if obj.ground == true then
|
if obj.ground == true then
|
||||||
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cG)
|
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cG)
|
||||||
end
|
end
|
||||||
if obj.wall == true then
|
if obj.wall == true then
|
||||||
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cW)
|
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cW)
|
||||||
end
|
end
|
||||||
|
|
||||||
local ex = tostring(tScreen[x][y].exit)
|
local ex = tostring(tScreen[x][y].exit)
|
||||||
@ -290,13 +289,13 @@ local function drawMap()
|
|||||||
end
|
end
|
||||||
term.setBackgroundColor(cG)
|
term.setBackgroundColor(cG)
|
||||||
term.setTextColor(ex)
|
term.setTextColor(ex)
|
||||||
term.setCursorPos(XOrgin+x,YOrgin+y+1)
|
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
|
||||||
print("X")
|
print("X")
|
||||||
end
|
end
|
||||||
|
|
||||||
local st = tostring(tScreen[x][y].start)
|
local st = tostring(tScreen[x][y].start)
|
||||||
if not(st == "zz" or st == "nil") then
|
if not(st == "zz" or st == "nil") then
|
||||||
local Cr = string.sub(st,2,2)
|
local Cr = string.sub(st, 2, 2)
|
||||||
if Cr == "a" then
|
if Cr == "a" then
|
||||||
Cr = cR1
|
Cr = cR1
|
||||||
elseif Cr == "b" then
|
elseif Cr == "b" then
|
||||||
@ -311,9 +310,9 @@ local function drawMap()
|
|||||||
|
|
||||||
term.setTextColor(Cr)
|
term.setTextColor(Cr)
|
||||||
term.setBackgroundColor(cG)
|
term.setBackgroundColor(cG)
|
||||||
term.setCursorPos(XOrgin+x,YOrgin+y+1)
|
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
|
||||||
|
|
||||||
local sSide = string.sub(st,1,1)
|
local sSide = string.sub(st, 1, 1)
|
||||||
if sSide == "a" then
|
if sSide == "a" then
|
||||||
print("^")
|
print("^")
|
||||||
elseif sSide == "b" then
|
elseif sSide == "b" then
|
||||||
@ -328,12 +327,12 @@ local function drawMap()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if obj.space == true then
|
if obj.space == true then
|
||||||
paintutils.drawPixel(XOrgin+x,YOrgin+y+1,cS)
|
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cS)
|
||||||
end
|
end
|
||||||
|
|
||||||
local rb = tostring(tScreen[x][y].robot)
|
local rb = tostring(tScreen[x][y].robot)
|
||||||
if not(rb == "zz" or rb == "nil") then
|
if not(rb == "zz" or rb == "nil") then
|
||||||
local Cr = string.sub(rb,2,2)
|
local Cr = string.sub(rb, 2, 2)
|
||||||
if Cr == "a" then
|
if Cr == "a" then
|
||||||
Cr = cR1
|
Cr = cR1
|
||||||
elseif Cr == "b" then
|
elseif Cr == "b" then
|
||||||
@ -347,8 +346,8 @@ local function drawMap()
|
|||||||
end
|
end
|
||||||
term.setBackgroundColor(Cr)
|
term.setBackgroundColor(Cr)
|
||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
term.setCursorPos(XOrgin+x,YOrgin+y+1)
|
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
|
||||||
local sSide = string.sub(rb,1,1)
|
local sSide = string.sub(rb, 1, 1)
|
||||||
if sSide == "a" then
|
if sSide == "a" then
|
||||||
print("^")
|
print("^")
|
||||||
elseif sSide == "b" then
|
elseif sSide == "b" then
|
||||||
@ -365,7 +364,7 @@ local function drawMap()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function isBrick(x,y)
|
local function isBrick(x, y)
|
||||||
local brb = tostring(tScreen[x][y].robot)
|
local brb = tostring(tScreen[x][y].robot)
|
||||||
local bobj = oScreen[x][y]
|
local bobj = oScreen[x][y]
|
||||||
if (brb == "zz" or brb == "nil") and not bobj.wall == true then
|
if (brb == "zz" or brb == "nil") and not bobj.wall == true then
|
||||||
@ -377,134 +376,134 @@ end
|
|||||||
|
|
||||||
local function gRender(sContext)
|
local function gRender(sContext)
|
||||||
if sContext == "start" then
|
if sContext == "start" then
|
||||||
for x=1,SizeW do
|
for x = 1, SizeW do
|
||||||
for y=1,SizeH do
|
for y = 1, SizeH do
|
||||||
local st = tostring(tScreen[x][y].start)
|
local st = tostring(tScreen[x][y].start)
|
||||||
if not(st == "zz" or st == "nil") then
|
if not(st == "zz" or st == "nil") then
|
||||||
local Cr = string.sub(st,2,2)
|
local Cr = string.sub(st, 2, 2)
|
||||||
local sSide = string.sub(st,1,1)
|
local sSide = string.sub(st, 1, 1)
|
||||||
addRobot(x,y,sSide,Cr)
|
addRobot(x, y, sSide, Cr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif sContext == "tick" then
|
elseif sContext == "tick" then
|
||||||
buMap()
|
buMap()
|
||||||
for x=1,SizeW do
|
for x = 1, SizeW do
|
||||||
for y=1,SizeH do
|
for y = 1, SizeH do
|
||||||
local rb = tostring(oScreen[x][y].robot)
|
local rb = tostring(oScreen[x][y].robot)
|
||||||
if not(rb == "zz" or rb == "nil") then
|
if not(rb == "zz" or rb == "nil") then
|
||||||
local Cr = string.sub(rb,2,2)
|
local Cr = string.sub(rb, 2, 2)
|
||||||
local sSide = string.sub(rb,1,1)
|
local sSide = string.sub(rb, 1, 1)
|
||||||
local sobj = oScreen[x][y]
|
local sobj = oScreen[x][y]
|
||||||
if sobj.space == true then
|
if sobj.space == true then
|
||||||
tScreen[x][y].robot = "zz"
|
tScreen[x][y].robot = "zz"
|
||||||
if not sSide == "g" then
|
if not sSide == "g" then
|
||||||
addRobot(x,y,"g",Cr)
|
addRobot(x, y, "g", Cr)
|
||||||
end
|
end
|
||||||
elseif sobj.exit == Cr then
|
elseif sobj.exit == Cr then
|
||||||
if sSide == "a" or sSide == "b" or sSide == "c" or sSide == "d" then
|
if sSide == "a" or sSide == "b" or sSide == "c" or sSide == "d" then
|
||||||
tScreen[x][y].robot = "zz"
|
tScreen[x][y].robot = "zz"
|
||||||
addRobot(x,y,"g",Cr)
|
addRobot(x, y, "g", Cr)
|
||||||
aExits = aExits-1
|
aExits = aExits - 1
|
||||||
end
|
end
|
||||||
elseif sSide == "a" then
|
elseif sSide == "a" then
|
||||||
local obj = isBrick(x,y-1)
|
local obj = isBrick(x, y - 1)
|
||||||
tScreen[x][y].robot = "zz"
|
tScreen[x][y].robot = "zz"
|
||||||
if not obj == true then
|
if not obj == true then
|
||||||
addRobot(x,y-1,sSide,Cr)
|
addRobot(x, y - 1, sSide, Cr)
|
||||||
else
|
else
|
||||||
local obj2 = isBrick(x-1,y)
|
local obj2 = isBrick(x - 1, y)
|
||||||
local obj3 = isBrick(x+1,y)
|
local obj3 = isBrick(x + 1, y)
|
||||||
if not obj2 == true and not obj3 == true then
|
if not obj2 == true and not obj3 == true then
|
||||||
if Cr == "a" then
|
if Cr == "a" then
|
||||||
addRobot(x,y,"d",Cr)
|
addRobot(x, y, "d", Cr)
|
||||||
elseif Cr == "b" then
|
elseif Cr == "b" then
|
||||||
addRobot(x,y,"b",Cr)
|
addRobot(x, y, "b", Cr)
|
||||||
end
|
end
|
||||||
elseif obj == true and obj2 == true and obj3 == true then
|
elseif obj == true and obj2 == true and obj3 == true then
|
||||||
addRobot(x,y,"c",Cr)
|
addRobot(x, y, "c", Cr)
|
||||||
else
|
else
|
||||||
if obj3 == true then
|
if obj3 == true then
|
||||||
addRobot(x,y,"d",Cr)
|
addRobot(x, y, "d", Cr)
|
||||||
elseif obj2 == true then
|
elseif obj2 == true then
|
||||||
addRobot(x,y,"b",Cr)
|
addRobot(x, y, "b", Cr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif sSide == "b" then
|
elseif sSide == "b" then
|
||||||
local obj = isBrick(x+1,y)
|
local obj = isBrick(x + 1, y)
|
||||||
tScreen[x][y].robot = "zz"
|
tScreen[x][y].robot = "zz"
|
||||||
if not obj == true then
|
if not obj == true then
|
||||||
addRobot(x+1,y,sSide,Cr)
|
addRobot(x + 1, y, sSide, Cr)
|
||||||
else
|
else
|
||||||
local obj2 = isBrick(x,y-1)
|
local obj2 = isBrick(x, y - 1)
|
||||||
local obj3 = isBrick(x,y+1)
|
local obj3 = isBrick(x, y + 1)
|
||||||
if not obj2 == true and not obj3 == true then
|
if not obj2 == true and not obj3 == true then
|
||||||
if Cr == "a" then
|
if Cr == "a" then
|
||||||
addRobot(x,y,"a",Cr)
|
addRobot(x, y, "a", Cr)
|
||||||
elseif Cr == "b" then
|
elseif Cr == "b" then
|
||||||
addRobot(x,y,"c",Cr)
|
addRobot(x, y, "c", Cr)
|
||||||
end
|
end
|
||||||
elseif obj == true and obj2 == true and obj3 == true then
|
elseif obj == true and obj2 == true and obj3 == true then
|
||||||
addRobot(x,y,"d",Cr)
|
addRobot(x, y, "d", Cr)
|
||||||
else
|
else
|
||||||
if obj3 == true then
|
if obj3 == true then
|
||||||
addRobot(x,y,"a",Cr)
|
addRobot(x, y, "a", Cr)
|
||||||
elseif obj2 == true then
|
elseif obj2 == true then
|
||||||
addRobot(x,y,"c",Cr)
|
addRobot(x, y, "c", Cr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif sSide == "c" then
|
elseif sSide == "c" then
|
||||||
local obj = isBrick(x,y+1)
|
local obj = isBrick(x, y + 1)
|
||||||
tScreen[x][y].robot = "zz"
|
tScreen[x][y].robot = "zz"
|
||||||
if not obj == true then
|
if not obj == true then
|
||||||
addRobot(x,y+1,sSide,Cr)
|
addRobot(x, y + 1, sSide, Cr)
|
||||||
else
|
else
|
||||||
local obj2 = isBrick(x-1,y)
|
local obj2 = isBrick(x - 1, y)
|
||||||
local obj3 = isBrick(x+1,y)
|
local obj3 = isBrick(x + 1, y)
|
||||||
if not obj2 == true and not obj3 == true then
|
if not obj2 == true and not obj3 == true then
|
||||||
if Cr == "a" then
|
if Cr == "a" then
|
||||||
addRobot(x,y,"b",Cr)
|
addRobot(x, y, "b", Cr)
|
||||||
elseif Cr == "b" then
|
elseif Cr == "b" then
|
||||||
addRobot(x,y,"d",Cr)
|
addRobot(x, y, "d", Cr)
|
||||||
end
|
end
|
||||||
elseif obj == true and obj2 == true and obj3 == true then
|
elseif obj == true and obj2 == true and obj3 == true then
|
||||||
addRobot(x,y,"a",Cr)
|
addRobot(x, y, "a", Cr)
|
||||||
else
|
else
|
||||||
if obj3 == true then
|
if obj3 == true then
|
||||||
addRobot(x,y,"d",Cr)
|
addRobot(x, y, "d", Cr)
|
||||||
elseif obj2 == true then
|
elseif obj2 == true then
|
||||||
addRobot(x,y,"b",Cr)
|
addRobot(x, y, "b", Cr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif sSide == "d" then
|
elseif sSide == "d" then
|
||||||
local obj = isBrick(x-1,y)
|
local obj = isBrick(x - 1, y)
|
||||||
tScreen[x][y].robot = "zz"
|
tScreen[x][y].robot = "zz"
|
||||||
if not obj == true then
|
if not obj == true then
|
||||||
addRobot(x-1,y,sSide,Cr)
|
addRobot(x - 1, y, sSide, Cr)
|
||||||
else
|
else
|
||||||
local obj2 = isBrick(x,y-1)
|
local obj2 = isBrick(x, y - 1)
|
||||||
local obj3 = isBrick(x,y+1)
|
local obj3 = isBrick(x, y + 1)
|
||||||
if not obj2 == true and not obj3 == true then
|
if not obj2 == true and not obj3 == true then
|
||||||
if Cr == "a" then
|
if Cr == "a" then
|
||||||
addRobot(x,y,"c",Cr)
|
addRobot(x, y, "c", Cr)
|
||||||
elseif Cr == "b" then
|
elseif Cr == "b" then
|
||||||
addRobot(x,y,"a",Cr)
|
addRobot(x, y, "a", Cr)
|
||||||
end
|
end
|
||||||
elseif obj == true and obj2 == true and obj3 == true then
|
elseif obj == true and obj2 == true and obj3 == true then
|
||||||
addRobot(x,y,"b",Cr)
|
addRobot(x, y, "b", Cr)
|
||||||
else
|
else
|
||||||
if obj3 == true then
|
if obj3 == true then
|
||||||
addRobot(x,y,"a",Cr)
|
addRobot(x, y, "a", Cr)
|
||||||
elseif obj2 == true then
|
elseif obj2 == true then
|
||||||
addRobot(x,y,"c",Cr)
|
addRobot(x, y, "c", Cr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
addRobot(x,y,sSide,"g")
|
addRobot(x, y, sSide, "g")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -515,15 +514,15 @@ end
|
|||||||
function InterFace.drawBar()
|
function InterFace.drawBar()
|
||||||
term.setBackgroundColor( colors.black )
|
term.setBackgroundColor( colors.black )
|
||||||
term.setTextColor( InterFace.cTitle )
|
term.setTextColor( InterFace.cTitle )
|
||||||
printCentred( 1, " "..sLevelTitle.." " )
|
printCentred( 1, " " .. sLevelTitle .. " " )
|
||||||
|
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
term.setBackgroundColor( cW )
|
term.setBackgroundColor( cW )
|
||||||
write( " " )
|
write( " " )
|
||||||
term.setBackgroundColor( colors.black )
|
term.setBackgroundColor( colors.black )
|
||||||
write( " x "..tostring(Blocks).." " )
|
write( " x " .. tostring(Blocks) .. " " )
|
||||||
|
|
||||||
term.setCursorPos( TermW-8,TermH )
|
term.setCursorPos( TermW - 8, TermH )
|
||||||
term.setBackgroundColor( colors.black )
|
term.setBackgroundColor( colors.black )
|
||||||
term.setTextColour(InterFace.cSpeedD)
|
term.setTextColour(InterFace.cSpeedD)
|
||||||
write(" <<" )
|
write(" <<" )
|
||||||
@ -540,7 +539,7 @@ function InterFace.drawBar()
|
|||||||
end
|
end
|
||||||
write(" >>")
|
write(" >>")
|
||||||
|
|
||||||
term.setCursorPos( TermW-1, 1 )
|
term.setCursorPos( TermW - 1, 1 )
|
||||||
term.setBackgroundColor( colors.black )
|
term.setBackgroundColor( colors.black )
|
||||||
term.setTextColour( InterFace.cExit )
|
term.setTextColour( InterFace.cExit )
|
||||||
write(" X")
|
write(" X")
|
||||||
@ -548,35 +547,35 @@ function InterFace.drawBar()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function InterFace.render()
|
function InterFace.render()
|
||||||
local id,p1,p2,p3 = os.pullEvent()
|
local id, p1, p2, p3 = os.pullEvent()
|
||||||
if id == "mouse_click" then
|
if id == "mouse_click" then
|
||||||
if p3 == 1 and p2 == TermW then
|
if p3 == 1 and p2 == TermW then
|
||||||
return "end"
|
return "end"
|
||||||
elseif p3 == TermH and p2 >= TermW-7 and p2 <= TermW-6 then
|
elseif p3 == TermH and p2 >= TermW - 7 and p2 <= TermW - 6 then
|
||||||
return "retry"
|
return "retry"
|
||||||
elseif p3 == TermH and p2 >= TermW-4 and p2 <= TermW-3 then
|
elseif p3 == TermH and p2 >= TermW - 4 and p2 <= TermW - 3 then
|
||||||
bPaused = not bPaused
|
bPaused = not bPaused
|
||||||
fSpeedS = false
|
fSpeedS = false
|
||||||
Speed = (bPaused and 0) or nSpeed
|
Speed = bPaused and 0 or nSpeed
|
||||||
if Speed > 0 then
|
if Speed > 0 then
|
||||||
Tick = os.startTimer(Speed)
|
Tick = os.startTimer(Speed)
|
||||||
else
|
else
|
||||||
Tick = nil
|
Tick = nil
|
||||||
end
|
end
|
||||||
InterFace.drawBar()
|
InterFace.drawBar()
|
||||||
elseif p3 == TermH and p2 >= TermW-1 then
|
elseif p3 == TermH and p2 >= TermW - 1 then
|
||||||
bPaused = false
|
bPaused = false
|
||||||
fSpeedS = not fSpeedS
|
fSpeedS = not fSpeedS
|
||||||
Speed = (fSpeedS and fSpeed) or nSpeed
|
Speed = fSpeedS and fSpeed or nSpeed
|
||||||
Tick = os.startTimer(Speed)
|
Tick = os.startTimer(Speed)
|
||||||
InterFace.drawBar()
|
InterFace.drawBar()
|
||||||
elseif p3-1 < YOrgin+SizeH+1 and p3-1 > YOrgin and
|
elseif p3 - 1 < YOrgin + SizeH + 1 and p3 - 1 > YOrgin and
|
||||||
p2 < XOrgin+SizeW+1 and p2 > XOrgin then
|
p2 < XOrgin + SizeW + 1 and p2 > XOrgin then
|
||||||
local eobj = tScreen[p2-XOrgin][p3-YOrgin-1]
|
local eobj = tScreen[p2 - XOrgin][p3 - YOrgin - 1]
|
||||||
local erobj = tostring(tScreen[p2-XOrgin][p3-YOrgin-1].robot)
|
local erobj = tostring(tScreen[p2 - XOrgin][p3 - YOrgin - 1].robot)
|
||||||
if (erobj == "zz" or erobj == "nil") and not eobj.wall == true and not eobj.space == true and Blocks > 0 then
|
if (erobj == "zz" or erobj == "nil") and not eobj.wall == true and not eobj.space == true and Blocks > 0 then
|
||||||
addWall(p2-XOrgin,p3-YOrgin-1)
|
addWall(p2 - XOrgin, p3 - YOrgin - 1)
|
||||||
Blocks = Blocks-1
|
Blocks = Blocks - 1
|
||||||
InterFace.drawBar()
|
InterFace.drawBar()
|
||||||
drawMap()
|
drawMap()
|
||||||
end
|
end
|
||||||
@ -596,7 +595,6 @@ local function startG(LevelN)
|
|||||||
drawStars()
|
drawStars()
|
||||||
loadLevel(LevelN)
|
loadLevel(LevelN)
|
||||||
centerOrgin()
|
centerOrgin()
|
||||||
local create = true
|
|
||||||
drawMap()
|
drawMap()
|
||||||
InterFace.drawBar()
|
InterFace.drawBar()
|
||||||
gRender("start")
|
gRender("start")
|
||||||
@ -637,17 +635,17 @@ if ok and not sStartLevel then
|
|||||||
term.clear()
|
term.clear()
|
||||||
drawStars()
|
drawStars()
|
||||||
term.setTextColor( colors.red )
|
term.setTextColor( colors.red )
|
||||||
printCentred( TermH/2 - 1, " REDIRECTION " )
|
printCentred( TermH / 2 - 1, " REDIRECTION " )
|
||||||
printCentred( TermH/2 - 0, " ComputerCraft Edition " )
|
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
|
||||||
term.setTextColor( colors.yellow )
|
term.setTextColor( colors.yellow )
|
||||||
printCentred( TermH/2 + 2, " Click to Begin " )
|
printCentred( TermH / 2 + 2, " Click to Begin " )
|
||||||
os.pullEvent( "mouse_click" )
|
os.pullEvent( "mouse_click" )
|
||||||
end )
|
end )
|
||||||
end
|
end
|
||||||
|
|
||||||
--Game--
|
--Game--
|
||||||
if ok then
|
if ok then
|
||||||
ok,err = pcall( function()
|
ok, err = pcall( function()
|
||||||
local nLevel
|
local nLevel
|
||||||
if sStartLevel then
|
if sStartLevel then
|
||||||
nLevel = tonumber( sStartLevel )
|
nLevel = tonumber( sStartLevel )
|
||||||
@ -670,18 +668,18 @@ if ok then
|
|||||||
drawStars()
|
drawStars()
|
||||||
term.setTextColor( colors.red )
|
term.setTextColor( colors.red )
|
||||||
if TermW >= 40 then
|
if TermW >= 40 then
|
||||||
printCentred( TermH/2 - 1, " Thank you for playing Redirection " )
|
printCentred( TermH / 2 - 1, " Thank you for playing Redirection " )
|
||||||
printCentred( TermH/2 - 0, " ComputerCraft Edition " )
|
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
|
||||||
printCentred( TermH/2 + 2, " Check out the full game: " )
|
printCentred( TermH / 2 + 2, " Check out the full game: " )
|
||||||
term.setTextColor( colors.yellow )
|
term.setTextColor( colors.yellow )
|
||||||
printCentred( TermH/2 + 3, " http://www.redirectiongame.com " )
|
printCentred( TermH / 2 + 3, " http://www.redirectiongame.com " )
|
||||||
else
|
else
|
||||||
printCentred( TermH/2 - 2, " Thank you for " )
|
printCentred( TermH / 2 - 2, " Thank you for " )
|
||||||
printCentred( TermH/2 - 1, " playing Redirection " )
|
printCentred( TermH / 2 - 1, " playing Redirection " )
|
||||||
printCentred( TermH/2 - 0, " ComputerCraft Edition " )
|
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
|
||||||
printCentred( TermH/2 + 2, " Check out the full game: " )
|
printCentred( TermH / 2 + 2, " Check out the full game: " )
|
||||||
term.setTextColor( colors.yellow )
|
term.setTextColor( colors.yellow )
|
||||||
printCentred( TermH/2 + 3, " www.redirectiongame.com " )
|
printCentred( TermH / 2 + 3, " www.redirectiongame.com " )
|
||||||
end
|
end
|
||||||
parallel.waitForAll(
|
parallel.waitForAll(
|
||||||
function() sleep(2) end,
|
function() sleep(2) end,
|
||||||
@ -691,7 +689,7 @@ if ok then
|
|||||||
end
|
end
|
||||||
|
|
||||||
--Clear and exit--
|
--Clear and exit--
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.clear()
|
term.clear()
|
||||||
|
@ -112,7 +112,7 @@ local items = {
|
|||||||
desc = "A perfect handle for torches or a pickaxe.",
|
desc = "A perfect handle for torches or a pickaxe.",
|
||||||
},
|
},
|
||||||
["a crafting table"] = {
|
["a crafting table"] = {
|
||||||
aliases = { "crafting table", "craft table", "work bench", "workbench", "crafting bench", "table", },
|
aliases = { "crafting table", "craft table", "work bench", "workbench", "crafting bench", "table" },
|
||||||
desc = "It's a crafting table. I shouldn't tell you this, but these don't actually do anything in this game, you can craft tools whenever you like.",
|
desc = "It's a crafting table. I shouldn't tell you this, but these don't actually do anything in this game, you can craft tools whenever you like.",
|
||||||
},
|
},
|
||||||
["a furnace"] = {
|
["a furnace"] = {
|
||||||
@ -270,7 +270,7 @@ local tAnimals = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
local tMonsters = {
|
local tMonsters = {
|
||||||
"a creeper", "a skeleton", "a zombie", "a spider"
|
"a creeper", "a skeleton", "a zombie", "a spider",
|
||||||
}
|
}
|
||||||
|
|
||||||
local tRecipes = {
|
local tRecipes = {
|
||||||
@ -309,8 +309,8 @@ local tGoWest = {
|
|||||||
local nGoWest = 0
|
local nGoWest = 0
|
||||||
|
|
||||||
local bRunning = true
|
local bRunning = true
|
||||||
local tMap = { { {}, }, }
|
local tMap = { { {} } }
|
||||||
local x,y,z = 0,0,0
|
local x, y, z = 0, 0, 0
|
||||||
local inventory = {
|
local inventory = {
|
||||||
["no tea"] = items["no tea"],
|
["no tea"] = items["no tea"],
|
||||||
}
|
}
|
||||||
@ -338,11 +338,11 @@ local tDayCycle = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
local function getTimeOfDay()
|
local function getTimeOfDay()
|
||||||
return math.fmod( math.floor(nTurn/3), #tDayCycle ) + 1
|
return math.fmod( math.floor(nTurn / 3), #tDayCycle ) + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local function isSunny()
|
local function isSunny()
|
||||||
return (getTimeOfDay() < 10)
|
return getTimeOfDay() < 10
|
||||||
end
|
end
|
||||||
|
|
||||||
local function getRoom( x, y, z, dontCreate )
|
local function getRoom( x, y, z, dontCreate )
|
||||||
@ -364,21 +364,21 @@ local function getRoom( x, y, z, dontCreate )
|
|||||||
room.trees = hasTrees( room.nBiome )
|
room.trees = hasTrees( room.nBiome )
|
||||||
|
|
||||||
-- Add animals
|
-- Add animals
|
||||||
if math.random(1,3) == 1 then
|
if math.random(1, 3) == 1 then
|
||||||
for n = 1,math.random(1,2) do
|
for _ = 1, math.random(1, 2) do
|
||||||
local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ]
|
local sAnimal = tAnimals[ math.random( 1, #tAnimals ) ]
|
||||||
room.items[ sAnimal ] = items[ sAnimal ]
|
room.items[ sAnimal ] = items[ sAnimal ]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Add surface ore
|
-- Add surface ore
|
||||||
if math.random(1,5) == 1 or hasStone( room.nBiome ) then
|
if math.random(1, 5) == 1 or hasStone( room.nBiome ) then
|
||||||
room.items[ "some stone" ] = items[ "some stone" ]
|
room.items[ "some stone" ] = items[ "some stone" ]
|
||||||
end
|
end
|
||||||
if math.random(1,8) == 1 then
|
if math.random(1, 8) == 1 then
|
||||||
room.items[ "some coal" ] = items[ "some coal" ]
|
room.items[ "some coal" ] = items[ "some coal" ]
|
||||||
end
|
end
|
||||||
if math.random(1,8) == 1 and hasRivers( room.nBiome ) then
|
if math.random(1, 8) == 1 and hasRivers( room.nBiome ) then
|
||||||
room.items[ "a river" ] = items[ "a river" ]
|
room.items[ "a river" ] = items[ "a river" ]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -389,7 +389,7 @@ local function getRoom( x, y, z, dontCreate )
|
|||||||
["east"] = true,
|
["east"] = true,
|
||||||
["west"] = true,
|
["west"] = true,
|
||||||
}
|
}
|
||||||
if math.random(1,8) == 1 then
|
if math.random(1, 8) == 1 then
|
||||||
room.exits["down"] = true
|
room.exits["down"] = true
|
||||||
room.items["a cave entrance"] = items["a cave entrance"]
|
room.items["a cave entrance"] = items["a cave entrance"]
|
||||||
end
|
end
|
||||||
@ -404,7 +404,7 @@ local function getRoom( x, y, z, dontCreate )
|
|||||||
room.exits[sDir] = true
|
room.exits[sDir] = true
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if math.random(1,3) == 1 then
|
if math.random(1, 3) == 1 then
|
||||||
room.exits[sDir] = true
|
room.exits[sDir] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -431,13 +431,13 @@ local function getRoom( x, y, z, dontCreate )
|
|||||||
|
|
||||||
-- Add ores
|
-- Add ores
|
||||||
room.items[ "some stone" ] = items[ "some stone" ]
|
room.items[ "some stone" ] = items[ "some stone" ]
|
||||||
if math.random(1,3) == 1 then
|
if math.random(1, 3) == 1 then
|
||||||
room.items[ "some coal" ] = items[ "some coal" ]
|
room.items[ "some coal" ] = items[ "some coal" ]
|
||||||
end
|
end
|
||||||
if math.random(1,8) == 1 then
|
if math.random(1, 8) == 1 then
|
||||||
room.items[ "some iron" ] = items[ "some iron" ]
|
room.items[ "some iron" ] = items[ "some iron" ]
|
||||||
end
|
end
|
||||||
if y == -3 and math.random(1,15) == 1 then
|
if y == -3 and math.random(1, 15) == 1 then
|
||||||
room.items[ "some diamond" ] = items[ "some diamond" ]
|
room.items[ "some diamond" ] = items[ "some diamond" ]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -478,7 +478,7 @@ local function findItem( _tList, _sQuery )
|
|||||||
return sItem
|
return sItem
|
||||||
end
|
end
|
||||||
if tItem.aliases ~= nil then
|
if tItem.aliases ~= nil then
|
||||||
for n, sAlias in pairs( tItem.aliases ) do
|
for _, sAlias in pairs( tItem.aliases ) do
|
||||||
if sAlias == _sQuery then
|
if sAlias == _sQuery then
|
||||||
return sItem
|
return sItem
|
||||||
end
|
end
|
||||||
@ -613,7 +613,7 @@ local function doCommand( text )
|
|||||||
end
|
end
|
||||||
|
|
||||||
for sCommand, t in pairs( tMatches ) do
|
for sCommand, t in pairs( tMatches ) do
|
||||||
for n, sMatch in pairs( t ) do
|
for _, sMatch in pairs( t ) do
|
||||||
local tCaptures = { string.match( text, "^" .. sMatch .. "$" ) }
|
local tCaptures = { string.match( text, "^" .. sMatch .. "$" ) }
|
||||||
if #tCaptures ~= 0 then
|
if #tCaptures ~= 0 then
|
||||||
local fnCommand = commands[ sCommand ]
|
local fnCommand = commands[ sCommand ]
|
||||||
@ -634,7 +634,7 @@ function commands.wait()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function commands.look( _sTarget )
|
function commands.look( _sTarget )
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
if room.dark then
|
if room.dark then
|
||||||
print( "It is pitch dark." )
|
print( "It is pitch dark." )
|
||||||
return
|
return
|
||||||
@ -648,7 +648,7 @@ function commands.look( _sTarget )
|
|||||||
else
|
else
|
||||||
io.write( "You are underground. " )
|
io.write( "You are underground. " )
|
||||||
if next( room.exits ) ~= nil then
|
if next( room.exits ) ~= nil then
|
||||||
print( "You can travel "..itemize( room.exits ).."." )
|
print( "You can travel " .. itemize( room.exits ) .. "." )
|
||||||
else
|
else
|
||||||
print()
|
print()
|
||||||
end
|
end
|
||||||
@ -679,16 +679,16 @@ function commands.look( _sTarget )
|
|||||||
end
|
end
|
||||||
|
|
||||||
if tItem then
|
if tItem then
|
||||||
print( tItem.desc or ("You see nothing special about "..sItem..".") )
|
print( tItem.desc or "You see nothing special about " .. sItem .. "." )
|
||||||
else
|
else
|
||||||
print( "You don't see any ".._sTarget.." here." )
|
print( "You don't see any " .. _sTarget .. " here." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function commands.go( _sDir )
|
function commands.go( _sDir )
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
if _sDir == nil then
|
if _sDir == nil then
|
||||||
print( "Go where?" )
|
print( "Go where?" )
|
||||||
return
|
return
|
||||||
@ -735,7 +735,7 @@ function commands.go( _sDir )
|
|||||||
end
|
end
|
||||||
|
|
||||||
function commands.dig( _sDir, _sTool )
|
function commands.dig( _sDir, _sTool )
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
if _sDir == nil then
|
if _sDir == nil then
|
||||||
print( "Dig where?" )
|
print( "Dig where?" )
|
||||||
return
|
return
|
||||||
@ -746,13 +746,13 @@ function commands.dig( _sDir, _sTool )
|
|||||||
if _sTool ~= nil then
|
if _sTool ~= nil then
|
||||||
sTool = findItem( inventory, _sTool )
|
sTool = findItem( inventory, _sTool )
|
||||||
if not sTool then
|
if not sTool then
|
||||||
print( "You're not carrying a ".._sTool.."." )
|
print( "You're not carrying a " .. _sTool .. "." )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
tTool = inventory[ sTool ]
|
tTool = inventory[ sTool ]
|
||||||
end
|
end
|
||||||
|
|
||||||
local bActuallyDigging = (room.exits[ _sDir ] ~= true)
|
local bActuallyDigging = room.exits[ _sDir ] ~= true
|
||||||
if bActuallyDigging then
|
if bActuallyDigging then
|
||||||
if sTool == nil or tTool.toolType ~= "pick" then
|
if sTool == nil or tTool.toolType ~= "pick" then
|
||||||
print( "You need to use a pickaxe to dig through stone." )
|
print( "You need to use a pickaxe to dig through stone." )
|
||||||
@ -827,10 +827,10 @@ function commands.dig( _sDir, _sTool )
|
|||||||
_sDir == "up" and y == 0 then
|
_sDir == "up" and y == 0 then
|
||||||
inventory[ "some dirt" ] = items[ "some dirt" ]
|
inventory[ "some dirt" ] = items[ "some dirt" ]
|
||||||
inventory[ "some stone" ] = items[ "some stone" ]
|
inventory[ "some stone" ] = items[ "some stone" ]
|
||||||
print( "You dig ".._sDir.." using "..sTool.." and collect some dirt and stone." )
|
print( "You dig " .. _sDir .. " using " .. sTool .. " and collect some dirt and stone." )
|
||||||
else
|
else
|
||||||
inventory[ "some stone" ] = items[ "some stone" ]
|
inventory[ "some stone" ] = items[ "some stone" ]
|
||||||
print( "You dig ".._sDir.." using "..sTool.." and collect some stone." )
|
print( "You dig " .. _sDir .. " using " .. sTool .. " and collect some stone." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -848,7 +848,7 @@ function commands.drop( _sItem )
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
local sItem = findItem( inventory, _sItem )
|
local sItem = findItem( inventory, _sItem )
|
||||||
if sItem then
|
if sItem then
|
||||||
local tItem = inventory[ sItem ]
|
local tItem = inventory[ sItem ]
|
||||||
@ -860,7 +860,7 @@ function commands.drop( _sItem )
|
|||||||
print( "Dropped." )
|
print( "Dropped." )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "You don't have a ".._sItem.."." )
|
print( "You don't have a " .. _sItem .. "." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -871,7 +871,7 @@ function commands.place( _sItem )
|
|||||||
end
|
end
|
||||||
|
|
||||||
if _sItem == "torch" or _sItem == "a torch" then
|
if _sItem == "torch" or _sItem == "a torch" then
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
if inventory["some torches"] or inventory["a torch"] then
|
if inventory["some torches"] or inventory["a torch"] then
|
||||||
inventory["a torch"] = nil
|
inventory["a torch"] = nil
|
||||||
room.items["a torch"] = items["a torch"]
|
room.items["a torch"] = items["a torch"]
|
||||||
@ -898,12 +898,12 @@ function commands.take( _sItem )
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
local sItem = findItem( room.items, _sItem )
|
local sItem = findItem( room.items, _sItem )
|
||||||
if sItem then
|
if sItem then
|
||||||
local tItem = room.items[ sItem ]
|
local tItem = room.items[ sItem ]
|
||||||
if tItem.heavy == true then
|
if tItem.heavy == true then
|
||||||
print( "You can't carry "..sItem.."." )
|
print( "You can't carry " .. sItem .. "." )
|
||||||
elseif tItem.ore == true then
|
elseif tItem.ore == true then
|
||||||
print( "You need to mine this ore." )
|
print( "You need to mine this ore." )
|
||||||
else
|
else
|
||||||
@ -923,7 +923,7 @@ function commands.take( _sItem )
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "You don't see a ".._sItem.." here." )
|
print( "You don't see a " .. _sItem .. " here." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -933,7 +933,7 @@ function commands.mine( _sItem, _sTool )
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
if _sTool == nil then
|
if _sTool == nil then
|
||||||
print( "Mine ".._sItem.." with what?" )
|
print( "Mine " .. _sItem .. " with what?" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
commands.cbreak( _sItem, _sTool )
|
commands.cbreak( _sItem, _sTool )
|
||||||
@ -957,12 +957,12 @@ function commands.cbreak( _sItem, _sTool )
|
|||||||
if _sTool ~= nil then
|
if _sTool ~= nil then
|
||||||
sTool = findItem( inventory, _sTool )
|
sTool = findItem( inventory, _sTool )
|
||||||
if sTool == nil then
|
if sTool == nil then
|
||||||
print( "You're not carrying a ".._sTool.."." )
|
print( "You're not carrying a " .. _sTool .. "." )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
if _sItem == "tree" or _sItem == "trees" or _sItem == "a tree" then
|
if _sItem == "tree" or _sItem == "trees" or _sItem == "a tree" then
|
||||||
print( "The tree breaks into blocks of wood, which you pick up." )
|
print( "The tree breaks into blocks of wood, which you pick up." )
|
||||||
inventory[ "some wood" ] = items[ "some wood" ]
|
inventory[ "some wood" ] = items[ "some wood" ]
|
||||||
@ -990,18 +990,18 @@ function commands.cbreak( _sItem, _sTool )
|
|||||||
local tTool = inventory[ sTool ]
|
local tTool = inventory[ sTool ]
|
||||||
if tTool.tool then
|
if tTool.tool then
|
||||||
if tTool.toolLevel < tItem.toolLevel then
|
if tTool.toolLevel < tItem.toolLevel then
|
||||||
print( sTool .." is not strong enough to break this ore." )
|
print( sTool .. " is not strong enough to break this ore." )
|
||||||
elseif tTool.toolType ~= tItem.toolType then
|
elseif tTool.toolType ~= tItem.toolType then
|
||||||
print( "You need a different kind of tool to break this ore." )
|
print( "You need a different kind of tool to break this ore." )
|
||||||
else
|
else
|
||||||
print( "The ore breaks, dropping "..sItem..", which you pick up." )
|
print( "The ore breaks, dropping " .. sItem .. ", which you pick up." )
|
||||||
inventory[ sItem ] = items[ sItem ]
|
inventory[ sItem ] = items[ sItem ]
|
||||||
if tItem.infinite ~= true then
|
if tItem.infinite ~= true then
|
||||||
room.items[ sItem ] = nil
|
room.items[ sItem ] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "You can't break "..sItem.." with "..sTool..".")
|
print( "You can't break " .. sItem .. " with " .. sTool .. ".")
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif tItem.creature == true then
|
elseif tItem.creature == true then
|
||||||
@ -1018,12 +1018,12 @@ function commands.cbreak( _sItem, _sTool )
|
|||||||
local tChances = { 0.2, 0.4, 0.55, 0.8, 1 }
|
local tChances = { 0.2, 0.4, 0.55, 0.8, 1 }
|
||||||
if math.random() <= tChances[ toolLevel + 1 ] then
|
if math.random() <= tChances[ toolLevel + 1 ] then
|
||||||
room.items[ sItem ] = nil
|
room.items[ sItem ] = nil
|
||||||
print( "The "..tItem.aliases[1].." dies." )
|
print( "The " .. tItem.aliases[1] .. " dies." )
|
||||||
|
|
||||||
if tItem.drops then
|
if tItem.drops then
|
||||||
for n, sDrop in pairs( tItem.drops ) do
|
for _, sDrop in pairs( tItem.drops ) do
|
||||||
if not room.items[sDrop] then
|
if not room.items[sDrop] then
|
||||||
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
|
print( "The " .. tItem.aliases[1] .. " dropped " .. sDrop .. "." )
|
||||||
room.items[sDrop] = items[sDrop]
|
room.items[sDrop] = items[sDrop]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1033,23 +1033,23 @@ function commands.cbreak( _sItem, _sTool )
|
|||||||
room.nMonsters = room.nMonsters - 1
|
room.nMonsters = room.nMonsters - 1
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "The "..tItem.aliases[1].." is injured by your blow." )
|
print( "The " .. tItem.aliases[1] .. " is injured by your blow." )
|
||||||
end
|
end
|
||||||
|
|
||||||
if tItem.hitDrops then
|
if tItem.hitDrops then
|
||||||
for n, sDrop in pairs( tItem.hitDrops ) do
|
for _, sDrop in pairs( tItem.hitDrops ) do
|
||||||
if not room.items[sDrop] then
|
if not room.items[sDrop] then
|
||||||
print( "The "..tItem.aliases[1].." dropped "..sDrop.."." )
|
print( "The " .. tItem.aliases[1] .. " dropped " .. sDrop .. "." )
|
||||||
room.items[sDrop] = items[sDrop]
|
room.items[sDrop] = items[sDrop]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
print( "You can't break "..sItem.."." )
|
print( "You can't break " .. sItem .. "." )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "You don't see a ".._sItem.." here." )
|
print( "You don't see a " .. _sItem .. " here." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1071,18 +1071,17 @@ function commands.craft( _sItem )
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local room = getRoom( x,y,z )
|
|
||||||
local sItem = findItem( items, _sItem )
|
local sItem = findItem( items, _sItem )
|
||||||
local tRecipe = (sItem and tRecipes[ sItem ]) or nil
|
local tRecipe = sItem and tRecipes[ sItem ] or nil
|
||||||
if tRecipe then
|
if tRecipe then
|
||||||
for n,sReq in ipairs( tRecipe ) do
|
for _, sReq in ipairs( tRecipe ) do
|
||||||
if inventory[sReq] == nil then
|
if inventory[sReq] == nil then
|
||||||
print( "You don't have the items you need to craft "..sItem.."." )
|
print( "You don't have the items you need to craft " .. sItem .. "." )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for n,sReq in ipairs( tRecipe ) do
|
for _, sReq in ipairs( tRecipe ) do
|
||||||
inventory[sReq] = nil
|
inventory[sReq] = nil
|
||||||
end
|
end
|
||||||
inventory[ sItem ] = items[ sItem ]
|
inventory[ sItem ] = items[ sItem ]
|
||||||
@ -1091,7 +1090,7 @@ function commands.craft( _sItem )
|
|||||||
end
|
end
|
||||||
print( "Crafted." )
|
print( "Crafted." )
|
||||||
else
|
else
|
||||||
print( "You don't know how to make "..(sItem or _sItem).."." )
|
print( "You don't know how to make " .. (sItem or _sItem) .. "." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1116,12 +1115,12 @@ function commands.build( _sThing, _sMaterial )
|
|||||||
else
|
else
|
||||||
sMaterial = findItem( inventory, _sMaterial )
|
sMaterial = findItem( inventory, _sMaterial )
|
||||||
if not sMaterial then
|
if not sMaterial then
|
||||||
print( "You don't have any ".._sMaterial )
|
print( "You don't have any " .. _sMaterial )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if inventory[sMaterial].material ~= true then
|
if inventory[sMaterial].material ~= true then
|
||||||
print( sMaterial.." is not a good building material." )
|
print( sMaterial .. " is not a good building material." )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1131,12 +1130,12 @@ function commands.build( _sThing, _sMaterial )
|
|||||||
alias = string.match( _sThing, "a ([%a ]+)" )
|
alias = string.match( _sThing, "a ([%a ]+)" )
|
||||||
end
|
end
|
||||||
|
|
||||||
local room = getRoom( x,y,z )
|
local room = getRoom( x, y, z )
|
||||||
inventory[sMaterial] = nil
|
inventory[sMaterial] = nil
|
||||||
room.items[ _sThing ] = {
|
room.items[ _sThing ] = {
|
||||||
heavy = true,
|
heavy = true,
|
||||||
aliases = { alias },
|
aliases = { alias },
|
||||||
desc = "As you look at your creation (made from "..sMaterial.."), you feel a swelling sense of pride.",
|
desc = "As you look at your creation (made from " .. sMaterial .. "), you feel a swelling sense of pride.",
|
||||||
}
|
}
|
||||||
|
|
||||||
print( "Your construction is complete." )
|
print( "Your construction is complete." )
|
||||||
@ -1159,7 +1158,7 @@ function commands.eat( _sItem )
|
|||||||
|
|
||||||
local sItem = findItem( inventory, _sItem )
|
local sItem = findItem( inventory, _sItem )
|
||||||
if not sItem then
|
if not sItem then
|
||||||
print( "You don't have any ".._sItem.."." )
|
print( "You don't have any " .. _sItem .. "." )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1173,7 +1172,7 @@ function commands.eat( _sItem )
|
|||||||
bInjured = false
|
bInjured = false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "You can't eat "..sItem.."." )
|
print( "You can't eat " .. sItem .. "." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1196,7 +1195,7 @@ function commands.badinput()
|
|||||||
"That doesn't make any sense.",
|
"That doesn't make any sense.",
|
||||||
"What?",
|
"What?",
|
||||||
}
|
}
|
||||||
print( tResponses[ math.random(1,#tResponses) ] )
|
print( tResponses[ math.random(1, #tResponses) ] )
|
||||||
end
|
end
|
||||||
|
|
||||||
function commands.noinput()
|
function commands.noinput()
|
||||||
@ -1207,32 +1206,32 @@ function commands.noinput()
|
|||||||
"Don't be shy.",
|
"Don't be shy.",
|
||||||
"Use your words.",
|
"Use your words.",
|
||||||
}
|
}
|
||||||
print( tResponses[ math.random(1,#tResponses) ] )
|
print( tResponses[ math.random(1, #tResponses) ] )
|
||||||
end
|
end
|
||||||
|
|
||||||
local function simulate()
|
local function simulate()
|
||||||
local bNewMonstersThisRoom = false
|
local bNewMonstersThisRoom = false
|
||||||
|
|
||||||
-- Spawn monsters in nearby rooms
|
-- Spawn monsters in nearby rooms
|
||||||
for sx = -2,2 do
|
for sx = -2, 2 do
|
||||||
for sy = -1,1 do
|
for sy = -1, 1 do
|
||||||
for sz = -2,2 do
|
for sz = -2, 2 do
|
||||||
local h = y + sy
|
local h = y + sy
|
||||||
if h >= -3 and h <= 0 then
|
if h >= -3 and h <= 0 then
|
||||||
local room = getRoom( x + sx, h, z + sz )
|
local room = getRoom( x + sx, h, z + sz )
|
||||||
|
|
||||||
-- Spawn monsters
|
-- Spawn monsters
|
||||||
if room.nMonsters < 2 and
|
if room.nMonsters < 2 and
|
||||||
((h == 0 and not isSunny() and not room.items["a torch"]) or room.dark) and
|
(h == 0 and not isSunny() and not room.items["a torch"] or room.dark) and
|
||||||
math.random(1,6) == 1 then
|
math.random(1, 6) == 1 then
|
||||||
|
|
||||||
local sMonster = tMonsters[ math.random(1,#tMonsters) ]
|
local sMonster = tMonsters[ math.random(1, #tMonsters) ]
|
||||||
if room.items[ sMonster ] == nil then
|
if room.items[ sMonster ] == nil then
|
||||||
room.items[ sMonster ] = items[ sMonster ]
|
room.items[ sMonster ] = items[ sMonster ]
|
||||||
room.nMonsters = room.nMonsters + 1
|
room.nMonsters = room.nMonsters + 1
|
||||||
|
|
||||||
if sx == 0 and sy == 0 and sz == 0 and not room.dark then
|
if sx == 0 and sy == 0 and sz == 0 and not room.dark then
|
||||||
print( "From the shadows, "..sMonster.." appears." )
|
print( "From the shadows, " .. sMonster .. " appears." )
|
||||||
bNewMonstersThisRoom = true
|
bNewMonstersThisRoom = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1240,11 +1239,11 @@ local function simulate()
|
|||||||
|
|
||||||
-- Burn monsters
|
-- Burn monsters
|
||||||
if h == 0 and isSunny() then
|
if h == 0 and isSunny() then
|
||||||
for n,sMonster in ipairs( tMonsters ) do
|
for _, sMonster in ipairs( tMonsters ) do
|
||||||
if room.items[sMonster] and items[sMonster].nocturnal then
|
if room.items[sMonster] and items[sMonster].nocturnal then
|
||||||
room.items[sMonster] = nil
|
room.items[sMonster] = nil
|
||||||
if sx == 0 and sy == 0 and sz == 0 and not room.dark then
|
if sx == 0 and sy == 0 and sz == 0 and not room.dark then
|
||||||
print( "With the sun high in the sky, the "..items[sMonster].aliases[1].." bursts into flame and dies." )
|
print( "With the sun high in the sky, the " .. items[sMonster].aliases[1] .. " bursts into flame and dies." )
|
||||||
end
|
end
|
||||||
room.nMonsters = room.nMonsters - 1
|
room.nMonsters = room.nMonsters - 1
|
||||||
end
|
end
|
||||||
@ -1258,10 +1257,10 @@ local function simulate()
|
|||||||
-- Make monsters attack
|
-- Make monsters attack
|
||||||
local room = getRoom( x, y, z )
|
local room = getRoom( x, y, z )
|
||||||
if nTimeInRoom >= 2 and not bNewMonstersThisRoom then
|
if nTimeInRoom >= 2 and not bNewMonstersThisRoom then
|
||||||
for n,sMonster in ipairs( tMonsters ) do
|
for _, sMonster in ipairs( tMonsters ) do
|
||||||
if room.items[sMonster] then
|
if room.items[sMonster] then
|
||||||
if math.random(1,4) == 1 and
|
if math.random(1, 4) == 1 and
|
||||||
not (y == 0 and isSunny() and (sMonster == "a spider")) then
|
not (y == 0 and isSunny() and sMonster == "a spider") then
|
||||||
if sMonster == "a creeper" then
|
if sMonster == "a creeper" then
|
||||||
if room.dark then
|
if room.dark then
|
||||||
print( "A creeper explodes." )
|
print( "A creeper explodes." )
|
||||||
@ -1272,9 +1271,9 @@ local function simulate()
|
|||||||
room.nMonsters = room.nMonsters - 1
|
room.nMonsters = room.nMonsters - 1
|
||||||
else
|
else
|
||||||
if room.dark then
|
if room.dark then
|
||||||
print( "A "..items[sMonster].aliases[1].." attacks you." )
|
print( "A " .. items[sMonster].aliases[1] .. " attacks you." )
|
||||||
else
|
else
|
||||||
print( "The "..items[sMonster].aliases[1].." attacks you." )
|
print( "The " .. items[sMonster].aliases[1] .. " attacks you." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ elseif sCommand == "play" or sCommand == nil then
|
|||||||
if sName == nil then
|
if sName == nil then
|
||||||
-- No disc specified, pick one at random
|
-- No disc specified, pick one at random
|
||||||
local tNames = {}
|
local tNames = {}
|
||||||
for n,sName in ipairs( peripheral.getNames() ) do
|
for _, sName in ipairs( peripheral.getNames() ) do
|
||||||
if disk.isPresent( sName ) and disk.hasAudio( sName ) then
|
if disk.isPresent( sName ) and disk.hasAudio( sName ) then
|
||||||
table.insert( tNames, sName )
|
table.insert( tNames, sName )
|
||||||
end
|
end
|
||||||
@ -32,15 +32,15 @@ elseif sCommand == "play" or sCommand == nil then
|
|||||||
print( "No Music Discs in attached disk drives" )
|
print( "No Music Discs in attached disk drives" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
sName = tNames[ math.random(1,#tNames) ]
|
sName = tNames[ math.random(1, #tNames) ]
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Play the disc
|
-- Play the disc
|
||||||
if disk.isPresent( sName ) and disk.hasAudio( sName ) then
|
if disk.isPresent( sName ) and disk.hasAudio( sName ) then
|
||||||
print( "Playing "..disk.getAudioTitle( sName ) )
|
print( "Playing " .. disk.getAudioTitle( sName ) )
|
||||||
disk.playAudio( sName )
|
disk.playAudio( sName )
|
||||||
else
|
else
|
||||||
print( "No Music Disc in disk drive: "..sName )
|
print( "No Music Disc in disk drive: " .. sName )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
if term.isColour() then
|
if term.isColour() then
|
||||||
term.setTextColour( 2^math.random(0,15) )
|
term.setTextColour( 2 ^ math.random(0, 15) )
|
||||||
end
|
end
|
||||||
textutils.slowPrint( "Hello World!" )
|
textutils.slowPrint( "Hello World!" )
|
||||||
term.setTextColour( colours.white )
|
term.setTextColour( colours.white )
|
||||||
|
@ -1,16 +1,14 @@
|
|||||||
|
|
||||||
-- Display the start screen
|
-- Display the start screen
|
||||||
local w,h = term.getSize()
|
local w, h = term.getSize()
|
||||||
|
|
||||||
local titleColour, headingColour, textColour, wormColour, fruitColour
|
local headingColour, textColour, wormColour, fruitColour
|
||||||
if term.isColour() then
|
if term.isColour() then
|
||||||
titleColour = colours.red
|
|
||||||
headingColour = colours.yellow
|
headingColour = colours.yellow
|
||||||
textColour = colours.white
|
textColour = colours.white
|
||||||
wormColour = colours.green
|
wormColour = colours.green
|
||||||
fruitColour = colours.red
|
fruitColour = colours.red
|
||||||
else
|
else
|
||||||
titleColour = colours.white
|
|
||||||
headingColour = colours.white
|
headingColour = colours.white
|
||||||
textColour = colours.white
|
textColour = colours.white
|
||||||
wormColour = colours.white
|
wormColour = colours.white
|
||||||
@ -18,30 +16,28 @@ else
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function printCentred( y, s )
|
local function printCentred( y, s )
|
||||||
local x = math.floor((w - string.len(s)) / 2)
|
local x = math.floor((w - #s) / 2)
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
--term.clearLine()
|
--term.clearLine()
|
||||||
term.write( s )
|
term.write( s )
|
||||||
end
|
end
|
||||||
|
|
||||||
local xVel,yVel = 1,0
|
local xVel, yVel = 1, 0
|
||||||
local xPos, yPos = math.floor(w/2), math.floor(h/2)
|
local xPos, yPos = math.floor(w / 2), math.floor(h / 2)
|
||||||
local pxVel, pyVel = nil, nil
|
local pxVel, pyVel = nil, nil
|
||||||
|
|
||||||
local nLength = 1
|
|
||||||
local nExtraLength = 6
|
local nExtraLength = 6
|
||||||
local bRunning = true
|
local bRunning = true
|
||||||
|
|
||||||
local tailX,tailY = xPos,yPos
|
local tailX, tailY = xPos, yPos
|
||||||
local nScore = 0
|
local nScore = 0
|
||||||
local nDifficulty = 2
|
local nDifficulty = 2
|
||||||
local nSpeed, nInterval
|
local nSpeed, nInterval
|
||||||
|
|
||||||
-- Setup the screen
|
-- Setup the screen
|
||||||
local screen = {}
|
local screen = {}
|
||||||
for x=1,w do
|
for x = 1, w do
|
||||||
screen[x] = {}
|
screen[x] = {}
|
||||||
for y=1,h do
|
for y = 1, h do
|
||||||
screen[x][y] = {}
|
screen[x][y] = {}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -58,17 +54,17 @@ local tFruits = {
|
|||||||
"q", "r", "s", "t", "u", "v", "w", "x",
|
"q", "r", "s", "t", "u", "v", "w", "x",
|
||||||
"y", "z",
|
"y", "z",
|
||||||
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
|
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
|
||||||
"@", "$", "%", "#", "&", "!", "?", "+", "*", "~"
|
"@", "$", "%", "#", "&", "!", "?", "+", "*", "~",
|
||||||
}
|
}
|
||||||
|
|
||||||
local function addFruit()
|
local function addFruit()
|
||||||
while true do
|
while true do
|
||||||
local x = math.random(1,w)
|
local x = math.random(1, w)
|
||||||
local y = math.random(2,h)
|
local y = math.random(2, h)
|
||||||
local fruit = screen[x][y]
|
local fruit = screen[x][y]
|
||||||
if fruit.snake == nil and fruit.wall == nil and fruit.fruit == nil then
|
if fruit.snake == nil and fruit.wall == nil and fruit.fruit == nil then
|
||||||
screen[x][y] = { fruit = true }
|
screen[x][y] = { fruit = true }
|
||||||
term.setCursorPos(x,y)
|
term.setCursorPos(x, y)
|
||||||
term.setBackgroundColour( fruitColour )
|
term.setBackgroundColour( fruitColour )
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setBackgroundColour( colours.black )
|
term.setBackgroundColour( colours.black )
|
||||||
@ -84,26 +80,25 @@ end
|
|||||||
|
|
||||||
local function drawMenu()
|
local function drawMenu()
|
||||||
term.setTextColour( headingColour )
|
term.setTextColour( headingColour )
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
term.write( "SCORE " )
|
term.write( "SCORE " )
|
||||||
|
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
term.setCursorPos(7,1)
|
term.setCursorPos(7, 1)
|
||||||
term.write( tostring(nScore) )
|
term.write( tostring(nScore) )
|
||||||
|
|
||||||
term.setTextColour( headingColour )
|
term.setTextColour( headingColour )
|
||||||
term.setCursorPos(w-11,1)
|
term.setCursorPos(w - 11, 1)
|
||||||
term.write( "DIFFICULTY ")
|
term.write( "DIFFICULTY ")
|
||||||
|
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
term.setCursorPos(w,1)
|
term.setCursorPos(w, 1)
|
||||||
term.write( tostring(nDifficulty or "?") )
|
term.write( tostring(nDifficulty or "?") )
|
||||||
|
|
||||||
term.setTextColour( colours.white )
|
term.setTextColour( colours.white )
|
||||||
end
|
end
|
||||||
|
|
||||||
local function update( )
|
local function update( )
|
||||||
local x,y = xPos,yPos
|
|
||||||
if pxVel and pyVel then
|
if pxVel and pyVel then
|
||||||
xVel, yVel = pxVel, pyVel
|
xVel, yVel = pxVel, pyVel
|
||||||
pxVel, pyVel = nil, nil
|
pxVel, pyVel = nil, nil
|
||||||
@ -113,7 +108,7 @@ local function update( )
|
|||||||
if nExtraLength == 0 then
|
if nExtraLength == 0 then
|
||||||
local tail = screen[tailX][tailY]
|
local tail = screen[tailX][tailY]
|
||||||
screen[tailX][tailY] = {}
|
screen[tailX][tailY] = {}
|
||||||
term.setCursorPos(tailX,tailY)
|
term.setCursorPos(tailX, tailY)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
tailX = tail.nextX
|
tailX = tail.nextX
|
||||||
tailY = tail.nextY
|
tailY = tail.nextY
|
||||||
@ -154,7 +149,7 @@ local function update( )
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
term.setCursorPos(xPos,yPos)
|
term.setCursorPos(xPos, yPos)
|
||||||
term.setBackgroundColour( wormColour )
|
term.setBackgroundColour( wormColour )
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setBackgroundColour( colours.black )
|
term.setBackgroundColour( colours.black )
|
||||||
@ -169,20 +164,20 @@ local function drawFrontend()
|
|||||||
--printCentred( math.floor(h/2) - 4, " W O R M " )
|
--printCentred( math.floor(h/2) - 4, " W O R M " )
|
||||||
|
|
||||||
term.setTextColour( headingColour )
|
term.setTextColour( headingColour )
|
||||||
printCentred( math.floor(h/2) - 3, "" )
|
printCentred( math.floor(h / 2) - 3, "" )
|
||||||
printCentred( math.floor(h/2) - 2, " SELECT DIFFICULTY " )
|
printCentred( math.floor(h / 2) - 2, " SELECT DIFFICULTY " )
|
||||||
printCentred( math.floor(h/2) - 1, "" )
|
printCentred( math.floor(h / 2) - 1, "" )
|
||||||
|
|
||||||
printCentred( math.floor(h/2) + 0, " " )
|
printCentred( math.floor(h / 2) + 0, " " )
|
||||||
printCentred( math.floor(h/2) + 1, " " )
|
printCentred( math.floor(h / 2) + 1, " " )
|
||||||
printCentred( math.floor(h/2) + 2, " " )
|
printCentred( math.floor(h / 2) + 2, " " )
|
||||||
printCentred( math.floor(h/2) - 1 + nDifficulty, " [ ] " )
|
printCentred( math.floor(h / 2) - 1 + nDifficulty, " [ ] " )
|
||||||
|
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
printCentred( math.floor(h/2) + 0, "EASY" )
|
printCentred( math.floor(h / 2) + 0, "EASY" )
|
||||||
printCentred( math.floor(h/2) + 1, "MEDIUM" )
|
printCentred( math.floor(h / 2) + 1, "MEDIUM" )
|
||||||
printCentred( math.floor(h/2) + 2, "HARD" )
|
printCentred( math.floor(h / 2) + 2, "HARD" )
|
||||||
printCentred( math.floor(h/2) + 3, "" )
|
printCentred( math.floor(h / 2) + 3, "" )
|
||||||
|
|
||||||
term.setTextColour( colours.white )
|
term.setTextColour( colours.white )
|
||||||
end
|
end
|
||||||
@ -190,7 +185,7 @@ end
|
|||||||
drawMenu()
|
drawMenu()
|
||||||
drawFrontend()
|
drawFrontend()
|
||||||
while true do
|
while true do
|
||||||
local e,key = os.pullEvent( "key" )
|
local _, key = os.pullEvent( "key" )
|
||||||
if key == keys.up or key == keys.w then
|
if key == keys.up or key == keys.w then
|
||||||
-- Up
|
-- Up
|
||||||
if nDifficulty > 1 then
|
if nDifficulty > 1 then
|
||||||
@ -228,7 +223,7 @@ addFruit()
|
|||||||
-- Play the game
|
-- Play the game
|
||||||
local timer = os.startTimer(0)
|
local timer = os.startTimer(0)
|
||||||
while bRunning do
|
while bRunning do
|
||||||
local event, p1, p2 = os.pullEvent()
|
local event, p1 = os.pullEvent()
|
||||||
if event == "timer" and p1 == timer then
|
if event == "timer" and p1 == timer then
|
||||||
timer = os.startTimer(nInterval)
|
timer = os.startTimer(nInterval)
|
||||||
update( false )
|
update( false )
|
||||||
@ -238,23 +233,23 @@ while bRunning do
|
|||||||
if key == keys.up or key == keys.w then
|
if key == keys.up or key == keys.w then
|
||||||
-- Up
|
-- Up
|
||||||
if yVel == 0 then
|
if yVel == 0 then
|
||||||
pxVel,pyVel = 0,-1
|
pxVel, pyVel = 0, -1
|
||||||
end
|
end
|
||||||
elseif key == keys.down or key == keys.s then
|
elseif key == keys.down or key == keys.s then
|
||||||
-- Down
|
-- Down
|
||||||
if yVel == 0 then
|
if yVel == 0 then
|
||||||
pxVel,pyVel = 0,1
|
pxVel, pyVel = 0, 1
|
||||||
end
|
end
|
||||||
elseif key == keys.left or key == keys.a then
|
elseif key == keys.left or key == keys.a then
|
||||||
-- Left
|
-- Left
|
||||||
if xVel == 0 then
|
if xVel == 0 then
|
||||||
pxVel,pyVel = -1,0
|
pxVel, pyVel = -1, 0
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif key == keys.right or key == keys.d then
|
elseif key == keys.right or key == keys.d then
|
||||||
-- Right
|
-- Right
|
||||||
if xVel == 0 then
|
if xVel == 0 then
|
||||||
pxVel,pyVel = 1,0
|
pxVel, pyVel = 1, 0
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -263,25 +258,25 @@ end
|
|||||||
|
|
||||||
-- Display the gameover screen
|
-- Display the gameover screen
|
||||||
term.setTextColour( headingColour )
|
term.setTextColour( headingColour )
|
||||||
printCentred( math.floor(h/2) - 2, " " )
|
printCentred( math.floor(h / 2) - 2, " " )
|
||||||
printCentred( math.floor(h/2) - 1, " G A M E O V E R " )
|
printCentred( math.floor(h / 2) - 1, " G A M E O V E R " )
|
||||||
|
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
printCentred( math.floor(h/2) + 0, " " )
|
printCentred( math.floor(h / 2) + 0, " " )
|
||||||
printCentred( math.floor(h/2) + 1, " FINAL SCORE "..nScore.." " )
|
printCentred( math.floor(h / 2) + 1, " FINAL SCORE " .. nScore .. " " )
|
||||||
printCentred( math.floor(h/2) + 2, " " )
|
printCentred( math.floor(h / 2) + 2, " " )
|
||||||
term.setTextColour( colours.white )
|
term.setTextColour( colours.white )
|
||||||
|
|
||||||
local timer = os.startTimer(2.5)
|
local timer = os.startTimer(2.5)
|
||||||
repeat
|
repeat
|
||||||
local e,p = os.pullEvent()
|
local e, p = os.pullEvent()
|
||||||
if e == "timer" and p == timer then
|
if e == "timer" and p == timer then
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
printCentred( math.floor(h/2) + 2, " PRESS ANY KEY " )
|
printCentred( math.floor(h / 2) + 2, " PRESS ANY KEY " )
|
||||||
printCentred( math.floor(h/2) + 3, " " )
|
printCentred( math.floor(h / 2) + 3, " " )
|
||||||
term.setTextColour( colours.white )
|
term.setTextColour( colours.white )
|
||||||
end
|
end
|
||||||
until e == "char"
|
until e == "char"
|
||||||
|
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
|
@ -28,7 +28,7 @@ elseif sCommand == "host" then
|
|||||||
|
|
||||||
-- Find a modem
|
-- Find a modem
|
||||||
local sModemSide = nil
|
local sModemSide = nil
|
||||||
for n,sSide in ipairs( rs.getSides() ) do
|
for _, sSide in ipairs( rs.getSides() ) do
|
||||||
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
|
if peripheral.getType( sSide ) == "modem" and peripheral.call( sSide, "isWireless" ) then
|
||||||
sModemSide = sSide
|
sModemSide = sSide
|
||||||
break
|
break
|
||||||
@ -41,7 +41,7 @@ elseif sCommand == "host" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Determine position
|
-- Determine position
|
||||||
local x,y,z
|
local x, y, z
|
||||||
if #tArgs >= 4 then
|
if #tArgs >= 4 then
|
||||||
-- Position is manually specified
|
-- Position is manually specified
|
||||||
x = tonumber(tArgs[2])
|
x = tonumber(tArgs[2])
|
||||||
@ -51,10 +51,10 @@ elseif sCommand == "host" then
|
|||||||
printUsage()
|
printUsage()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
print( "Position is "..x..","..y..","..z )
|
print( "Position is " .. x .. "," .. y .. "," .. z )
|
||||||
else
|
else
|
||||||
-- Position is to be determined using locate
|
-- Position is to be determined using locate
|
||||||
x,y,z = gps.locate( 2, true )
|
x, y, z = gps.locate( 2, true )
|
||||||
if x == nil then
|
if x == nil then
|
||||||
print( "Run \"gps host <x> <y> <z>\" to set position manually" )
|
print( "Run \"gps host <x> <y> <z>\" to set position manually" )
|
||||||
return
|
return
|
||||||
@ -63,7 +63,7 @@ elseif sCommand == "host" then
|
|||||||
|
|
||||||
-- Open a channel
|
-- Open a channel
|
||||||
local modem = peripheral.wrap( sModemSide )
|
local modem = peripheral.wrap( sModemSide )
|
||||||
print( "Opening channel on modem "..sModemSide )
|
print( "Opening channel on modem " .. sModemSide )
|
||||||
modem.open( gps.CHANNEL_GPS )
|
modem.open( gps.CHANNEL_GPS )
|
||||||
|
|
||||||
-- Serve requests indefinately
|
-- Serve requests indefinately
|
||||||
@ -80,10 +80,10 @@ elseif sCommand == "host" then
|
|||||||
-- Print the number of requests handled
|
-- Print the number of requests handled
|
||||||
nServed = nServed + 1
|
nServed = nServed + 1
|
||||||
if nServed > 1 then
|
if nServed > 1 then
|
||||||
local x,y = term.getCursorPos()
|
local _, y = term.getCursorPos()
|
||||||
term.setCursorPos(1,y-1)
|
term.setCursorPos(1, y - 1)
|
||||||
end
|
end
|
||||||
print( nServed.." GPS requests served" )
|
print( nServed .. " GPS requests served" )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -14,7 +14,7 @@ if sTopic == "index" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local sFile = help.lookup( sTopic )
|
local sFile = help.lookup( sTopic )
|
||||||
local file = ((sFile ~= nil) and io.open( sFile )) or nil
|
local file = sFile ~= nil and io.open( sFile ) or nil
|
||||||
if file then
|
if file then
|
||||||
local sContents = file:read("*a")
|
local sContents = file:read("*a")
|
||||||
file:close()
|
file:close()
|
||||||
|
@ -46,9 +46,9 @@ local function get(url)
|
|||||||
|
|
||||||
write( "Connecting to pastebin.com... " )
|
write( "Connecting to pastebin.com... " )
|
||||||
-- Add a cache buster so that spam protection is re-checked
|
-- Add a cache buster so that spam protection is re-checked
|
||||||
local cacheBuster = ("%x"):format(math.random(0, 2^30))
|
local cacheBuster = ("%x"):format(math.random(0, 2 ^ 30))
|
||||||
local response, err = http.get(
|
local response, err = http.get(
|
||||||
"https://pastebin.com/raw/"..textutils.urlEncode( paste ).."?cb="..cacheBuster
|
"https://pastebin.com/raw/" .. textutils.urlEncode( paste ) .. "?cb=" .. cacheBuster
|
||||||
)
|
)
|
||||||
|
|
||||||
if response then
|
if response then
|
||||||
@ -93,11 +93,11 @@ if sCommand == "put" then
|
|||||||
local key = "0ec2eb25b6166c0c27a394ae118ad829"
|
local key = "0ec2eb25b6166c0c27a394ae118ad829"
|
||||||
local response = http.post(
|
local response = http.post(
|
||||||
"https://pastebin.com/api/api_post.php",
|
"https://pastebin.com/api/api_post.php",
|
||||||
"api_option=paste&"..
|
"api_option=paste&" ..
|
||||||
"api_dev_key="..key.."&"..
|
"api_dev_key=" .. key .. "&" ..
|
||||||
"api_paste_format=lua&"..
|
"api_paste_format=lua&" ..
|
||||||
"api_paste_name="..textutils.urlEncode(sName).."&"..
|
"api_paste_name=" .. textutils.urlEncode(sName) .. "&" ..
|
||||||
"api_paste_code="..textutils.urlEncode(sText)
|
"api_paste_code=" .. textutils.urlEncode(sText)
|
||||||
)
|
)
|
||||||
|
|
||||||
if response then
|
if response then
|
||||||
@ -107,8 +107,8 @@ if sCommand == "put" then
|
|||||||
response.close()
|
response.close()
|
||||||
|
|
||||||
local sCode = string.match( sResponse, "[^/]+$" )
|
local sCode = string.match( sResponse, "[^/]+$" )
|
||||||
print( "Uploaded as "..sResponse )
|
print( "Uploaded as " .. sResponse )
|
||||||
print( "Run \"pastebin get "..sCode.."\" to download anywhere" )
|
print( "Run \"pastebin get " .. sCode .. "\" to download anywhere" )
|
||||||
|
|
||||||
else
|
else
|
||||||
print( "Failed." )
|
print( "Failed." )
|
||||||
@ -137,7 +137,7 @@ elseif sCommand == "get" then
|
|||||||
file.write( res )
|
file.write( res )
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
print( "Downloaded as "..sFile )
|
print( "Downloaded as " .. sFile )
|
||||||
end
|
end
|
||||||
elseif sCommand == "run" then
|
elseif sCommand == "run" then
|
||||||
local sCode = tArgs[2]
|
local sCode = tArgs[2]
|
||||||
|
@ -6,24 +6,24 @@ if #tArgs > 0 then
|
|||||||
end
|
end
|
||||||
|
|
||||||
if sDrive == nil then
|
if sDrive == nil then
|
||||||
print( "This is computer #"..os.getComputerID() )
|
print( "This is computer #" .. os.getComputerID() )
|
||||||
|
|
||||||
local label = os.getComputerLabel()
|
local label = os.getComputerLabel()
|
||||||
if label then
|
if label then
|
||||||
print( "This computer is labelled \""..label.."\"" )
|
print( "This computer is labelled \"" .. label .. "\"" )
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
local bData = disk.hasData( sDrive )
|
local bData = disk.hasData( sDrive )
|
||||||
if not bData then
|
if not bData then
|
||||||
print( "No disk in drive "..sDrive )
|
print( "No disk in drive " .. sDrive )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
print( "The disk is #"..disk.getID( sDrive ) )
|
print( "The disk is #" .. disk.getID( sDrive ) )
|
||||||
|
|
||||||
local label = disk.getLabel( sDrive )
|
local label = disk.getLabel( sDrive )
|
||||||
if label then
|
if label then
|
||||||
print( "The disk is labelled \""..label.."\"" )
|
print( "The disk is labelled \"" .. label .. "\"" )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -14,11 +14,11 @@ local function checkDrive( sDrive )
|
|||||||
-- Check the disk exists
|
-- Check the disk exists
|
||||||
local bData = disk.hasData( sDrive )
|
local bData = disk.hasData( sDrive )
|
||||||
if not bData then
|
if not bData then
|
||||||
print( "No disk in "..sDrive.." drive" )
|
print( "No disk in " .. sDrive .. " drive" )
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "No disk drive named "..sDrive )
|
print( "No disk drive named " .. sDrive )
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
@ -29,7 +29,7 @@ local function get( sDrive )
|
|||||||
if checkDrive( sDrive ) then
|
if checkDrive( sDrive ) then
|
||||||
local sLabel = disk.getLabel( sDrive )
|
local sLabel = disk.getLabel( sDrive )
|
||||||
if sLabel then
|
if sLabel then
|
||||||
print( "Disk label is \""..sLabel.."\"" )
|
print( "Disk label is \"" .. sLabel .. "\"" )
|
||||||
else
|
else
|
||||||
print( "No Disk label" )
|
print( "No Disk label" )
|
||||||
end
|
end
|
||||||
@ -37,7 +37,7 @@ local function get( sDrive )
|
|||||||
else
|
else
|
||||||
local sLabel = os.getComputerLabel()
|
local sLabel = os.getComputerLabel()
|
||||||
if sLabel then
|
if sLabel then
|
||||||
print( "Computer label is \""..sLabel.."\"" )
|
print( "Computer label is \"" .. sLabel .. "\"" )
|
||||||
else
|
else
|
||||||
print( "No Computer label" )
|
print( "No Computer label" )
|
||||||
end
|
end
|
||||||
@ -50,7 +50,7 @@ local function set( sDrive, sText )
|
|||||||
disk.setLabel( sDrive, sText )
|
disk.setLabel( sDrive, sText )
|
||||||
local sLabel = disk.getLabel( sDrive )
|
local sLabel = disk.getLabel( sDrive )
|
||||||
if sLabel then
|
if sLabel then
|
||||||
print( "Disk label set to \""..sLabel.."\"" )
|
print( "Disk label set to \"" .. sLabel .. "\"" )
|
||||||
else
|
else
|
||||||
print( "Disk label cleared" )
|
print( "Disk label cleared" )
|
||||||
end
|
end
|
||||||
@ -59,7 +59,7 @@ local function set( sDrive, sText )
|
|||||||
os.setComputerLabel( sText )
|
os.setComputerLabel( sText )
|
||||||
local sLabel = os.getComputerLabel()
|
local sLabel = os.getComputerLabel()
|
||||||
if sLabel then
|
if sLabel then
|
||||||
print( "Computer label set to \""..sLabel.."\"" )
|
print( "Computer label set to \"" .. sLabel .. "\"" )
|
||||||
else
|
else
|
||||||
print( "Computer label cleared" )
|
print( "Computer label cleared" )
|
||||||
end
|
end
|
||||||
|
@ -18,7 +18,7 @@ local tFiles = {}
|
|||||||
local tDirs = {}
|
local tDirs = {}
|
||||||
|
|
||||||
local bShowHidden = settings.get( "list.show_hidden" )
|
local bShowHidden = settings.get( "list.show_hidden" )
|
||||||
for n, sItem in pairs( tAll ) do
|
for _, sItem in pairs( tAll ) do
|
||||||
if bShowHidden or string.sub( sItem, 1, 1 ) ~= "." then
|
if bShowHidden or string.sub( sItem, 1, 1 ) ~= "." then
|
||||||
local sPath = fs.combine( sDir, sItem )
|
local sPath = fs.combine( sDir, sItem )
|
||||||
if fs.isDir( sPath ) then
|
if fs.isDir( sPath ) then
|
||||||
|
@ -67,7 +67,7 @@ while bRunning do
|
|||||||
|
|
||||||
local nForcePrint = 0
|
local nForcePrint = 0
|
||||||
local func, e = load( s, "=lua", "t", tEnv )
|
local func, e = load( s, "=lua", "t", tEnv )
|
||||||
local func2, e2 = load( "return _echo("..s..");", "=lua", "t", tEnv )
|
local func2 = load( "return _echo(" .. s .. ");", "=lua", "t", tEnv )
|
||||||
if not func then
|
if not func then
|
||||||
if func2 then
|
if func2 then
|
||||||
func = func2
|
func = func2
|
||||||
@ -84,7 +84,7 @@ while bRunning do
|
|||||||
local tResults = table.pack( pcall( func ) )
|
local tResults = table.pack( pcall( func ) )
|
||||||
if tResults[1] then
|
if tResults[1] then
|
||||||
local n = 1
|
local n = 1
|
||||||
while n < tResults.n or (n <= nForcePrint) do
|
while n < tResults.n or n <= nForcePrint do
|
||||||
local value = tResults[ n + 1 ]
|
local value = tResults[ n + 1 ]
|
||||||
if type( value ) == "table" then
|
if type( value ) == "table" then
|
||||||
local metatable = getmetatable( value )
|
local metatable = getmetatable( value )
|
||||||
|
@ -8,9 +8,9 @@ end
|
|||||||
for _, v in ipairs( tArgs ) do
|
for _, v in ipairs( tArgs ) do
|
||||||
local sNewDir = shell.resolve( v )
|
local sNewDir = shell.resolve( v )
|
||||||
if fs.exists( sNewDir ) and not fs.isDir( sNewDir ) then
|
if fs.exists( sNewDir ) and not fs.isDir( sNewDir ) then
|
||||||
printError( v..": Destination exists" )
|
printError( v .. ": Destination exists" )
|
||||||
elseif fs.isReadOnly( sNewDir ) then
|
elseif fs.isReadOnly( sNewDir ) then
|
||||||
printError( v..": Access denied" )
|
printError( v .. ": Access denied" )
|
||||||
else
|
else
|
||||||
fs.makeDir( sNewDir )
|
fs.makeDir( sNewDir )
|
||||||
end
|
end
|
||||||
|
@ -11,18 +11,18 @@ end
|
|||||||
|
|
||||||
local sName = tArgs[1]
|
local sName = tArgs[1]
|
||||||
if peripheral.getType( sName ) ~= "monitor" then
|
if peripheral.getType( sName ) ~= "monitor" then
|
||||||
print( "No monitor named ".. sName )
|
print( "No monitor named " .. sName )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local sProgram = tArgs[2]
|
local sProgram = tArgs[2]
|
||||||
local sPath = shell.resolveProgram( sProgram )
|
local sPath = shell.resolveProgram( sProgram )
|
||||||
if sPath == nil then
|
if sPath == nil then
|
||||||
print( "No such program: "..sProgram )
|
print( "No such program: " .. sProgram )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
print( "Running "..sProgram.." on monitor "..sName )
|
print( "Running " .. sProgram .. " on monitor " .. sName )
|
||||||
|
|
||||||
local monitor = peripheral.wrap( sName )
|
local monitor = peripheral.wrap( sName )
|
||||||
local previousTerm = term.redirect( monitor )
|
local previousTerm = term.redirect( monitor )
|
||||||
|
@ -3,7 +3,7 @@ local tMotd = {}
|
|||||||
for sPath in string.gmatch(settings.get( "motd.path" ), "[^:]+") do
|
for sPath in string.gmatch(settings.get( "motd.path" ), "[^:]+") do
|
||||||
if fs.exists(sPath) then
|
if fs.exists(sPath) then
|
||||||
for sLine in io.lines(sPath) do
|
for sLine in io.lines(sPath) do
|
||||||
table.insert(tMotd,sLine)
|
table.insert(tMotd, sLine)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -11,5 +11,5 @@ end
|
|||||||
if #tMotd == 0 then
|
if #tMotd == 0 then
|
||||||
print("missingno")
|
print("missingno")
|
||||||
else
|
else
|
||||||
print(tMotd[math.random(1,#tMotd)])
|
print(tMotd[math.random(1, #tMotd)])
|
||||||
end
|
end
|
||||||
|
@ -9,7 +9,7 @@ local sSource = shell.resolve( tArgs[1] )
|
|||||||
local sDest = shell.resolve( tArgs[2] )
|
local sDest = shell.resolve( tArgs[2] )
|
||||||
local tFiles = fs.find( sSource )
|
local tFiles = fs.find( sSource )
|
||||||
if #tFiles > 0 then
|
if #tFiles > 0 then
|
||||||
for n,sFile in ipairs( tFiles ) do
|
for _, sFile in ipairs( tFiles ) do
|
||||||
if fs.isDir( sDest ) then
|
if fs.isDir( sDest ) then
|
||||||
fs.move( sFile, fs.combine( sDest, fs.getName(sFile) ) )
|
fs.move( sFile, fs.combine( sDest, fs.getName(sFile) ) )
|
||||||
elseif #tFiles == 1 then
|
elseif #tFiles == 1 then
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
local tPeripherals = peripheral.getNames()
|
local tPeripherals = peripheral.getNames()
|
||||||
print( "Attached Peripherals:" )
|
print( "Attached Peripherals:" )
|
||||||
if #tPeripherals > 0 then
|
if #tPeripherals > 0 then
|
||||||
for n=1,#tPeripherals do
|
for n = 1, #tPeripherals do
|
||||||
local sPeripheral = tPeripherals[n]
|
local sPeripheral = tPeripherals[n]
|
||||||
print( sPeripheral .. " (" .. peripheral.getType( sPeripheral ) .. ")" )
|
print( sPeripheral .. " (" .. peripheral.getType( sPeripheral ) .. ")" )
|
||||||
end
|
end
|
||||||
|
@ -4,178 +4,178 @@ This version written by Gopher, at the request of Dan200, for
|
|||||||
ComputerCraft v1.6. No particular rights are reserved.
|
ComputerCraft v1.6. No particular rights are reserved.
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local function colorass(c,bw)
|
local function colorass(c, bw)
|
||||||
return term.isColor() and c or bw
|
return term.isColor() and c or bw
|
||||||
end
|
end
|
||||||
|
|
||||||
local block_s1= {
|
local block_s1 = {
|
||||||
{
|
{
|
||||||
{ 1,0,0,0, },
|
{ 1, 0, 0, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 0,1,1,0, },
|
{ 0, 1, 1, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","{}"),
|
ch = colorass(" ", "{}"),
|
||||||
fg=colorass(colors.blue,colors.black),
|
fg = colorass(colors.blue, colors.black),
|
||||||
bg=colorass(colors.cyan,colors.white),
|
bg = colorass(colors.cyan, colors.white),
|
||||||
}
|
}
|
||||||
local block_s2= {
|
local block_s2 = {
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 1,0,0,0, },
|
{ 1, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,1,1,0, },
|
{ 0, 1, 1, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","{}"),
|
ch = colorass(" ", "{}"),
|
||||||
fg=colorass(colors.green,colors.black),
|
fg = colorass(colors.green, colors.black),
|
||||||
bg=colorass(colors.lime,colors.white),
|
bg = colorass(colors.lime, colors.white),
|
||||||
}
|
}
|
||||||
local block_line = {
|
local block_line = {
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 1,1,1,1, },
|
{ 1, 1, 1, 1 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","[]"),
|
ch = colorass(" ", "[]"),
|
||||||
fg=colorass(colors.pink,colors.black),
|
fg = colorass(colors.pink, colors.black),
|
||||||
bg=colorass(colors.red,colors.white),
|
bg = colorass(colors.red, colors.white),
|
||||||
}
|
}
|
||||||
local block_square = {
|
local block_square = {
|
||||||
{
|
{
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","[]"),
|
ch = colorass(" ", "[]"),
|
||||||
fg=colorass(colors.lightBlue,colors.black),
|
fg = colorass(colors.lightBlue, colors.black),
|
||||||
bg=colorass(colors.blue,colors.white),
|
bg = colorass(colors.blue, colors.white),
|
||||||
}
|
}
|
||||||
local block_L1 = {
|
local block_L1 = {
|
||||||
{
|
{
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 1,1,1,0, },
|
{ 1, 1, 1, 0 },
|
||||||
{ 1,0,0,0, },
|
{ 1, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,1,0, },
|
{ 0, 1, 1, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,1,0, },
|
{ 0, 0, 1, 0 },
|
||||||
{ 1,1,1,0, },
|
{ 1, 1, 1, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","()"),
|
ch = colorass(" ", "()"),
|
||||||
fg=colorass(colors.orange,colors.black),
|
fg = colorass(colors.orange, colors.black),
|
||||||
bg=colorass(colors.yellow,colors.white),
|
bg = colorass(colors.yellow, colors.white),
|
||||||
}
|
}
|
||||||
local block_L2 = {
|
local block_L2 = {
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 1,1,1,0, },
|
{ 1, 1, 1, 0 },
|
||||||
{ 0,0,1,0, },
|
{ 0, 0, 1, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,1,1,0, },
|
{ 0, 1, 1, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 1,0,0,0, },
|
{ 1, 0, 0, 0 },
|
||||||
{ 1,1,1,0, },
|
{ 1, 1, 1, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","()"),
|
ch = colorass(" ", "()"),
|
||||||
fg=colorass(colors.brown,colors.black),
|
fg = colorass(colors.brown, colors.black),
|
||||||
bg=colorass(colors.orange,colors.white),
|
bg = colorass(colors.orange, colors.white),
|
||||||
}
|
}
|
||||||
local block_T = {
|
local block_T = {
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 1,1,0,0, },
|
{ 1, 1, 0, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 1,1,1,0, },
|
{ 1, 1, 1, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,1,1,0, },
|
{ 0, 1, 1, 0 },
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 0,1,0,0, },
|
{ 0, 1, 0, 0 },
|
||||||
{ 1,1,1,0, },
|
{ 1, 1, 1, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
{ 0,0,0,0, },
|
{ 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
ch=colorass(" ","<>"),
|
ch = colorass(" ", "<>"),
|
||||||
fg=colorass(colors.cyan,colors.black),
|
fg = colorass(colors.cyan, colors.black),
|
||||||
bg=colorass(colors.purple,colors.white),
|
bg = colorass(colors.purple, colors.white),
|
||||||
}
|
}
|
||||||
|
|
||||||
local blocks={ block_line, block_square, block_s1, block_s2, block_L1, block_L2, block_T}
|
local blocks = { block_line, block_square, block_s1, block_s2, block_L1, block_L2, block_T}
|
||||||
|
|
||||||
local points={4,10,30,120}
|
local points = {4, 10, 30, 120}
|
||||||
|
|
||||||
local function lpad(text,amt)
|
local function lpad(text, amt)
|
||||||
text=tostring(text)
|
text = tostring(text)
|
||||||
return string.rep(" ",amt-#text)..text
|
return string.rep(" ", amt - #text) .. text
|
||||||
end
|
end
|
||||||
|
|
||||||
local width,height=term.getSize()
|
local width, height = term.getSize()
|
||||||
|
|
||||||
if height<19 or width<26 then
|
if height < 19 or width < 26 then
|
||||||
print("Your screen is too small to play :(")
|
print("Your screen is too small to play :(")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local speedsByLevel={
|
local speedsByLevel = {
|
||||||
1.2,
|
1.2,
|
||||||
1.0,
|
1.0,
|
||||||
.8,
|
.8,
|
||||||
@ -187,23 +187,23 @@ local speedsByLevel={
|
|||||||
.2,
|
.2,
|
||||||
.15,
|
.15,
|
||||||
.1,
|
.1,
|
||||||
.05,}
|
.05, }
|
||||||
|
|
||||||
local level=1
|
local level = 1
|
||||||
|
|
||||||
local function playGame()
|
local function playGame()
|
||||||
local score=0
|
local score = 0
|
||||||
local lines=0
|
local lines = 0
|
||||||
local initialLevel=level
|
local initialLevel = level
|
||||||
local next=blocks[math.random(1,#blocks)]
|
local next = blocks[math.random(1, #blocks)]
|
||||||
|
|
||||||
local pit={}
|
local pit = {}
|
||||||
|
|
||||||
|
|
||||||
local heightAdjust=0
|
local heightAdjust = 0
|
||||||
|
|
||||||
if height<=19 then
|
if height <= 19 then
|
||||||
heightAdjust=1
|
heightAdjust = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -215,56 +215,56 @@ local function playGame()
|
|||||||
|
|
||||||
term.setTextColor(colors.black)
|
term.setTextColor(colors.black)
|
||||||
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||||
term.setCursorPos(22,2)
|
term.setCursorPos(22, 2)
|
||||||
term.write("Score") --score
|
term.write("Score") --score
|
||||||
term.setCursorPos(22,5)
|
term.setCursorPos(22, 5)
|
||||||
term.write("Level") --level
|
term.write("Level") --level
|
||||||
term.setCursorPos(22,8)
|
term.setCursorPos(22, 8)
|
||||||
term.write("Lines") --lines
|
term.write("Lines") --lines
|
||||||
term.setCursorPos(22,12)
|
term.setCursorPos(22, 12)
|
||||||
term.write("Next") --next
|
term.write("Next") --next
|
||||||
|
|
||||||
term.setCursorPos(21,1)
|
term.setCursorPos(21, 1)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,2)
|
term.setCursorPos(21, 2)
|
||||||
term.write(" ") --score
|
term.write(" ") --score
|
||||||
term.setCursorPos(21,3)
|
term.setCursorPos(21, 3)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,4)
|
term.setCursorPos(21, 4)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,5)
|
term.setCursorPos(21, 5)
|
||||||
term.write(" ") --level
|
term.write(" ") --level
|
||||||
term.setCursorPos(21,6)
|
term.setCursorPos(21, 6)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,7)
|
term.setCursorPos(21, 7)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,8)
|
term.setCursorPos(21, 8)
|
||||||
term.write(" ") --lines
|
term.write(" ") --lines
|
||||||
term.setCursorPos(21,9)
|
term.setCursorPos(21, 9)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,10)
|
term.setCursorPos(21, 10)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,11)
|
term.setCursorPos(21, 11)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,12)
|
term.setCursorPos(21, 12)
|
||||||
term.write(" ") --next
|
term.write(" ") --next
|
||||||
term.setCursorPos(26,12)
|
term.setCursorPos(26, 12)
|
||||||
term.write(" ") --next
|
term.write(" ") --next
|
||||||
term.setCursorPos(21,13)
|
term.setCursorPos(21, 13)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,14)
|
term.setCursorPos(21, 14)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,15)
|
term.setCursorPos(21, 15)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,16)
|
term.setCursorPos(21, 16)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,17)
|
term.setCursorPos(21, 17)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,18)
|
term.setCursorPos(21, 18)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,19)
|
term.setCursorPos(21, 19)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
term.setCursorPos(21,20)
|
term.setCursorPos(21, 20)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -272,47 +272,47 @@ local function playGame()
|
|||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
|
|
||||||
term.setCursorPos(22,3)
|
term.setCursorPos(22, 3)
|
||||||
term.write(lpad(score,5)) --score
|
term.write(lpad(score, 5)) --score
|
||||||
term.setCursorPos(22,6)
|
term.setCursorPos(22, 6)
|
||||||
term.write(lpad(level,5)) --level
|
term.write(lpad(level, 5)) --level
|
||||||
term.setCursorPos(22,9)
|
term.setCursorPos(22, 9)
|
||||||
term.write(lpad(lines,5)) --lines
|
term.write(lpad(lines, 5)) --lines
|
||||||
end
|
end
|
||||||
|
|
||||||
local function drawBlockAt(block,xp,yp,rot)
|
local function drawBlockAt(block, xp, yp, rot)
|
||||||
term.setTextColor(block.fg)
|
term.setTextColor(block.fg)
|
||||||
term.setBackgroundColor(block.bg)
|
term.setBackgroundColor(block.bg)
|
||||||
for y=1,4 do
|
for y = 1, 4 do
|
||||||
for x=1,4 do
|
for x = 1, 4 do
|
||||||
if block[rot][y][x]==1 then
|
if block[rot][y][x] == 1 then
|
||||||
term.setCursorPos((xp+x)*2-3,yp+y-1-heightAdjust)
|
term.setCursorPos((xp + x) * 2 - 3, yp + y - 1 - heightAdjust)
|
||||||
term.write(block.ch)
|
term.write(block.ch)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function eraseBlockAt(block,xp,yp,rot)
|
local function eraseBlockAt(block, xp, yp, rot)
|
||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
for y=1,4 do
|
for y = 1, 4 do
|
||||||
for x=1,4 do
|
for x = 1, 4 do
|
||||||
if block[rot][y][x]==1 then
|
if block[rot][y][x] == 1 then
|
||||||
term.setCursorPos((xp+x)*2-3,yp+y-1-heightAdjust)
|
term.setCursorPos((xp + x) * 2 - 3, yp + y - 1 - heightAdjust)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function testBlockAt(block,xp,yp,rot)
|
local function testBlockAt(block, xp, yp, rot)
|
||||||
for y=1,4 do
|
for y = 1, 4 do
|
||||||
local ty=yp+y-1
|
local ty = yp + y - 1
|
||||||
for x=1,4 do
|
for x = 1, 4 do
|
||||||
local tx=xp+x-1
|
local tx = xp + x - 1
|
||||||
if block[rot][y][x]==1 then
|
if block[rot][y][x] == 1 then
|
||||||
if tx>10 or tx<1 or ty>20 or pit[ty][tx]~=0 then
|
if tx > 10 or tx < 1 or ty > 20 or pit[ty][tx] ~= 0 then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -320,11 +320,11 @@ local function playGame()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function pitBlock(block,xp,yp,rot)
|
local function pitBlock(block, xp, yp, rot)
|
||||||
for y=1,4 do
|
for y = 1, 4 do
|
||||||
for x=1,4 do
|
for x = 1, 4 do
|
||||||
if block[rot][y][x]==1 then
|
if block[rot][y][x] == 1 then
|
||||||
pit[yp+y-1][xp+x-1]=block
|
pit[yp + y - 1][xp + x - 1] = block
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -332,10 +332,10 @@ local function playGame()
|
|||||||
|
|
||||||
|
|
||||||
local function clearPit()
|
local function clearPit()
|
||||||
for row=1,20 do
|
for row = 1, 20 do
|
||||||
pit[row]={}
|
pit[row] = {}
|
||||||
for col=1,10 do
|
for col = 1, 10 do
|
||||||
pit[row][col]=0
|
pit[row][col] = 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -350,24 +350,24 @@ local function playGame()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
local halt=false
|
local halt = false
|
||||||
local dropSpeed=speedsByLevel[math.min(level,12)]
|
local dropSpeed = speedsByLevel[math.min(level, 12)]
|
||||||
|
|
||||||
|
|
||||||
local curBlock=next
|
local curBlock = next
|
||||||
next=blocks[math.random(1,7)]
|
next = blocks[math.random(1, 7)]
|
||||||
|
|
||||||
local curX, curY, curRot=4, 1, 1
|
local curX, curY, curRot = 4, 1, 1
|
||||||
local dropTimer=os.startTimer(dropSpeed)
|
local dropTimer = os.startTimer(dropSpeed)
|
||||||
|
|
||||||
drawBlockAt(next,11.5,15+heightAdjust,1)
|
drawBlockAt(next, 11.5, 15 + heightAdjust, 1)
|
||||||
drawBlockAt(curBlock,curX,curY,curRot)
|
drawBlockAt(curBlock, curX, curY, curRot)
|
||||||
|
|
||||||
local function redrawPit()
|
local function redrawPit()
|
||||||
for r=1+heightAdjust,20 do
|
for r = 1 + heightAdjust, 20 do
|
||||||
term.setCursorPos(1,r-heightAdjust)
|
term.setCursorPos(1, r - heightAdjust)
|
||||||
for c=1,10 do
|
for c = 1, 10 do
|
||||||
if pit[r][c]==0 then
|
if pit[r][c] == 0 then
|
||||||
term.setTextColor(colors.black)
|
term.setTextColor(colors.black)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
@ -381,8 +381,8 @@ local function playGame()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function hidePit()
|
local function hidePit()
|
||||||
for r=1+heightAdjust,20 do
|
for r = 1 + heightAdjust, 20 do
|
||||||
term.setCursorPos(1,r-heightAdjust)
|
term.setCursorPos(1, r - heightAdjust)
|
||||||
term.setTextColor(colors.black)
|
term.setTextColor(colors.black)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
@ -390,56 +390,56 @@ local function playGame()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function msgBox(message)
|
local function msgBox(message)
|
||||||
local x=math.floor((17-#message)/2)
|
local x = math.floor((17 - #message) / 2)
|
||||||
term.setBackgroundColor(colorass(colors.lightGray,colors.white))
|
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||||
term.setTextColor(colors.black)
|
term.setTextColor(colors.black)
|
||||||
term.setCursorPos(x,9)
|
term.setCursorPos(x, 9)
|
||||||
term.write("+"..string.rep("-",#message+2).."+")
|
term.write("+" .. string.rep("-", #message + 2) .. "+")
|
||||||
term.setCursorPos(x,10)
|
term.setCursorPos(x, 10)
|
||||||
term.write("|")
|
term.write("|")
|
||||||
term.setCursorPos(x+#message+3,10)
|
term.setCursorPos(x + #message + 3, 10)
|
||||||
term.write("|")
|
term.write("|")
|
||||||
term.setCursorPos(x,11)
|
term.setCursorPos(x, 11)
|
||||||
term.write("+"..string.rep("-",#message+2).."+")
|
term.write("+" .. string.rep("-", #message + 2) .. "+")
|
||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.setCursorPos(x+1,10)
|
term.setCursorPos(x + 1, 10)
|
||||||
term.write(" "..message.." ")
|
term.write(" " .. message .. " ")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function clearRows()
|
local function clearRows()
|
||||||
local rows={}
|
local rows = {}
|
||||||
for r=1,20 do
|
for r = 1, 20 do
|
||||||
local count=0
|
local count = 0
|
||||||
for c=1,10 do
|
for c = 1, 10 do
|
||||||
if pit[r][c]~=0 then
|
if pit[r][c] ~= 0 then
|
||||||
count=count+1
|
count = count + 1
|
||||||
else
|
else
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if count==10 then
|
if count == 10 then
|
||||||
rows[#rows+1]=r
|
rows[#rows + 1] = r
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if #rows>0 then
|
if #rows > 0 then
|
||||||
for i=1,4 do
|
for _ = 1, 4 do
|
||||||
sleep(.1)
|
sleep(.1)
|
||||||
for r=1,#rows do
|
for r = 1, #rows do
|
||||||
r=rows[r]
|
r = rows[r]
|
||||||
term.setCursorPos(1,r-heightAdjust)
|
term.setCursorPos(1, r - heightAdjust)
|
||||||
for c=1,10 do
|
for c = 1, 10 do
|
||||||
term.setTextColor(pit[r][c].bg)
|
term.setTextColor(pit[r][c].bg)
|
||||||
term.setBackgroundColor(pit[r][c].fg)
|
term.setBackgroundColor(pit[r][c].fg)
|
||||||
term.write(pit[r][c].ch)
|
term.write(pit[r][c].ch)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
sleep(.1)
|
sleep(.1)
|
||||||
for r=1,#rows do
|
for r = 1, #rows do
|
||||||
r=rows[r]
|
r = rows[r]
|
||||||
term.setCursorPos(1,r-heightAdjust)
|
term.setCursorPos(1, r - heightAdjust)
|
||||||
for c=1,10 do
|
for c = 1, 10 do
|
||||||
term.setTextColor(pit[r][c].fg)
|
term.setTextColor(pit[r][c].fg)
|
||||||
term.setBackgroundColor(pit[r][c].bg)
|
term.setBackgroundColor(pit[r][c].bg)
|
||||||
term.write(pit[r][c].ch)
|
term.write(pit[r][c].ch)
|
||||||
@ -448,155 +448,154 @@ local function playGame()
|
|||||||
end
|
end
|
||||||
--now remove the rows and drop everythign else
|
--now remove the rows and drop everythign else
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
for r=1,#rows do
|
for r = 1, #rows do
|
||||||
r=rows[r]
|
r = rows[r]
|
||||||
term.setCursorPos(1,r-heightAdjust)
|
term.setCursorPos(1, r - heightAdjust)
|
||||||
term.write(" ")
|
term.write(" ")
|
||||||
end
|
end
|
||||||
sleep(.25)
|
sleep(.25)
|
||||||
for r=1,#rows do
|
for r = 1, #rows do
|
||||||
table.remove(pit,rows[r])
|
table.remove(pit, rows[r])
|
||||||
table.insert(pit,1,{0,0,0,0,0,0,0,0,0,0})
|
table.insert(pit, 1, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
|
||||||
end
|
end
|
||||||
redrawPit()
|
redrawPit()
|
||||||
lines=lines+#rows
|
lines = lines + #rows
|
||||||
score=score+points[#rows]*math.min(level,20)
|
score = score + points[#rows] * math.min(level, 20)
|
||||||
level=math.floor(lines/10)+initialLevel
|
level = math.floor(lines / 10) + initialLevel
|
||||||
dropSpeed=speedsByLevel[math.min(level,12)]
|
dropSpeed = speedsByLevel[math.min(level, 12)]
|
||||||
updateNumbers()
|
updateNumbers()
|
||||||
end
|
end
|
||||||
sleep(.25)
|
sleep(.25)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function blockFall()
|
local function blockFall()
|
||||||
local result = false
|
if testBlockAt(curBlock, curX, curY + 1, curRot) then
|
||||||
if testBlockAt(curBlock,curX,curY+1,curRot) then
|
pitBlock(curBlock, curX, curY, curRot)
|
||||||
pitBlock(curBlock,curX,curY,curRot)
|
|
||||||
--detect rows that clear
|
--detect rows that clear
|
||||||
clearRows()
|
clearRows()
|
||||||
|
|
||||||
curBlock=next
|
curBlock = next
|
||||||
curX=4
|
curX = 4
|
||||||
curY=1
|
curY = 1
|
||||||
curRot=1
|
curRot = 1
|
||||||
if testBlockAt(curBlock,curX,curY,curRot) then
|
if testBlockAt(curBlock, curX, curY, curRot) then
|
||||||
halt=true
|
halt = true
|
||||||
end
|
end
|
||||||
drawBlockAt(curBlock,curX,curY,curRot)
|
drawBlockAt(curBlock, curX, curY, curRot)
|
||||||
eraseBlockAt(next,11.5,15+heightAdjust,1)
|
eraseBlockAt(next, 11.5, 15 + heightAdjust, 1)
|
||||||
next=blocks[math.random(1,7)]
|
next = blocks[math.random(1, 7)]
|
||||||
drawBlockAt(next,11.5,15+heightAdjust,1)
|
drawBlockAt(next, 11.5, 15 + heightAdjust, 1)
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
eraseBlockAt(curBlock,curX,curY,curRot)
|
eraseBlockAt(curBlock, curX, curY, curRot)
|
||||||
curY=curY+1
|
curY = curY + 1
|
||||||
drawBlockAt(curBlock,curX,curY,curRot)
|
drawBlockAt(curBlock, curX, curY, curRot)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
while not halt do
|
while not halt do
|
||||||
local e={os.pullEvent()}
|
local e = {os.pullEvent()}
|
||||||
if e[1]=="timer" then
|
if e[1] == "timer" then
|
||||||
if e[2]==dropTimer then
|
if e[2] == dropTimer then
|
||||||
blockFall()
|
blockFall()
|
||||||
dropTimer=os.startTimer(dropSpeed)
|
dropTimer = os.startTimer(dropSpeed)
|
||||||
end
|
end
|
||||||
elseif e[1]=="key" then
|
elseif e[1] == "key" then
|
||||||
local key=e[2]
|
local key = e[2]
|
||||||
local dx,dy,dr=0,0,0
|
local dx, dy, dr = 0, 0, 0
|
||||||
if key==keys.left or key==keys.a then
|
if key == keys.left or key == keys.a then
|
||||||
dx=-1
|
dx = -1
|
||||||
elseif key==keys.right or key==keys.d then
|
elseif key == keys.right or key == keys.d then
|
||||||
dx=1
|
dx = 1
|
||||||
elseif key==keys.up or key==keys.w then
|
elseif key == keys.up or key == keys.w then
|
||||||
dr=1
|
dr = 1
|
||||||
elseif key==keys.down or key==keys.s then
|
elseif key == keys.down or key == keys.s then
|
||||||
while not blockFall() do end
|
while not blockFall() do end
|
||||||
dropTimer=os.startTimer(dropSpeed)
|
dropTimer = os.startTimer(dropSpeed)
|
||||||
elseif key==keys.space then
|
elseif key == keys.space then
|
||||||
hidePit()
|
hidePit()
|
||||||
msgBox("Paused")
|
msgBox("Paused")
|
||||||
while ({os.pullEvent("key")})[2]~=keys.space do end
|
while ({os.pullEvent("key")})[2] ~= keys.space do end
|
||||||
redrawPit()
|
redrawPit()
|
||||||
drawBlockAt(curBlock,curX,curY,curRot)
|
drawBlockAt(curBlock, curX, curY, curRot)
|
||||||
dropTimer=os.startTimer(dropSpeed)
|
dropTimer = os.startTimer(dropSpeed)
|
||||||
end
|
end
|
||||||
if dx+dr~=0 then
|
if dx + dr ~= 0 then
|
||||||
if not testBlockAt(curBlock,curX+dx,curY+dy,(dr>0 and curRot%#curBlock+dr or curRot)) then
|
if not testBlockAt(curBlock, curX + dx, curY + dy, dr > 0 and curRot % #curBlock + dr or curRot) then
|
||||||
eraseBlockAt(curBlock,curX,curY,curRot)
|
eraseBlockAt(curBlock, curX, curY, curRot)
|
||||||
curX=curX+dx
|
curX = curX + dx
|
||||||
curY=curY+dy
|
curY = curY + dy
|
||||||
curRot=dr==0 and curRot or (curRot%#curBlock+dr)
|
curRot = dr == 0 and curRot or curRot % #curBlock + dr
|
||||||
drawBlockAt(curBlock,curX,curY,curRot)
|
drawBlockAt(curBlock, curX, curY, curRot)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif e[1]=="term_resize" then
|
elseif e[1] == "term_resize" then
|
||||||
local w,h=term.getSize()
|
local _, h = term.getSize()
|
||||||
if h==20 then
|
if h == 20 then
|
||||||
heightAdjust=0
|
heightAdjust = 0
|
||||||
else
|
else
|
||||||
heightAdjust=1
|
heightAdjust = 1
|
||||||
end
|
end
|
||||||
redrawPit()
|
redrawPit()
|
||||||
drawBlockAt(curBlock,curX,curY,curRot)
|
drawBlockAt(curBlock, curX, curY, curRot)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
msgBox("Game Over!")
|
msgBox("Game Over!")
|
||||||
while true do
|
while true do
|
||||||
local _,k=os.pullEvent("key")
|
local _, k = os.pullEvent("key")
|
||||||
if k==keys.space or k==keys.enter then
|
if k == keys.space or k == keys.enter then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
level = math.min(level,9)
|
level = math.min(level, 9)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local selected=1
|
local selected = 1
|
||||||
local playersDetected=false
|
local playersDetected = false
|
||||||
|
|
||||||
local function drawMenu()
|
local function drawMenu()
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.setTextColor(colorass(colors.red,colors.white))
|
term.setTextColor(colorass(colors.red, colors.white))
|
||||||
term.clear()
|
term.clear()
|
||||||
|
|
||||||
local cx,cy=math.floor(width/2),math.floor(height/2)
|
local cx, cy = math.floor(width / 2), math.floor(height / 2)
|
||||||
|
|
||||||
term.setCursorPos(cx-6,cy-2)
|
term.setCursorPos(cx - 6, cy - 2)
|
||||||
term.write("F A L L I N G")
|
term.write("F A L L I N G")
|
||||||
|
|
||||||
if playersDetected then
|
if playersDetected then
|
||||||
if selected==0 then
|
if selected == 0 then
|
||||||
term.setTextColor(colorass(colors.blue,colors.black))
|
term.setTextColor(colorass(colors.blue, colors.black))
|
||||||
term.setBackgroundColor(colorass(colors.gray,colors.white))
|
term.setBackgroundColor(colorass(colors.gray, colors.white))
|
||||||
else
|
else
|
||||||
term.setTextColor(colorass(colors.lightBlue,colors.white))
|
term.setTextColor(colorass(colors.lightBlue, colors.white))
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
end
|
end
|
||||||
term.setCursorPos(cx-12,cy)
|
term.setCursorPos(cx - 12, cy)
|
||||||
term.write(" Play head-to-head game! ")
|
term.write(" Play head-to-head game! ")
|
||||||
end
|
end
|
||||||
|
|
||||||
term.setCursorPos(cx-10,cy+1)
|
term.setCursorPos(cx - 10, cy + 1)
|
||||||
if selected==1 then
|
if selected == 1 then
|
||||||
term.setTextColor(colorass(colors.blue,colors.black))
|
term.setTextColor(colorass(colors.blue, colors.black))
|
||||||
term.setBackgroundColor(colorass(colors.lightGray,colors.white))
|
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||||
else
|
else
|
||||||
term.setTextColor(colorass(colors.lightBlue,colors.white))
|
term.setTextColor(colorass(colors.lightBlue, colors.white))
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
end
|
end
|
||||||
term.write(" Play from level: <" .. level .. "> ")
|
term.write(" Play from level: <" .. level .. "> ")
|
||||||
|
|
||||||
term.setCursorPos(cx-3,cy+3)
|
term.setCursorPos(cx - 3, cy + 3)
|
||||||
if selected==2 then
|
if selected == 2 then
|
||||||
term.setTextColor(colorass(colors.blue,colors.black))
|
term.setTextColor(colorass(colors.blue, colors.black))
|
||||||
term.setBackgroundColor(colorass(colors.lightGray,colors.white))
|
term.setBackgroundColor(colorass(colors.lightGray, colors.white))
|
||||||
else
|
else
|
||||||
term.setTextColor(colorass(colors.lightBlue,colors.white))
|
term.setTextColor(colorass(colors.lightBlue, colors.white))
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
end
|
end
|
||||||
term.write(" Quit ")
|
term.write(" Quit ")
|
||||||
@ -607,28 +606,28 @@ local function runMenu()
|
|||||||
drawMenu()
|
drawMenu()
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local event={os.pullEvent()}
|
local event = {os.pullEvent()}
|
||||||
if event[1]=="key" then
|
if event[1] == "key" then
|
||||||
local key=event[2]
|
local key = event[2]
|
||||||
if key==keys.right or key==keys.d and selected==1 then
|
if key == keys.right or key == keys.d and selected == 1 then
|
||||||
level=math.min(level+1,9)
|
level = math.min(level + 1, 9)
|
||||||
drawMenu()
|
drawMenu()
|
||||||
elseif key==keys.left or key==keys.a and selected==1 then
|
elseif key == keys.left or key == keys.a and selected == 1 then
|
||||||
level=math.max(level-1,1)
|
level = math.max(level - 1, 1)
|
||||||
drawMenu()
|
drawMenu()
|
||||||
elseif key>=keys.one and key<=keys.nine and selected==1 then
|
elseif key >= keys.one and key <= keys.nine and selected == 1 then
|
||||||
level=(key-keys.one) + 1
|
level = key - keys.one + 1
|
||||||
drawMenu()
|
drawMenu()
|
||||||
elseif key==keys.up or key==keys.w then
|
elseif key == keys.up or key == keys.w then
|
||||||
selected=selected-1
|
selected = selected - 1
|
||||||
if selected==0 then
|
if selected == 0 then
|
||||||
selected=2
|
selected = 2
|
||||||
end
|
end
|
||||||
drawMenu()
|
drawMenu()
|
||||||
elseif key==keys.down or key==keys.s then
|
elseif key == keys.down or key == keys.s then
|
||||||
selected=selected%2+1
|
selected = selected % 2 + 1
|
||||||
drawMenu()
|
drawMenu()
|
||||||
elseif key==keys.enter or key==keys.space then
|
elseif key == keys.enter or key == keys.space then
|
||||||
break --begin play!
|
break --begin play!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -637,7 +636,7 @@ end
|
|||||||
|
|
||||||
while true do
|
while true do
|
||||||
runMenu()
|
runMenu()
|
||||||
if selected==2 then
|
if selected == 2 then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -648,4 +647,4 @@ end
|
|||||||
term.setTextColor(colors.white)
|
term.setTextColor(colors.white)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1, 1)
|
||||||
|
@ -9,7 +9,7 @@ end
|
|||||||
|
|
||||||
local sOpenedModem = nil
|
local sOpenedModem = nil
|
||||||
local function openModem()
|
local function openModem()
|
||||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||||
if peripheral.getType( sModem ) == "modem" then
|
if peripheral.getType( sModem ) == "modem" then
|
||||||
if not rednet.isOpen( sModem ) then
|
if not rednet.isOpen( sModem ) then
|
||||||
rednet.open( sModem )
|
rednet.open( sModem )
|
||||||
@ -94,7 +94,7 @@ if sCommand == "host" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function printUsers()
|
local function printUsers()
|
||||||
local x,y = term.getCursorPos()
|
local _, y = term.getCursorPos()
|
||||||
term.setCursorPos( 1, y - 1 )
|
term.setCursorPos( 1, y - 1 )
|
||||||
term.clearLine()
|
term.clearLine()
|
||||||
if nUsers == 1 then
|
if nUsers == 1 then
|
||||||
@ -108,13 +108,13 @@ if sCommand == "host" then
|
|||||||
local ok, error = pcall( function()
|
local ok, error = pcall( function()
|
||||||
parallel.waitForAny( function()
|
parallel.waitForAny( function()
|
||||||
while true do
|
while true do
|
||||||
local sEvent, timer = os.pullEvent( "timer" )
|
local _, timer = os.pullEvent( "timer" )
|
||||||
local nUserID = tPingPongTimer[ timer ]
|
local nUserID = tPingPongTimer[ timer ]
|
||||||
if nUserID and tUsers[ nUserID ] then
|
if nUserID and tUsers[ nUserID ] then
|
||||||
local tUser = tUsers[ nUserID ]
|
local tUser = tUsers[ nUserID ]
|
||||||
if tUser then
|
if tUser then
|
||||||
if not tUser.bPingPonged then
|
if not tUser.bPingPonged then
|
||||||
send( "* "..tUser.sUsername.." has timed out" )
|
send( "* " .. tUser.sUsername .. " has timed out" )
|
||||||
tUsers[ nUserID ] = nil
|
tUsers[ nUserID ] = nil
|
||||||
nUsers = nUsers - 1
|
nUsers = nUsers - 1
|
||||||
printUsers()
|
printUsers()
|
||||||
@ -130,17 +130,17 @@ if sCommand == "host" then
|
|||||||
local tCommands
|
local tCommands
|
||||||
tCommands = {
|
tCommands = {
|
||||||
["me"] = function( tUser, sContent )
|
["me"] = function( tUser, sContent )
|
||||||
if string.len(sContent) > 0 then
|
if #sContent > 0 then
|
||||||
send( "* "..tUser.sUsername.." "..sContent )
|
send( "* " .. tUser.sUsername .. " " .. sContent )
|
||||||
else
|
else
|
||||||
send( "* Usage: /me [words]", tUser.nUserID )
|
send( "* Usage: /me [words]", tUser.nUserID )
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
["nick"] = function( tUser, sContent )
|
["nick"] = function( tUser, sContent )
|
||||||
if string.len(sContent) > 0 then
|
if #sContent > 0 then
|
||||||
local sOldName = tUser.sUsername
|
local sOldName = tUser.sUsername
|
||||||
tUser.sUsername = sContent
|
tUser.sUsername = sContent
|
||||||
send( "* "..sOldName.." is now known as "..tUser.sUsername )
|
send( "* " .. sOldName .. " is now known as " .. tUser.sUsername )
|
||||||
else
|
else
|
||||||
send( "* Usage: /nick [nickname]", tUser.nUserID )
|
send( "* Usage: /nick [nickname]", tUser.nUserID )
|
||||||
end
|
end
|
||||||
@ -148,7 +148,7 @@ if sCommand == "host" then
|
|||||||
["users"] = function( tUser, sContent )
|
["users"] = function( tUser, sContent )
|
||||||
send( "* Connected Users:", tUser.nUserID )
|
send( "* Connected Users:", tUser.nUserID )
|
||||||
local sUsers = "*"
|
local sUsers = "*"
|
||||||
for nUserID, tUser in pairs( tUsers ) do
|
for _, tUser in pairs( tUsers ) do
|
||||||
sUsers = sUsers .. " " .. tUser.sUsername
|
sUsers = sUsers .. " " .. tUser.sUsername
|
||||||
end
|
end
|
||||||
send( sUsers, tUser.nUserID )
|
send( sUsers, tUser.nUserID )
|
||||||
@ -156,10 +156,10 @@ if sCommand == "host" then
|
|||||||
["help"] = function( tUser, sContent )
|
["help"] = function( tUser, sContent )
|
||||||
send( "* Available commands:", tUser.nUserID )
|
send( "* Available commands:", tUser.nUserID )
|
||||||
local sCommands = "*"
|
local sCommands = "*"
|
||||||
for sCommand, fnCommand in pairs( tCommands ) do
|
for sCommand in pairs( tCommands ) do
|
||||||
sCommands = sCommands .. " /" .. sCommand
|
sCommands = sCommands .. " /" .. sCommand
|
||||||
end
|
end
|
||||||
send( sCommands.." /logout", tUser.nUserID )
|
send( sCommands .. " /logout", tUser.nUserID )
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ if sCommand == "host" then
|
|||||||
}
|
}
|
||||||
nUsers = nUsers + 1
|
nUsers = nUsers + 1
|
||||||
printUsers()
|
printUsers()
|
||||||
send( "* "..sUsername.." has joined the chat" )
|
send( "* " .. sUsername .. " has joined the chat" )
|
||||||
ping( nUserID )
|
ping( nUserID )
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ if sCommand == "host" then
|
|||||||
local tUser = tUsers[ nUserID ]
|
local tUser = tUsers[ nUserID ]
|
||||||
if tUser and tUser.nID == nSenderID then
|
if tUser and tUser.nID == nSenderID then
|
||||||
if tMessage.sType == "logout" then
|
if tMessage.sType == "logout" then
|
||||||
send( "* "..tUser.sUsername.." has left the chat" )
|
send( "* " .. tUser.sUsername .. " has left the chat" )
|
||||||
tUsers[ nUserID ] = nil
|
tUsers[ nUserID ] = nil
|
||||||
nUsers = nUsers - 1
|
nUsers = nUsers - 1
|
||||||
printUsers()
|
printUsers()
|
||||||
@ -199,13 +199,13 @@ if sCommand == "host" then
|
|||||||
if sCommand then
|
if sCommand then
|
||||||
local fnCommand = tCommands[ sCommand ]
|
local fnCommand = tCommands[ sCommand ]
|
||||||
if fnCommand then
|
if fnCommand then
|
||||||
local sContent = string.sub( sMessage, string.len(sCommand)+3 )
|
local sContent = string.sub( sMessage, #sCommand + 3 )
|
||||||
fnCommand( tUser, sContent )
|
fnCommand( tUser, sContent )
|
||||||
else
|
else
|
||||||
send( "* Unrecognised command: /"..sCommand, tUser.nUserID )
|
send( "* Unrecognised command: /" .. sCommand, tUser.nUserID )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
send( "<"..tUser.sUsername.."> "..tMessage.sText )
|
send( "<" .. tUser.sUsername .. "> " .. tMessage.sText )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -284,12 +284,12 @@ elseif sCommand == "join" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Handle messages
|
-- Handle messages
|
||||||
local w,h = term.getSize()
|
local w, h = term.getSize()
|
||||||
local parentTerm = term.current()
|
local parentTerm = term.current()
|
||||||
local titleWindow = window.create( parentTerm, 1, 1, w, 1, true )
|
local titleWindow = window.create( parentTerm, 1, 1, w, 1, true )
|
||||||
local historyWindow = window.create( parentTerm, 1, 2, w, h-2, true )
|
local historyWindow = window.create( parentTerm, 1, 2, w, h - 2, true )
|
||||||
local promptWindow = window.create( parentTerm, 1, h, w, 1, true )
|
local promptWindow = window.create( parentTerm, 1, h, w, 1, true )
|
||||||
historyWindow.setCursorPos( 1, h-2 )
|
historyWindow.setCursorPos( 1, h - 2 )
|
||||||
|
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
@ -297,11 +297,10 @@ elseif sCommand == "join" then
|
|||||||
promptWindow.restoreCursor()
|
promptWindow.restoreCursor()
|
||||||
|
|
||||||
local function drawTitle()
|
local function drawTitle()
|
||||||
local x,y = titleWindow.getCursorPos()
|
local w = titleWindow.getSize()
|
||||||
local w,h = titleWindow.getSize()
|
local sTitle = sUsername .. " on " .. sHostname
|
||||||
local sTitle = sUsername.." on "..sHostname
|
|
||||||
titleWindow.setTextColour( highlightColour )
|
titleWindow.setTextColour( highlightColour )
|
||||||
titleWindow.setCursorPos( math.floor( w/2 - string.len(sTitle)/2 ), 1 )
|
titleWindow.setCursorPos( math.floor( w / 2 - #sTitle / 2 ), 1 )
|
||||||
titleWindow.clearLine()
|
titleWindow.clearLine()
|
||||||
titleWindow.write( sTitle )
|
titleWindow.write( sTitle )
|
||||||
promptWindow.restoreCursor()
|
promptWindow.restoreCursor()
|
||||||
@ -322,7 +321,7 @@ elseif sCommand == "join" then
|
|||||||
term.setTextColour( highlightColour )
|
term.setTextColour( highlightColour )
|
||||||
write( sUsernameBit )
|
write( sUsernameBit )
|
||||||
term.setTextColour( textColour )
|
term.setTextColour( textColour )
|
||||||
write( string.sub( sMessage, string.len( sUsernameBit ) + 1 ) )
|
write( string.sub( sMessage, #sUsernameBit + 1 ) )
|
||||||
else
|
else
|
||||||
write( sMessage )
|
write( sMessage )
|
||||||
end
|
end
|
||||||
@ -348,9 +347,9 @@ elseif sCommand == "join" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
elseif sEvent == "term_resize" then
|
elseif sEvent == "term_resize" then
|
||||||
local w,h = parentTerm.getSize()
|
local w, h = parentTerm.getSize()
|
||||||
titleWindow.reposition( 1, 1, w, 1 )
|
titleWindow.reposition( 1, 1, w, 1 )
|
||||||
historyWindow.reposition( 1, 2, w, h-2 )
|
historyWindow.reposition( 1, 2, w, h - 2 )
|
||||||
promptWindow.reposition( 1, h, w, 1 )
|
promptWindow.reposition( 1, h, w, 1 )
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -385,7 +384,7 @@ elseif sCommand == "join" then
|
|||||||
function()
|
function()
|
||||||
local tSendHistory = {}
|
local tSendHistory = {}
|
||||||
while true do
|
while true do
|
||||||
promptWindow.setCursorPos( 1,1 )
|
promptWindow.setCursorPos( 1, 1 )
|
||||||
promptWindow.clearLine()
|
promptWindow.clearLine()
|
||||||
promptWindow.setTextColor( highlightColour )
|
promptWindow.setTextColor( highlightColour )
|
||||||
promptWindow.write( ": ")
|
promptWindow.write( ": ")
|
||||||
@ -410,7 +409,7 @@ elseif sCommand == "join" then
|
|||||||
term.redirect( parentTerm )
|
term.redirect( parentTerm )
|
||||||
|
|
||||||
-- Print error notice
|
-- Print error notice
|
||||||
local w,h = term.getSize()
|
local _, h = term.getSize()
|
||||||
term.setCursorPos( 1, h )
|
term.setCursorPos( 1, h )
|
||||||
term.clearLine()
|
term.clearLine()
|
||||||
term.setCursorBlink( false )
|
term.setCursorBlink( false )
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
-- Find modems
|
-- Find modems
|
||||||
local tModems = {}
|
local tModems = {}
|
||||||
for n,sModem in ipairs( peripheral.getNames() ) do
|
for _, sModem in ipairs( peripheral.getNames() ) do
|
||||||
if peripheral.getType( sModem ) == "modem" then
|
if peripheral.getType( sModem ) == "modem" then
|
||||||
table.insert( tModems, sModem )
|
table.insert( tModems, sModem )
|
||||||
end
|
end
|
||||||
@ -16,14 +16,14 @@ else
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function open( nChannel )
|
local function open( nChannel )
|
||||||
for n=1,#tModems do
|
for n = 1, #tModems do
|
||||||
local sModem = tModems[n]
|
local sModem = tModems[n]
|
||||||
peripheral.call( sModem, "open", nChannel )
|
peripheral.call( sModem, "open", nChannel )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function close( nChannel )
|
local function close( nChannel )
|
||||||
for n=1,#tModems do
|
for n = 1, #tModems do
|
||||||
local sModem = tModems[n]
|
local sModem = tModems[n]
|
||||||
peripheral.call( sModem, "close", nChannel )
|
peripheral.call( sModem, "close", nChannel )
|
||||||
end
|
end
|
||||||
@ -51,7 +51,7 @@ local ok, error = pcall( function()
|
|||||||
tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = tMessage.nMessageID
|
tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = tMessage.nMessageID
|
||||||
|
|
||||||
-- Send on all other open modems, to the target and to other repeaters
|
-- Send on all other open modems, to the target and to other repeaters
|
||||||
for n=1,#tModems do
|
for n = 1, #tModems do
|
||||||
local sOtherModem = tModems[n]
|
local sOtherModem = tModems[n]
|
||||||
peripheral.call( sOtherModem, "transmit", rednet.CHANNEL_REPEAT, nReplyChannel, tMessage )
|
peripheral.call( sOtherModem, "transmit", rednet.CHANNEL_REPEAT, nReplyChannel, tMessage )
|
||||||
peripheral.call( sOtherModem, "transmit", tMessage.nRecipient, nReplyChannel, tMessage )
|
peripheral.call( sOtherModem, "transmit", tMessage.nRecipient, nReplyChannel, tMessage )
|
||||||
@ -59,7 +59,7 @@ local ok, error = pcall( function()
|
|||||||
|
|
||||||
-- Log the event
|
-- Log the event
|
||||||
nTransmittedMessages = nTransmittedMessages + 1
|
nTransmittedMessages = nTransmittedMessages + 1
|
||||||
local x,y = term.getCursorPos()
|
local _, y = term.getCursorPos()
|
||||||
term.setCursorPos( 1, y - 1 )
|
term.setCursorPos( 1, y - 1 )
|
||||||
term.clearLine()
|
term.clearLine()
|
||||||
if nTransmittedMessages == 1 then
|
if nTransmittedMessages == 1 then
|
||||||
|
@ -17,7 +17,7 @@ if sCommand == "probe" then
|
|||||||
|
|
||||||
local count = 0
|
local count = 0
|
||||||
local bundledCount = 0
|
local bundledCount = 0
|
||||||
for n,sSide in ipairs( redstone.getSides() ) do
|
for _, sSide in ipairs( redstone.getSides() ) do
|
||||||
if redstone.getBundledInput( sSide ) > 0 then
|
if redstone.getBundledInput( sSide ) > 0 then
|
||||||
bundledCount = bundledCount + 1
|
bundledCount = bundledCount + 1
|
||||||
end
|
end
|
||||||
@ -39,12 +39,12 @@ if sCommand == "probe" then
|
|||||||
if bundledCount > 0 then
|
if bundledCount > 0 then
|
||||||
print()
|
print()
|
||||||
print( "Bundled inputs:" )
|
print( "Bundled inputs:" )
|
||||||
for i,sSide in ipairs( redstone.getSides() ) do
|
for _, sSide in ipairs( redstone.getSides() ) do
|
||||||
local nInput = redstone.getBundledInput( sSide )
|
local nInput = redstone.getBundledInput( sSide )
|
||||||
if nInput ~= 0 then
|
if nInput ~= 0 then
|
||||||
write( sSide..": " )
|
write( sSide .. ": " )
|
||||||
local count = 0
|
local count = 0
|
||||||
for sColour,nColour in pairs( colors ) do
|
for sColour, nColour in pairs( colors ) do
|
||||||
if type( nColour ) == "number" and colors.test( nInput, nColour ) then
|
if type( nColour ) == "number" and colors.test( nInput, nColour ) then
|
||||||
if count > 0 then
|
if count > 0 then
|
||||||
write( ", " )
|
write( ", " )
|
||||||
@ -69,7 +69,7 @@ elseif sCommand == "pulse" then
|
|||||||
local sSide = tArgs[2]
|
local sSide = tArgs[2]
|
||||||
local nCount = tonumber( tArgs[3] ) or 1
|
local nCount = tonumber( tArgs[3] ) or 1
|
||||||
local nPeriod = tonumber( tArgs[4] ) or 0.5
|
local nPeriod = tonumber( tArgs[4] ) or 0.5
|
||||||
for n=1,nCount do
|
for _ = 1, nCount do
|
||||||
redstone.setOutput( sSide, true )
|
redstone.setOutput( sSide, true )
|
||||||
sleep( nPeriod / 2 )
|
sleep( nPeriod / 2 )
|
||||||
redstone.setOutput( sSide, false )
|
redstone.setOutput( sSide, false )
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs == 0 then
|
if #tArgs == 0 then
|
||||||
-- "set"
|
-- "set"
|
||||||
local x,y = term.getCursorPos()
|
local _, y = term.getCursorPos()
|
||||||
local tSettings = {}
|
local tSettings = {}
|
||||||
for n,sName in ipairs( settings.getNames() ) do
|
for n, sName in ipairs( settings.getNames() ) do
|
||||||
tSettings[n] = textutils.serialize(sName) .. " is " .. textutils.serialize(settings.get(sName))
|
tSettings[n] = textutils.serialize(sName) .. " is " .. textutils.serialize(settings.get(sName))
|
||||||
end
|
end
|
||||||
textutils.pagedPrint(table.concat(tSettings,"\n"),y-3)
|
textutils.pagedPrint(table.concat(tSettings, "\n"), y - 3)
|
||||||
|
|
||||||
elseif #tArgs == 1 then
|
elseif #tArgs == 1 then
|
||||||
-- "set foo"
|
-- "set foo"
|
||||||
|
@ -9,10 +9,10 @@ if multishell then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local bExit = false
|
local bExit = false
|
||||||
local sDir = (parentShell and parentShell.dir()) or ""
|
local sDir = parentShell and parentShell.dir() or ""
|
||||||
local sPath = (parentShell and parentShell.path()) or ".:/rom/programs"
|
local sPath = parentShell and parentShell.path() or ".:/rom/programs"
|
||||||
local tAliases = (parentShell and parentShell.aliases()) or {}
|
local tAliases = parentShell and parentShell.aliases() or {}
|
||||||
local tCompletionInfo = (parentShell and parentShell.getCompletionInfo()) or {}
|
local tCompletionInfo = parentShell and parentShell.getCompletionInfo() or {}
|
||||||
local tProgramStack = {}
|
local tProgramStack = {}
|
||||||
|
|
||||||
local shell = {}
|
local shell = {}
|
||||||
@ -33,9 +33,9 @@ local function createShellEnv( sDir )
|
|||||||
}
|
}
|
||||||
package.path = "?;?.lua;?/init.lua;/rom/modules/main/?;/rom/modules/main/?.lua;/rom/modules/main/?/init.lua"
|
package.path = "?;?.lua;?/init.lua;/rom/modules/main/?;/rom/modules/main/?.lua;/rom/modules/main/?/init.lua"
|
||||||
if turtle then
|
if turtle then
|
||||||
package.path = package.path..";/rom/modules/turtle/?;/rom/modules/turtle/?.lua;/rom/modules/turtle/?/init.lua"
|
package.path = package.path .. ";/rom/modules/turtle/?;/rom/modules/turtle/?.lua;/rom/modules/turtle/?/init.lua"
|
||||||
elseif command then
|
elseif command then
|
||||||
package.path = package.path..";/rom/modules/command/?;/rom/modules/command/?.lua;/rom/modules/command/?/init.lua"
|
package.path = package.path .. ";/rom/modules/command/?;/rom/modules/command/?.lua;/rom/modules/command/?/init.lua"
|
||||||
end
|
end
|
||||||
package.config = "/\n;\n?\n!\n-"
|
package.config = "/\n;\n?\n!\n-"
|
||||||
package.preload = {}
|
package.preload = {}
|
||||||
@ -52,7 +52,7 @@ local function createShellEnv( sDir )
|
|||||||
local sError = ""
|
local sError = ""
|
||||||
for pattern in string.gmatch(package.path, "[^;]+") do
|
for pattern in string.gmatch(package.path, "[^;]+") do
|
||||||
local sPath = string.gsub(pattern, "%?", fname)
|
local sPath = string.gsub(pattern, "%?", fname)
|
||||||
if sPath:sub(1,1) ~= "/" then
|
if sPath:sub(1, 1) ~= "/" then
|
||||||
sPath = fs.combine(sDir, sPath)
|
sPath = fs.combine(sDir, sPath)
|
||||||
end
|
end
|
||||||
if fs.exists(sPath) and not fs.isDir(sPath) then
|
if fs.exists(sPath) and not fs.isDir(sPath) then
|
||||||
@ -70,7 +70,7 @@ local function createShellEnv( sDir )
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
return nil, sError
|
return nil, sError
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
local sentinel = {}
|
local sentinel = {}
|
||||||
@ -125,7 +125,7 @@ local function run( _sCommand, ... )
|
|||||||
if multishell then
|
if multishell then
|
||||||
local sTitle = fs.getName( sPath )
|
local sTitle = fs.getName( sPath )
|
||||||
if sTitle:sub(-4) == ".lua" then
|
if sTitle:sub(-4) == ".lua" then
|
||||||
sTitle = sTitle:sub(1,-5)
|
sTitle = sTitle:sub(1, -5)
|
||||||
end
|
end
|
||||||
multishell.setTitle( multishell.getCurrent(), sTitle )
|
multishell.setTitle( multishell.getCurrent(), sTitle )
|
||||||
end
|
end
|
||||||
@ -140,7 +140,7 @@ local function run( _sCommand, ... )
|
|||||||
if #tProgramStack > 0 then
|
if #tProgramStack > 0 then
|
||||||
local sTitle = fs.getName( tProgramStack[#tProgramStack] )
|
local sTitle = fs.getName( tProgramStack[#tProgramStack] )
|
||||||
if sTitle:sub(-4) == ".lua" then
|
if sTitle:sub(-4) == ".lua" then
|
||||||
sTitle = sTitle:sub(1,-5)
|
sTitle = sTitle:sub(1, -5)
|
||||||
end
|
end
|
||||||
multishell.setTitle( multishell.getCurrent(), sTitle )
|
multishell.setTitle( multishell.getCurrent(), sTitle )
|
||||||
else
|
else
|
||||||
@ -272,12 +272,12 @@ function shell.programs( _bIncludeHidden )
|
|||||||
sPath = shell.resolve( sPath )
|
sPath = shell.resolve( sPath )
|
||||||
if fs.isDir( sPath ) then
|
if fs.isDir( sPath ) then
|
||||||
local tList = fs.list( sPath )
|
local tList = fs.list( sPath )
|
||||||
for n=1,#tList do
|
for n = 1, #tList do
|
||||||
local sFile = tList[n]
|
local sFile = tList[n]
|
||||||
if not fs.isDir( fs.combine( sPath, sFile ) ) and
|
if not fs.isDir( fs.combine( sPath, sFile ) ) and
|
||||||
(_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then
|
(_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then
|
||||||
if #sFile > 4 and sFile:sub(-4) == ".lua" then
|
if #sFile > 4 and sFile:sub(-4) == ".lua" then
|
||||||
sFile = sFile:sub(1,-5)
|
sFile = sFile:sub(1, -5)
|
||||||
end
|
end
|
||||||
tItems[ sFile ] = true
|
tItems[ sFile ] = true
|
||||||
end
|
end
|
||||||
@ -287,7 +287,7 @@ function shell.programs( _bIncludeHidden )
|
|||||||
|
|
||||||
-- Sort and return
|
-- Sort and return
|
||||||
local tItemList = {}
|
local tItemList = {}
|
||||||
for sItem, b in pairs( tItems ) do
|
for sItem in pairs( tItems ) do
|
||||||
table.insert( tItemList, sItem )
|
table.insert( tItemList, sItem )
|
||||||
end
|
end
|
||||||
table.sort( tItemList )
|
table.sort( tItemList )
|
||||||
@ -304,7 +304,7 @@ local function completeProgram( sLine )
|
|||||||
local tSeen = {}
|
local tSeen = {}
|
||||||
|
|
||||||
-- Add aliases
|
-- Add aliases
|
||||||
for sAlias, sCommand in pairs( tAliases ) do
|
for sAlias in pairs( tAliases ) do
|
||||||
if #sAlias > #sLine and string.sub( sAlias, 1, #sLine ) == sLine then
|
if #sAlias > #sLine and string.sub( sAlias, 1, #sLine ) == sLine then
|
||||||
local sResult = string.sub( sAlias, #sLine + 1 )
|
local sResult = string.sub( sAlias, #sLine + 1 )
|
||||||
if not tSeen[ sResult ] then
|
if not tSeen[ sResult ] then
|
||||||
@ -326,7 +326,7 @@ local function completeProgram( sLine )
|
|||||||
|
|
||||||
-- Add programs from the path
|
-- Add programs from the path
|
||||||
local tPrograms = shell.programs()
|
local tPrograms = shell.programs()
|
||||||
for n=1,#tPrograms do
|
for n = 1, #tPrograms do
|
||||||
local sProgram = tPrograms[n]
|
local sProgram = tPrograms[n]
|
||||||
if #sProgram > #sLine and string.sub( sProgram, 1, #sLine ) == sLine then
|
if #sProgram > #sLine and string.sub( sProgram, 1, #sLine ) == sLine then
|
||||||
local sResult = string.sub( sProgram, #sLine + 1 )
|
local sResult = string.sub( sProgram, #sLine + 1 )
|
||||||
@ -366,7 +366,7 @@ function shell.complete( sLine )
|
|||||||
return { " " }
|
return { " " }
|
||||||
else
|
else
|
||||||
local tResults = completeProgram( sBit )
|
local tResults = completeProgram( sBit )
|
||||||
for n=1,#tResults do
|
for n = 1, #tResults do
|
||||||
local sResult = tResults[n]
|
local sResult = tResults[n]
|
||||||
local sPath = shell.resolveProgram( sBit .. sResult )
|
local sPath = shell.resolveProgram( sBit .. sResult )
|
||||||
if tCompletionInfo[ sPath ] then
|
if tCompletionInfo[ sPath ] then
|
||||||
@ -397,7 +397,7 @@ function shell.setCompletionFunction( sProgram, fnComplete )
|
|||||||
expect(1, sProgram, "string")
|
expect(1, sProgram, "string")
|
||||||
expect(2, fnComplete, "function")
|
expect(2, fnComplete, "function")
|
||||||
tCompletionInfo[ sProgram ] = {
|
tCompletionInfo[ sProgram ] = {
|
||||||
fnComplete = fnComplete
|
fnComplete = fnComplete,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
local nTime = os.time()
|
local nTime = os.time()
|
||||||
local nDay = os.day()
|
local nDay = os.day()
|
||||||
print( "The time is "..textutils.formatTime( nTime, false ).." on Day "..nDay )
|
print( "The time is " .. textutils.formatTime( nTime, false ) .. " on Day " .. nDay )
|
||||||
|
@ -29,7 +29,7 @@ if turtle.craft( nLimit ) then
|
|||||||
end
|
end
|
||||||
|
|
||||||
if nCrafted > 1 then
|
if nCrafted > 1 then
|
||||||
print( nCrafted.." items crafted" )
|
print( nCrafted .. " items crafted" )
|
||||||
elseif nCrafted == 1 then
|
elseif nCrafted == 1 then
|
||||||
print( "1 item crafted" )
|
print( "1 item crafted" )
|
||||||
else
|
else
|
||||||
|
@ -81,10 +81,10 @@ textutils.slowWrite( "Preparing to get down." )
|
|||||||
textutils.slowPrint( "..", 0.75 )
|
textutils.slowPrint( "..", 0.75 )
|
||||||
|
|
||||||
local sAudio = nil
|
local sAudio = nil
|
||||||
for n,sName in pairs( peripheral.getNames() ) do
|
for _, sName in pairs( peripheral.getNames() ) do
|
||||||
if disk.hasAudio( sName ) then
|
if disk.hasAudio( sName ) then
|
||||||
disk.playAudio( sName )
|
disk.playAudio( sName )
|
||||||
print( "Jamming to "..disk.getAudioTitle( sName ) )
|
print( "Jamming to " .. disk.getAudioTitle( sName ) )
|
||||||
sAudio = sName
|
sAudio = sName
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@ -95,7 +95,7 @@ print( "Press any key to stop the groove" )
|
|||||||
parallel.waitForAny(
|
parallel.waitForAny(
|
||||||
function()
|
function()
|
||||||
while not bEnd do
|
while not bEnd do
|
||||||
local event, key = os.pullEvent("key")
|
local _, key = os.pullEvent("key")
|
||||||
if key ~= keys.escape then
|
if key ~= keys.escape then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -103,7 +103,7 @@ parallel.waitForAny(
|
|||||||
end,
|
end,
|
||||||
function()
|
function()
|
||||||
while true do
|
while true do
|
||||||
local fnMove = tMoves[math.random(1,#tMoves)]
|
local fnMove = tMoves[math.random(1, #tMoves)]
|
||||||
fnMove()
|
fnMove()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -20,15 +20,15 @@ local depth = 0
|
|||||||
local unloaded = 0
|
local unloaded = 0
|
||||||
local collected = 0
|
local collected = 0
|
||||||
|
|
||||||
local xPos,zPos = 0,0
|
local xPos, zPos = 0, 0
|
||||||
local xDir,zDir = 0,1
|
local xDir, zDir = 0, 1
|
||||||
|
|
||||||
local goTo -- Filled in further down
|
local goTo -- Filled in further down
|
||||||
local refuel -- Filled in further down
|
local refuel -- Filled in further down
|
||||||
|
|
||||||
local function unload( _bKeepOneFuelStack )
|
local function unload( _bKeepOneFuelStack )
|
||||||
print( "Unloading items..." )
|
print( "Unloading items..." )
|
||||||
for n=1,16 do
|
for n = 1, 16 do
|
||||||
local nCount = turtle.getItemCount(n)
|
local nCount = turtle.getItemCount(n)
|
||||||
if nCount > 0 then
|
if nCount > 0 then
|
||||||
turtle.select(n)
|
turtle.select(n)
|
||||||
@ -48,11 +48,11 @@ local function unload( _bKeepOneFuelStack )
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function returnSupplies()
|
local function returnSupplies()
|
||||||
local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
|
local x, y, z, xd, zd = xPos, depth, zPos, xDir, zDir
|
||||||
print( "Returning to surface..." )
|
print( "Returning to surface..." )
|
||||||
goTo( 0,0,0,0,-1 )
|
goTo( 0, 0, 0, 0, -1 )
|
||||||
|
|
||||||
local fuelNeeded = 2*(x+y+z) + 1
|
local fuelNeeded = 2 * (x + y + z) + 1
|
||||||
if not refuel( fuelNeeded ) then
|
if not refuel( fuelNeeded ) then
|
||||||
unload( true )
|
unload( true )
|
||||||
print( "Waiting for fuel" )
|
print( "Waiting for fuel" )
|
||||||
@ -64,13 +64,13 @@ local function returnSupplies()
|
|||||||
end
|
end
|
||||||
|
|
||||||
print( "Resuming mining..." )
|
print( "Resuming mining..." )
|
||||||
goTo( x,y,z,xd,zd )
|
goTo( x, y, z, xd, zd )
|
||||||
end
|
end
|
||||||
|
|
||||||
local function collect()
|
local function collect()
|
||||||
local bFull = true
|
local bFull = true
|
||||||
local nTotalItems = 0
|
local nTotalItems = 0
|
||||||
for n=1,16 do
|
for n = 1, 16 do
|
||||||
local nCount = turtle.getItemCount(n)
|
local nCount = turtle.getItemCount(n)
|
||||||
if nCount == 0 then
|
if nCount == 0 then
|
||||||
bFull = false
|
bFull = false
|
||||||
@ -81,7 +81,7 @@ local function collect()
|
|||||||
if nTotalItems > collected then
|
if nTotalItems > collected then
|
||||||
collected = nTotalItems
|
collected = nTotalItems
|
||||||
if math.fmod(collected + unloaded, 50) == 0 then
|
if math.fmod(collected + unloaded, 50) == 0 then
|
||||||
print( "Mined "..(collected + unloaded).." items." )
|
print( "Mined " .. collected + unloaded .. " items." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -98,10 +98,9 @@ function refuel( ammount )
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
local needed = ammount or (xPos + zPos + depth + 2)
|
local needed = ammount or xPos + zPos + depth + 2
|
||||||
if turtle.getFuelLevel() < needed then
|
if turtle.getFuelLevel() < needed then
|
||||||
local fueled = false
|
for n = 1, 16 do
|
||||||
for n=1,16 do
|
|
||||||
if turtle.getItemCount(n) > 0 then
|
if turtle.getItemCount(n) > 0 then
|
||||||
turtle.select(n)
|
turtle.select(n)
|
||||||
if turtle.refuel(1) then
|
if turtle.refuel(1) then
|
||||||
@ -177,7 +176,7 @@ local function tryDown()
|
|||||||
|
|
||||||
depth = depth + 1
|
depth = depth + 1
|
||||||
if math.fmod( depth, 10 ) == 0 then
|
if math.fmod( depth, 10 ) == 0 then
|
||||||
print( "Descended "..depth.." metres." )
|
print( "Descended " .. depth .. " metres." )
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@ -291,8 +290,8 @@ end
|
|||||||
local alternate = 0
|
local alternate = 0
|
||||||
local done = false
|
local done = false
|
||||||
while not done do
|
while not done do
|
||||||
for n=1,size do
|
for n = 1, size do
|
||||||
for m=1,size-1 do
|
for _ = 1, size - 1 do
|
||||||
if not tryForwards() then
|
if not tryForwards() then
|
||||||
done = true
|
done = true
|
||||||
break
|
break
|
||||||
@ -301,8 +300,8 @@ while not done do
|
|||||||
if done then
|
if done then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
if n<size then
|
if n < size then
|
||||||
if math.fmod(n + alternate,2) == 0 then
|
if math.fmod(n + alternate, 2) == 0 then
|
||||||
turnLeft()
|
turnLeft()
|
||||||
if not tryForwards() then
|
if not tryForwards() then
|
||||||
done = true
|
done = true
|
||||||
@ -324,7 +323,7 @@ while not done do
|
|||||||
end
|
end
|
||||||
|
|
||||||
if size > 1 then
|
if size > 1 then
|
||||||
if math.fmod(size,2) == 0 then
|
if math.fmod(size, 2) == 0 then
|
||||||
turnRight()
|
turnRight()
|
||||||
else
|
else
|
||||||
if alternate == 0 then
|
if alternate == 0 then
|
||||||
@ -345,13 +344,13 @@ end
|
|||||||
print( "Returning to surface..." )
|
print( "Returning to surface..." )
|
||||||
|
|
||||||
-- Return to where we started
|
-- Return to where we started
|
||||||
goTo( 0,0,0,0,-1 )
|
goTo( 0, 0, 0, 0, -1 )
|
||||||
unload( false )
|
unload( false )
|
||||||
goTo( 0,0,0,0,1 )
|
goTo( 0, 0, 0, 0, 1 )
|
||||||
|
|
||||||
-- Seal the hole
|
-- Seal the hole
|
||||||
if reseal then
|
if reseal then
|
||||||
turtle.placeDown()
|
turtle.placeDown()
|
||||||
end
|
end
|
||||||
|
|
||||||
print( "Mined "..(collected + unloaded).." items total." )
|
print( "Mined " .. collected + unloaded .. " items total." )
|
||||||
|
@ -50,7 +50,7 @@ while nArg <= #tArgs do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "No such direction: "..sDirection )
|
print( "No such direction: " .. sDirection )
|
||||||
print( "Try: forward, back, up, down" )
|
print( "Try: forward, back, up, down" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -23,7 +23,7 @@ end
|
|||||||
if turtle.getFuelLevel() ~= "unlimited" then
|
if turtle.getFuelLevel() ~= "unlimited" then
|
||||||
for n = 1, 16 do
|
for n = 1, 16 do
|
||||||
-- Stop if we've reached the limit, or are fully refuelled.
|
-- Stop if we've reached the limit, or are fully refuelled.
|
||||||
if (nLimit and nLimit <= 0) or turtle.getFuelLevel() >= turtle.getFuelLimit() then
|
if nLimit and nLimit <= 0 or turtle.getFuelLevel() >= turtle.getFuelLimit() then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ if turtle.getFuelLevel() ~= "unlimited" then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
print( "Fuel level is "..turtle.getFuelLevel() )
|
print( "Fuel level is " .. turtle.getFuelLevel() )
|
||||||
if turtle.getFuelLevel() == turtle.getFuelLimit() then
|
if turtle.getFuelLevel() == turtle.getFuelLimit() then
|
||||||
print( "Fuel limit reached" )
|
print( "Fuel limit reached" )
|
||||||
end
|
end
|
||||||
|
@ -15,14 +15,12 @@ if length < 1 then
|
|||||||
print( "Tunnel length must be positive" )
|
print( "Tunnel length must be positive" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local depth = 0
|
|
||||||
local collected = 0
|
local collected = 0
|
||||||
|
|
||||||
local function collect()
|
local function collect()
|
||||||
collected = collected + 1
|
collected = collected + 1
|
||||||
if math.fmod(collected, 25) == 0 then
|
if math.fmod(collected, 25) == 0 then
|
||||||
print( "Mined "..collected.." items." )
|
print( "Mined " .. collected .. " items." )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -69,7 +67,7 @@ local function refuel()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function tryRefuel()
|
local function tryRefuel()
|
||||||
for n=1,16 do
|
for n = 1, 16 do
|
||||||
if turtle.getItemCount(n) > 0 then
|
if turtle.getItemCount(n) > 0 then
|
||||||
turtle.select(n)
|
turtle.select(n)
|
||||||
if turtle.refuel(1) then
|
if turtle.refuel(1) then
|
||||||
@ -141,7 +139,7 @@ end
|
|||||||
|
|
||||||
print( "Tunnelling..." )
|
print( "Tunnelling..." )
|
||||||
|
|
||||||
for n=1,length do
|
for n = 1, length do
|
||||||
turtle.placeDown()
|
turtle.placeDown()
|
||||||
tryDigUp()
|
tryDigUp()
|
||||||
turtle.turnLeft()
|
turtle.turnLeft()
|
||||||
@ -155,7 +153,7 @@ for n=1,length do
|
|||||||
tryDig()
|
tryDig()
|
||||||
turtle.turnLeft()
|
turtle.turnLeft()
|
||||||
|
|
||||||
if n<length then
|
if n < length then
|
||||||
tryDig()
|
tryDig()
|
||||||
if not tryForward() then
|
if not tryForward() then
|
||||||
print( "Aborting Tunnel." )
|
print( "Aborting Tunnel." )
|
||||||
@ -185,4 +183,4 @@ turtle.turnRight()
|
|||||||
]]
|
]]
|
||||||
|
|
||||||
print( "Tunnel complete." )
|
print( "Tunnel complete." )
|
||||||
print( "Mined "..collected.." items total." )
|
print( "Mined " .. collected .. " items total." )
|
||||||
|
@ -31,11 +31,11 @@ while nArg <= #tArgs do
|
|||||||
|
|
||||||
local fnHandler = tHandlers[string.lower(sDirection)]
|
local fnHandler = tHandlers[string.lower(sDirection)]
|
||||||
if fnHandler then
|
if fnHandler then
|
||||||
for n=1,nDistance do
|
for _ = 1, nDistance do
|
||||||
fnHandler( nArg )
|
fnHandler( nArg )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( "No such direction: "..sDirection )
|
print( "No such direction: " .. sDirection )
|
||||||
print( "Try: left, right" )
|
print( "Try: left, right" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -14,7 +14,7 @@ if #tArgs ~= 1 then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function unequip( fnEquipFunction )
|
local function unequip( fnEquipFunction )
|
||||||
for nSlot=1,16 do
|
for nSlot = 1, 16 do
|
||||||
local nOldCount = turtle.getItemCount( nSlot )
|
local nOldCount = turtle.getItemCount( nSlot )
|
||||||
if nOldCount == 0 then
|
if nOldCount == 0 then
|
||||||
turtle.select( nSlot )
|
turtle.select( nSlot )
|
||||||
|
@ -3,24 +3,24 @@ local completion = require "cc.shell.completion"
|
|||||||
-- Setup paths
|
-- Setup paths
|
||||||
local sPath = ".:/rom/programs"
|
local sPath = ".:/rom/programs"
|
||||||
if term.isColor() then
|
if term.isColor() then
|
||||||
sPath = sPath..":/rom/programs/advanced"
|
sPath = sPath .. ":/rom/programs/advanced"
|
||||||
end
|
end
|
||||||
if turtle then
|
if turtle then
|
||||||
sPath = sPath..":/rom/programs/turtle"
|
sPath = sPath .. ":/rom/programs/turtle"
|
||||||
else
|
else
|
||||||
sPath = sPath..":/rom/programs/rednet:/rom/programs/fun"
|
sPath = sPath .. ":/rom/programs/rednet:/rom/programs/fun"
|
||||||
if term.isColor() then
|
if term.isColor() then
|
||||||
sPath = sPath..":/rom/programs/fun/advanced"
|
sPath = sPath .. ":/rom/programs/fun/advanced"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if pocket then
|
if pocket then
|
||||||
sPath = sPath..":/rom/programs/pocket"
|
sPath = sPath .. ":/rom/programs/pocket"
|
||||||
end
|
end
|
||||||
if commands then
|
if commands then
|
||||||
sPath = sPath..":/rom/programs/command"
|
sPath = sPath .. ":/rom/programs/command"
|
||||||
end
|
end
|
||||||
if http then
|
if http then
|
||||||
sPath = sPath..":/rom/programs/http"
|
sPath = sPath .. ":/rom/programs/http"
|
||||||
end
|
end
|
||||||
shell.setPath( sPath )
|
shell.setPath( sPath )
|
||||||
help.setPath( "/rom/help" )
|
help.setPath( "/rom/help" )
|
||||||
@ -121,7 +121,7 @@ if fs.exists( "/rom/autorun" ) and fs.isDir( "/rom/autorun" ) then
|
|||||||
local tFiles = fs.list( "/rom/autorun" )
|
local tFiles = fs.list( "/rom/autorun" )
|
||||||
for _, sFile in ipairs( tFiles ) do
|
for _, sFile in ipairs( tFiles ) do
|
||||||
if string.sub( sFile, 1, 1 ) ~= "." then
|
if string.sub( sFile, 1, 1 ) ~= "." then
|
||||||
local sPath = "/rom/autorun/"..sFile
|
local sPath = "/rom/autorun/" .. sFile
|
||||||
if not fs.isDir( sPath ) then
|
if not fs.isDir( sPath ) then
|
||||||
shell.run( sPath )
|
shell.run( sPath )
|
||||||
end
|
end
|
||||||
@ -142,7 +142,7 @@ local function findStartups( sBaseDir )
|
|||||||
if tStartups == nil then
|
if tStartups == nil then
|
||||||
tStartups = {}
|
tStartups = {}
|
||||||
end
|
end
|
||||||
for _,v in pairs( fs.list( sBasePath ) ) do
|
for _, v in pairs( fs.list( sBasePath ) ) do
|
||||||
local sPath = "/" .. fs.combine( sBasePath, v )
|
local sPath = "/" .. fs.combine( sBasePath, v )
|
||||||
if not fs.isDir( sPath ) then
|
if not fs.isDir( sPath ) then
|
||||||
tStartups[ #tStartups + 1 ] = sPath
|
tStartups[ #tStartups + 1 ] = sPath
|
||||||
@ -163,7 +163,7 @@ if settings.get( "shell.allow_startup" ) then
|
|||||||
tUserStartups = findStartups( "/" )
|
tUserStartups = findStartups( "/" )
|
||||||
end
|
end
|
||||||
if settings.get( "shell.allow_disk_startup" ) then
|
if settings.get( "shell.allow_disk_startup" ) then
|
||||||
for n,sName in pairs( peripheral.getNames() ) do
|
for _, sName in pairs( peripheral.getNames() ) do
|
||||||
if disk.isPresent( sName ) and disk.hasData( sName ) then
|
if disk.isPresent( sName ) and disk.hasData( sName ) then
|
||||||
local startups = findStartups( disk.getMountPath( sName ) )
|
local startups = findStartups( disk.getMountPath( sName ) )
|
||||||
if startups then
|
if startups then
|
||||||
@ -174,7 +174,7 @@ if settings.get( "shell.allow_disk_startup" ) then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if tUserStartups then
|
if tUserStartups then
|
||||||
for _,v in pairs( tUserStartups ) do
|
for _, v in pairs( tUserStartups ) do
|
||||||
shell.run( v )
|
shell.run( v )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -11,19 +11,19 @@
|
|||||||
|
|
||||||
--- Assert an argument to the given function has the specified type.
|
--- Assert an argument to the given function has the specified type.
|
||||||
--
|
--
|
||||||
-- @tparam string The function's name
|
-- @tparam string func The function's name
|
||||||
-- @tparam int The argument index to this function
|
-- @tparam int idx The argument index to this function
|
||||||
-- @tparam string The type this argument should have. May be 'value' for any
|
-- @tparam string ty The type this argument should have. May be 'value' for
|
||||||
-- non-nil value.
|
-- any non-nil value.
|
||||||
-- @param val The value to check
|
-- @param val val The value to check
|
||||||
-- @raise If this value doesn't match the expected type.
|
-- @throws If this value doesn't match the expected type.
|
||||||
local function check(func, arg, ty, val)
|
local function check(func, idx, ty, val)
|
||||||
if ty == 'value' then
|
if ty == 'value' then
|
||||||
if val == nil then
|
if val == nil then
|
||||||
error(('%s: bad argument #%d (got nil)'):format(func, arg), 3)
|
error(('%s: bad argument #%d (got nil)'):format(func, idx), 3)
|
||||||
end
|
end
|
||||||
elseif type(val) ~= ty then
|
elseif type(val) ~= ty then
|
||||||
return error(('%s: bad argument #%d (expected %s, got %s)'):format(func, arg, ty, type(val)), 3)
|
return error(('%s: bad argument #%d (expected %s, got %s)'):format(func, idx, ty, type(val)), 3)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ local error_mt = { __tostring = function(self) return self.message end }
|
|||||||
--- Attempt to execute the provided function, gathering a stack trace when it
|
--- Attempt to execute the provided function, gathering a stack trace when it
|
||||||
-- errors.
|
-- errors.
|
||||||
--
|
--
|
||||||
-- @tparam
|
-- @tparam function() fn The function to run
|
||||||
-- @return[1] true
|
-- @return[1] true
|
||||||
-- @return[2] false
|
-- @return[2] false
|
||||||
-- @return[2] The error object
|
-- @return[2] The error object
|
||||||
@ -170,7 +170,7 @@ end
|
|||||||
--- Fail a test with the given message
|
--- Fail a test with the given message
|
||||||
--
|
--
|
||||||
-- @tparam string message The message to fail with
|
-- @tparam string message The message to fail with
|
||||||
-- @raises An error with the given message
|
-- @throws An error with the given message
|
||||||
local function fail(message)
|
local function fail(message)
|
||||||
check('fail', 1, 'string', message)
|
check('fail', 1, 'string', message)
|
||||||
error(setmetatable({ message = message, fail = true }, error_mt))
|
error(setmetatable({ message = message, fail = true }, error_mt))
|
||||||
@ -192,7 +192,7 @@ expect_mt.__index = expect_mt
|
|||||||
--- Assert that this expectation has the provided value
|
--- Assert that this expectation has the provided value
|
||||||
--
|
--
|
||||||
-- @param value The value to require this expectation to be equal to
|
-- @param value The value to require this expectation to be equal to
|
||||||
-- @raises If the values are not equal
|
-- @throws If the values are not equal
|
||||||
function expect_mt:equals(value)
|
function expect_mt:equals(value)
|
||||||
if value ~= self.value then
|
if value ~= self.value then
|
||||||
fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
|
fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
|
||||||
@ -206,7 +206,7 @@ expect_mt.eq = expect_mt.equals
|
|||||||
--- Assert that this expectation does not equal the provided value
|
--- Assert that this expectation does not equal the provided value
|
||||||
--
|
--
|
||||||
-- @param value The value to require this expectation to not be equal to
|
-- @param value The value to require this expectation to not be equal to
|
||||||
-- @raises If the values are equal
|
-- @throws If the values are equal
|
||||||
function expect_mt:not_equals(value)
|
function expect_mt:not_equals(value)
|
||||||
if value == self.value then
|
if value == self.value then
|
||||||
fail(("Expected any value but %s"):format(format(value)))
|
fail(("Expected any value but %s"):format(format(value)))
|
||||||
@ -220,7 +220,7 @@ expect_mt.ne = expect_mt.not_equals
|
|||||||
--- Assert that this expectation has something of the provided type
|
--- Assert that this expectation has something of the provided type
|
||||||
--
|
--
|
||||||
-- @tparam string exp_type The type to require this expectation to have
|
-- @tparam string exp_type The type to require this expectation to have
|
||||||
-- @raises If it does not have that thpe
|
-- @throws If it does not have that thpe
|
||||||
function expect_mt:type(exp_type)
|
function expect_mt:type(exp_type)
|
||||||
local actual_type = type(self.value)
|
local actual_type = type(self.value)
|
||||||
if exp_type ~= actual_type then
|
if exp_type ~= actual_type then
|
||||||
@ -270,7 +270,7 @@ end
|
|||||||
-- the provided object.
|
-- the provided object.
|
||||||
--
|
--
|
||||||
-- @param value The value to check for structural equivalence
|
-- @param value The value to check for structural equivalence
|
||||||
-- @raises If they are not equivalent
|
-- @throws If they are not equivalent
|
||||||
function expect_mt:same(value)
|
function expect_mt:same(value)
|
||||||
if not matches({}, true, self.value, value) then
|
if not matches({}, true, self.value, value) then
|
||||||
fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
|
fail(("Expected %s\n but got %s"):format(format(value), format(self.value)))
|
||||||
@ -283,7 +283,7 @@ end
|
|||||||
-- in the provided object.
|
-- in the provided object.
|
||||||
--
|
--
|
||||||
-- @param value The value to check against
|
-- @param value The value to check against
|
||||||
-- @raises If this does not match the provided value
|
-- @throws If this does not match the provided value
|
||||||
function expect_mt:matches(value)
|
function expect_mt:matches(value)
|
||||||
if not matches({}, false, value, self.value) then
|
if not matches({}, false, value, self.value) then
|
||||||
fail(("Expected %s\nto match %s"):format(format(self.value), format(value)))
|
fail(("Expected %s\nto match %s"):format(format(self.value), format(value)))
|
||||||
@ -296,7 +296,7 @@ end
|
|||||||
--
|
--
|
||||||
-- @tparam[opt] number The exact number of times the function must be called.
|
-- @tparam[opt] number The exact number of times the function must be called.
|
||||||
-- If not given just require the function to be called at least once.
|
-- If not given just require the function to be called at least once.
|
||||||
-- @raises If this function was not called the expected number of times.
|
-- @throws If this function was not called the expected number of times.
|
||||||
function expect_mt:called(times)
|
function expect_mt:called(times)
|
||||||
if getmetatable(self.value) ~= stub_mt or self.value.arguments == nil then
|
if getmetatable(self.value) ~= stub_mt or self.value.arguments == nil then
|
||||||
fail(("Expected stubbed function, got %s"):format(type(self.value)))
|
fail(("Expected stubbed function, got %s"):format(type(self.value)))
|
||||||
@ -380,7 +380,7 @@ local expect = setmetatable( {
|
|||||||
-- @return The new expectation
|
-- @return The new expectation
|
||||||
__call = function(_, value)
|
__call = function(_, value)
|
||||||
return setmetatable({ value = value }, expect_mt)
|
return setmetatable({ value = value }, expect_mt)
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
--- The stack of "describe"s.
|
--- The stack of "describe"s.
|
||||||
@ -623,7 +623,7 @@ end
|
|||||||
-- And some summary statistics
|
-- And some summary statistics
|
||||||
local actual_count = tests_run - test_status.pending
|
local actual_count = tests_run - test_status.pending
|
||||||
local info = ("Ran %s test(s), of which %s passed (%g%%).")
|
local info = ("Ran %s test(s), of which %s passed (%g%%).")
|
||||||
:format(actual_count, test_status.pass, (test_status.pass / actual_count) * 100)
|
:format(actual_count, test_status.pass, test_status.pass / actual_count * 100)
|
||||||
|
|
||||||
if test_status.pending > 0 then
|
if test_status.pending > 0 then
|
||||||
info = info .. (" Skipped %d pending test(s)."):format(test_status.pending)
|
info = info .. (" Skipped %d pending test(s)."):format(test_status.pending)
|
||||||
|
@ -2,7 +2,7 @@ describe("The gps library", function()
|
|||||||
describe("gps.locate", function()
|
describe("gps.locate", function()
|
||||||
it("validates arguments", function()
|
it("validates arguments", function()
|
||||||
stub(_G, "commands", { getBlockPosition = function()
|
stub(_G, "commands", { getBlockPosition = function()
|
||||||
end })
|
end, })
|
||||||
|
|
||||||
gps.locate()
|
gps.locate()
|
||||||
gps.locate(1)
|
gps.locate(1)
|
||||||
|
@ -60,10 +60,10 @@ describe("The io library", function()
|
|||||||
|
|
||||||
expect(io.output():seek()):equal(0)
|
expect(io.output():seek()):equal(0)
|
||||||
assert(io.write("alo alo"))
|
assert(io.write("alo alo"))
|
||||||
expect(io.output():seek()):equal(#("alo alo"))
|
expect(io.output():seek()):equal(#"alo alo")
|
||||||
expect(io.output():seek("cur", -3)):equal(#("alo alo") - 3)
|
expect(io.output():seek("cur", -3)):equal(#"alo alo" - 3)
|
||||||
assert(io.write("joao"))
|
assert(io.write("joao"))
|
||||||
expect(io.output():seek("end"):equal(#("alo joao")))
|
expect(io.output():seek("end"):equal(#"alo joao"))
|
||||||
|
|
||||||
expect(io.output():seek("set")):equal(0)
|
expect(io.output():seek("set")):equal(0)
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ describe("The Lua base library", function()
|
|||||||
|
|
||||||
it("does not prefix for unnamed chunks", function()
|
it("does not prefix for unnamed chunks", function()
|
||||||
local info = debug.getinfo(loadstring("return 1"), "S")
|
local info = debug.getinfo(loadstring("return 1"), "S")
|
||||||
expect(info):matches { short_src = '[string "return 1"]', source = "return 1", }
|
expect(info):matches { short_src = '[string "return 1"]', source = "return 1" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("does not prefix when already prefixed", function()
|
it("does not prefix when already prefixed", function()
|
||||||
|
@ -5,7 +5,7 @@ describe("cc.shell.completion", function()
|
|||||||
it("completes both", function()
|
it("completes both", function()
|
||||||
expect(c.dirOrFile(shell, "rom/")):same {
|
expect(c.dirOrFile(shell, "rom/")):same {
|
||||||
"apis/", "apis", "autorun/", "autorun", "help/", "help",
|
"apis/", "apis", "autorun/", "autorun", "help/", "help",
|
||||||
"modules/", "modules", "motd.txt", "programs/", "programs", "startup.lua"
|
"modules/", "modules", "motd.txt", "programs/", "programs", "startup.lua",
|
||||||
}
|
}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ describe("The commands program", function()
|
|||||||
it("lists commands", function()
|
it("lists commands", function()
|
||||||
local pagedTabulate = stub(textutils, "pagedTabulate", function(x) print(table.unpack(x)) end)
|
local pagedTabulate = stub(textutils, "pagedTabulate", function(x) print(table.unpack(x)) end)
|
||||||
stub(_G, "commands", {
|
stub(_G, "commands", {
|
||||||
list = function() return { "computercraft" } end
|
list = function() return { "computercraft" } end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/command/commands.lua"))
|
expect(capture(stub, "/rom/programs/command/commands.lua"))
|
||||||
|
@ -15,7 +15,7 @@ describe("The exec program", function()
|
|||||||
|
|
||||||
it("runs a command", function()
|
it("runs a command", function()
|
||||||
stub(_G, "commands", {
|
stub(_G, "commands", {
|
||||||
exec = function() return true, {"Hello World!"} end
|
exec = function() return true, {"Hello World!"} end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))
|
expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))
|
||||||
@ -23,8 +23,8 @@ describe("The exec program", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("reports command failures", function()
|
it("reports command failures", function()
|
||||||
stub(_G,"commands",{
|
stub(_G, "commands", {
|
||||||
exec = function() return false, {"Hello World!"} end
|
exec = function() return false, {"Hello World!"} end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))
|
expect(capture(stub, "/rom/programs/command/exec.lua computercraft"))
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
local capture = require "test_helpers".capture_program
|
local capture = require "test_helpers".capture_program
|
||||||
local testFile = require "test_helpers".testFile
|
|
||||||
|
|
||||||
describe("The edit program", function()
|
describe("The edit program", function()
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ describe("The pastebin program", function()
|
|||||||
local tHeader = {}
|
local tHeader = {}
|
||||||
tHeader["Content-Type"] = "text/plain; charset=utf-8"
|
tHeader["Content-Type"] = "text/plain; charset=utf-8"
|
||||||
return tHeader
|
return tHeader
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
post = function()
|
post = function()
|
||||||
@ -28,7 +28,7 @@ describe("The pastebin program", function()
|
|||||||
close = function()
|
close = function()
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ describe("The wget program", function()
|
|||||||
close = function()
|
close = function()
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -6,6 +6,6 @@ describe("The id program", function()
|
|||||||
local id = os.getComputerID()
|
local id = os.getComputerID()
|
||||||
|
|
||||||
expect(capture(stub, "id"))
|
expect(capture(stub, "id"))
|
||||||
:matches { ok = true, output = "This is computer #"..id.."\n", error = "" }
|
:matches { ok = true, output = "This is computer #" .. id .. "\n", error = "" }
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@ -3,10 +3,10 @@ local capture = require "test_helpers".capture_program
|
|||||||
describe("The motd program", function()
|
describe("The motd program", function()
|
||||||
|
|
||||||
it("displays MODT", function()
|
it("displays MODT", function()
|
||||||
local file = fs.open("/modt_check.txt","w")
|
local file = fs.open("/modt_check.txt", "w")
|
||||||
file.write("Hello World!")
|
file.write("Hello World!")
|
||||||
file.close()
|
file.close()
|
||||||
settings.set("motd.path","/modt_check.txt")
|
settings.set("motd.path", "/modt_check.txt")
|
||||||
|
|
||||||
expect(capture(stub, "motd"))
|
expect(capture(stub, "motd"))
|
||||||
:matches { ok = true, output = "Hello World!\n", error = "" }
|
:matches { ok = true, output = "Hello World!\n", error = "" }
|
||||||
|
@ -9,7 +9,7 @@ describe("The pocket equip program", function()
|
|||||||
|
|
||||||
it("can equip an upgrade", function()
|
it("can equip an upgrade", function()
|
||||||
stub(_G, "pocket", {
|
stub(_G, "pocket", {
|
||||||
equipBack = function() return true end
|
equipBack = function() return true end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/pocket/equip.lua"))
|
expect(capture(stub, "/rom/programs/pocket/equip.lua"))
|
||||||
@ -18,7 +18,7 @@ describe("The pocket equip program", function()
|
|||||||
|
|
||||||
it("handles when an upgrade cannot be equipped", function()
|
it("handles when an upgrade cannot be equipped", function()
|
||||||
stub(_G, "pocket", {
|
stub(_G, "pocket", {
|
||||||
equipBack = function() return false, "Cannot equip this item." end
|
equipBack = function() return false, "Cannot equip this item." end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/pocket/equip.lua"))
|
expect(capture(stub, "/rom/programs/pocket/equip.lua"))
|
||||||
|
@ -9,7 +9,7 @@ describe("The pocket unequip program", function()
|
|||||||
|
|
||||||
it("unequips an upgrade", function()
|
it("unequips an upgrade", function()
|
||||||
stub(_G, "pocket", {
|
stub(_G, "pocket", {
|
||||||
unequipBack = function() return true end
|
unequipBack = function() return true end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/pocket/unequip.lua"))
|
expect(capture(stub, "/rom/programs/pocket/unequip.lua"))
|
||||||
@ -18,7 +18,7 @@ describe("The pocket unequip program", function()
|
|||||||
|
|
||||||
it("handles when an upgrade cannot be equipped", function()
|
it("handles when an upgrade cannot be equipped", function()
|
||||||
stub(_G, "pocket", {
|
stub(_G, "pocket", {
|
||||||
unequipBack = function() return false, "Nothing to remove." end
|
unequipBack = function() return false, "Nothing to remove." end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/pocket/unequip.lua"))
|
expect(capture(stub, "/rom/programs/pocket/unequip.lua"))
|
||||||
|
@ -4,8 +4,8 @@ describe("The set program", function()
|
|||||||
|
|
||||||
it("displays all settings", function()
|
it("displays all settings", function()
|
||||||
settings.clear()
|
settings.clear()
|
||||||
settings.set("Test","Hello World!")
|
settings.set("Test", "Hello World!")
|
||||||
settings.set("123",456)
|
settings.set("123", 456)
|
||||||
|
|
||||||
expect(capture(stub, "set"))
|
expect(capture(stub, "set"))
|
||||||
:matches { ok = true, output = '"123" is 456\n"Test" is "Hello World!"\n', error = "" }
|
:matches { ok = true, output = '"123" is 456\n"Test" is "Hello World!"\n', error = "" }
|
||||||
@ -13,8 +13,8 @@ describe("The set program", function()
|
|||||||
|
|
||||||
it("displays a single settings", function()
|
it("displays a single settings", function()
|
||||||
settings.clear()
|
settings.clear()
|
||||||
settings.set("Test","Hello World!")
|
settings.set("Test", "Hello World!")
|
||||||
settings.set("123",456)
|
settings.set("123", 456)
|
||||||
|
|
||||||
expect(capture(stub, "set Test"))
|
expect(capture(stub, "set Test"))
|
||||||
:matches { ok = true, output = '"Test" is "Hello World!"\n', error = "" }
|
:matches { ok = true, output = '"Test" is "Hello World!"\n', error = "" }
|
||||||
|
@ -7,6 +7,6 @@ describe("The time program", function()
|
|||||||
local day = os.day()
|
local day = os.day()
|
||||||
|
|
||||||
expect(capture(stub, "time"))
|
expect(capture(stub, "time"))
|
||||||
:matches { ok = true, output = "The time is "..time.." on Day "..day.."\n", error = "" }
|
:matches { ok = true, output = "The time is " .. time .. " on Day " .. day .. "\n", error = "" }
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@ -39,7 +39,7 @@ describe("The craft program", function()
|
|||||||
|
|
||||||
it("craft a single item", function()
|
it("craft a single item", function()
|
||||||
local item_count = 2
|
local item_count = 2
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
craft = function()
|
craft = function()
|
||||||
item_count = 1
|
item_count = 1
|
||||||
return true
|
return true
|
||||||
@ -54,7 +54,7 @@ describe("The craft program", function()
|
|||||||
|
|
||||||
it("crafts no items", function()
|
it("crafts no items", function()
|
||||||
local item_count = 2
|
local item_count = 2
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
craft = function()
|
craft = function()
|
||||||
item_count = 1
|
item_count = 1
|
||||||
return false
|
return false
|
||||||
|
@ -29,7 +29,7 @@ describe("The turtle equip program", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("swaps existing upgrades", function()
|
it("swaps existing upgrades", function()
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
select = function() end,
|
select = function() end,
|
||||||
getItemCount = function() return 1 end,
|
getItemCount = function() return 1 end,
|
||||||
equipLeft = function() return true end,
|
equipLeft = function() return true end,
|
||||||
@ -45,7 +45,7 @@ describe("The turtle equip program", function()
|
|||||||
describe("equips a new upgrade", function()
|
describe("equips a new upgrade", function()
|
||||||
local function setup()
|
local function setup()
|
||||||
local item_count = 1
|
local item_count = 1
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
select = function() end,
|
select = function() end,
|
||||||
getItemCount = function() return item_count end,
|
getItemCount = function() return item_count end,
|
||||||
equipLeft = function()
|
equipLeft = function()
|
||||||
@ -73,7 +73,7 @@ describe("The turtle equip program", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("handles when an upgrade cannot be equipped", function()
|
it("handles when an upgrade cannot be equipped", function()
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
select = function() end,
|
select = function() end,
|
||||||
getItemCount = function() return 1 end,
|
getItemCount = function() return 1 end,
|
||||||
equipLeft = function() return false end,
|
equipLeft = function() return false end,
|
||||||
|
@ -17,7 +17,7 @@ describe("The refuel program", function()
|
|||||||
end,
|
end,
|
||||||
getFuelLimit = function()
|
getFuelLimit = function()
|
||||||
return fuel_limit
|
return fuel_limit
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -49,13 +49,13 @@ describe("The refuel program", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("reports when the fuel limit is reached", function()
|
it("reports when the fuel limit is reached", function()
|
||||||
setup_turtle(0,5,5)
|
setup_turtle(0, 5, 5)
|
||||||
expect(capture(stub, "/rom/programs/turtle/refuel.lua 5"))
|
expect(capture(stub, "/rom/programs/turtle/refuel.lua 5"))
|
||||||
:matches { ok = true, output = "Fuel level is 5\nFuel limit reached\n", error = "" }
|
:matches { ok = true, output = "Fuel level is 5\nFuel limit reached\n", error = "" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("reports when the fuel level is unlimited", function()
|
it("reports when the fuel level is unlimited", function()
|
||||||
setup_turtle("unlimited",5,5)
|
setup_turtle("unlimited", 5, 5)
|
||||||
expect(capture(stub, "/rom/programs/turtle/refuel.lua 5"))
|
expect(capture(stub, "/rom/programs/turtle/refuel.lua 5"))
|
||||||
:matches { ok = true, output = "Fuel level is unlimited\n", error = "" }
|
:matches { ok = true, output = "Fuel level is unlimited\n", error = "" }
|
||||||
end)
|
end)
|
||||||
|
@ -17,11 +17,11 @@ describe("The turtle unequip program", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("says when nothing was unequipped", function()
|
it("says when nothing was unequipped", function()
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
select = function() end,
|
select = function() end,
|
||||||
getItemCount = function() return 0 end,
|
getItemCount = function() return 0 end,
|
||||||
equipRight = function() return true end,
|
equipRight = function() return true end,
|
||||||
equipLeft = function() return true end
|
equipLeft = function() return true end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
|
expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
|
||||||
@ -32,7 +32,7 @@ describe("The turtle unequip program", function()
|
|||||||
|
|
||||||
it("unequips a upgrade", function()
|
it("unequips a upgrade", function()
|
||||||
local item_count = 0
|
local item_count = 0
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
select = function() end,
|
select = function() end,
|
||||||
getItemCount = function() return item_count end,
|
getItemCount = function() return item_count end,
|
||||||
equipRight = function()
|
equipRight = function()
|
||||||
@ -42,7 +42,7 @@ describe("The turtle unequip program", function()
|
|||||||
equipLeft = function()
|
equipLeft = function()
|
||||||
item_count = 1
|
item_count = 1
|
||||||
return true
|
return true
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
|
expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
|
||||||
@ -53,11 +53,11 @@ describe("The turtle unequip program", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("fails when the turtle is full", function()
|
it("fails when the turtle is full", function()
|
||||||
stub(_G,"turtle",{
|
stub(_G, "turtle", {
|
||||||
select = function() end,
|
select = function() end,
|
||||||
getItemCount = function() return 1 end,
|
getItemCount = function() return 1 end,
|
||||||
equipRight = function() return true end,
|
equipRight = function() return true end,
|
||||||
equipLeft = function() return true end
|
equipLeft = function() return true end,
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
|
expect(capture(stub, "/rom/programs/turtle/unequip.lua left"))
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user