From ced2a4c3e4db89ed39f76ab7da8d54d22c040fa8 Mon Sep 17 00:00:00 2001 From: David Skrundz Date: Sun, 15 Sep 2024 02:06:18 -0600 Subject: [PATCH] Initial commit --- .gitignore | 1 + .vscode/.lua-format | 33 +++++++++++++++++++++ .vscode/extensions.json | 5 ++++ .vscode/settings.json | 11 +++++++ CONTRIBUTING.md | 6 ++++ LICENSE.md | 7 +++++ README.md | 15 ++++++++++ changelog.txt | 9 ++++++ data.lua | 4 +++ fmsl.lua | 4 +++ fmsl/box.lua | 48 +++++++++++++++++++++++++++++++ fmsl/position.lua | 62 ++++++++++++++++++++++++++++++++++++++++ info.json | 11 +++++++ package.py | 36 +++++++++++++++++++++++ std/array.lua | 14 +++++++++ std/log.lua | 13 +++++++++ std/table.lua | 24 ++++++++++++++++ thumbnail.png | Bin 0 -> 31326 bytes 18 files changed, 303 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/.lua-format create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 changelog.txt create mode 100644 data.lua create mode 100644 fmsl.lua create mode 100644 fmsl/box.lua create mode 100644 fmsl/position.lua create mode 100644 info.json create mode 100755 package.py create mode 100644 std/array.lua create mode 100644 std/log.lua create mode 100644 std/table.lua create mode 100644 thumbnail.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4c4ffc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.zip diff --git a/.vscode/.lua-format b/.vscode/.lua-format new file mode 100644 index 0000000..c729fb2 --- /dev/null +++ b/.vscode/.lua-format @@ -0,0 +1,33 @@ +column_limit: 100 +indent_width: 2 +use_tab: false +tab_width: 4 +continuation_indent_width: 4 +keep_simple_control_block_one_line: false +keep_simple_function_one_line: false +align_args: true +break_after_functioncall_lp: false +break_before_functioncall_rp: false +align_parameter: true +chop_down_parameter: true +break_after_functiondef_lp: true +break_before_functiondef_rp: true +align_table_field: true +break_after_table_lb: true +break_before_table_rb: true +chop_down_table: false +chop_down_kv_table: true +column_table_limit: 100 +column_table_limit_kv: 100 +table_sep: "," +extra_sep_at_table_end: true +break_after_operator: false +single_quote_to_double_quote: true +double_quote_to_single_quote: false +spaces_before_call: 1 +spaces_inside_functiondef_parens: false +spaces_inside_functioncall_parens: false +spaces_inside_table_braces: false +spaces_around_equals_in_field: true +line_breaks_after_function_body: 1 +line_separator: input diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..9ac1454 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "koihik.vscode-lua-format", + ], +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3a7a685 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "editor.detectIndentation": false, + "editor.tabSize": 4, + "editor.insertSpaces": false, + "[lua]": { + "editor.detectIndentation": false, + "editor.tabSize": 2, + "editor.insertSpaces": true, + }, + "vscode-lua-format.configPath": ".vscode/.lua-format" +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..2f4b83c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +How to Contribute +================= + +We'd love to accept your patches and contributions to this project. +We just need you to follow the Contributor License Agreement outlined +in the latest v0.0.x of https://github.com/Skrunix/license diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..161d3b0 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Skrunix Software License +======================== + +Permission to use, copy, modify, and/or distribute this software is +outlined in the latest v0.0.x of https://github.com/Skrunix/license + +THE SOFTWARE IS PROVIDED "AS IS" diff --git a/README.md b/README.md new file mode 100644 index 0000000..416a4cc --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Standard Library + +Factorio Modding Standard Library + +--- + +### Data +```lua +fmsl.log.color = true +``` + +### Control +```lua +fmsl = require("__fmsl__.fmsl") +``` diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..54150e4 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,9 @@ +--------------------------------------------------------------------------------------------------- +Version: 0.0.1 +Date: 15.09.2024 + Features: + - Initial release + Scripting: + - table.remove_key + - fmsl.table.merge + - fmsl.array.concat diff --git a/data.lua b/data.lua new file mode 100644 index 0000000..6715473 --- /dev/null +++ b/data.lua @@ -0,0 +1,4 @@ +require("std.array") +require("std.table") + +fmsl = {log = require("std.log")} diff --git a/fmsl.lua b/fmsl.lua new file mode 100644 index 0000000..2d5dc98 --- /dev/null +++ b/fmsl.lua @@ -0,0 +1,4 @@ +require("std.array") +require("std.table") + +return {box = require("fmsl.box"), position = require("fmsl.position"), log = require("std.log")} diff --git a/fmsl/box.lua b/fmsl/box.lua new file mode 100644 index 0000000..712c91c --- /dev/null +++ b/fmsl/box.lua @@ -0,0 +1,48 @@ +-- Bounding-box defined by two points +-- +-- Represented as {left_top = Position, right_bottom = Position} or {Position, Position} +local Box = {} + +-- Asserts that the box is valid +-- @param box: Box or Any +-- @return ERROR +function Box.assert(box) + local box_type = type(box) + if box_type ~= "table" then + error("Unsupported box type: " .. box_type) + end + + local box_left_top = box.left_top or box[1] + local box_left_top_type = type(box_left_top) + if box_left_top_type ~= "table" then + error("Box has invalid left_top type: " .. box_left_top_type) + end + fmsl.position.assert(box_left_top) + + local box_right_bottom = box.right_bottom or box[2] + local box_right_bottom_type = type(box_right_bottom) + if box_right_bottom_type ~= "table" then + error("Box has invalid right_bottom type: " .. box_right_bottom_type) + end + fmsl.position.assert(box_right_bottom) +end + +-- Create a new box +-- @param center: Position +-- @param radius: double +-- @return Box +function Box.center_radius(center, radius) + fmsl.position.assert(center) + + local radius_type = type(radius) + if radius_type ~= "number" then + error("Radius has invalid x type: " .. radius_type) + end + + return { + left_top = fmsl.position.sub(center, radius), + right_bottom = fmsl.position.add(center, radius), + } +end + +return Box diff --git a/fmsl/position.lua b/fmsl/position.lua new file mode 100644 index 0000000..853bd17 --- /dev/null +++ b/fmsl/position.lua @@ -0,0 +1,62 @@ +-- Coordinates on a surface +-- +-- Represented as {x = double, y = double} or {double, double} +local Position = {} + +-- Asserts that the position is valid +-- @param position: Position or Any +-- @return ERROR +function Position.assert(position) + local position_type = type(position) + if position_type ~= "table" then + error("Unsupported position type: " .. position_type) + end + + local position_x_type = type(position.x or position[1]) + if position_x_type ~= "number" then + error("Position has invalid x type: " .. position_x_type) + end + + local position_y_type = type(position.y or position[2]) + if position_y_type ~= "number" then + error("Position has invalid y type: " .. position_x_type) + end +end + +-- Add the offset to the position +-- @param position: Position +-- @param offset: Position or double +-- @return Position +function Position.add(position, offset) + fmsl.position.assert(position) + + if type(offset) == "number" then + return {x = (position.x or position[1]) + offset, y = (position.y or position[2]) + offset} + end + + if type(offset) == "table" then + return {x = (position.x or position[1]) + offset, y = (position.y or position[2]) + offset} + end + + error("Unsupported offset type: " .. type(offset)) +end + +-- Subtract the offset to the position +-- @param position: Position +-- @param offset: Position or double +-- @return Position +function Position.sub(position, offset) + fmsl.position.assert(position) + + if type(offset) == "number" then + return {x = (position.x or position[1]) - offset, y = (position.y or position[2]) - offset} + end + + if type(offset) == "table" then + return {x = (position.x or position[1]) - offset, y = (position.y or position[2]) - offset} + end + + error("Unsupported offset type: " .. type(offset)) +end + +return Position diff --git a/info.json b/info.json new file mode 100644 index 0000000..4b7d9fe --- /dev/null +++ b/info.json @@ -0,0 +1,11 @@ +{ + "name": "fmsl", + "version": "0.0.1", + "title": "Standard Library", + "description": "Factorio Modding Standard Library", + "author": "David Skrundz", + "contact": "david@skrundz.ca", + "homepage": "https://git.skrundz.dev/skrundztorio/fmsl", + "factorio_version": "1.1", + "dependencies": [] +} diff --git a/package.py b/package.py new file mode 100755 index 0000000..588c21e --- /dev/null +++ b/package.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import json +import os +from zipfile import ZipFile + +modFiles = [ + "info.json", + "changelog.txt", + "thumbnail.png", + "LICENSE.md", + + "data.lua", + "fmsl.lua", +] +modFolders = [ + "fmsl", + "std", +] + +with open("info.json") as file: + modInfo = json.load(file) + +mod_name = modInfo["name"] +mod_version = modInfo["version"] +zipName = f"{mod_name}_{mod_version}" + +with ZipFile(f"{zipName}.zip", 'w') as modZip: + for file in modFiles: + modZip.write(file, arcname=f"{zipName}/{file}") + for folder in modFolders: + for root, dirs, files in os.walk(folder): + for file in files: + filePath = os.path.join(root, file) + archivePath = os.path.relpath(filePath, os.path.join(folder, '..')) + modZip.write(filePath, arcname=f"{zipName}/{archivePath}") diff --git a/std/array.lua b/std/array.lua new file mode 100644 index 0000000..0626a5f --- /dev/null +++ b/std/array.lua @@ -0,0 +1,14 @@ +-- Concatenate multiple arrays into a new table, in order +-- @param ...: Table +-- @return Table +function table.concat_new(...) + local result = {} + for _, array in ipairs({...}) do + if array then + for _, value in ipairs(array) do + table.insert(result, value) + end + end + end + return result +end diff --git a/std/log.lua b/std/log.lua new file mode 100644 index 0000000..a7ddaed --- /dev/null +++ b/std/log.lua @@ -0,0 +1,13 @@ +local Log = { + color = false, + checkmarks = { + [false] = {[false] = "✗", [true] = "✓"}, + [true] = {[false] = "❌", [true] = "✅"}, + }, +} + +function Log.checkmark(success) + return Log.checkmarks[Log.color][success] +end + +return Log diff --git a/std/table.lua b/std/table.lua new file mode 100644 index 0000000..0cf81e1 --- /dev/null +++ b/std/table.lua @@ -0,0 +1,24 @@ +-- Remove a key from a table and return the value +-- @param table: Table +-- @param key: Any +-- @return Any +function table.remove_key(table, key) + local value = table[key] + table[key] = nil + return value +end + +-- Merge multiple tables into a new table, with later tables taking precedence +-- @param ...: Table +-- @return Table +function table.merge_new(...) + local result = {} + for _, table in ipairs({...}) do + if table then + for key, value in pairs(table) do + result[key] = value + end + end + end + return result +end diff --git a/thumbnail.png b/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1421585eef6dcf774ae7698af143e389f1897c GIT binary patch literal 31326 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