From c35707725f1441e9870bda820d5de04edf2033ee Mon Sep 17 00:00:00 2001 From: SquidDev Date: Fri, 20 Nov 2020 21:59:17 +0000 Subject: [PATCH] More examples Yay! --- rollup.config.js | 12 ++- .../computercraft/lua/rom/apis/paintutils.lua | 7 ++ .../computercraft/lua/rom/apis/parallel.lua | 83 +++++++++++++------ .../lua/rom/programs/fun/advanced/paint.lua | 4 +- src/web/index.tsx | 5 ++ src/web/mount/example.nfp | 16 ++++ 6 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 src/web/mount/example.nfp diff --git a/rollup.config.js b/rollup.config.js index 1e0342fea..725abb7ca 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -35,14 +35,20 @@ export default { await Promise.all(files .filter(x => path.extname(x) !== ".ts") - .map(file => fs.writeFile(`${input}/mount/${file}.d.ts`, template)) + .map(async file => { + const path = `${input}/mount/${file}.d.ts`; + const contents = await fs.readFile(path, { encoding: "utf-8" }).catch(() => ""); + if (contents !== template) await fs.writeFile(path, template); + }) ); return options; }, async transform(code, file) { // Allow loading files in /mount. - if (path.extname(file) != ".lua" && path.basename(file) != ".settings") return null; - return `export default ${JSON.stringify(code)};\n`; + const ext = path.extname(file); + return ext != '.tsx' && ext != '.ts' && path.dirname(file) === path.resolve(`${input}/mount`) + ? `export default ${JSON.stringify(code)};\n` + : null; }, } ], diff --git a/src/main/resources/data/computercraft/lua/rom/apis/paintutils.lua b/src/main/resources/data/computercraft/lua/rom/apis/paintutils.lua index 7ae1006b8..b920341c3 100644 --- a/src/main/resources/data/computercraft/lua/rom/apis/paintutils.lua +++ b/src/main/resources/data/computercraft/lua/rom/apis/paintutils.lua @@ -64,6 +64,10 @@ end -- -- @treturn table|nil The parsed image data, suitable for use with -- @{paintutils.drawImage}, or `nil` if the file does not exist. +-- @usage Load an image and draw it. +-- +-- local image = paintutils.loadImage("test-image.nfp") +-- paintutils.drawImage(image, term.getCursorPos()) function loadImage(path) expect(1, path, "string") @@ -107,6 +111,7 @@ end -- @tparam number endY The end y position of the line. -- @tparam[opt] number colour The @{colors|color} of this pixel. This will be -- the current background colour if not specified. +-- @usage paintutils.drawLine(2, 3, 30, 7, colors.red) function drawLine(startX, startY, endX, endY, colour) expect(1, startX, "number") expect(2, startY, "number") @@ -170,6 +175,7 @@ end -- @tparam number endY The end y position of the line. -- @tparam[opt] number colour The @{colors|color} of this pixel. This will be -- the current background colour if not specified. +-- @usage paintutils.drawBox(2, 3, 30, 7, colors.red) function drawBox(startX, startY, endX, endY, nColour) expect(1, startX, "number") expect(2, startY, "number") @@ -222,6 +228,7 @@ end -- @tparam number endY The end y position of the line. -- @tparam[opt] number colour The @{colors|color} of this pixel. This will be -- the current background colour if not specified. +-- @usage paintutils.drawFilledBox(2, 3, 30, 7, colors.red) function drawFilledBox(startX, startY, endX, endY, nColour) expect(1, startX, "number") expect(2, startY, "number") diff --git a/src/main/resources/data/computercraft/lua/rom/apis/parallel.lua b/src/main/resources/data/computercraft/lua/rom/apis/parallel.lua index c787eff41..e826ed28e 100644 --- a/src/main/resources/data/computercraft/lua/rom/apis/parallel.lua +++ b/src/main/resources/data/computercraft/lua/rom/apis/parallel.lua @@ -1,18 +1,19 @@ ---- Provides a simple implementation of multitasking. --- --- Functions are not actually executed simultaniously, but rather this API will --- automatically switch between them whenever they yield (eg whenever they call --- @{coroutine.yield}, or functions that call that - eg `os.pullEvent` - or --- functions that call that, etc - basically, anything that causes the function --- to "pause"). --- --- Each function executed in "parallel" gets its own copy of the event queue, --- and so "event consuming" functions (again, mostly anything that causes the --- script to pause - eg `sleep`, `rednet.receive`, most of the `turtle` API, --- etc) can safely be used in one without affecting the event queue accessed by --- the other. --- --- @module parallel +--[[- Provides a simple implementation of multitasking. + +Functions are not actually executed simultaniously, but rather this API will +automatically switch between them whenever they yield (eg whenever they call +@{coroutine.yield}, or functions that call that - eg `os.pullEvent` - or +functions that call that, etc - basically, anything that causes the function +to "pause"). + +Each function executed in "parallel" gets its own copy of the event queue, +and so "event consuming" functions (again, mostly anything that causes the +script to pause - eg `sleep`, `rednet.receive`, most of the `turtle` API, +etc) can safely be used in one without affecting the event queue accessed by +the other. + +@module parallel +]] local function create(...) local tFns = table.pack(...) @@ -70,21 +71,53 @@ local function runUntilLimit(_routines, _limit) end end ---- Switches between execution of the functions, until any of them --- finishes. If any of the functions errors, the message is propagated upwards --- from the @{parallel.waitForAny} call. --- --- @tparam function ... The functions this task will run +--[[- Switches between execution of the functions, until any of them +finishes. If any of the functions errors, the message is propagated upwards +from the @{parallel.waitForAny} call. + +@tparam function ... The functions this task will run +@usage Print a message every second until the `q` key is pressed. + + local function tick() + while true do + os.sleep(1) + print("Tick") + end + end + local function wait_for_q() + repeat + local _, key = os.pullEvent("key") + until key == keys.q + print("Q was pressed!") + end + + parallel.waitForAny(tick, wait_for_q) + print("Everything done!") +]] function waitForAny(...) local routines = create(...) return runUntilLimit(routines, #routines - 1) end ---- Switches between execution of the functions, until all of them are --- finished. If any of the functions errors, the message is propagated upwards --- from the @{parallel.waitForAll} call. --- --- @tparam function ... The functions this task will run +--[[- Switches between execution of the functions, until all of them are +finished. If any of the functions errors, the message is propagated upwards +from the @{parallel.waitForAll} call. + +@tparam function ... The functions this task will run +@usage Start off two timers and wait for them both to run. + + local function a() + os.sleep(1) + print("A is done") + end + local function b() + os.sleep(3) + print("B is done") + end + + parallel.waitForAll(a, b) + print("Everything done!") +]] function waitForAll(...) local routines = create(...) return runUntilLimit(routines, 0) diff --git a/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua b/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua index cab2cfc6c..862bc2afe 100644 --- a/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua +++ b/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua @@ -252,8 +252,8 @@ local function drawCanvasLine(y) bg = bg .. color_hex_lookup[pixel or canvasColour] else text = text .. "\127" - fg = fg .. color_hex_lookup[canvasColour] - bg = bg .. color_hex_lookup[colours.grey] + fg = fg .. color_hex_lookup[colours.grey] + bg = bg .. color_hex_lookup[canvasColour] end end diff --git a/src/web/index.tsx b/src/web/index.tsx index 0bf476a86..f4e85033a 100644 --- a/src/web/index.tsx +++ b/src/web/index.tsx @@ -4,10 +4,15 @@ import type { ComponentChild } from "preact"; import settingsFile from "./mount/.settings"; import startupFile from "./mount/startup.lua"; import exprTemplate from "./mount/expr_template.lua"; +import exampleImage from "./mount/example.nfp"; const defaultFiles: { [filename: string]: string } = { ".settings": settingsFile, "startup.lua": startupFile, + + // TODO: Ideally this'd be in data/image.nfp or something, but copy-cat's + // dir bootstrapping doesn't cope with that right now. + "test-image.nfp": exampleImage }; const clamp = (value: number, min: number, max: number): number => { diff --git a/src/web/mount/example.nfp b/src/web/mount/example.nfp new file mode 100644 index 000000000..1025172c9 --- /dev/null +++ b/src/web/mount/example.nfp @@ -0,0 +1,16 @@ +fffffffffffffffffffffff +f444444444444444444444f +f444444444444444444444f +f44fffffffffffffffff44f +f44ff0ffffffffffffff44f +f44fff0fffffffffffff44f +f44ff0ffffffffffffff44f +f44fffffffffffffffff44f +f44fffffffffffffffff44f +f44fffffffffffffffff44f +f44fffffffffffffffff44f +f44fffffffffffffffff44f +f444444444444444444444f +f4444444444444444fff44f +f444444444444444444444f +fffffffffffffffffffffff