mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-10-16 06:27:39 +00:00
Compare commits
21 Commits
v1.15.2-1.
...
v1.15.2-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
74ac5bb3d1 | ||
![]() |
d13bd2cce8 | ||
![]() |
cc96e41d3e | ||
![]() |
741adfa7bb | ||
![]() |
666e83cf4f | ||
![]() |
e2a635b6e5 | ||
![]() |
c58441b29c | ||
![]() |
a6fcfb6af2 | ||
![]() |
17a9329207 | ||
![]() |
f6160bdc57 | ||
![]() |
6aae4e5766 | ||
![]() |
84a6bb1cf3 | ||
![]() |
c334423d42 | ||
![]() |
113b560a20 | ||
![]() |
61fb4caaad | ||
![]() |
6734af6e4a | ||
![]() |
bf6053906d | ||
![]() |
01d81cb91d | ||
![]() |
93068402a2 | ||
![]() |
34a2c835d4 | ||
![]() |
30d35883b8 |
1
.github/workflows/main-ci.yml
vendored
1
.github/workflows/main-ci.yml
vendored
@@ -34,6 +34,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload Coverage
|
- name: Upload Coverage
|
||||||
run: bash <(curl -s https://codecov.io/bash)
|
run: bash <(curl -s https://codecov.io/bash)
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Generate Java documentation stubs
|
- name: Generate Java documentation stubs
|
||||||
run: ./gradlew luaJavadoc --no-daemon
|
run: ./gradlew luaJavadoc --no-daemon
|
||||||
|
2
.github/workflows/make-doc.sh
vendored
2
.github/workflows/make-doc.sh
vendored
@@ -12,5 +12,5 @@ chmod 600 "$HOME/.ssh/key"
|
|||||||
|
|
||||||
# And upload
|
# And upload
|
||||||
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
|
rsync -avc -e "ssh -i $HOME/.ssh/key -o StrictHostKeyChecking=no -p $SSH_PORT" \
|
||||||
"$GITHUB_WORKSPACE/doc/" \
|
"$GITHUB_WORKSPACE/doc/out/" \
|
||||||
"$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST"
|
"$SSH_USER@$SSH_HOST:/var/www/tweaked.cc/$DEST"
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,9 +3,8 @@
|
|||||||
/logs
|
/logs
|
||||||
/build
|
/build
|
||||||
/out
|
/out
|
||||||
/doc/**/*.html
|
/doc/out/
|
||||||
/doc/javadoc/
|
/doc/javadoc/
|
||||||
/doc/index.json
|
|
||||||
|
|
||||||
# Runtime directories
|
# Runtime directories
|
||||||
/run
|
/run
|
||||||
|
@@ -9,7 +9,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.google.code.gson:gson:2.8.1'
|
classpath 'com.google.code.gson:gson:2.8.1'
|
||||||
classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.179'
|
classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.187'
|
||||||
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
|
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
|
||||||
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
|
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ dependencies {
|
|||||||
|
|
||||||
deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
|
deployerJars "org.apache.maven.wagon:wagon-ssh:3.0.0"
|
||||||
|
|
||||||
cctJavadoc 'cc.tweaked:cct-javadoc:1.1.0'
|
cctJavadoc 'cc.tweaked:cct-javadoc:1.2.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile tasks
|
// Compile tasks
|
||||||
|
55
doc/stub/global.lua
Normal file
55
doc/stub/global.lua
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
--[[-
|
||||||
|
Global functions defined by `bios.lua`. This does not include standard Lua
|
||||||
|
functions.
|
||||||
|
|
||||||
|
@module _G
|
||||||
|
]]
|
||||||
|
|
||||||
|
--[[- Pauses execution for the specified number of seconds.
|
||||||
|
|
||||||
|
As it waits for a fixed amount of world ticks, `time` will automatically be
|
||||||
|
rounded up to the nearest multiple of 0.05 seconds. If you are using coroutines
|
||||||
|
or the @{parallel|parallel API}, it will only pause execution of the current
|
||||||
|
thread, not the whole program.
|
||||||
|
|
||||||
|
**Note** Because sleep internally uses timers, it is a function that yields.
|
||||||
|
This means that you can use it to prevent "Too long without yielding" errors,
|
||||||
|
however, as the minimum sleep time is 0.05 seconds, it will slow your program
|
||||||
|
down.
|
||||||
|
|
||||||
|
**Warning** Internally, this function queues and waits for a timer event (using
|
||||||
|
@{os.startTimer}), however it does not listen for any other events. This means
|
||||||
|
that any event that occurs while sleeping will be entirely discarded. If you
|
||||||
|
need to receive events while sleeping, consider using @{os.startTimer|timers},
|
||||||
|
or the @{parallel|parallel API}.
|
||||||
|
|
||||||
|
@tparam number time The number of seconds to sleep for, rounded up to the
|
||||||
|
nearest multiple of 0.05.
|
||||||
|
|
||||||
|
@see os.startTimer
|
||||||
|
]]
|
||||||
|
function sleep(time) end
|
||||||
|
|
||||||
|
function write(text) end
|
||||||
|
function print(...) end
|
||||||
|
function printError(...) end
|
||||||
|
|
||||||
|
function read(replaceChar, history, completeFn, default) end
|
||||||
|
|
||||||
|
--- The ComputerCraft and Minecraft version of the current computer environment.
|
||||||
|
--
|
||||||
|
-- For example, `ComputerCraft 1.93.0 (Minecraft 1.15.2)`.
|
||||||
|
_HOST = _HOST
|
||||||
|
|
||||||
|
--[[- The default computer settings as defined in the ComputerCraft
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
This is a comma-separated list of settings pairs defined by the mod
|
||||||
|
configuration or server owner. By default, it is empty.
|
||||||
|
|
||||||
|
An example value to disable autocompletion:
|
||||||
|
|
||||||
|
shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false
|
||||||
|
|
||||||
|
]]
|
||||||
|
_CC_DEFAULT_SETTINGS = _CC_DEFAULT_SETTINGS
|
@@ -1,8 +1,6 @@
|
|||||||
--- The http library allows communicating with web servers, sending and
|
--- The http library allows communicating with web servers, sending and
|
||||||
-- receiving data from them.
|
-- receiving data from them.
|
||||||
--
|
--
|
||||||
-- #### `http_check` event
|
|
||||||
--
|
|
||||||
-- @module http
|
-- @module http
|
||||||
|
|
||||||
--- Asynchronously make a HTTP request to the given url.
|
--- Asynchronously make a HTTP request to the given url.
|
||||||
|
115
doc/stub/os.lua
115
doc/stub/os.lua
@@ -1,6 +1,121 @@
|
|||||||
-- Defined in bios.lua
|
-- Defined in bios.lua
|
||||||
|
|
||||||
|
--[[- Loads the given API into the global environment.
|
||||||
|
|
||||||
|
**Warning** This function is deprecated. Use of this function will pollute the
|
||||||
|
global table, use @{require} instead.
|
||||||
|
|
||||||
|
This function loads and executes the file at the given path, and all global
|
||||||
|
variables and functions exported by it will by available through the use of
|
||||||
|
`myAPI.<function name>`, where `myAPI` is the base name of the API file.
|
||||||
|
|
||||||
|
@tparam string path The path of the API to load.
|
||||||
|
@treturn boolean Whether or not the API was successfully loaded.
|
||||||
|
|
||||||
|
@deprecated Use @{require}.
|
||||||
|
]]
|
||||||
function loadAPI(path) end
|
function loadAPI(path) end
|
||||||
|
|
||||||
|
--- Unloads an API which was loaded by @{os.loadAPI}.
|
||||||
|
--
|
||||||
|
-- This effectively removes the specified table from `_G`.
|
||||||
|
--
|
||||||
|
-- @tparam string name The name of the API to unload.
|
||||||
|
-- @deprecated Use @{require}.
|
||||||
|
function unloadAPI(name) end
|
||||||
|
|
||||||
|
--[[- Pause execution of the current thread and waits for any events matching
|
||||||
|
`filter`.
|
||||||
|
|
||||||
|
This function @{coroutine.yield|yields} the current process and waits for it
|
||||||
|
to be resumed with a vararg list where the first element matches `filter`.
|
||||||
|
If no `filter` is supplied, this will match all events.
|
||||||
|
|
||||||
|
Unlike @{os.pullEventRaw}, it will stop the application upon a "terminate"
|
||||||
|
event, printing the error "Terminated".
|
||||||
|
|
||||||
|
@tparam[opt] string filter Event to filter for.
|
||||||
|
@treturn string event The name of the event that fired.
|
||||||
|
@treturn any param... Optional additional parameters of the event.
|
||||||
|
@usage Listen for `mouse_click` events.
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local event, button, x, y = os.pullEvent("mouse_click")
|
||||||
|
print("Button", button, "was clicked at", x, ",", y)
|
||||||
|
end
|
||||||
|
|
||||||
|
@usage Listen for multiple events.
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local eventData = {os.pullEvent()}
|
||||||
|
local event = eventData[1]
|
||||||
|
|
||||||
|
if event == "mouse_click" then
|
||||||
|
print("Button", eventData[2], "was clicked at", eventData[3], ",", eventData[4])
|
||||||
|
elseif event == "key" then
|
||||||
|
print("Key code", eventData[2], "was pressed")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@see os.pullEventRaw To pull the terminate event.
|
||||||
|
]]
|
||||||
function pullEvent(filter) end
|
function pullEvent(filter) end
|
||||||
|
|
||||||
|
--[[- Pause execution of the current thread and waits for events, including the
|
||||||
|
`terminate` event.
|
||||||
|
|
||||||
|
This behaves almost the same as @{os.pullEvent}, except it allows you to handle
|
||||||
|
the `terminate` event yourself - the program will not stop execution when
|
||||||
|
<kbd>Ctrl+T</kbd> is pressed.
|
||||||
|
|
||||||
|
@tparam[opt] string filter Event to filter for.
|
||||||
|
@treturn string event The name of the event that fired.
|
||||||
|
@treturn any param... Optional additional parameters of the event.
|
||||||
|
@usage Listen for `terminate` events.
|
||||||
|
|
||||||
|
while true do
|
||||||
|
local event = os.pullEventRaw()
|
||||||
|
if event == "terminate" then
|
||||||
|
print("Caught terminate event!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@see os.pullEvent To pull events normally.
|
||||||
|
]]
|
||||||
function pullEventRaw(filter) end
|
function pullEventRaw(filter) end
|
||||||
|
|
||||||
|
--- Pauses execution for the specified number of seconds, alias of @{_G.sleep}.
|
||||||
|
function sleep(time) end
|
||||||
|
|
||||||
|
--- Get the current CraftOS version (for example, `CraftOS 1.8`).
|
||||||
|
--
|
||||||
|
-- This is defined by `bios.lua`. For the current version of CC:Tweaked, this
|
||||||
|
-- should return `CraftOS 1.8`.
|
||||||
|
--
|
||||||
|
-- @treturn string The current CraftOS version.
|
||||||
function version() end
|
function version() end
|
||||||
|
|
||||||
|
--[[- Run the program at the given path with the specified environment and
|
||||||
|
arguments.
|
||||||
|
|
||||||
|
This function does not resolve program names like the shell does. This means
|
||||||
|
that, for example, `os.run("edit")` will not work. As well as this, it does not
|
||||||
|
provide access to the @{shell} API in the environment. For this behaviour, use
|
||||||
|
@{shell.run} instead.
|
||||||
|
|
||||||
|
If the program cannot be found, or failed to run, it will print the error and
|
||||||
|
return `false`. If you want to handle this more gracefully, use an alternative
|
||||||
|
such as @{loadfile}.
|
||||||
|
|
||||||
|
@tparam table env The environment to run the program with.
|
||||||
|
@tparam string path The exact path of the program to run.
|
||||||
|
@param ... The arguments to pass to the program.
|
||||||
|
@treturn boolean Whether or not the program ran successfully.
|
||||||
|
@usage Run the default shell from within your program:
|
||||||
|
|
||||||
|
os.run({}, "/rom/programs/shell")
|
||||||
|
|
||||||
|
@see shell.run
|
||||||
|
@see loadfile
|
||||||
|
]]
|
||||||
function run(env, path, ...) end
|
function run(env, path, ...) end
|
||||||
|
187
doc/styles.css
187
doc/styles.css
@@ -1,191 +1,14 @@
|
|||||||
/* Basic reset on elements */
|
/* Pretty tables, mostly inherited from table.definition-list */
|
||||||
h1, h2, h3, h4, p, table, div, body {
|
table.pretty-table {
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
border: 0;
|
|
||||||
font-size: 100%;
|
|
||||||
font: inherit;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
/* Make the page a little more airy */
|
|
||||||
body {
|
|
||||||
margin: 20px auto;
|
|
||||||
max-width: 1200px;
|
|
||||||
padding: 0 10px;
|
|
||||||
line-height: 1.6;
|
|
||||||
color: #222;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try to use system default fonts. */
|
|
||||||
body {
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans",
|
|
||||||
"Droid Sans", "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
|
||||||
}
|
|
||||||
|
|
||||||
code, pre, .parameter, .type, .definition-name, .reference-code {
|
|
||||||
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some definitions of basic tags */
|
|
||||||
code {
|
|
||||||
color: #c7254e;
|
|
||||||
background-color: #f9f2f4;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0.9em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 1.5em;
|
|
||||||
font-weight: lighter;
|
|
||||||
border-bottom: solid 1px #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2, h3, h4 { margin: 1.4em 0 0.3em;}
|
|
||||||
h2 { font-size: 1.25em; }
|
|
||||||
h3 { font-size: 1.15em; font-weight: bold; }
|
|
||||||
h4 { font-size: 1.06em; }
|
|
||||||
|
|
||||||
a, a:visited, a:active { font-weight: bold; color: #004080; text-decoration: none; }
|
|
||||||
a:hover { text-decoration: underline; }
|
|
||||||
|
|
||||||
blockquote {
|
|
||||||
padding: 0.3em;
|
|
||||||
margin: 1em 0;
|
|
||||||
background: #f0f0f0;
|
|
||||||
border-left: solid 0.5em #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stop sublists from having initial vertical space */
|
|
||||||
ul ul { margin-top: 0px; }
|
|
||||||
ol ul { margin-top: 0px; }
|
|
||||||
ol ol { margin-top: 0px; }
|
|
||||||
ul ol { margin-top: 0px; }
|
|
||||||
|
|
||||||
/* Make the target distinct; helps when we're navigating to a function */
|
|
||||||
a:target + * { background-color: #FFFF99; }
|
|
||||||
|
|
||||||
/* Allow linking to any subsection */
|
|
||||||
a[name]::before { content: "#"; }
|
|
||||||
|
|
||||||
/* Layout */
|
|
||||||
#main {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
min-height: calc(100vh - 100px);
|
|
||||||
}
|
|
||||||
|
|
||||||
#main > nav {
|
|
||||||
flex-basis: 30%;
|
|
||||||
min-width: 150px;
|
|
||||||
max-width: 250px;
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav h1, nav ul { padding: 0em 10px; }
|
|
||||||
|
|
||||||
nav h2 {
|
|
||||||
background-color:#e7e7e7;
|
|
||||||
font-size: 1.1em;
|
|
||||||
color:#000000;
|
|
||||||
padding: 5px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav ul {
|
|
||||||
list-style-type: none;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content {
|
|
||||||
flex-shrink: 1;
|
|
||||||
flex-basis: 80%;
|
|
||||||
padding: 0px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
text-align: right;
|
|
||||||
font-size: 0.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The definition lists at the top of each page */
|
|
||||||
table.definition-list {
|
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.definition-list td, table.definition-list th {
|
table.pretty-table td, table.pretty-table th {
|
||||||
border: 1px solid #cccccc;
|
border: 1px solid #cccccc;
|
||||||
padding: 5px;
|
padding: 2px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.definition-list th {
|
table.pretty-table th {
|
||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
min-width: 200px;
|
|
||||||
white-space: nowrap;
|
|
||||||
text-align: right;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
table.definition-list td { width: 100%; }
|
|
||||||
|
|
||||||
dl.definition dt {
|
|
||||||
border-top: 1px solid #ccc;
|
|
||||||
padding-top: 1em;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.definition dt .definition-name {
|
|
||||||
padding: 0 0.1em;
|
|
||||||
margin: 0 0.1em;
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
dl.definition dd {
|
|
||||||
padding-bottom: 1em;
|
|
||||||
margin: 10px 0 0 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.definition h3 {
|
|
||||||
font-size: .95em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Links to source-code */
|
|
||||||
.source-link { font-size: 0.8em; }
|
|
||||||
.source-link::before { content: '[' }
|
|
||||||
.source-link::after { content: ']' }
|
|
||||||
a.source-link, a.source-link:visited, a.source-link:active { color: #505050; }
|
|
||||||
|
|
||||||
/* Method definitions */
|
|
||||||
span.parameter:after { content:":"; padding-left: 0.3em; }
|
|
||||||
.optional { text-decoration: underline dotted; }
|
|
||||||
|
|
||||||
/** Fancy colour display. */
|
|
||||||
.colour-ref {
|
|
||||||
display: inline-block;
|
|
||||||
width: 0.8em;
|
|
||||||
height: 0.8em;
|
|
||||||
margin: 0.1em 0.1em 0.3em 0.1em; /* Terrrible hack to force vertical alignment. */
|
|
||||||
border: solid 1px black;
|
|
||||||
box-sizing: border-box;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* styles for prettification of source */
|
|
||||||
.highlight .comment { color: #558817; }
|
|
||||||
.highlight .constant { color: #a8660d; }
|
|
||||||
.highlight .escape { color: #844631; }
|
|
||||||
.highlight .keyword { color: #aa5050; font-weight: bold; }
|
|
||||||
.highlight .library { color: #0e7c6b; }
|
|
||||||
.highlight .marker { color: #512b1e; background: #fedc56; font-weight: bold; }
|
|
||||||
.highlight .string { color: #8080ff; }
|
|
||||||
.highlight .literal-kw { color: #8080ff; }
|
|
||||||
.highlight .number { color: #f8660d; }
|
|
||||||
.highlight .operator { color: #2239a8; font-weight: bold; }
|
|
||||||
.highlight .preprocessor, pre .prepro { color: #a33243; }
|
|
||||||
.highlight .global { color: #800080; }
|
|
||||||
.highlight .user-keyword { color: #800080; }
|
|
||||||
.highlight .prompt { color: #558817; }
|
|
||||||
.highlight .url { color: #272fc2; text-decoration: underline; }
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# Mod properties
|
# Mod properties
|
||||||
mod_version=1.93.0
|
mod_version=1.94.0
|
||||||
|
|
||||||
# Minecraft properties (update mods.toml when changing)
|
# Minecraft properties (update mods.toml when changing)
|
||||||
mc_version=1.15.2
|
mc_version=1.15.2
|
||||||
|
@@ -10,7 +10,10 @@
|
|||||||
|
|
||||||
(doc
|
(doc
|
||||||
(title "CC: Tweaked")
|
(title "CC: Tweaked")
|
||||||
|
(destination doc/out)
|
||||||
|
(logo src/main/resources/pack.png)
|
||||||
(index doc/index.md)
|
(index doc/index.md)
|
||||||
|
(styles doc/styles.css)
|
||||||
(source-link https://github.com/SquidDev-CC/CC-Tweaked/blob/${commit}/${path}#L${line})
|
(source-link https://github.com/SquidDev-CC/CC-Tweaked/blob/${commit}/${path}#L${line})
|
||||||
|
|
||||||
(module-kinds
|
(module-kinds
|
||||||
@@ -50,7 +53,7 @@
|
|||||||
|
|
||||||
;; colours imports from colors, and we don't handle that right now.
|
;; colours imports from colors, and we don't handle that right now.
|
||||||
;; keys is entirely dynamic, so we skip it.
|
;; keys is entirely dynamic, so we skip it.
|
||||||
(dynamic-modules colours keys)
|
(dynamic-modules colours keys _G)
|
||||||
|
|
||||||
(globals
|
(globals
|
||||||
:max
|
:max
|
||||||
@@ -79,6 +82,7 @@
|
|||||||
/doc/stub/http.lua
|
/doc/stub/http.lua
|
||||||
/doc/stub/os.lua
|
/doc/stub/os.lua
|
||||||
/doc/stub/turtle.lua
|
/doc/stub/turtle.lua
|
||||||
|
/doc/stub/global.lua
|
||||||
; Java generated APIs
|
; Java generated APIs
|
||||||
/doc/javadoc/turtle.lua
|
/doc/javadoc/turtle.lua
|
||||||
; Peripherals
|
; Peripherals
|
||||||
@@ -100,6 +104,10 @@
|
|||||||
/doc/stub/fs.lua)
|
/doc/stub/fs.lua)
|
||||||
(linters -doc:unresolved-reference))
|
(linters -doc:unresolved-reference))
|
||||||
|
|
||||||
|
;; Suppress warnings for the BIOS using its own deprecated members for now.
|
||||||
|
(at /src/main/resources/*/computercraft/lua/bios.lua
|
||||||
|
(linters -var:deprecated))
|
||||||
|
|
||||||
(at /src/test/resources/test-rom
|
(at /src/test/resources/test-rom
|
||||||
; We should still be able to test deprecated members.
|
; We should still be able to test deprecated members.
|
||||||
(linters -var:deprecated)
|
(linters -var:deprecated)
|
||||||
|
@@ -90,8 +90,6 @@ public final class ComputerCraft
|
|||||||
public static boolean turtlesCanPush = true;
|
public static boolean turtlesCanPush = true;
|
||||||
public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf( TurtleAction.class );
|
public static EnumSet<TurtleAction> turtleDisabledActions = EnumSet.noneOf( TurtleAction.class );
|
||||||
|
|
||||||
public static boolean genericPeripheral = false;
|
|
||||||
|
|
||||||
public static int computerTermWidth = 51;
|
public static int computerTermWidth = 51;
|
||||||
public static int computerTermHeight = 19;
|
public static int computerTermHeight = 19;
|
||||||
|
|
||||||
|
@@ -139,7 +139,7 @@ public interface ITurtleAccess
|
|||||||
*
|
*
|
||||||
* @return This turtle's owner.
|
* @return This turtle's owner.
|
||||||
*/
|
*/
|
||||||
@Nonnull
|
@Nullable
|
||||||
GameProfile getOwningPlayer();
|
GameProfile getOwningPlayer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -115,6 +115,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
|
|||||||
|
|
||||||
private static void renderFrame( Matrix4f transform, ComputerFamily family, int colour, int width, int height )
|
private static void renderFrame( Matrix4f transform, ComputerFamily family, int colour, int width, int height )
|
||||||
{
|
{
|
||||||
|
RenderSystem.enableBlend();
|
||||||
Minecraft.getInstance().getTextureManager()
|
Minecraft.getInstance().getTextureManager()
|
||||||
.bindTexture( colour != -1 ? ComputerBorderRenderer.BACKGROUND_COLOUR : ComputerBorderRenderer.getTexture( family ) );
|
.bindTexture( colour != -1 ? ComputerBorderRenderer.BACKGROUND_COLOUR : ComputerBorderRenderer.getTexture( family ) );
|
||||||
|
|
||||||
@@ -133,7 +134,6 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
|
|||||||
|
|
||||||
private static void renderLight( Matrix4f transform, int colour, int width, int height )
|
private static void renderLight( Matrix4f transform, int colour, int width, int height )
|
||||||
{
|
{
|
||||||
RenderSystem.enableBlend();
|
|
||||||
RenderSystem.disableTexture();
|
RenderSystem.disableTexture();
|
||||||
|
|
||||||
float r = ((colour >>> 16) & 0xFF) / 255.0f;
|
float r = ((colour >>> 16) & 0xFF) / 255.0f;
|
||||||
|
@@ -171,12 +171,18 @@ public class OSAPI implements ILuaAPI
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts a timer that will run for the specified number of seconds. Once
|
* Starts a timer that will run for the specified number of seconds. Once
|
||||||
* the timer fires, a timer event will be added to the queue with the ID
|
* the timer fires, a {@code timer} event will be added to the queue with
|
||||||
* returned from this function as the first parameter.
|
* the ID returned from this function as the first parameter.
|
||||||
|
*
|
||||||
|
* As with @{os.sleep|sleep}, {@code timer} will automatically be rounded up
|
||||||
|
* to the nearest multiple of 0.05 seconds, as it waits for a fixed amount
|
||||||
|
* of world ticks.
|
||||||
*
|
*
|
||||||
* @param timer The number of seconds until the timer fires.
|
* @param timer The number of seconds until the timer fires.
|
||||||
* @return The ID of the new timer.
|
* @return The ID of the new timer. This can be used to filter the
|
||||||
|
* {@code timer} event, or {@link #cancelTimer cancel the timer}.
|
||||||
* @throws LuaException If the time is below zero.
|
* @throws LuaException If the time is below zero.
|
||||||
|
* @see #cancelTimer To cancel a timer.
|
||||||
*/
|
*/
|
||||||
@LuaFunction
|
@LuaFunction
|
||||||
public final int startTimer( double timer ) throws LuaException
|
public final int startTimer( double timer ) throws LuaException
|
||||||
@@ -199,11 +205,14 @@ public class OSAPI implements ILuaAPI
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an alarm that will fire at the specified world time. When it fires,
|
* Sets an alarm that will fire at the specified world time. When it fires,
|
||||||
* an alarm event will be added to the event queue.
|
* an {@code alarm} event will be added to the event queue with the ID
|
||||||
|
* returned from this function as the first parameter.
|
||||||
*
|
*
|
||||||
* @param time The time at which to fire the alarm, in the range [0.0, 24.0).
|
* @param time The time at which to fire the alarm, in the range [0.0, 24.0).
|
||||||
* @return The ID of the alarm that was set.
|
* @return The ID of the new alarm. This can be used to filter the
|
||||||
|
* {@code alarm} event, or {@link #cancelAlarm cancel the alarm}.
|
||||||
* @throws LuaException If the time is out of range.
|
* @throws LuaException If the time is out of range.
|
||||||
|
* @see #cancelAlarm To cancel an alarm.
|
||||||
*/
|
*/
|
||||||
@LuaFunction
|
@LuaFunction
|
||||||
public final int setAlarm( double time ) throws LuaException
|
public final int setAlarm( double time ) throws LuaException
|
||||||
|
@@ -82,8 +82,6 @@ public final class Config
|
|||||||
private static final ConfigValue<Integer> monitorWidth;
|
private static final ConfigValue<Integer> monitorWidth;
|
||||||
private static final ConfigValue<Integer> monitorHeight;
|
private static final ConfigValue<Integer> monitorHeight;
|
||||||
|
|
||||||
private static final ConfigValue<Boolean> genericPeripheral;
|
|
||||||
|
|
||||||
private static final ConfigValue<MonitorRenderer> monitorRenderer;
|
private static final ConfigValue<MonitorRenderer> monitorRenderer;
|
||||||
private static final ConfigValue<Integer> monitorDistance;
|
private static final ConfigValue<Integer> monitorDistance;
|
||||||
|
|
||||||
@@ -294,17 +292,6 @@ public final class Config
|
|||||||
builder.pop();
|
builder.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
builder.comment( "Options for various experimental features. These are not guaranteed to be stable, and may change or be removed across versions." );
|
|
||||||
builder.push( "experimental" );
|
|
||||||
|
|
||||||
genericPeripheral = builder
|
|
||||||
.comment( "Attempt to make any existing block (or tile entity) a peripheral.\n" +
|
|
||||||
"This provides peripheral methods for any inventory, fluid tank or energy storage block. It will" +
|
|
||||||
"_not_ provide methods which have an existing peripheral provider." )
|
|
||||||
.define( "generic_peripherals", false );
|
|
||||||
}
|
|
||||||
|
|
||||||
serverSpec = builder.build();
|
serverSpec = builder.build();
|
||||||
|
|
||||||
Builder clientBuilder = new Builder();
|
Builder clientBuilder = new Builder();
|
||||||
@@ -379,9 +366,6 @@ public final class Config
|
|||||||
ComputerCraft.monitorWidth = monitorWidth.get();
|
ComputerCraft.monitorWidth = monitorWidth.get();
|
||||||
ComputerCraft.monitorHeight = monitorHeight.get();
|
ComputerCraft.monitorHeight = monitorHeight.get();
|
||||||
|
|
||||||
// Experimental
|
|
||||||
ComputerCraft.genericPeripheral = genericPeripheral.get();
|
|
||||||
|
|
||||||
// Client
|
// Client
|
||||||
ComputerCraft.monitorRenderer = monitorRenderer.get();
|
ComputerCraft.monitorRenderer = monitorRenderer.get();
|
||||||
ComputerCraft.monitorDistanceSq = monitorDistance.get() * monitorDistance.get();
|
ComputerCraft.monitorDistanceSq = monitorDistance.get() * monitorDistance.get();
|
||||||
|
@@ -116,7 +116,6 @@ public class CommandAPI implements ILuaAPI
|
|||||||
* @param command The command to execute.
|
* @param command The command to execute.
|
||||||
* @return The "task id". When this command has been executed, it will queue a `task_complete` event with a matching id.
|
* @return The "task id". When this command has been executed, it will queue a `task_complete` event with a matching id.
|
||||||
* @throws LuaException (hidden) If the task cannot be created.
|
* @throws LuaException (hidden) If the task cannot be created.
|
||||||
* @cc.tparam string command The command to execute.
|
|
||||||
* @cc.usage Asynchronously sets the block above the computer to stone.
|
* @cc.usage Asynchronously sets the block above the computer to stone.
|
||||||
* <pre>
|
* <pre>
|
||||||
* commands.execAsync("~ ~1 ~ minecraft:stone")
|
* commands.execAsync("~ ~1 ~ minecraft:stone")
|
||||||
|
@@ -140,7 +140,8 @@ public class DiskDrivePeripheral implements IPeripheral
|
|||||||
/**
|
/**
|
||||||
* Returns the title of the inserted audio disk.
|
* Returns the title of the inserted audio disk.
|
||||||
*
|
*
|
||||||
* @return The title of the audio, or {@code nil} if no audio disk is inserted.
|
* @return The title of the audio, or {@code false} if no audio disk is inserted.
|
||||||
|
* @cc.treturn string|nil|false The title of the audio, {@code false} if no disk is inserted, or {@code nil} if the disk has no audio.
|
||||||
*/
|
*/
|
||||||
@LuaFunction
|
@LuaFunction
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
package dan200.computercraft.shared.peripheral.generic;
|
package dan200.computercraft.shared.peripheral.generic;
|
||||||
|
|
||||||
import dan200.computercraft.ComputerCraft;
|
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import dan200.computercraft.core.asm.NamedMethod;
|
import dan200.computercraft.core.asm.NamedMethod;
|
||||||
import dan200.computercraft.core.asm.PeripheralMethod;
|
import dan200.computercraft.core.asm.PeripheralMethod;
|
||||||
@@ -35,8 +34,6 @@ public class GenericPeripheralProvider
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
public static LazyOptional<IPeripheral> getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
|
public static LazyOptional<IPeripheral> getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side )
|
||||||
{
|
{
|
||||||
if( !ComputerCraft.genericPeripheral ) return LazyOptional.empty();
|
|
||||||
|
|
||||||
TileEntity tile = world.getTileEntity( pos );
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
if( tile == null ) return LazyOptional.empty();
|
if( tile == null ) return LazyOptional.empty();
|
||||||
|
|
||||||
|
@@ -7,7 +7,6 @@
|
|||||||
package dan200.computercraft.shared.peripheral.generic.data;
|
package dan200.computercraft.shared.peripheral.generic.data;
|
||||||
|
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
import dan200.computercraft.ComputerCraft;
|
|
||||||
import dan200.computercraft.shared.util.NBTUtil;
|
import dan200.computercraft.shared.util.NBTUtil;
|
||||||
import net.minecraft.enchantment.Enchantment;
|
import net.minecraft.enchantment.Enchantment;
|
||||||
import net.minecraft.enchantment.EnchantmentHelper;
|
import net.minecraft.enchantment.EnchantmentHelper;
|
||||||
@@ -26,9 +25,6 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Data providers for items.
|
* Data providers for items.
|
||||||
*
|
|
||||||
* We guard using {@link ComputerCraft#genericPeripheral} in several places, as advanced functionality should not be
|
|
||||||
* exposed for {@code turtle.getItemDetail} when generic peripehrals are disabled.
|
|
||||||
*/
|
*/
|
||||||
public class ItemData
|
public class ItemData
|
||||||
{
|
{
|
||||||
@@ -73,8 +69,6 @@ public class ItemData
|
|||||||
|
|
||||||
data.put( "tags", DataHelpers.getTags( stack.getItem().getTags() ) );
|
data.put( "tags", DataHelpers.getTags( stack.getItem().getTags() ) );
|
||||||
|
|
||||||
if( !ComputerCraft.genericPeripheral ) return data;
|
|
||||||
|
|
||||||
CompoundNBT tag = stack.getTag();
|
CompoundNBT tag = stack.getTag();
|
||||||
if( tag != null && tag.contains( "display", Constants.NBT.TAG_COMPOUND ) )
|
if( tag != null && tag.contains( "display", Constants.NBT.TAG_COMPOUND ) )
|
||||||
{
|
{
|
||||||
|
@@ -69,7 +69,7 @@ public final class ClientMonitor extends ClientTerminal
|
|||||||
GL15.glBufferData( GL31.GL_TEXTURE_BUFFER, 0, GL15.GL_STATIC_DRAW );
|
GL15.glBufferData( GL31.GL_TEXTURE_BUFFER, 0, GL15.GL_STATIC_DRAW );
|
||||||
tboTexture = GlStateManager.genTexture();
|
tboTexture = GlStateManager.genTexture();
|
||||||
GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, tboTexture );
|
GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, tboTexture );
|
||||||
GL31.glTexBuffer( GL31.GL_TEXTURE_BUFFER, GL30.GL_R8, tboBuffer );
|
GL31.glTexBuffer( GL31.GL_TEXTURE_BUFFER, GL30.GL_R8UI, tboBuffer );
|
||||||
GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, 0 );
|
GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, 0 );
|
||||||
|
|
||||||
GlStateManager.bindBuffer( GL31.GL_TEXTURE_BUFFER, 0 );
|
GlStateManager.bindBuffer( GL31.GL_TEXTURE_BUFFER, 0 );
|
||||||
|
@@ -45,6 +45,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
|||||||
import net.minecraftforge.items.wrapper.InvWrapper;
|
import net.minecraftforge.items.wrapper.InvWrapper;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@@ -598,7 +599,7 @@ public class TurtleBrain implements ITurtleAccess
|
|||||||
m_owningPlayer = profile;
|
m_owningPlayer = profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public GameProfile getOwningPlayer()
|
public GameProfile getOwningPlayer()
|
||||||
{
|
{
|
||||||
|
@@ -17,6 +17,7 @@ import net.minecraft.entity.EntitySize;
|
|||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.Pose;
|
import net.minecraft.entity.Pose;
|
||||||
import net.minecraft.entity.passive.horse.AbstractHorseEntity;
|
import net.minecraft.entity.passive.horse.AbstractHorseEntity;
|
||||||
|
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||||
import net.minecraft.inventory.IInventory;
|
import net.minecraft.inventory.IInventory;
|
||||||
import net.minecraft.inventory.container.INamedContainerProvider;
|
import net.minecraft.inventory.container.INamedContainerProvider;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -41,11 +42,30 @@ public final class TurtlePlayer extends FakePlayer
|
|||||||
"[ComputerCraft]"
|
"[ComputerCraft]"
|
||||||
);
|
);
|
||||||
|
|
||||||
private TurtlePlayer( ITurtleAccess turtle )
|
private TurtlePlayer( ServerWorld world, GameProfile name )
|
||||||
{
|
{
|
||||||
super( (ServerWorld) turtle.getWorld(), getProfile( turtle.getOwningPlayer() ) );
|
super( world, name );
|
||||||
this.connection = new FakeNetHandler( this );
|
}
|
||||||
setState( turtle );
|
|
||||||
|
private static TurtlePlayer create( ITurtleAccess turtle )
|
||||||
|
{
|
||||||
|
ServerWorld world = (ServerWorld) turtle.getWorld();
|
||||||
|
GameProfile profile = turtle.getOwningPlayer();
|
||||||
|
|
||||||
|
TurtlePlayer player = new TurtlePlayer( world, getProfile( profile ) );
|
||||||
|
player.connection = new FakeNetHandler( player );
|
||||||
|
player.setState( turtle );
|
||||||
|
|
||||||
|
if( profile != null && profile.getId() != null )
|
||||||
|
{
|
||||||
|
// Constructing a player overrides the "active player" variable in advancements. As fake players cannot
|
||||||
|
// get advancements, this prevents a normal player who has placed a turtle from getting advancements.
|
||||||
|
// We try to locate the "actual" player and restore them.
|
||||||
|
ServerPlayerEntity actualPlayer = world.getServer().getPlayerList().getPlayerByUUID( profile.getId() );
|
||||||
|
if( actualPlayer != null ) player.getAdvancements().setPlayer( actualPlayer );
|
||||||
|
}
|
||||||
|
|
||||||
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GameProfile getProfile( @Nullable GameProfile profile )
|
private static GameProfile getProfile( @Nullable GameProfile profile )
|
||||||
@@ -72,14 +92,14 @@ public final class TurtlePlayer extends FakePlayer
|
|||||||
|
|
||||||
public static TurtlePlayer get( ITurtleAccess access )
|
public static TurtlePlayer get( ITurtleAccess access )
|
||||||
{
|
{
|
||||||
if( !(access instanceof TurtleBrain) ) return new TurtlePlayer( access );
|
if( !(access instanceof TurtleBrain) ) return create( access );
|
||||||
|
|
||||||
TurtleBrain brain = (TurtleBrain) access;
|
TurtleBrain brain = (TurtleBrain) access;
|
||||||
TurtlePlayer player = brain.m_cachedPlayer;
|
TurtlePlayer player = brain.m_cachedPlayer;
|
||||||
if( player == null || player.getGameProfile() != getProfile( access.getOwningPlayer() )
|
if( player == null || player.getGameProfile() != getProfile( access.getOwningPlayer() )
|
||||||
|| player.getEntityWorld() != access.getWorld() )
|
|| player.getEntityWorld() != access.getWorld() )
|
||||||
{
|
{
|
||||||
player = brain.m_cachedPlayer = new TurtlePlayer( brain );
|
player = brain.m_cachedPlayer = create( brain );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
uniform sampler2D u_font;
|
uniform sampler2D u_font;
|
||||||
uniform int u_width;
|
uniform int u_width;
|
||||||
uniform int u_height;
|
uniform int u_height;
|
||||||
uniform samplerBuffer u_tbo;
|
uniform usamplerBuffer u_tbo;
|
||||||
uniform vec3 u_palette[16];
|
uniform vec3 u_palette[16];
|
||||||
|
|
||||||
in vec2 f_pos;
|
in vec2 f_pos;
|
||||||
@@ -30,9 +30,9 @@ void main() {
|
|||||||
vec2 outside = step(vec2(0.0, 0.0), vec2(cell)) * step(vec2(cell), vec2(float(u_width) - 1.0, float(u_height) - 1.0));
|
vec2 outside = step(vec2(0.0, 0.0), vec2(cell)) * step(vec2(cell), vec2(float(u_width) - 1.0, float(u_height) - 1.0));
|
||||||
float mult = outside.x * outside.y;
|
float mult = outside.x * outside.y;
|
||||||
|
|
||||||
int character = int(texelFetch(u_tbo, index).r * 255.0);
|
int character = int(texelFetch(u_tbo, index).r);
|
||||||
int fg = int(texelFetch(u_tbo, index + 1).r * 255.0);
|
int fg = int(texelFetch(u_tbo, index + 1).r);
|
||||||
int bg = int(texelFetch(u_tbo, index + 2).r * 255.0);
|
int bg = int(texelFetch(u_tbo, index + 2).r);
|
||||||
|
|
||||||
vec2 pos = (term_pos - corner) * vec2(FONT_WIDTH, FONT_HEIGHT);
|
vec2 pos = (term_pos - corner) * vec2(FONT_WIDTH, FONT_HEIGHT);
|
||||||
vec4 img = texture(u_font, (texture_corner(character) + pos) / 256.0);
|
vec4 img = texture(u_font, (texture_corner(character) + pos) / 256.0);
|
||||||
|
@@ -1,15 +1,137 @@
|
|||||||
--- The Colors API allows you to manipulate sets of colors.
|
--[[- The Colors API allows you to manipulate sets of colors.
|
||||||
--
|
|
||||||
-- This is useful in conjunction with Bundled Cables from the RedPower mod,
|
This is useful in conjunction with Bundled Cables from the RedPower mod, RedNet
|
||||||
-- RedNet Cables from the MineFactory Reloaded mod, and colors on Advanced
|
Cables from the MineFactory Reloaded mod, and colors on Advanced Computers and
|
||||||
-- Computers and Advanced Monitors.
|
Advanced Monitors.
|
||||||
--
|
|
||||||
-- For the non-American English version just replace @{colors} with @{colours}
|
For the non-American English version just replace @{colors} with @{colours} and
|
||||||
-- and it will use the other API, colours which is exactly the same, except in
|
it will use the other API, colours which is exactly the same, except in British
|
||||||
-- British English (e.g. @{colors.gray} is spelt @{colours.grey}).
|
English (e.g. @{colors.gray} is spelt @{colours.grey}).
|
||||||
--
|
|
||||||
-- @see colours
|
On basic terminals (such as the Computer and Monitor), all the colors are
|
||||||
-- @module colors
|
converted to grayscale. This means you can still use all 16 colors on the
|
||||||
|
screen, but they will appear as the nearest tint of gray. You can check if a
|
||||||
|
terminal supports color by using the function @{term.isColor}.
|
||||||
|
|
||||||
|
Grayscale colors are calculated by taking the average of the three components,
|
||||||
|
i.e. `(red + green + blue) / 3`.
|
||||||
|
|
||||||
|
<table class="pretty-table">
|
||||||
|
<thead>
|
||||||
|
<tr><th colspan="8" align="center">Default Colors</th></tr>
|
||||||
|
<tr>
|
||||||
|
<th rowspan="2" align="center">Color</th>
|
||||||
|
<th colspan="3" align="center">Value</th>
|
||||||
|
<th colspan="4" align="center">Default Palette Color</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Dec</th><th>Hex</th><th>Paint/Blit</th>
|
||||||
|
<th>Preview</th><th>Hex</th><th>RGB</th><th>Grayscale</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.white</code></td>
|
||||||
|
<td align="right">1</td><td align="right">0x1</td><td align="right">0</td>
|
||||||
|
<td style="background:#F0F0F0"></td><td>#F0F0F0</td><td>240, 240, 240</td>
|
||||||
|
<td style="background:#F0F0F0"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.orange</code></td>
|
||||||
|
<td align="right">2</td><td align="right">0x2</td><td align="right">1</td>
|
||||||
|
<td style="background:#F2B233"></td><td>#F2B233</td><td>242, 178, 51</td>
|
||||||
|
<td style="background:#9D9D9D"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.magenta</code></td>
|
||||||
|
<td align="right">4</td><td align="right">0x4</td><td align="right">2</td>
|
||||||
|
<td style="background:#E57FD8"></td><td>#E57FD8</td><td>229, 127, 216</td>
|
||||||
|
<td style="background:#BEBEBE"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.lightBlue</code></td>
|
||||||
|
<td align="right">8</td><td align="right">0x8</td><td align="right">3</td>
|
||||||
|
<td style="background:#99B2F2"></td><td>#99B2F2</td><td>153, 178, 242</td>
|
||||||
|
<td style="background:#BFBFBF"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.yellow</code></td>
|
||||||
|
<td align="right">16</td><td align="right">0x10</td><td align="right">4</td>
|
||||||
|
<td style="background:#DEDE6C"></td><td>#DEDE6C</td><td>222, 222, 108</td>
|
||||||
|
<td style="background:#B8B8B8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.lime</code></td>
|
||||||
|
<td align="right">32</td><td align="right">0x20</td><td align="right">5</td>
|
||||||
|
<td style="background:#7FCC19"></td><td>#7FCC19</td><td>127, 204, 25</td>
|
||||||
|
<td style="background:#767676"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.pink</code></td>
|
||||||
|
<td align="right">64</td><td align="right">0x40</td><td align="right">6</td>
|
||||||
|
<td style="background:#F2B2CC"></td><td>#F2B2CC</td><td>242, 178, 204</td>
|
||||||
|
<td style="background:#D0D0D0"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.gray</code></td>
|
||||||
|
<td align="right">128</td><td align="right">0x80</td><td align="right">7</td>
|
||||||
|
<td style="background:#4C4C4C"></td><td>#4C4C4C</td><td>76, 76, 76</td>
|
||||||
|
<td style="background:#4C4C4C"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.lightGray</code></td>
|
||||||
|
<td align="right">256</td><td align="right">0x100</td><td align="right">8</td>
|
||||||
|
<td style="background:#999999"></td><td>#999999</td><td>153, 153, 153</td>
|
||||||
|
<td style="background:#999999"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.cyan</code></td>
|
||||||
|
<td align="right">512</td><td align="right">0x200</td><td align="right">9</td>
|
||||||
|
<td style="background:#4C99B2"></td><td>#4C99B2</td><td>76, 153, 178</td>
|
||||||
|
<td style="background:#878787"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.purple</code></td>
|
||||||
|
<td align="right">1024</td><td align="right">0x400</td><td align="right">a</td>
|
||||||
|
<td style="background:#B266E5"></td><td>#B266E5</td><td>178, 102, 229</td>
|
||||||
|
<td style="background:#A9A9A9"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.blue</code></td>
|
||||||
|
<td align="right">2048</td><td align="right">0x800</td><td align="right">b</td>
|
||||||
|
<td style="background:#3366CC"></td><td>#3366CC</td><td>51, 102, 204</td>
|
||||||
|
<td style="background:#777777"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.brown</code></td>
|
||||||
|
<td align="right">4096</td><td align="right">0x1000</td><td align="right">c</td>
|
||||||
|
<td style="background:#7F664C"></td><td>#7F664C</td><td>127, 102, 76</td>
|
||||||
|
<td style="background:#656565"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.green</code></td>
|
||||||
|
<td align="right">8192</td><td align="right">0x2000</td><td align="right">d</td>
|
||||||
|
<td style="background:#57A64E"></td><td>#57A64E</td><td>87, 166, 78</td>
|
||||||
|
<td style="background:#6E6E6E"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.red</code></td>
|
||||||
|
<td align="right">16384</td><td align="right">0x4000</td><td align="right">e</td>
|
||||||
|
<td style="background:#CC4C4C"></td><td>#CC4C4C</td><td>204, 76, 76</td>
|
||||||
|
<td style="background:#767676"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>colors.black</code></td>
|
||||||
|
<td align="right">32768</td><td align="right">0x8000</td><td align="right">f</td>
|
||||||
|
<td style="background:#111111"></td><td>#111111</td><td>17, 17, 17</td>
|
||||||
|
<td style="background:#111111"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
@see colours
|
||||||
|
@module colors
|
||||||
|
]]
|
||||||
|
|
||||||
local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
local expect = dofile("rom/modules/main/cc/expect.lua").expect
|
||||||
|
|
||||||
@@ -37,7 +159,7 @@ yellow = 0x10
|
|||||||
-- terminal colour of #7FCC19.
|
-- terminal colour of #7FCC19.
|
||||||
lime = 0x20
|
lime = 0x20
|
||||||
|
|
||||||
--- Pink. Written as `6` in paint files and @{term.blit}, has a default
|
--- Pink: Written as `6` in paint files and @{term.blit}, has a default
|
||||||
-- terminal colour of #F2B2CC.
|
-- terminal colour of #F2B2CC.
|
||||||
pink = 0x40
|
pink = 0x40
|
||||||
|
|
||||||
@@ -74,10 +196,11 @@ green = 0x2000
|
|||||||
red = 0x4000
|
red = 0x4000
|
||||||
|
|
||||||
--- Black: Written as `f` in paint files and @{term.blit}, has a default
|
--- Black: Written as `f` in paint files and @{term.blit}, has a default
|
||||||
-- terminal colour of #191919.
|
-- terminal colour of #111111.
|
||||||
black = 0x8000
|
black = 0x8000
|
||||||
|
|
||||||
--- Combines a set of colors (or sets of colors) into a larger set.
|
--- Combines a set of colors (or sets of colors) into a larger set. Useful for
|
||||||
|
-- Bundled Cables.
|
||||||
--
|
--
|
||||||
-- @tparam number ... The colors to combine.
|
-- @tparam number ... The colors to combine.
|
||||||
-- @treturn number The union of the color sets given in `...`
|
-- @treturn number The union of the color sets given in `...`
|
||||||
@@ -96,7 +219,8 @@ function combine(...)
|
|||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Removes one or more colors (or sets of colors) from an initial set.
|
--- Removes one or more colors (or sets of colors) from an initial set. Useful
|
||||||
|
-- for Bundled Cables.
|
||||||
--
|
--
|
||||||
-- Each parameter beyond the first may be a single color or may be a set of
|
-- Each parameter beyond the first may be a single color or may be a set of
|
||||||
-- colors (in the latter case, all colors in the set are removed from the
|
-- colors (in the latter case, all colors in the set are removed from the
|
||||||
@@ -121,7 +245,8 @@ function subtract(colors, ...)
|
|||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Tests whether `color` is contained within `colors`.
|
--- Tests whether `color` is contained within `colors`. Useful for Bundled
|
||||||
|
-- Cables.
|
||||||
--
|
--
|
||||||
-- @tparam number colors A color, or color set
|
-- @tparam number colors A color, or color set
|
||||||
-- @tparam number color A color or set of colors that `colors` should contain.
|
-- @tparam number color A color or set of colors that `colors` should contain.
|
||||||
@@ -207,3 +332,21 @@ function rgb8(r, g, b)
|
|||||||
return packRGB(r, g, b)
|
return packRGB(r, g, b)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Colour to hex lookup table for toBlit
|
||||||
|
local color_hex_lookup = {}
|
||||||
|
for i = 0, 15 do
|
||||||
|
color_hex_lookup[2 ^ i] = string.format("%x", i)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Converts the given color to a paint/blit hex character (0-9a-f).
|
||||||
|
--
|
||||||
|
-- This is equivalent to converting floor(log_2(color)) to hexadecimal.
|
||||||
|
--
|
||||||
|
-- @tparam number color The color to convert.
|
||||||
|
-- @treturn string The blit hex code of the color.
|
||||||
|
function toBlit(color)
|
||||||
|
expect(1, color, "number")
|
||||||
|
return color_hex_lookup[color] or
|
||||||
|
string.format("%x", math.floor(math.log(color) / math.log(2)))
|
||||||
|
end
|
||||||
|
@@ -23,6 +23,25 @@ local function parseLine(tImageArg, sLine)
|
|||||||
table.insert(tImageArg, tLine)
|
table.insert(tImageArg, tLine)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Sorts pairs of startX/startY/endX/endY such that the start is always the min
|
||||||
|
local function sortCoords(startX, startY, endX, endY)
|
||||||
|
local minX, maxX, minY, maxY
|
||||||
|
|
||||||
|
if startX <= endX then
|
||||||
|
minX, maxX = startX, endX
|
||||||
|
else
|
||||||
|
minX, maxX = endX, startX
|
||||||
|
end
|
||||||
|
|
||||||
|
if startY <= endY then
|
||||||
|
minY, maxY = startY, endY
|
||||||
|
else
|
||||||
|
minY, maxY = endY, startY
|
||||||
|
end
|
||||||
|
|
||||||
|
return minX, maxX, minY, maxY
|
||||||
|
end
|
||||||
|
|
||||||
--- Parses an image from a multi-line string
|
--- Parses an image from a multi-line string
|
||||||
--
|
--
|
||||||
-- @tparam string image The string containing the raw-image data.
|
-- @tparam string image The string containing the raw-image data.
|
||||||
@@ -71,9 +90,6 @@ function drawPixel(xPos, yPos, colour)
|
|||||||
expect(2, yPos, "number")
|
expect(2, yPos, "number")
|
||||||
expect(3, colour, "number", "nil")
|
expect(3, colour, "number", "nil")
|
||||||
|
|
||||||
if type(xPos) ~= "number" then error("bad argument #1 (expected number, got " .. type(xPos) .. ")", 2) end
|
|
||||||
if type(yPos) ~= "number" then error("bad argument #2 (expected number, got " .. type(yPos) .. ")", 2) end
|
|
||||||
if colour ~= nil and type(colour) ~= "number" then error("bad argument #3 (expected number, got " .. type(colour) .. ")", 2) end
|
|
||||||
if colour then
|
if colour then
|
||||||
term.setBackgroundColor(colour)
|
term.setBackgroundColor(colour)
|
||||||
end
|
end
|
||||||
@@ -111,17 +127,7 @@ function drawLine(startX, startY, endX, endY, colour)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local minX = math.min(startX, endX)
|
local minX, maxX, minY, maxY = sortCoords(startX, startY, endX, endY)
|
||||||
local maxX, minY, maxY
|
|
||||||
if minX == startX then
|
|
||||||
minY = startY
|
|
||||||
maxX = endX
|
|
||||||
maxY = endY
|
|
||||||
else
|
|
||||||
minY = endY
|
|
||||||
maxX = startX
|
|
||||||
maxY = startY
|
|
||||||
end
|
|
||||||
|
|
||||||
-- TODO: clip to screen rectangle?
|
-- TODO: clip to screen rectangle?
|
||||||
|
|
||||||
@@ -177,37 +183,33 @@ function drawBox(startX, startY, endX, endY, nColour)
|
|||||||
endY = math.floor(endY)
|
endY = math.floor(endY)
|
||||||
|
|
||||||
if nColour then
|
if nColour then
|
||||||
term.setBackgroundColor(nColour)
|
term.setBackgroundColor(nColour) -- Maintain legacy behaviour
|
||||||
|
else
|
||||||
|
nColour = term.getBackgroundColour()
|
||||||
end
|
end
|
||||||
|
local colourHex = colours.toBlit(nColour)
|
||||||
|
|
||||||
if startX == endX and startY == endY then
|
if startX == endX and startY == endY then
|
||||||
drawPixelInternal(startX, startY)
|
drawPixelInternal(startX, startY)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local minX = math.min(startX, endX)
|
local minX, maxX, minY, maxY = sortCoords(startX, startY, endX, endY)
|
||||||
local maxX, minY, maxY
|
local width = maxX - minX + 1
|
||||||
if minX == startX then
|
|
||||||
minY = startY
|
|
||||||
maxX = endX
|
|
||||||
maxY = endY
|
|
||||||
else
|
|
||||||
minY = endY
|
|
||||||
maxX = startX
|
|
||||||
maxY = startY
|
|
||||||
end
|
|
||||||
|
|
||||||
for x = minX, maxX do
|
for y = minY, maxY do
|
||||||
drawPixelInternal(x, minY)
|
if y == minY or y == maxY then
|
||||||
drawPixelInternal(x, maxY)
|
term.setCursorPos(minX, y)
|
||||||
end
|
term.blit((" "):rep(width), colourHex:rep(width), colourHex:rep(width))
|
||||||
|
else
|
||||||
if maxY - minY >= 2 then
|
term.setCursorPos(minX, y)
|
||||||
for y = minY + 1, maxY - 1 do
|
term.blit(" ", colourHex, colourHex)
|
||||||
drawPixelInternal(minX, y)
|
term.setCursorPos(maxX, y)
|
||||||
drawPixelInternal(maxX, y)
|
term.blit(" ", colourHex, colourHex)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Draws a filled box on the current term from the specified start position to
|
--- Draws a filled box on the current term from the specified start position to
|
||||||
-- the specified end position.
|
-- the specified end position.
|
||||||
--
|
--
|
||||||
@@ -233,29 +235,23 @@ function drawFilledBox(startX, startY, endX, endY, nColour)
|
|||||||
endY = math.floor(endY)
|
endY = math.floor(endY)
|
||||||
|
|
||||||
if nColour then
|
if nColour then
|
||||||
term.setBackgroundColor(nColour)
|
term.setBackgroundColor(nColour) -- Maintain legacy behaviour
|
||||||
|
else
|
||||||
|
nColour = term.getBackgroundColour()
|
||||||
end
|
end
|
||||||
|
local colourHex = colours.toBlit(nColour)
|
||||||
|
|
||||||
if startX == endX and startY == endY then
|
if startX == endX and startY == endY then
|
||||||
drawPixelInternal(startX, startY)
|
drawPixelInternal(startX, startY)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local minX = math.min(startX, endX)
|
local minX, maxX, minY, maxY = sortCoords(startX, startY, endX, endY)
|
||||||
local maxX, minY, maxY
|
local width = maxX - minX + 1
|
||||||
if minX == startX then
|
|
||||||
minY = startY
|
|
||||||
maxX = endX
|
|
||||||
maxY = endY
|
|
||||||
else
|
|
||||||
minY = endY
|
|
||||||
maxX = startX
|
|
||||||
maxY = startY
|
|
||||||
end
|
|
||||||
|
|
||||||
for x = minX, maxX do
|
for y = minY, maxY do
|
||||||
for y = minY, maxY do
|
term.setCursorPos(minX, y)
|
||||||
drawPixelInternal(x, y)
|
term.blit((" "):rep(width), colourHex:rep(width), colourHex:rep(width))
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -453,13 +453,13 @@ do
|
|||||||
error_at(pos, "Unexpected %s, expected %s.", actual, exp)
|
error_at(pos, "Unexpected %s, expected %s.", actual, exp)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function parse_string(str, pos)
|
local function parse_string(str, pos, terminate)
|
||||||
local buf, n = {}, 1
|
local buf, n = {}, 1
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local c = sub(str, pos, pos)
|
local c = sub(str, pos, pos)
|
||||||
if c == "" then error_at(pos, "Unexpected end of input, expected '\"'.") end
|
if c == "" then error_at(pos, "Unexpected end of input, expected '\"'.") end
|
||||||
if c == '"' then break end
|
if c == terminate then break end
|
||||||
|
|
||||||
if c == '\\' then
|
if c == '\\' then
|
||||||
-- Handle the various escapes
|
-- Handle the various escapes
|
||||||
@@ -485,13 +485,13 @@ do
|
|||||||
return concat(buf, "", 1, n - 1), pos + 1
|
return concat(buf, "", 1, n - 1), pos + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local valid = { b = true, B = true, s = true, S = true, l = true, L = true, f = true, F = true, d = true, D = true }
|
local num_types = { b = true, B = true, s = true, S = true, l = true, L = true, f = true, F = true, d = true, D = true }
|
||||||
local function parse_number(str, pos, opts)
|
local function parse_number(str, pos, opts)
|
||||||
local _, last, num_str = find(str, '^(-?%d+%.?%d*[eE]?[+-]?%d*)', pos)
|
local _, last, num_str = find(str, '^(-?%d+%.?%d*[eE]?[+-]?%d*)', pos)
|
||||||
local val = tonumber(num_str)
|
local val = tonumber(num_str)
|
||||||
if not val then error_at(pos, "Malformed number %q.", num_str) end
|
if not val then error_at(pos, "Malformed number %q.", num_str) end
|
||||||
|
|
||||||
if opts.nbt_style and valid[sub(str, pos + 1, pos + 1)] then return val, last + 2 end
|
if opts.nbt_style and num_types[sub(str, last + 1, last + 1)] then return val, last + 2 end
|
||||||
|
|
||||||
return val, last + 1
|
return val, last + 1
|
||||||
end
|
end
|
||||||
@@ -501,9 +501,11 @@ do
|
|||||||
return val, last + 1
|
return val, last + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local arr_types = { I = true, L = true, B = true }
|
||||||
local function decode_impl(str, pos, opts)
|
local function decode_impl(str, pos, opts)
|
||||||
local c = sub(str, pos, pos)
|
local c = sub(str, pos, pos)
|
||||||
if c == '"' then return parse_string(str, pos + 1)
|
if c == '"' then return parse_string(str, pos + 1, '"')
|
||||||
|
elseif c == "'" and opts.nbt_style then return parse_string(str, pos + 1, "\'")
|
||||||
elseif c == "-" or c >= "0" and c <= "9" then return parse_number(str, pos, opts)
|
elseif c == "-" or c >= "0" and c <= "9" then return parse_number(str, pos, opts)
|
||||||
elseif c == "t" then
|
elseif c == "t" then
|
||||||
if sub(str, pos + 1, pos + 3) == "rue" then return true, pos + 4 end
|
if sub(str, pos + 1, pos + 3) == "rue" then return true, pos + 4 end
|
||||||
@@ -528,7 +530,7 @@ do
|
|||||||
|
|
||||||
while true do
|
while true do
|
||||||
local key, value
|
local key, value
|
||||||
if c == "\"" then key, pos = parse_string(str, pos + 1)
|
if c == "\"" then key, pos = parse_string(str, pos + 1, "\"")
|
||||||
elseif opts.nbt_style then key, pos = parse_ident(str, pos)
|
elseif opts.nbt_style then key, pos = parse_ident(str, pos)
|
||||||
else return expected(pos, c, "object key")
|
else return expected(pos, c, "object key")
|
||||||
end
|
end
|
||||||
@@ -560,6 +562,11 @@ do
|
|||||||
pos = skip(str, pos + 1)
|
pos = skip(str, pos + 1)
|
||||||
c = sub(str, pos, pos)
|
c = sub(str, pos, pos)
|
||||||
|
|
||||||
|
if arr_types[c] and sub(str, pos + 1, pos + 1) == ";" and opts.nbt_style then
|
||||||
|
pos = skip(str, pos + 2)
|
||||||
|
c = sub(str, pos, pos)
|
||||||
|
end
|
||||||
|
|
||||||
if c == "" then return expected(pos, c, "']'") end
|
if c == "" then return expected(pos, c, "']'") end
|
||||||
if c == "]" then return empty_json_array, pos + 1 end
|
if c == "]" then return empty_json_array, pos + 1 end
|
||||||
|
|
||||||
|
@@ -474,6 +474,14 @@ function create(parent, nX, nY, nWidth, nHeight, bStartVisible)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Get whether this window is visible. Invisible windows will not be
|
||||||
|
-- drawn to the screen until they are made visible again.
|
||||||
|
--
|
||||||
|
-- @treturn boolean Whether this window is visible.
|
||||||
|
-- @see Window:setVisible
|
||||||
|
function window.isVisible()
|
||||||
|
return bVisible
|
||||||
|
end
|
||||||
--- Draw this window. This does nothing if the window is not visible.
|
--- Draw this window. This does nothing if the window is not visible.
|
||||||
--
|
--
|
||||||
-- @see Window:setVisible
|
-- @see Window:setVisible
|
||||||
|
@@ -1,3 +1,20 @@
|
|||||||
|
# New features in CC: Tweaked 1.94.0
|
||||||
|
|
||||||
|
* Add getter for window visibility (devomaa)
|
||||||
|
* Generic peripherals are no longer experimental, and on by default.
|
||||||
|
* Use term.blit to draw boxes in paintutils (Lemmmy).
|
||||||
|
|
||||||
|
And several bug fixes:
|
||||||
|
* Fix turtles not getting advancements when turtles are on.
|
||||||
|
* Draw in-hand pocket computers with the correct transparent flags enabled.
|
||||||
|
* Several bug fixes to SNBT parsing.
|
||||||
|
* Fix several programs using their original name instead of aliases in usage hints (Lupus590).
|
||||||
|
|
||||||
|
# New features in CC: Tweaked 1.93.1
|
||||||
|
|
||||||
|
* Various documentation improvements (Lemmmy).
|
||||||
|
* Fix TBO monitor renderer on some older graphics cards (Lemmmy).
|
||||||
|
|
||||||
# New features in CC: Tweaked 1.93.0
|
# New features in CC: Tweaked 1.93.0
|
||||||
|
|
||||||
* Update Swedish translations (Granddave).
|
* Update Swedish translations (Granddave).
|
||||||
@@ -52,8 +69,6 @@ And several bug fixes:
|
|||||||
* Fix deadlock when mistakenly "watching" an unloaded chunk.
|
* Fix deadlock when mistakenly "watching" an unloaded chunk.
|
||||||
* Fix full path of files being leaked in some errors.
|
* Fix full path of files being leaked in some errors.
|
||||||
|
|
||||||
Type "help changelog" to see the full version history.
|
|
||||||
|
|
||||||
# New features in CC: Tweaked 1.89.1
|
# New features in CC: Tweaked 1.89.1
|
||||||
|
|
||||||
* Fix crashes when rendering monitors of varying sizes.
|
* Fix crashes when rendering monitors of varying sizes.
|
||||||
|
@@ -1,11 +1,13 @@
|
|||||||
New features in CC: Tweaked 1.93.0
|
New features in CC: Tweaked 1.94.0
|
||||||
|
|
||||||
* Update Swedish translations (Granddave).
|
* Add getter for window visibility (devomaa)
|
||||||
* Printers use item tags to check dyes.
|
* Generic peripherals are no longer experimental, and on by default.
|
||||||
* HTTP rules may now be targetted for a specific port.
|
* Use term.blit to draw boxes in paintutils (Lemmmy).
|
||||||
* Don't propagate adjacent redstone signals through computers.
|
|
||||||
|
|
||||||
And several bug fixes:
|
And several bug fixes:
|
||||||
* Fix NPEs when turtles interact with containers.
|
* Fix turtles not getting advancements when turtles are on.
|
||||||
|
* Draw in-hand pocket computers with the correct transparent flags enabled.
|
||||||
|
* Several bug fixes to SNBT parsing.
|
||||||
|
* Fix several programs using their original name instead of aliases in usage hints (Lupus590).
|
||||||
|
|
||||||
Type "help changelog" to see the full version history.
|
Type "help changelog" to see the full version history.
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
-- @module cc.pretty
|
-- @module cc.pretty
|
||||||
-- @usage Print a table to the terminal
|
-- @usage Print a table to the terminal
|
||||||
-- local pretty = require "cc.pretty"
|
-- local pretty = require "cc.pretty"
|
||||||
-- pretty.write(pretty.dump({ 1, 2, 3 }))
|
-- pretty.write(pretty.pretty({ 1, 2, 3 }))
|
||||||
--
|
--
|
||||||
-- @usage Build a custom document and display it
|
-- @usage Build a custom document and display it
|
||||||
-- local pretty = require "cc.pretty"
|
-- local pretty = require "cc.pretty"
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs > 2 then
|
if #tArgs > 2 then
|
||||||
print("Usage: alias <alias> <program>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <alias> <program>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 1 then
|
if #tArgs < 1 then
|
||||||
print("Usage: cd <path>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <path>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -4,7 +4,8 @@ if not commands then
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
if #tArgs == 0 then
|
if #tArgs == 0 then
|
||||||
printError("Usage: exec <command>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
printError("Usage: " .. programName .. " <command>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 2 then
|
if #tArgs < 2 then
|
||||||
print("Usage: cp <source> <destination>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <source> <destination>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
local args = table.pack(...)
|
local args = table.pack(...)
|
||||||
|
|
||||||
if args.n < 1 then
|
if args.n < 1 then
|
||||||
print("Usage: rm <paths>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <paths>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
-- Get file to edit
|
-- Get file to edit
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs == 0 then
|
if #tArgs == 0 then
|
||||||
print("Usage: edit <path>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <path>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
-- Get arguments
|
-- Get arguments
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs == 0 then
|
if #tArgs == 0 then
|
||||||
print("Usage: eject <drive>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <drive>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -34,7 +34,8 @@ end
|
|||||||
-- Determines if the file exists, and can be edited on this computer
|
-- Determines if the file exists, and can be edited on this computer
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs == 0 then
|
if #tArgs == 0 then
|
||||||
print("Usage: paint <path>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <path>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local sPath = shell.resolve(tArgs[1])
|
local sPath = shell.resolve(tArgs[1])
|
||||||
|
@@ -1,10 +1,11 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
|
||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usages:")
|
print("Usages:")
|
||||||
print("dj play")
|
print(programName .. " play")
|
||||||
print("dj play <drive>")
|
print(programName .. " play <drive>")
|
||||||
print("dj stop")
|
print(programName .. " stop")
|
||||||
end
|
end
|
||||||
|
|
||||||
if #tArgs > 2 then
|
if #tArgs > 2 then
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usages:")
|
print("Usages:")
|
||||||
print("gps host")
|
print(programName .. " host")
|
||||||
print("gps host <x> <y> <z>")
|
print(programName .. " host <x> <y> <z>")
|
||||||
print("gps locate")
|
print(programName .. " locate")
|
||||||
end
|
end
|
||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usages:")
|
print("Usages:")
|
||||||
print("pastebin put <filename>")
|
print(programName .. " put <filename>")
|
||||||
print("pastebin get <code> <filename>")
|
print(programName .. " get <code> <filename>")
|
||||||
print("pastebin run <code> <arguments>")
|
print(programName .. " run <code> <arguments>")
|
||||||
end
|
end
|
||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usage:")
|
print("Usage:")
|
||||||
print("wget <url> [filename]")
|
print(programName .. " <url> [filename]")
|
||||||
print("wget run <url>")
|
print(programName .. " run <url>")
|
||||||
end
|
end
|
||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
@@ -1,11 +1,12 @@
|
|||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usages:")
|
print("Usages:")
|
||||||
print("label get")
|
print(programName .. " get")
|
||||||
print("label get <drive>")
|
print(programName .. " get <drive>")
|
||||||
print("label set <text>")
|
print(programName .. " set <text>")
|
||||||
print("label set <drive> <text>")
|
print(programName .. " set <drive> <text>")
|
||||||
print("label clear")
|
print(programName .. " clear")
|
||||||
print("label clear <drive>")
|
print(programName .. " clear <drive>")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function checkDrive(sDrive)
|
local function checkDrive(sDrive)
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
|
||||||
if #tArgs < 1 then
|
if #tArgs < 1 then
|
||||||
print("Usage: mkdir <paths>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <paths>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
local function printUsage()
|
local function printUsage()
|
||||||
print("Usage: monitor <name> <program> <arguments>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <name> <program> <arguments>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 2 then
|
if #tArgs < 2 then
|
||||||
print("Usage: mv <source> <destination>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <source> <destination>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
|
||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usages:")
|
print("Usages:")
|
||||||
print("chat host <hostname>")
|
print(programName .. " host <hostname>")
|
||||||
print("chat join <hostname> <nickname>")
|
print(programName .. " join <hostname> <nickname>")
|
||||||
end
|
end
|
||||||
|
|
||||||
local sOpenedModem = nil
|
local sOpenedModem = nil
|
||||||
|
@@ -1,11 +1,12 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
|
|
||||||
local function printUsage()
|
local function printUsage()
|
||||||
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
print("Usages:")
|
print("Usages:")
|
||||||
print("redstone probe")
|
print(programName .. " probe")
|
||||||
print("redstone set <side> <value>")
|
print(programName .. " set <side> <value>")
|
||||||
print("redstone set <side> <color> <value>")
|
print(programName .. " set <side> <color> <value>")
|
||||||
print("redstone pulse <side> <count> <period>")
|
print(programName .. " pulse <side> <count> <period>")
|
||||||
end
|
end
|
||||||
|
|
||||||
local sCommand = tArgs[1]
|
local sCommand = tArgs[1]
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 2 then
|
if #tArgs < 2 then
|
||||||
print("Usage: rename <source> <destination>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <source> <destination>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -11,7 +11,8 @@ end
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
local nLimit = nil
|
local nLimit = nil
|
||||||
if #tArgs < 1 then
|
if #tArgs < 1 then
|
||||||
print("Usage: craft [number]")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " [number]")
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
nLimit = tonumber(tArgs[1])
|
nLimit = tonumber(tArgs[1])
|
||||||
|
@@ -5,7 +5,8 @@ end
|
|||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
local function printUsage()
|
local function printUsage()
|
||||||
print("Usage: equip <slot> <side>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <slot> <side>")
|
||||||
end
|
end
|
||||||
|
|
||||||
if #tArgs ~= 2 then
|
if #tArgs ~= 2 then
|
||||||
|
@@ -5,7 +5,8 @@ end
|
|||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs ~= 1 then
|
if #tArgs ~= 1 then
|
||||||
print("Usage: excavate <diameter>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <diameter>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -5,7 +5,8 @@ end
|
|||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 1 then
|
if #tArgs < 1 then
|
||||||
print("Usage: go <direction> <distance>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <direction> <distance>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -6,7 +6,8 @@ end
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
local nLimit = 1
|
local nLimit = 1
|
||||||
if #tArgs > 1 then
|
if #tArgs > 1 then
|
||||||
print("Usage: refuel [number]")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " [number]")
|
||||||
return
|
return
|
||||||
elseif #tArgs > 0 then
|
elseif #tArgs > 0 then
|
||||||
if tArgs[1] == "all" then
|
if tArgs[1] == "all" then
|
||||||
|
@@ -5,7 +5,8 @@ end
|
|||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs ~= 1 then
|
if #tArgs ~= 1 then
|
||||||
print("Usage: tunnel <length>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <length>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -5,7 +5,8 @@ end
|
|||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 1 then
|
if #tArgs < 1 then
|
||||||
print("Usage: turn <direction> <turns>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <direction> <turns>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -5,7 +5,8 @@ end
|
|||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
local function printUsage()
|
local function printUsage()
|
||||||
print("Usage: unequip <side>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <side>")
|
||||||
end
|
end
|
||||||
|
|
||||||
if #tArgs ~= 1 then
|
if #tArgs ~= 1 then
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs < 1 then
|
if #tArgs < 1 then
|
||||||
print("Usage: type <path>")
|
local programName = arg[0] or fs.getName(shell.getRunningProgram())
|
||||||
|
print("Usage: " .. programName .. " <path>")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -73,4 +73,20 @@ describe("The colors library", function()
|
|||||||
expect(colors.rgb8(0.3, 0.5, 0.6)):equals(0x4c7f99)
|
expect(colors.rgb8(0.3, 0.5, 0.6)):equals(0x4c7f99)
|
||||||
expect({ colors.rgb8(0x4c7f99) }):same { 0x4c / 0xFF, 0x7f / 0xFF, 0.6 }
|
expect({ colors.rgb8(0x4c7f99) }):same { 0x4c / 0xFF, 0x7f / 0xFF, 0.6 }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe("colors.toBlit", function()
|
||||||
|
it("validates arguments", function()
|
||||||
|
expect.error(colors.toBlit, nil):eq("bad argument #1 (expected number, got nil)")
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("converts all colors", function()
|
||||||
|
for i = 0, 15 do
|
||||||
|
expect(colors.toBlit(2 ^ i)):eq(string.format("%x", i))
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("floors colors", function()
|
||||||
|
expect(colors.toBlit(16385)):eq("e")
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
@@ -1,4 +1,19 @@
|
|||||||
|
local with_window = require "test_helpers".with_window
|
||||||
|
|
||||||
describe("The paintutils library", function()
|
describe("The paintutils library", function()
|
||||||
|
-- Verifies that a window's lines are equal to the given table of blit
|
||||||
|
-- strings ({{"text", "fg", "bg"}, {"text", "fg", "bg"}...})
|
||||||
|
local function window_eq(w, state)
|
||||||
|
-- Verification of the size isn't really important in the tests, but
|
||||||
|
-- better safe than sorry.
|
||||||
|
local _, height = w.getSize()
|
||||||
|
expect(#state):eq(height)
|
||||||
|
|
||||||
|
for line = 1, height do
|
||||||
|
expect({ w.getLine(line) }):same(state[line])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe("paintutils.parseImage", function()
|
describe("paintutils.parseImage", function()
|
||||||
it("validates arguments", function()
|
it("validates arguments", function()
|
||||||
paintutils.parseImage("")
|
paintutils.parseImage("")
|
||||||
@@ -28,6 +43,30 @@ describe("The paintutils library", function()
|
|||||||
expect.error(paintutils.drawLine, 1, 1, 1, nil):eq("bad argument #4 (expected number, got nil)")
|
expect.error(paintutils.drawLine, 1, 1, 1, nil):eq("bad argument #4 (expected number, got nil)")
|
||||||
expect.error(paintutils.drawLine, 1, 1, 1, 1, false):eq("bad argument #5 (expected number, got boolean)")
|
expect.error(paintutils.drawLine, 1, 1, 1, 1, false):eq("bad argument #5 (expected number, got boolean)")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("draws a line going across with custom colour", function()
|
||||||
|
local w = with_window(3, 2, function()
|
||||||
|
paintutils.drawLine(1, 1, 3, 1, colours.red)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "000", "eee" },
|
||||||
|
{ " ", "000", "fff" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("draws a line going diagonally with term colour", function()
|
||||||
|
local w = with_window(3, 3, function()
|
||||||
|
term.setBackgroundColour(colours.red)
|
||||||
|
paintutils.drawLine(1, 1, 3, 3)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "000", "eff" },
|
||||||
|
{ " ", "000", "fef" },
|
||||||
|
{ " ", "000", "ffe" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe("paintutils.drawBox", function()
|
describe("paintutils.drawBox", function()
|
||||||
@@ -38,6 +77,45 @@ describe("The paintutils library", function()
|
|||||||
expect.error(paintutils.drawBox, 1, 1, 1, nil):eq("bad argument #4 (expected number, got nil)")
|
expect.error(paintutils.drawBox, 1, 1, 1, nil):eq("bad argument #4 (expected number, got nil)")
|
||||||
expect.error(paintutils.drawBox, 1, 1, 1, 1, false):eq("bad argument #5 (expected number, got boolean)")
|
expect.error(paintutils.drawBox, 1, 1, 1, 1, false):eq("bad argument #5 (expected number, got boolean)")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("draws a box with term colour", function()
|
||||||
|
local w = with_window(3, 3, function()
|
||||||
|
term.setBackgroundColour(colours.red)
|
||||||
|
paintutils.drawBox(1, 1, 3, 3)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " ", "e0e", "efe" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("draws a box with custom colour", function()
|
||||||
|
local w = with_window(3, 3, function()
|
||||||
|
paintutils.drawBox(1, 1, 3, 3, colours.red)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " ", "e0e", "efe" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("draws a box without overwriting existing content", function()
|
||||||
|
local w = with_window(3, 3, function()
|
||||||
|
term.setCursorPos(2, 2)
|
||||||
|
term.write("a")
|
||||||
|
paintutils.drawBox(1, 1, 3, 3, colours.red)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " a ", "e0e", "efe" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe("paintutils.drawFilledBox", function()
|
describe("paintutils.drawFilledBox", function()
|
||||||
@@ -48,6 +126,31 @@ describe("The paintutils library", function()
|
|||||||
expect.error(paintutils.drawFilledBox, 1, 1, 1, nil):eq("bad argument #4 (expected number, got nil)")
|
expect.error(paintutils.drawFilledBox, 1, 1, 1, nil):eq("bad argument #4 (expected number, got nil)")
|
||||||
expect.error(paintutils.drawFilledBox, 1, 1, 1, 1, false):eq("bad argument #5 (expected number, got boolean)")
|
expect.error(paintutils.drawFilledBox, 1, 1, 1, 1, false):eq("bad argument #5 (expected number, got boolean)")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("draws a filled box with term colour", function()
|
||||||
|
local w = with_window(3, 3, function()
|
||||||
|
term.setBackgroundColour(colours.red)
|
||||||
|
paintutils.drawFilledBox(1, 1, 3, 3)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("draws a filled box with custom colour", function()
|
||||||
|
local w = with_window(3, 3, function()
|
||||||
|
paintutils.drawFilledBox(1, 1, 3, 3, colours.red)
|
||||||
|
end)
|
||||||
|
|
||||||
|
window_eq(w, {
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
{ " ", "eee", "eee" },
|
||||||
|
})
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe("paintutils.drawImage", function()
|
describe("paintutils.drawImage", function()
|
||||||
|
@@ -126,12 +126,28 @@ describe("The textutils library", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
describe("parses using NBT-style syntax", function()
|
describe("parses using NBT-style syntax", function()
|
||||||
|
local function exp(x)
|
||||||
|
local res, err = textutils.unserializeJSON(x, { nbt_style = true })
|
||||||
|
if not res then error(err, 2) end
|
||||||
|
return expect(res)
|
||||||
|
end
|
||||||
it("basic objects", function()
|
it("basic objects", function()
|
||||||
expect(textutils.unserializeJSON([[{ a: 1, b:2 }]], { nbt_style = true })):same { a = 1, b = 2 }
|
exp([[{ a: 1, b:2 }]]):same { a = 1, b = 2 }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("suffixed numbers", function()
|
it("suffixed numbers", function()
|
||||||
expect(textutils.unserializeJSON("1b", { nbt_style = true })):eq(1)
|
exp("1b"):eq(1)
|
||||||
|
exp("1.1d"):eq(1.1)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("strings", function()
|
||||||
|
exp("'123'"):eq("123")
|
||||||
|
exp("\"123\""):eq("123")
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("typed arrays", function()
|
||||||
|
exp("[B; 1, 2, 3]"):same { 1, 2, 3 }
|
||||||
|
exp("[B;]"):same {}
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@@ -157,4 +157,17 @@ describe("The window library", function()
|
|||||||
expect({ w.getLine(1) }):same { "test ", "aaaa0", "4444f" }
|
expect({ w.getLine(1) }):same { "test ", "aaaa0", "4444f" }
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
describe("Window.setVisible", function()
|
||||||
|
it("validates arguments", function()
|
||||||
|
local w = mk()
|
||||||
|
expect.error(w.setVisible, nil):eq("bad argument #1 (expected boolean, got nil)")
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
describe("Window.isVisible", function()
|
||||||
|
it("gets window visibility", function()
|
||||||
|
local w = mk()
|
||||||
|
w.setVisible(false)
|
||||||
|
expect(w.isVisible()):same(false)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
@@ -10,7 +10,7 @@ describe("The exec program", function()
|
|||||||
it("displays its usage when given no argument", function()
|
it("displays its usage when given no argument", function()
|
||||||
stub(_G, "commands", {})
|
stub(_G, "commands", {})
|
||||||
expect(capture(stub, "/rom/programs/command/exec.lua"))
|
expect(capture(stub, "/rom/programs/command/exec.lua"))
|
||||||
:matches { ok = true, output = "", error = "Usage: exec <command>\n" }
|
:matches { ok = true, output = "", error = "Usage: /rom/programs/command/exec.lua <command>\n" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("runs a command", function()
|
it("runs a command", function()
|
||||||
|
@@ -35,6 +35,6 @@ describe("The copy program", function()
|
|||||||
|
|
||||||
it("displays the usage when given no arguments", function()
|
it("displays the usage when given no arguments", function()
|
||||||
expect(capture(stub, "copy"))
|
expect(capture(stub, "copy"))
|
||||||
:matches { ok = true, output = "Usage: cp <source> <destination>\n", error = "" }
|
:matches { ok = true, output = "Usage: copy <source> <destination>\n", error = "" }
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@@ -69,6 +69,6 @@ describe("The move program", function()
|
|||||||
|
|
||||||
it("displays the usage with no arguments", function()
|
it("displays the usage with no arguments", function()
|
||||||
expect(capture(stub, "move"))
|
expect(capture(stub, "move"))
|
||||||
:matches { ok = true, output = "Usage: mv <source> <destination>\n", error = "" }
|
:matches { ok = true, output = "Usage: move <source> <destination>\n", error = "" }
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@@ -19,7 +19,7 @@ describe("The craft program", function()
|
|||||||
stub(_G, "turtle", { craft = function() end })
|
stub(_G, "turtle", { craft = function() end })
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/turtle/craft.lua"))
|
expect(capture(stub, "/rom/programs/turtle/craft.lua"))
|
||||||
:matches { ok = true, output = "Usage: craft [number]\n", error = "" }
|
:matches { ok = true, output = "Usage: /rom/programs/turtle/craft.lua [number]\n", error = "" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("crafts multiple items", function()
|
it("crafts multiple items", function()
|
||||||
|
@@ -13,7 +13,7 @@ describe("The turtle equip program", function()
|
|||||||
stub(_G, "turtle", {})
|
stub(_G, "turtle", {})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/turtle/equip.lua"))
|
expect(capture(stub, "/rom/programs/turtle/equip.lua"))
|
||||||
:matches { ok = true, output = "Usage: equip <slot> <side>\n", error = "" }
|
:matches { ok = true, output = "Usage: /rom/programs/turtle/equip.lua <slot> <side>\n", error = "" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("equip nothing", function()
|
it("equip nothing", function()
|
||||||
|
@@ -32,7 +32,7 @@ describe("The refuel program", function()
|
|||||||
it("displays its usage when given too many argument", function()
|
it("displays its usage when given too many argument", function()
|
||||||
setup_turtle(0, 5, 0)
|
setup_turtle(0, 5, 0)
|
||||||
expect(capture(stub, "/rom/programs/turtle/refuel.lua a b"))
|
expect(capture(stub, "/rom/programs/turtle/refuel.lua a b"))
|
||||||
:matches { ok = true, output = "Usage: refuel [number]\n", error = "" }
|
:matches { ok = true, output = "Usage: /rom/programs/turtle/refuel.lua [number]\n", error = "" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("requires a numeric argument", function()
|
it("requires a numeric argument", function()
|
||||||
|
@@ -13,7 +13,7 @@ describe("The turtle unequip program", function()
|
|||||||
stub(_G, "turtle", {})
|
stub(_G, "turtle", {})
|
||||||
|
|
||||||
expect(capture(stub, "/rom/programs/turtle/unequip.lua"))
|
expect(capture(stub, "/rom/programs/turtle/unequip.lua"))
|
||||||
:matches { ok = true, output = "Usage: unequip <side>\n", error = "" }
|
:matches { ok = true, output = "Usage: /rom/programs/turtle/unequip.lua <side>\n", error = "" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("says when nothing was unequipped", function()
|
it("says when nothing was unequipped", function()
|
||||||
|
Reference in New Issue
Block a user