This commit is contained in:
Igor Timofeev 2016-07-14 02:30:52 +03:00
parent f7101d0bb3
commit d6a3ca108e
9 changed files with 423 additions and 1738 deletions

View File

@ -267,12 +267,25 @@
----------------------------------------------------- Библиотеки --------------------------------------------------------------------------
{
name="lib/MineOSCore.lua",
url="IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua",
type="Library",
version=1.18,
},
{
name="lib/advancedLua.lua",
url="IgorTimofeev/OpenComputers/master/lib/advancedLua.lua",
type="Library",
preLoadFile=true,
version=1.00,
},
{
name="lib/ECSAPI.lua",
url="IgorTimofeev/OpenComputers/master/lib/ECSAPI.lua",
type="Library",
preLoadFile=true,
version=1.02,
version=1.03,
},
{
name="lib/colorlib.lua",
@ -295,17 +308,11 @@
preLoadFile=true,
version=1.0,
},
{
name="lib/MineOSCore.lua",
url="IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua",
type="Library",
version=1.17,
},
{
name="lib/GUI.lua",
url="IgorTimofeev/OpenComputers/master/lib/GUI.lua",
type="Library",
version=1.11,
version=1.12,
},
{
name="lib/serialization.lua",
@ -317,7 +324,7 @@
name="lib/rayEngine.lua",
url="IgorTimofeev/OpenComputers/master/lib/rayEngine.lua",
type="Library",
version=1.32,
version=1.33,
},
{
name="lib/doubleHeight.lua",
@ -513,7 +520,7 @@
type="Application",
icon="IgorTimofeev/OpenComputers/master/Applications/VK/Icon.pic",
createShortcut="dock",
version=1.2,
version=1.21,
resources={
{
name="VKLogo.pic",
@ -908,7 +915,7 @@
icon="IgorTimofeev/OpenComputers/master/Applications/AppMarket/Icon.pic",
createShortcut="dock",
forceDownload=true,
version=1.44,
version=1.45,
resources={
{
name="Localization/Russian.lang",

View File

@ -3,6 +3,7 @@
-- _G.GUI = nil
local libraries = {
advancedLua = "advancedLua",
buffer = "doubleBuffering",
MineOSCore = "MineOSCore",
image = "image",
@ -128,7 +129,7 @@ local function getApplication(i)
if newApplications[i].about then
currentApps[i].description = getDescription(newApplications.GitHubUserURL .. newApplications[i].about .. _G.OSSettings.language .. ".txt")
currentApps[i].description = ecs.stringWrap({currentApps[i].description}, sizes.descriptionTruncateSize )
currentApps[i].description = string.wrap({currentApps[i].description}, sizes.descriptionTruncateSize )
else
currentApps[i].description = {localization.descriptionNotAvailable}
end
@ -328,7 +329,6 @@ local function updateAll()
changes = {}
oldApplications = newApplications
saveOldApplications()
require("computer").shutdown(true)
end
------------------------------------------------------------------------------------------------------------------

View File

@ -1,6 +1,7 @@
---------------------------------------------------- Библиотеки ----------------------------------------------------------------
local advancedLua = require("advancedLua")
local json = require("json")
local serialization = require("serialization")
local event = require("event")
@ -507,7 +508,7 @@ local function messagesGUI()
if messages.response.items[i].attachments then table.insert(messageTextArray, getAttachments(messages.response.items[i])) end
if messages.response.items[i].action == "chat_invite_user" then table.insert(messageTextArray, "Пользователь под ID " .. messages.response.items[i].from_id .. " пригласил в беседу пользователя под ID " .. messages.response.items[i].action_mid) end
messageTextArray = ecs.stringWrap(messageTextArray, cloudWidth - 4)
messageTextArray = string.wrap(messageTextArray, cloudWidth - 4)
local peerID = getPeerIDFromMessageArray(messages.response.items[i])
--Делаем дату пиздатой

View File

@ -1,975 +0,0 @@
{
GitHubUserURL = "https://raw.githubusercontent.com/",
GitHubApplicationListURL = "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications.txt",
----------------------------------------------------- Все для ОС --------------------------------------------------------------------------
{
["name"]="OS.lua",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/OS.lua",
["type"]="Script",
["version"]=4.0,
},
{
["name"]="MineOS/Pictures/Dayeneris.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Dayeneris.pic",
["type"]="Wallpaper",
["version"]=5.0,
},
{
["name"]="MineOS/Pictures/Catniss.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Catniss.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Harp.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Harp.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Afterlife.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Afterlife.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Nocturnal.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Nocturnal.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Ciri.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Ciri.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Liara.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Liara.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/AhsokaTano.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/AhsokaTano.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/StarWars.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/StarWars.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Girl.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Girl.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/TemplarAssassin.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/TemplarAssassin.pic",
["type"]="Wallpaper",
["version"]=6.0,
},
{
["name"]="MineOS/Pictures/Invoker.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Invoker.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/GrammarNazi.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/GrammarNazi.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Jodie.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Jodie.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/Luna.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/Luna.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/Pictures/ChristmasTree.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Wallpapers/ChristmasTree.pic",
["type"]="Wallpaper",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Languages/Russian.lang",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Languages/Russian.lang",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Languages/English.lang",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Languages/English.lang",
["type"]="Script",
["version"]=112.0,
},
----------------------------------------------------- Системные иконки --------------------------------------------------------------------------
{
["name"]="MineOS/System/OS/Icons/3DModel.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/3DModel.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Computer.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Computer.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Robot.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Robot.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Tablet.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Tablet.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Pastebin.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Pastebin.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Love.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Love.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/HDD.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/HDD.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Floppy.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Floppy.pic",
["type"]="Script",
["version"]=33.0,
},
{
["name"]="MineOS/System/OS/Icons/Steve.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Steve.pic",
["type"]="Script",
["version"]=14.0,
},
{
["name"]="MineOS/System/OS/Icons/Folder.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Folder.pic",
["type"]="Script",
["version"]=1.5,
},
{
["name"]="MineOS/System/OS/Icons/Finger.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Finger.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/FileNotExists.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/FileNotExists.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Script.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Script.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Text.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Text.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Update.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Update.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Security.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Security.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Config.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Config.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Image.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Image.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/RawImage.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/RawImage.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Lua.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Lua.pic",
["type"]="Script",
["version"]=1.6,
},
{
["name"]="MineOS/System/OS/Icons/SampleIcon.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/SampleIcon.pic",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/OS/Icons/Archive.pic",
["url"]="IgorTimofeev/OpenComputers/master/MineOS/Icons/Archive.pic",
["type"]="Script",
["version"]=1.0,
},
----------------------------------------------------- Библиотеки --------------------------------------------------------------------------
{
["name"]="lib/MineOSCore.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/GUI.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/GUI.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/serialization.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/serialization.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/rayEngine.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/rayEngine.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/doubleHeight.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/doubleHeight.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/json.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/json.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/filemanager.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/filemanager.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/modemConnection.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/modemConnection.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/bigLetters.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/bigLetters.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/files.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/files.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/libPNGImage.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/libPNGImage.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/crc32lua.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/crc32lua.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/deflatelua.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/deflatelua.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/tetris.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/tetris.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/unixtime.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/unixtime.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/context.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/context.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/syntax.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/syntax.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/palette.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/palette.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/doubleBuffering.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/doubleBuffering.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/thread.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/thread.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/archive.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/archive.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/xmlParser.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/xmlParser.lua",
["type"]="Library",
["version"]=1.0,
},
{
["name"]="lib/SHA2.lua",
["url"]="IgorTimofeev/OpenComputers/master/lib/SHA2.lua",
["type"]="Library",
["version"]=1.0,
},
----------------------------------------------------- Скрипты и дополнения к ним --------------------------------------------------------------------------
{
["name"]="init.lua",
["url"]="IgorTimofeev/OpenComputers/master/Applications/init.lua",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="etc/profile",
["url"]="IgorTimofeev/OpenComputers/master/etc/profile",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="bin/get.lua",
["url"]="IgorTimofeev/OpenComputers/master/Applications/get.lua",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="bin/event.lua",
["url"]="IgorTimofeev/OpenComputers/master/Applications/event.lua",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="bin/clear.lua",
["url"]="IgorTimofeev/OpenComputers/master/Applications/clear.lua",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="bin/scale.lua",
["url"]="IgorTimofeev/OpenComputers/master/Applications/scale.lua",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="usr/misc/greetings/English.txt",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Motd/English.txt",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="usr/misc/greetings/Russian.txt",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Motd/Russian.txt",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="etc/motd",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Motd/motd.lua",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="bin/archive.lua",
["url"]="IgorTimofeev/OpenComputers/master/Applications/archive.lua",
["type"]="Script",
["version"]=1.0,
},
----------------------------------------------------- Приложения без ресурсов --------------------------------------------------------------------------
{
["name"]="MineOS/Applications/Graph",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Graph/Graph.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Graph/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/FlappyBlock",
["url"]="IgorTimofeev/OpenComputers/master/Applications/FlappyBlock/FlappyBlock.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/FlappyBlock/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/MineCode",
["url"]="IgorTimofeev/OpenComputers/master/Applications/MineCode2/MineCode.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/MineCode2/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Battleship",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Battleship/Battleship.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Battleship/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Battleship/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Palette",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Palette/Palette.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Palette/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Radio",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Radio/Radio.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Radio/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Radio/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/FuckTheRain",
["url"]="IgorTimofeev/OpenComputers/master/Applications/FuckTheRain/FuckTheRain.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/FuckTheRain/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/FuckTheRain/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/GuessWord",
["url"]="IgorTimofeev/OpenComputers/master/Applications/GuessWord/GuessWord.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/GuessWord/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/GuessWord/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/3DPrint",
["url"]="IgorTimofeev/OpenComputers/master/Applications/3DPrint/3DPrint.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/3DPrint/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/3DPrint/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/ForceAdmin",
["url"]="IgorTimofeev/OpenComputers/master/Applications/ForceAdmin/ForceAdmin.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/ForceAdmin/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/ForceAdmin/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/MineSweeper",
["url"]="IgorTimofeev/OpenComputers/master/Applications/MineSweeper/MineSweeper.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/MineSweeper/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/MineSweeper/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/DanceFloor",
["url"]="IgorTimofeev/OpenComputers/master/Applications/DanceFloor/DanceFloor.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/DanceFloor/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/DanceFloor/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/RunningString",
["url"]="IgorTimofeev/OpenComputers/master/Applications/RunningString/RunningString.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/RunningString/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/RunningString/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/QuantumCube",
["url"]="IgorTimofeev/OpenComputers/master/Applications/QuantumCube/QuantumCube.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/QuantumCube/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/QuantumCube/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Photoshop",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Photoshop/Photoshop.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Photoshop/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Photoshop/Icon.pic",
["createShortcut"]="dock",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Shooting",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Shooting/Shooting.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Shooting/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Geoscan",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Geoscan/Geoscan.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Geoscan/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/HoloClock",
["url"]="IgorTimofeev/OpenComputers/master/Applications/HoloClock/HoloClock.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/HoloClock/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Pastebin",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Pastebin/Pastebin.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Pastebin/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Finder",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Finder/Finder.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Finder/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Finder/Icon.pic",
["createShortcut"]="dock",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Control",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Control/Control.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Control/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Control/Icon.pic",
["createShortcut"]="dock",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Piano",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Piano/Piano.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Piano/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Calendar",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Calendar/Calendar.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Calendar/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Calendar/Icon.pic",
["createShortcut"]="dock",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Snake",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Snake/Snake.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Snake/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/CodeDoor",
["url"]="IgorTimofeev/OpenComputers/master/Applications/CodeDoor/CodeDoor.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/CodeDoor/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/CodeDoor/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Keyboard",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Keyboard/Keyboard.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Keyboard/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Keyboard/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Nano",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Nano/Nano.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Nano/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Nano/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Camera",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Camera/Camera.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Camera/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Camera/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Autorun",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Autorun/Autorun.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Autorun/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Autorun/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/Matrix",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Matrix/Matrix.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Matrix/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Matrix/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/HEX",
["url"]="IgorTimofeev/OpenComputers/master/Applications/HEX/HEX.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/HEX/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/HEX/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/Applications/ChristmasTree",
["url"]="IgorTimofeev/OpenComputers/master/Applications/ChristmasTree/ChristmasTree.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/ChristmasTree/About.txt",
["type"]="Application",
["createShortcut"]="desktop",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/ChristmasTree/Icon.pic",
["version"]=1.0,
},
-- Приложение InfoPanel
{
["name"]="MineOS/Applications/InfoPanel",
["url"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/InfoPanel.lua",
["type"]="Application",
["about"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/About.txt",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/System/InfoPanel/Правила",
["url"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Rules.txt",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/InfoPanel/Главная",
["url"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Main.txt",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/InfoPanel/ССПИ",
["url"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/SSPI.txt",
["type"]="Script",
["version"]=1.0,
},
{
["name"]="MineOS/System/InfoPanel/Приват",
["url"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Claims.txt",
["type"]="Script",
["version"]=1.0,
},
--Приложение Чат
{
["name"]="MineOS/Applications/Chat",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Chat/Chat.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Chat/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Chat/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
},
{
["name"]="MineOS/System/Chat/Avatars/MyAvatar.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Chat/MyAvatar.pic",
["type"]="Script",
["version"]=1.0,
},
----------------------------------------------------- Приложения с ресурсами --------------------------------------------------------------------------
{
["name"]="MineOS/Applications/Stargate",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Stargate/Stargate.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Stargate/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Gate.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Stargate/Gate.pic",
},
{
["name"]="GateCore.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Stargate/GateCore.pic",
},
},
},
{
["name"]="MineOS/Applications/VK",
["url"]="IgorTimofeev/OpenComputers/master/Applications/VK/VK.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/VK/Icon.pic",
["createShortcut"]="dock",
["version"]=1.0,
["resources"]={
{
["name"]="VKLogo.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/VK/VKLogo.pic",
},
},
},
{
["name"]="MineOS/Applications/TurretControl",
["url"]="IgorTimofeev/OpenComputers/master/Applications/TurretControl/TurretControl.lua",
["type"]="Application",
["about"]="IgorTimofeev/OpenComputers/master/Applications/TurretControl/About.txt",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/TurretControl/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Turret.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/TurretControl/Turret.pic",
},
},
},
{
["name"]="MineOS/Applications/FlappyBird",
["url"]="IgorTimofeev/OpenComputers/master/Applications/FlappyBird/FlappyBird.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/FlappyBird/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Flappy.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/FlappyBird/Flappy.pic",
},
},
},
{
["name"]="MineOS/Applications/Crossword",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Crossword/Crossword.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Crossword/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Crossword/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="CrosswordFile.txt",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Crossword/CrosswordFile.txt",
},
},
},
{
["name"]="MineOS/Applications/HoloEdit",
["url"]="IgorTimofeev/OpenComputers/master/Applications/HoloEdit/HoloEdit.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/HoloEdit/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Russian.lang",
["url"]="IgorTimofeev/OpenComputers/master/Applications/HoloEdit/Russian.lang",
},
{
["name"]="English.lang",
["url"]="IgorTimofeev/OpenComputers/master/Applications/HoloEdit/English.lang",
},
},
},
{
["name"]="MineOS/Applications/BufferDemo",
["url"]="IgorTimofeev/OpenComputers/master/Applications/BufferDemo/BufferDemo.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/BufferDemo/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/BufferDemo/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Wallpaper.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/BufferDemo/Wallpaper.pic",
},
},
},
{
["name"]="MineOS/Applications/Viewer",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Viewer/Viewer.lua",
["about"]="IgorTimofeev/OpenComputers/master/Applications/Viewer/About.txt",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Viewer/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="arrowLeft.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Viewer/arrowLeft.pic",
},
{
["name"]="arrowRight.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Viewer/arrowRight.pic",
},
{
["name"]="play.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Viewer/play.pic",
},
},
},
{
["name"]="MineOS/Applications/RayWalk",
["url"]="IgorTimofeev/OpenComputers/master/Applications/RayWalk/RayWalk.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/RayWalk/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Day.scene",
["url"]="IgorTimofeev/OpenComputers/master/Applications/RayWalk/Day.scene",
},
{
["name"]="Night.scene",
["url"]="IgorTimofeev/OpenComputers/master/Applications/RayWalk/Night.scene",
},
},
},
{
["name"]="MineOS/Applications/Weather",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Weather.lua",
["type"]="Application",
["icon"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Icon.pic",
["createShortcut"]="desktop",
["version"]=1.0,
["resources"]={
{
["name"]="Cloudy.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Cloudy.pic",
},
{
["name"]="Cloudy.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Cloudy.pic",
},
{
["name"]="Rainy.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Rainy.pic",
},
{
["name"]="Snowy.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Snowy.pic",
},
{
["name"]="Stormy.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Stormy.pic",
},
{
["name"]="Sunny.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/Sunny.pic",
},
{
["name"]="SunnyWithClouds.pic",
["url"]="IgorTimofeev/OpenComputers/master/Applications/Weather/SunnyWithClouds.pic",
},
},
},
}

View File

@ -1,26 +1,20 @@
-- Адаптивная загрузка необходимых библиотек и компонентов
local libraries = {
["component"] = "component",
["term"] = "term",
["unicode"] = "unicode",
["event"] = "event",
["fs"] = "filesystem",
["shell"] = "shell",
["keyboard"] = "keyboard",
["computer"] = "computer",
["serialization"] = "serialization",
--["internet"] = "internet",
--["image"] = "image",
advancedLua = "advancedLua",
component = "component",
term = "term",
unicode = "unicode",
event = "event",
fs = "filesystem",
shell = "shell",
keyboard = "keyboard",
computer = "computer",
serialization = "serialization",
}
local components = {
["gpu"] = "gpu",
}
for library in pairs(libraries) do if not _G[library] then _G[library] = require(libraries[library]) end end
for comp in pairs(components) do if not _G[comp] then _G[comp] = _G.component[components[comp]] end end
libraries, components = nil, nil
for library in pairs(libraries) do if not _G[library] then _G[library] = require(libraries[library]) end end; libraries = nil
_G.gpu = component.gpu
local ecs = {}
@ -154,7 +148,7 @@ function ecs.getScaledResolution(scale, debug)
local proportion = xPixels / yPixels
--Получаем максимально возможное разрешение данной видеокарты
local xMax, yMax = gpu.maxResolution()
local xMax, yMax = component.gpu.maxResolution()
--Получаем теоретическое максимальное разрешение монитора с учетом его пропорции, но без учета лимита видеокарты
local newWidth, newHeight
@ -204,11 +198,11 @@ end
--Установка масштаба монитора
function ecs.setScale(scale, debug)
--Устанавливаем выбранное разрешение
gpu.setResolution(ecs.getScaledResolution(scale, debug))
component.gpu.setResolution(ecs.getScaledResolution(scale, debug))
end
function ecs.rebindGPU(address)
gpu.bind(address)
component.gpu.bind(address)
end
--Получаем всю инфу об оперативку в килобайтах
@ -439,33 +433,33 @@ end
--Заливка всего экрана указанным цветом
function ecs.clearScreen(color)
if color then gpu.setBackground(color) end
if color then component.gpu.setBackground(color) end
term.clear()
end
--Установка пикселя нужного цвета
function ecs.setPixel(x,y,color)
gpu.setBackground(color)
gpu.set(x,y," ")
component.gpu.setBackground(color)
component.gpu.set(x,y," ")
end
--Простая установка цветов в одну строку, ибо я ленивый
function ecs.setColor(background, foreground)
gpu.setBackground(background)
gpu.setForeground(foreground)
component.gpu.setBackground(background)
component.gpu.setForeground(foreground)
end
--Цветной текст
function ecs.colorText(x,y,textColor,text)
gpu.setForeground(textColor)
gpu.set(x,y,text)
component.gpu.setForeground(textColor)
component.gpu.set(x,y,text)
end
--Цветной текст с жопкой!
function ecs.colorTextWithBack(x,y,textColor,backColor,text)
gpu.setForeground(textColor)
gpu.setBackground(backColor)
gpu.set(x,y,text)
component.gpu.setForeground(textColor)
component.gpu.setBackground(backColor)
component.gpu.set(x,y,text)
end
--Инверсия цвета
@ -475,12 +469,12 @@ end
--Адаптивный текст, подстраивающийся под фон
function ecs.adaptiveText(x,y,text,textColor)
gpu.setForeground(textColor)
component.gpu.setForeground(textColor)
x = x - 1
for i=1,unicode.len(text) do
local info = {gpu.get(x+i,y)}
gpu.setBackground(info[3])
gpu.set(x+i,y,unicode.sub(text,i,i))
local info = {component.gpu.get(x+i,y)}
component.gpu.setBackground(info[3])
component.gpu.set(x+i,y,unicode.sub(text,i,i))
end
end
@ -514,7 +508,7 @@ function ecs.smartText(x, y, text)
--Разбираем по кусочкам строку и получаем цвета
local massiv = {}
local iterator = 1
local currentColor = gpu.getForeground()
local currentColor = component.gpu.getForeground()
while iterator <= sText do
local symbol = unicode.sub(text, iterator, iterator)
if symbol == specialSymbol then
@ -528,8 +522,8 @@ function ecs.smartText(x, y, text)
end
x = x - 1
for i = 1, #massiv do
if currentColor ~= massiv[i][2] then currentColor = massiv[i][2]; gpu.setForeground(massiv[i][2]) end
gpu.set(x + i, y, massiv[i][1])
if currentColor ~= massiv[i][2] then currentColor = massiv[i][2]; component.gpu.setForeground(massiv[i][2]) end
component.gpu.set(x + i, y, massiv[i][1])
end
end
@ -548,14 +542,14 @@ function ecs.formattedText(x, y, text, limit)
--Если находим символ параграфа, то
if symbols[i] == "§" then
--Меняем цвет текста на указанный
gpu.setForeground(tonumber("0x" .. symbols[i+1] .. symbols[i+2] .. symbols[i+3] .. symbols[i+4] .. symbols[i+5] .. symbols[i+6]))
component.gpu.setForeground(tonumber("0x" .. symbols[i+1] .. symbols[i+2] .. symbols[i+3] .. symbols[i+4] .. symbols[i+5] .. symbols[i+6]))
--Увеличиваем лимит на 7, т.к.
limit = limit + 7
--Сдвигаем итератор цикла на 7
i = i + 7
end
--Рисуем символ на нужной позиции
gpu.set(xPos, y, symbols[i])
component.gpu.set(xPos, y, symbols[i])
--Увеличиваем позицию курсора и итератор на 1
xPos = xPos + 1
i = i + 1
@ -564,7 +558,7 @@ end
--Инвертированный текст на основе цвета фона
function ecs.invertedText(x,y,symbol)
local info = {gpu.get(x,y)}
local info = {component.gpu.get(x,y)}
ecs.adaptiveText(x,y,symbol,ecs.invertColor(info[3]))
end
@ -586,34 +580,34 @@ end
--Обычный квадрат указанного цвета
function ecs.square(x,y,width,height,color)
gpu.setBackground(color)
gpu.fill(x,y,width,height," ")
component.gpu.setBackground(color)
component.gpu.fill(x,y,width,height," ")
end
--Юникодовская рамка
function ecs.border(x, y, width, height, back, fore)
local stringUp = ""..string.rep("", width - 2)..""
local stringDown = ""..string.rep("", width - 2)..""
gpu.setForeground(fore)
gpu.setBackground(back)
gpu.set(x, y, stringUp)
gpu.set(x, y + height - 1, stringDown)
component.gpu.setForeground(fore)
component.gpu.setBackground(back)
component.gpu.set(x, y, stringUp)
component.gpu.set(x, y + height - 1, stringDown)
local yPos = 1
for i = 1, (height - 2) do
gpu.set(x, y + yPos, "")
gpu.set(x + width - 1, y + yPos, "")
component.gpu.set(x, y + yPos, "")
component.gpu.set(x + width - 1, y + yPos, "")
yPos = yPos + 1
end
end
--Кнопка в виде текста в рамке
function ecs.drawFramedButton(x, y, width, height, text, color)
ecs.border(x, y, width, height, gpu.getBackground(), color)
gpu.fill(x + 1, y + 1, width - 2, height - 2, " ")
ecs.border(x, y, width, height, component.gpu.getBackground(), color)
component.gpu.fill(x + 1, y + 1, width - 2, height - 2, " ")
x = x + math.floor(width / 2 - unicode.len(text) / 2)
y = y + math.floor(width / 2 - 1)
gpu.set(x, y, text)
component.gpu.set(x, y, text)
end
--Юникодовский разделитель
@ -624,14 +618,14 @@ end
--Автоматическое центрирование текста по указанной координате (x, y, xy)
function ecs.centerText(mode,coord,text)
local dlina = unicode.len(text)
local xSize,ySize = gpu.getResolution()
local xSize,ySize = component.gpu.getResolution()
if mode == "x" then
gpu.set(math.floor(xSize/2-dlina/2),coord,text)
component.gpu.set(math.floor(xSize/2-dlina/2),coord,text)
elseif mode == "y" then
gpu.set(coord,math.floor(ySize/2),text)
component.gpu.set(coord,math.floor(ySize/2),text)
else
gpu.set(math.floor(xSize/2-dlina/2),math.floor(ySize/2),text)
component.gpu.set(math.floor(xSize/2-dlina/2),math.floor(ySize/2),text)
end
end
@ -647,9 +641,9 @@ function ecs.drawCustomImage(x,y,pixels)
for i=1,pixelsHeight do
for j=1,pixelsWidth do
if pixels[i][j][3] ~= "#" then
if gpu.getBackground() ~= pixels[i][j][1] then gpu.setBackground(pixels[i][j][1]) end
if gpu.getForeground() ~= pixels[i][j][2] then gpu.setForeground(pixels[i][j][2]) end
gpu.set(x+j,y+i,pixels[i][j][3])
if component.gpu.getBackground() ~= pixels[i][j][1] then component.gpu.setBackground(pixels[i][j][1]) end
if component.gpu.getForeground() ~= pixels[i][j][2] then component.gpu.setForeground(pixels[i][j][2]) end
component.gpu.set(x+j,y+i,pixels[i][j][3])
end
end
end
@ -659,7 +653,7 @@ end
--Корректировка стартовых координат. Core-функция для всех моих программ
function ecs.correctStartCoords(xStart,yStart,xWindowSize,yWindowSize)
local xSize,ySize = gpu.getResolution()
local xSize,ySize = component.gpu.getResolution()
if xStart == "auto" then
xStart = math.floor(xSize/2 - xWindowSize/2)
end
@ -672,7 +666,7 @@ end
--Запомнить область пикселей и возвратить ее в виде массива
function ecs.rememberOldPixels(x, y, x2, y2)
local newPNGMassiv = { ["backgrounds"] = {} }
local xSize, ySize = gpu.getResolution()
local xSize, ySize = component.gpu.getResolution()
newPNGMassiv.x, newPNGMassiv.y = x, y
--Перебираем весь массив стандартного PNG-вида по высоте
@ -685,7 +679,7 @@ function ecs.rememberOldPixels(x, y, x2, y2)
error("Can't remember pixel, because it's located behind the screen: x("..i.."), y("..j..") out of xSize("..xSize.."), ySize("..ySize..")\n")
end
local symbol, fore, back = gpu.get(i, j)
local symbol, fore, back = component.gpu.get(i, j)
newPNGMassiv["backgrounds"][back] = newPNGMassiv["backgrounds"][back] or {}
newPNGMassiv["backgrounds"][back][fore] = newPNGMassiv["backgrounds"][back][fore] or {}
@ -707,12 +701,12 @@ end
function ecs.drawOldPixels(massivSudaPihay)
--Перебираем массив с фонами
for back, backValue in pairs(massivSudaPihay["backgrounds"]) do
gpu.setBackground(back)
component.gpu.setBackground(back)
for fore, foreValue in pairs(massivSudaPihay["backgrounds"][back]) do
gpu.setForeground(fore)
component.gpu.setForeground(fore)
for pixel = 1, #massivSudaPihay["backgrounds"][back][fore] do
if massivSudaPihay["backgrounds"][back][fore][pixel][3] ~= transparentSymbol then
gpu.set(massivSudaPihay.x + massivSudaPihay["backgrounds"][back][fore][pixel][1] - 1, massivSudaPihay.y + massivSudaPihay["backgrounds"][back][fore][pixel][2] - 1, massivSudaPihay["backgrounds"][back][fore][pixel][3])
component.gpu.set(massivSudaPihay.x + massivSudaPihay["backgrounds"][back][fore][pixel][1] - 1, massivSudaPihay.y + massivSudaPihay["backgrounds"][back][fore][pixel][2] - 1, massivSudaPihay["backgrounds"][back][fore][pixel][3])
end
end
end
@ -886,13 +880,13 @@ function ecs.drawTopBar(x, y, width, selectedObject, background, foreground, ...
for i = 1, #objects do
if i == selectedObject then
ecs.square(xPos, y, unicode.len(objects[i][1]) + spaceBetween, 3, ecs.colors.blue)
gpu.setForeground(0xffffff)
component.gpu.setForeground(0xffffff)
else
gpu.setBackground(background)
gpu.setForeground(foreground)
component.gpu.setBackground(background)
component.gpu.setForeground(foreground)
end
gpu.set(xPos + spaceBetween / 2, y + 2, objects[i][1])
gpu.set(xPos + math.ceil(unicode.len(objects[i][1]) / 2), y + 1, objects[i][2])
component.gpu.set(xPos + spaceBetween / 2, y + 2, objects[i][1])
component.gpu.set(xPos + math.ceil(unicode.len(objects[i][1]) / 2), y + 1, objects[i][2])
xPos = xPos + unicode.len(objects[i][1]) + spaceBetween
end
@ -908,13 +902,13 @@ function ecs.drawTopMenu(x, y, width, color, selectedObject, ...)
for i = 1, #objects do
if i == selectedObject then
ecs.square(xPos - 1, y, unicode.len(objects[i][1]) + spaceBetween, 1, ecs.colors.blue)
gpu.setForeground(0xffffff)
gpu.set(xPos, y, objects[i][1])
gpu.setForeground(objects[i][2])
gpu.setBackground(color)
component.gpu.setForeground(0xffffff)
component.gpu.set(xPos, y, objects[i][1])
component.gpu.setForeground(objects[i][2])
component.gpu.setBackground(color)
else
if gpu.getForeground() ~= objects[i][2] then gpu.setForeground(objects[i][2]) end
gpu.set(xPos, y, objects[i][1])
if component.gpu.getForeground() ~= objects[i][2] then component.gpu.setForeground(objects[i][2]) end
component.gpu.set(xPos, y, objects[i][1])
end
objectsToReturn[objects[i][1]] = { xPos, y, xPos + unicode.len(objects[i][1]) - 1, y, i }
xPos = xPos + unicode.len(objects[i][1]) + spaceBetween
@ -950,9 +944,9 @@ end
--Отрисовка оконной "тени"
function ecs.windowShadow(x,y,width,height)
gpu.setBackground(ecs.windowColors.shadow)
gpu.fill(x+width,y+1,2,height," ")
gpu.fill(x+1,y+height,width,1," ")
component.gpu.setBackground(ecs.windowColors.shadow)
component.gpu.fill(x+width,y+1,2,height," ")
component.gpu.fill(x+1,y+height,width,1," ")
end
--Просто белое окошко с тенью
@ -972,17 +966,17 @@ function ecs.emptyWindow(x,y,width,height,title)
local oldPixels = ecs.rememberOldPixels(x,y,x+width+1,y+height)
--ОКНО
gpu.setBackground(ecs.windowColors.background)
gpu.fill(x,y+1,width,height-1," ")
component.gpu.setBackground(ecs.windowColors.background)
component.gpu.fill(x,y+1,width,height-1," ")
--ТАБ СВЕРХУ
gpu.setBackground(ecs.windowColors.tab)
gpu.fill(x,y,width,1," ")
component.gpu.setBackground(ecs.windowColors.tab)
component.gpu.fill(x,y,width,1," ")
--ТИТЛ
gpu.setForeground(ecs.windowColors.title)
component.gpu.setForeground(ecs.windowColors.title)
local textPosX = x + math.floor(width/2-unicode.len(title)/2) -1
gpu.set(textPosX,y,title)
component.gpu.set(textPosX,y,title)
--ТЕНЬ
ecs.windowShadow(x,y,width,height)
@ -997,66 +991,6 @@ function ecs.getWordsArrayFromString(s)
return words
end
--Функция по переносу слов на новую строку в зависимости от ограничения по ширине
function ecs.stringWrap(strings, limit)
local currentString = 1
while currentString <= #strings do
local words = ecs.getWordsArrayFromString(tostring(strings[currentString]))
local newStringThatFormedFromWords, oldStringThatFormedFromWords = "", ""
local word = 1
local overflow = false
while word <= #words do
oldStringThatFormedFromWords = oldStringThatFormedFromWords .. (word > 1 and " " or "") .. words[word]
if unicode.len(oldStringThatFormedFromWords) > limit then
--ЕБЛО
if unicode.len(words[word]) > limit then
local left = unicode.sub(oldStringThatFormedFromWords, 1, limit)
local right = unicode.sub(strings[currentString], unicode.len(left) + 1, -1)
overflow = true
strings[currentString] = left
if strings[currentString + 1] then
strings[currentString + 1] = right .. " " .. strings[currentString + 1]
else
strings[currentString + 1] = right
end
end
break
else
newStringThatFormedFromWords = oldStringThatFormedFromWords
end
word = word + 1
end
if word <= #words and not overflow then
local fuckToAdd = table.concat(words, " ", word, #words)
if strings[currentString + 1] then
strings[currentString + 1] = fuckToAdd .. " " .. strings[currentString + 1]
else
strings[currentString + 1] = fuckToAdd
end
strings[currentString] = newStringThatFormedFromWords
end
currentString = currentString + 1
end
return strings
-- local firstSlice, secondSlice
-- local i = 1
-- while i <= #strings do
-- if unicode.len(strings[i]) > limit then
-- firstSlice = unicode.sub(strings[i], 1, limit)
-- secondSlice = unicode.sub(strings[i], limit + 1, -1)
-- strings[i] = firstSlice
-- table.insert(strings, i + 1, secondSlice)
-- end
-- i = i + 1
-- end
-- return strings
end
--Моя любимая функция ошибки C:
function ecs.error(...)
local args = {...}
@ -1071,15 +1005,15 @@ function ecs.error(...)
else
text = tostring(args[1])
end
ecs.universalWindow("auto", "auto", math.ceil(gpu.getResolution() * 0.45), ecs.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x880000, "Ошибка!"}, {"EmptyLine"}, {"WrappedText", 0x262626, text}, {"EmptyLine"}, {"Button", {0x880000, 0xffffff, "OK!"}})
ecs.universalWindow("auto", "auto", math.ceil(component.gpu.getResolution() * 0.45), ecs.windowColors.background, true, {"EmptyLine"}, {"CenterText", 0x880000, "Ошибка!"}, {"EmptyLine"}, {"WrappedText", 0x262626, text}, {"EmptyLine"}, {"Button", {0x880000, 0xffffff, "OK!"}})
end
--Очистить экран, установить комфортные цвета и поставить курсок на 1, 1
function ecs.prepareToExit(color1, color2)
term.setCursor(1, 1)
ecs.clearScreen(color1 or 0x333333)
gpu.setForeground(color2 or 0xffffff)
gpu.set(1, 1, "")
component.gpu.setForeground(color2 or 0xffffff)
component.gpu.set(1, 1, "")
end
--Конвертация из юникода в символ. Вроде норм, а вроде и не норм. Но полезно.
@ -1125,9 +1059,9 @@ function ecs.inputText(x, y, limit, cheBiloVvedeno, background, foreground, just
background = background or 0xffffff
foreground = foreground or 0x000000
gpu.setBackground(background)
gpu.setForeground(foreground)
gpu.fill(x, y, limit, 1, " ")
component.gpu.setBackground(background)
component.gpu.setForeground(foreground)
component.gpu.fill(x, y, limit, 1, " ")
local text = cheBiloVvedeno
@ -1139,9 +1073,9 @@ function ecs.inputText(x, y, limit, cheBiloVvedeno, background, foreground, just
if xCursor > (x + limit - 1) then xCursor = (x + limit - 1) end
if maskTextWith then
gpu.set(x, y, ecs.stringLimit("start", string.rep("", dlina), limit))
component.gpu.set(x, y, ecs.stringLimit("start", string.rep("", dlina), limit))
else
gpu.set(x, y, ecs.stringLimit("start", text, limit))
component.gpu.set(x, y, ecs.stringLimit("start", text, limit))
end
term.setCursor(xCursor, y)
@ -1159,7 +1093,7 @@ function ecs.inputText(x, y, limit, cheBiloVvedeno, background, foreground, just
if e[4] == 14 then
term.setCursorBlink(false)
text = unicode.sub(text, 1, -2)
if unicode.len(text) < limit then gpu.set(x + unicode.len(text), y, " ") end
if unicode.len(text) < limit then component.gpu.set(x + unicode.len(text), y, " ") end
draw()
elseif e[4] == 28 then
term.setCursorBlink(false)
@ -1348,12 +1282,12 @@ function ecs.textField(x, y, width, height, lines, displayFrom, background, fore
ecs.square(x, y, width - 1, height, background)
ecs.srollBar(x + width - 1, y, 1, height, sLines, displayFrom, scrollbarBackground, scrollbarForeground)
gpu.setBackground(background)
gpu.setForeground(foreground)
component.gpu.setBackground(background)
component.gpu.setForeground(foreground)
local yPos = y
for i = displayFrom, (displayFrom + height - 1) do
if lines[i] then
gpu.set(x + 1, yPos, lines[i])
component.gpu.set(x + 1, yPos, lines[i])
yPos = yPos + 1
else
break
@ -1575,10 +1509,10 @@ end
-- Анимация затухания экрана
function ecs.fadeOut(startColor, targetColor, speed)
local xSize, ySize = gpu.getResolution()
local xSize, ySize = component.gpu.getResolution()
while startColor >= targetColor do
gpu.setBackground(startColor)
gpu.fill(1, 1, xSize, ySize, " ")
component.gpu.setBackground(startColor)
component.gpu.fill(1, 1, xSize, ySize, " ")
startColor = startColor - 0x111111
os.sleep(speed or 0)
end
@ -1586,10 +1520,10 @@ end
-- Анимация загорания экрана
function ecs.fadeIn(startColor, targetColor, speed)
local xSize, ySize = gpu.getResolution()
local xSize, ySize = component.gpu.getResolution()
while startColor <= targetColor do
gpu.setBackground(startColor)
gpu.fill(1, 1, xSize, ySize, " ")
component.gpu.setBackground(startColor)
component.gpu.fill(1, 1, xSize, ySize, " ")
startColor = startColor + 0x111111
os.sleep(speed or 0)
end
@ -1597,23 +1531,23 @@ end
-- Анимация выхода в олдскул-телевизионном стиле
function ecs.TV(speed, targetColor)
local xSize, ySize = gpu.getResolution()
local xSize, ySize = component.gpu.getResolution()
local xCenter, yCenter = math.floor(xSize / 2), math.floor(ySize / 2)
gpu.setBackground(targetColor or 0x000000)
component.gpu.setBackground(targetColor or 0x000000)
for y = 1, yCenter do
gpu.fill(1, y - 1, xSize, 1, " ")
gpu.fill(1, ySize - y + 1, xSize, 1, " ")
component.gpu.fill(1, y - 1, xSize, 1, " ")
component.gpu.fill(1, ySize - y + 1, xSize, 1, " ")
os.sleep(speed or 0)
end
for x = 1, xCenter - 1 do
gpu.fill(x, yCenter, 1, 1, " ")
gpu.fill(xSize - x + 1, yCenter, 1, 1, " ")
component.gpu.fill(x, yCenter, 1, 1, " ")
component.gpu.fill(xSize - x + 1, yCenter, 1, 1, " ")
os.sleep(speed or 0)
end
os.sleep(0.3)
gpu.fill(1, yCenter, xSize, 1, " ")
component.gpu.fill(1, yCenter, xSize, 1, " ")
end
@ -1695,7 +1629,7 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
height = height + objects[i][2]
elseif objectType == "wrappedtext" then
--Заранее парсим текст перенесенный
objects[i].wrapped = ecs.stringWrap({objects[i][3]}, width - 4)
objects[i].wrapped = string.wrap({objects[i][3]}, width - 4)
objects[i].height = #objects[i].wrapped
height = height + objects[i].height
else
@ -1708,8 +1642,8 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
--Запоминаем инфу о том, что было нарисовано, если это необходимо
local oldPixels, oldBackground, oldForeground
if closeWindowAfter then
oldBackground = gpu.getBackground()
oldForeground = gpu.getForeground()
oldBackground = component.gpu.getBackground()
oldForeground = component.gpu.getForeground()
oldPixels = ecs.rememberOldPixels(x, y, x + width - 1, y + height - 1)
end
--Считаем все координаты объектов
@ -1742,9 +1676,9 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
if objectType == "centertext" then
local xPos = x + math.floor(width / 2 - unicode.len(objects[number][3]) / 2)
gpu.setForeground(objects[number][2])
gpu.setBackground(background)
gpu.set(xPos, objects[number].y, objects[number][3])
component.gpu.setForeground(objects[number][2])
component.gpu.setBackground(background)
component.gpu.set(xPos, objects[number].y, objects[number][3])
elseif objectType == "input" then
@ -1757,7 +1691,7 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
--Рамочка
ecs.border(x + 1, objects[number].y, width - 2, objectsHeights.input, background, objects[number][2])
--Текстик
gpu.set(x + 3, objects[number].y + 1, ecs.stringLimit("start", objects[number][4], width - 6))
component.gpu.set(x + 3, objects[number].y + 1, ecs.stringLimit("start", objects[number][4], width - 6))
ecs.inputText(x + 3, objects[number].y + 1, width - 6, objects[number][4], background, objects[number][2], true, objects[number][5])
end
@ -1803,12 +1737,12 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
--Коробка для галочки
ecs.border(x + 1, yPos, 5, 3, background, usualColor)
--Текст
gpu.set(x + 7, yPos + 1, objects[number][i])
component.gpu.set(x + 7, yPos + 1, objects[number][i])
--Галочка
if objects[number].selectedData == (i - 3) then
ecs.colorText(x + 3, yPos + 1, selectionColor, symbol)
else
gpu.set(x + 3, yPos + 1, " ")
component.gpu.set(x + 3, yPos + 1, " ")
end
obj["Selects"] = obj["Selects"] or {}
@ -1831,12 +1765,12 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
local yPos = objects[number].y
local function bordak(borderColor)
gpu.setBackground(background)
gpu.setForeground(borderColor)
gpu.set(x + 1, objects[number].y, topLine)
gpu.set(x + 1, objects[number].y + 1, midLine)
gpu.set(x + 1, objects[number].y + 2, botLine)
gpu.set(x + 3, objects[number].y + 1, ecs.stringLimit("start", objects[number].selectedElement, width - 6))
component.gpu.setBackground(background)
component.gpu.setForeground(borderColor)
component.gpu.set(x + 1, objects[number].y, topLine)
component.gpu.set(x + 1, objects[number].y + 1, midLine)
component.gpu.set(x + 1, objects[number].y + 2, botLine)
component.gpu.set(x + 3, objects[number].y + 1, ecs.stringLimit("start", objects[number].selectedElement, width - 6))
ecs.colorText(x + width - 4, objects[number].y + 1, arrowColor, "")
end
@ -1860,9 +1794,9 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
local botLine = ""..string.rep("", selectorWidth - 2) .. ""
ecs.colorTextWithBack(xPos, yPos - 1, arrowColor, background, topLine)
for i = 1, spisokHeight - 1 do
gpu.set(xPos, yPos + i - 1, midLine)
component.gpu.set(xPos, yPos + i - 1, midLine)
end
gpu.set(xPos, yPos + spisokHeight - 1, botLine)
component.gpu.set(xPos, yPos + spisokHeight - 1, botLine)
--Элементы рисуем
xPos = xPos + 2
@ -1901,15 +1835,15 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
elseif objectType == "textfield" then
newObj("TextFields", number, x + 1, objects[number].y, x + width - 2, objects[number].y + objects[number][2] - 1)
if not objects[number].strings then objects[number].strings = ecs.stringWrap({objects[number][7]}, width - 3) end
if not objects[number].strings then objects[number].strings = string.wrap({objects[number][7]}, width - 3) end
objects[number].displayFrom = objects[number].displayFrom or 1
ecs.textField(x, objects[number].y, width, objects[number][2], objects[number].strings, objects[number].displayFrom, objects[number][3], objects[number][4], objects[number][5], objects[number][6])
elseif objectType == "wrappedtext" then
gpu.setBackground(background)
gpu.setForeground(objects[number][2])
component.gpu.setBackground(background)
component.gpu.setForeground(objects[number][2])
for i = 1, #objects[number].wrapped do
gpu.set(x + 2, objects[number].y + i - 1, objects[number].wrapped[i])
component.gpu.set(x + 2, objects[number].y + i - 1, objects[number].wrapped[i])
end
elseif objectType == "button" then
@ -2007,8 +1941,8 @@ function ecs.universalWindow(x, y, width, background, closeWindowAfter, ...)
local function redrawBeforeClose()
if closeWindowAfter then
ecs.drawOldPixels(oldPixels)
gpu.setBackground(oldBackground)
gpu.setForeground(oldForeground)
component.gpu.setBackground(oldBackground)
component.gpu.setForeground(oldForeground)
end
end

View File

@ -1,553 +1 @@
local libraries = {
buffer = "doubleBuffering",
unicode = "unicode",
event = "event",
}
for library in pairs(libraries) do if not _G[library] then _G[library] = require(libraries[library]) end end; libraries = nil
local GUI = {}
---------------------------------------------------- Универсальные методы --------------------------------------------------------
GUI.alignment = {
verticalCenter = 0,
horizontalCenter = 1,
horizontalAndVerticalCenter = 3,
}
GUI.directions = {
horizontal = 0,
vertical = 1,
}
GUI.buttonTypes = {
default = 0,
adaptive = 1,
framedDefault = 2,
framedAdaptive = 3,
}
GUI.colors = {
disabled = 0x888888,
disabledText = 0xAAAAAA,
}
-- Универсальный метод для проверки клика на прямоугольный объект
local function objectClicked(object, x, y)
if x >= object.x and y >= object.y and x <= object.x + object.width - 1 and y <= object.y + object.height - 1 and not object.disabled and not object.invisible ~= false then return true end
return false
end
local function objectSetDisabled(object, state)
object.disabled = state
end
--Создание базового примитива-объекта
function GUI.object(x, y, width, height)
return {
x = x,
y = y,
width = width,
height = height,
isClicked = objectClicked,
}
end
---------------------------------------------------- Кнопки --------------------------------------------------------------------
-- Универсальынй метод-рисоватор кнопки
local function drawButton(buttonObject, isPressed)
local textLength = unicode.len(buttonObject.text)
if textLength > buttonObject.width then buttonObject.text = unicode.sub(buttonObject.text, 1, buttonObject.width) end
local xText = math.floor(buttonObject.x + buttonObject.width / 2 - textLength / 2)
local yText = math.floor(buttonObject.y + buttonObject.height / 2)
local buttonColor = buttonObject.disabled and buttonObject.colors.disabled.button or (isPressed and buttonObject.colors.pressed.button or buttonObject.colors.default.button)
local textColor = buttonObject.disabled and buttonObject.colors.disabled.text or (isPressed and buttonObject.colors.pressed.text or buttonObject.colors.default.text)
if buttonObject.type == GUI.buttonTypes.default or buttonObject.type == GUI.buttonTypes.adaptive then
buffer.square(buttonObject.x, buttonObject.y, buttonObject.width, buttonObject.height, buttonColor, textColor, " ")
buffer.text(xText, yText, textColor, buttonObject.text)
elseif buttonObject.type == GUI.buttonTypes.framedDefault or buttonObject.type == GUI.buttonTypes.framedAdaptive then
buffer.frame(buttonObject.x, buttonObject.y, buttonObject.width, buttonObject.height, buttonColor)
buffer.text(xText, yText, textColor, buttonObject.text)
end
end
-- Метод-нажиматор кнопки
local function pressButton(buttonObject, pressTime)
drawButton(buttonObject, true)
buffer.draw()
os.sleep(pressTime or 0.2)
drawButton(buttonObject, false)
buffer.draw()
end
-- Создание таблицы кнопки со всеми необходимыми параметрами
local function createButtonObject(buttonType, x, y, width, height, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
local buttonObject = GUI.object(x, y, width, height)
buttonObject.colors = {
default = {
button = buttonColor,
text = textColor
},
pressed = {
button = buttonPressedColor,
text = textPressedColor
},
disabled = {
button = GUI.colors.disabled,
text = GUI.colors.disabledText,
}
}
buttonObject.disabled = disabledState
buttonObject.setDisabled = objectSetDisabled
buttonObject.type = buttonType
buttonObject.text = text
buttonObject.press = pressButton
buttonObject.draw = drawButton
return buttonObject
end
-- Кнопка фиксированных размеров
function GUI.button(x, y, width, height, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
local buttonObject = createButtonObject(GUI.buttonTypes.default, x, y, width, height, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
buttonObject:draw()
return buttonObject
end
-- Кнопка, подстраивающаяся под размер текста
function GUI.adaptiveButton(x, y, xOffset, yOffset, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
local buttonObject = createButtonObject(GUI.buttonTypes.adaptive, x, y, xOffset * 2 + unicode.len(text), yOffset * 2 + 1, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
buttonObject:draw()
return buttonObject
end
-- Кнопка в рамке
function GUI.framedButton(x, y, width, height, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
local buttonObject = createButtonObject(GUI.buttonTypes.framedDefault, x, y, width, height, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
buttonObject:draw()
return buttonObject
end
-- Кнопка в рамке, подстраивающаяся под размер текста
function GUI.adaptiveFramedButton(x, y, xOffset, yOffset, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
local buttonObject = createButtonObject(GUI.buttonTypes.framedAdaptive, x, y, xOffset * 2 + unicode.len(text), yOffset * 2 + 1, buttonColor, textColor, buttonPressedColor, textPressedColor, text, disabledState)
buttonObject:draw()
return buttonObject
end
-- Вертикальный или горизонтальный ряд кнопок
-- Каждая кнопка - это массив вида {enum GUI.buttonTypes.default или GUI.buttonTypes.adaptive, int ширина/отступ, int высота/отступ, int цвет кнопки, int цвет текста, int цвет нажатой кнопки, int цвет нажатого текста, string текст}
-- Метод возвращает обычный массив кнопочных объектов (см. выше)
function GUI.buttons(x, y, direction, spaceBetweenButtons, ...)
local buttons = {...}
local buttonObjects = {}
local function drawCorrectButton(i)
if buttons[i][1] == GUI.buttonTypes.default then
return GUI.button(x, y, buttons[i][2], buttons[i][3], buttons[i][4], buttons[i][5], buttons[i][6], buttons[i][7], buttons[i][8])
elseif buttons[i][1] == GUI.buttonTypes.adaptive then
return GUI.adaptiveButton(x, y, buttons[i][2], buttons[i][3], buttons[i][4], buttons[i][5], buttons[i][6], buttons[i][7], buttons[i][8])
elseif buttons[i][1] == GUI.buttonTypes.framedDefault then
return GUI.framedButton(x, y, buttons[i][2], buttons[i][3], buttons[i][4], buttons[i][5], buttons[i][6], buttons[i][7], buttons[i][8])
elseif buttons[i][1] == GUI.buttonTypes.framedAdaptive then
return GUI.adaptiveFramedButton(x, y, buttons[i][2], buttons[i][3], buttons[i][4], buttons[i][5], buttons[i][6], buttons[i][7], buttons[i][8])
else
error("Неподдерживаемый тип кнопки: " .. tostring(buttons[i][1]))
end
end
for i = 1, #buttons do
buttonObjects[i] = drawCorrectButton(i)
if direction == GUI.directions.horizontal then
x = x + buttonObjects[i].width + spaceBetweenButtons
elseif direction == GUI.directions.vertical then
y = y + buttonObjects[i].height + spaceBetweenButtons
else
error("Неподдерживаемое направление: " .. tostring(buttons[i][1]))
end
end
return buttonObjects
end
function GUI.menu(x, y, width, menuColor, ...)
local buttons = {...}
buffer.square(x, y, width, 1, menuColor)
x = x + 1
local menuObjects = {}
for i = 1, #buttons do
menuObjects[i] = GUI.adaptiveButton(x, y, 1, 0, menuColor, buttons[i].textColor, buttons[i].buttonPressedColor or 0x3366CC, buttons[i].textPressedColor or 0xFFFFFF, buttons[i].text)
x = x + menuObjects[i].width
end
return menuObjects
end
function GUI.windowActionButtons(x, y, fatSymbol)
local symbol = fatSymbol and "" or ""
local windowActionButtons, background = {}
background = buffer.get(x, y); windowActionButtons.close = GUI.button(x, y, 1, 1, background, 0xFF4940, background, 0x992400, symbol); x = x + 2
background = buffer.get(x, y); windowActionButtons.minimize = GUI.button(x, y, 1, 1, background, 0xFFB640, background, 0x996D00, symbol); x = x + 2
background = buffer.get(x, y); windowActionButtons.maximize = GUI.button(x, y, 1, 1, background, 0x00B640, background, 0x006D40, symbol); x = x + 2
return windowActionButtons
end
function GUI.toolbar(x, y, width, height, spaceBetweenElements, currentElement, toolbarColor, elementTextColor, activeElementColor, activeElementTextColor, ...)
local elements, objects, elementLength, isCurrent, elementWidth = {...}, {}
local totalWidth = 0; for i = 1, #elements do totalWidth = totalWidth + unicode.len(elements[i]) + 2 + spaceBetweenElements end; totalWidth = totalWidth - spaceBetweenElements
buffer.square(x, y, width, height, toolbarColor)
x = math.floor(x + width / 2 - totalWidth / 2)
local yText = math.floor(y + height / 2)
for i = 1, #elements do
elementLength, isCurrent = unicode.len(elements[i]), i == currentElement
elementWidth = elementLength + 2
if isCurrent then buffer.square(x, y, elementWidth, height, activeElementColor) end
buffer.text(x + 1, yText, isCurrent and activeElementTextColor or elementTextColor, elements[i])
table.insert(objects, GUI.object(x, y, elementWidth, height))
x = x + elementWidth + spaceBetweenElements
end
return objects
end
function GUI.progressBar(x, y, width, height, firstColor, secondColor, value, maxValue, thin)
local percent = value / maxValue
local activeWidth = math.floor(percent * width)
if thin then
buffer.text(x, y, firstColor, string.rep("", width))
buffer.text(x, y, secondColor, string.rep("", activeWidth))
else
buffer.square(x, y, width, height, firstColor)
buffer.square(x, y, activeWidth, height, secondColor)
end
end
function GUI.windowShadow(x, y, width, height, transparency)
buffer.square(x + width, y + 1, 2, height, 0x000000, 0x000000, " ", transparency)
buffer.square(x + 2, y + height, width - 2, 1, 0x000000, 0x000000, " ", transparency)
end
------------------------------------------------- Окна -------------------------------------------------------------------
-- Красивое окошко для отображения сообщения об ошибке. Аргумент errorWindowParameters может принимать следующие значения:
-- local errorWindowParameters = {
-- backgroundColor = 0x262626,
-- textColor = 0xFFFFFF,
-- truncate = 50,
-- title = {color = 0xFF8888, text = "Ошибочка"}
-- noAnimation = true,
-- }
function GUI.error(text, errorWindowParameters)
--Всякие константы, бла-бла
local backgroundColor = (errorWindowParameters and errorWindowParameters.backgroundColor) or 0x1b1b1b
local errorPixMap = {
{{0xffdb40 , 0xffffff,"#"}, {0xffdb40 , 0xffffff, "#"}, {backgroundColor, 0xffdb40, ""}, {backgroundColor, 0xffdb40, ""}, {0xffdb40 , 0xffffff, "#"}, {0xffdb40 , 0xffffff, "#"}},
{{0xffdb40 , 0xffffff,"#"}, {backgroundColor, 0xffdb40, ""}, {0xffdb40 , 0xffffff, " "}, {0xffdb40 , 0xffffff, " "}, {backgroundColor, 0xffdb40, ""}, {0xffdb40 , 0xffffff, "#"}},
{{backgroundColor, 0xffdb40,""}, {0xffdb40 , 0xffffff, "c"}, {0xffdb40 , 0xffffff, "y"}, {0xffdb40 , 0xffffff, "k"}, {0xffdb40 , 0xffffff, "a"}, {backgroundColor, 0xffdb40, ""}},
}
local textColor = (errorWindowParameters and errorWindowParameters.textColor) or 0xFFFFFF
local buttonWidth = 12
local verticalOffset = 2
local minimumHeight = verticalOffset * 2 + #errorPixMap
local height = 0
local widthOfText = math.floor(buffer.screen.width * 0.5)
--Ебемся с текстом, делаем его пиздатым во всех смыслах
if type(text) ~= "table" then
text = tostring(text)
text = (errorWindowParameters and errorWindowParameters.truncate) and unicode.sub(text, 1, errorWindowParameters.truncate) or text
text = { text }
end
text = GUI.stringWrap(text, widthOfText)
--Ебашим высоту правильнуюe
height = verticalOffset * 2 + #text + 1
if errorWindowParameters and errorWindowParameters.title then height = height + 2 end
if height < minimumHeight then height = minimumHeight end
--Ебашим стартовые коорды отрисовки
local x, y = math.ceil(buffer.screen.width / 2 - widthOfText / 2), math.ceil(buffer.screen.height / 2 - height / 2)
local OKButton = {}
local oldPixels = buffer.copy(1, y, buffer.screen.width, height)
--Отрисовочка
local function draw()
local yPos = y
--Подложка
buffer.square(1, yPos, buffer.screen.width, height, backgroundColor, 0x000000); yPos = yPos + verticalOffset
buffer.customImage(x - #errorPixMap[1] - 3, yPos, errorPixMap)
--Титл, епта!
if errorWindowParameters and errorWindowParameters.title then buffer.text(x, yPos, errorWindowParameters.title.color, errorWindowParameters.title.text); yPos = yPos + 2 end
--Текстус
for i = 1, #text do buffer.text(x, yPos, textColor, text[i]); yPos = yPos + 1 end; yPos = yPos + 1
--Кнопачка
OKButton = GUI.button(x + widthOfText - buttonWidth, y + height - 2, buttonWidth, 1, 0x3392FF, 0xFFFFFF, 0xFFFFFF, 0x262626, "OK")
--Атрисовачка
buffer.draw()
end
--Графонистый выход
local function quit()
OKButton:press(0.2)
buffer.paste(1, y, oldPixels)
buffer.draw()
end
--Онимацыя
if not (errorWindowParameters and errorWindowParameters.noAnimation) then for i = 1, height do buffer.setDrawLimit(1, math.floor(buffer.screen.height / 2) - i, buffer.screen.width, i * 2); draw(); os.sleep(0.05) end; buffer.resetDrawLimit() end
draw()
--Анализ говнища
while true do
local e = {event.pull()}
if e[1] == "key_down" then
if e[4] == 28 then
quit(); return
end
elseif e[1] == "touch" then
if OKButton:isClicked(e[3], e[4]) then
quit(); return
end
end
end
end
--------------------------------------------------------------------------------------------------------------------------------
-- local textFieldProperties = {
-- --Регурярное выражение, которому должны соответствовать вводимые данные. При несоответствии на выходе из функции выдается первоначальный текст, поданынй на выход функции
-- regex = "^%d+$",
-- --Отключает символ многоточия при выходе за пределы текстового поля
-- disableDots = true,
-- --Попросту отрисовывает всю необходимую информацию без активации нажатия на клавиши
-- justDrawNotEvent = true,
-- --Задержка между миганимем курсора
-- cursorBlinkDelay = 1.5,
-- --Цвет курсора
-- cursorColor = 0xFF7777,
-- --Символ, используемый для отрисовки курсора
-- cursorSymbol = "▌",
-- --Символ-маскировщик, на который будет визуально заменен весь вводимый текст. Полезно для полей ввода пароля
-- maskTextWithSymbol = "*",
-- }
function GUI.input(x, y, width, foreground, startText, textFieldProperties)
if not (y >= buffer.drawLimit.y and y <= buffer.drawLimit.y2) then return startText end
local text = startText
local textLength = unicode.len(text)
local cursorBlinkState = false
local cursorBlinkDelay = (textFieldProperties and textFieldProperties.cursorBlinkDelay) and textFieldProperties.cursorBlinkDelay or 0.5
local cursorColor = (textFieldProperties and textFieldProperties.cursorColor) and textFieldProperties.cursorColor or 0x00A8FF
local cursorSymbol = (textFieldProperties and textFieldProperties.cursorSymbol) and textFieldProperties.cursorSymbol or ""
local oldPixels = {}; for i = x, x + width - 1 do table.insert(oldPixels, { buffer.get(i, y) }) end
local function drawOldPixels()
for i = 1, #oldPixels do buffer.set(x + i - 1, y, oldPixels[i][1], oldPixels[i][2], oldPixels[i][3]) end
end
local function getTextLength()
textLength = unicode.len(text)
end
local function textFormat()
local formattedText = text
if textFieldProperties and textFieldProperties.maskTextWithSymbol then
formattedText = string.rep(textFieldProperties.maskTextWithSymbol or "*", textLength)
end
if textLength > width then
if textFieldProperties and textFieldProperties.disableDots then
formattedText = unicode.sub(formattedText, -width, -1)
else
formattedText = "" .. unicode.sub(formattedText, -width + 1, -1)
end
end
return formattedText
end
local function draw()
drawOldPixels()
buffer.text(x, y, foreground, textFormat())
if cursorBlinkState then
local cursorPosition = textLength < width and x + textLength or x + width - 1
local bg = buffer.get(cursorPosition, y)
buffer.set(cursorPosition, y, bg, cursorColor, cursorSymbol)
end
if not (textFieldProperties and textFieldProperties.justDrawNotEvent) then buffer.draw() end
end
local function backspace()
if unicode.len(text) > 0 then text = unicode.sub(text, 1, -2); getTextLength(); draw() end
end
local function quit()
cursorBlinkState = false
if textFieldProperties and textFieldProperties.regex and not string.match(text, textFieldProperties.regex) then
text = startText
draw()
return startText
end
draw()
return text
end
draw()
if textFieldProperties and textFieldProperties.justDrawNotEvent then return startText end
while true do
local e = { event.pull(cursorBlinkDelay) }
if e[1] == "key_down" then
if e[4] == 14 then
backspace()
elseif e[4] == 28 then
return quit()
else
local symbol = unicode.char(e[3])
if not keyboard.isControl(e[3]) then
text = text .. symbol
getTextLength()
draw()
end
end
elseif e[1] == "clipboard" then
text = text .. e[3]
getTextLength()
draw()
elseif e[1] == "touch" then
return quit()
else
cursorBlinkState = not cursorBlinkState
draw()
end
end
end
local function drawTextField(object, isFocused)
if not object.invisible then
local background = object.disabled and object.colors.disabled.textField or (isFocused and object.colors.focused.textField or object.colors.default.textField)
local foreground = object.disabled and object.colors.disabled.text or (isFocused and object.colors.focused.text or object.colors.default.text)
local y = math.floor(object.y + object.height / 2)
local text = isFocused and (object.text or "") or (object.text or object.placeholderText or "")
if background then buffer.square(object.x, object.y, object.width, object.height, background, foreground, " ") end
local resultText = GUI.input(object.x + 1, y, object.width - 2, foreground, text, {justDrawNotEvent = not isFocused})
object.text = isFocused and resultText or object.text
end
end
local function textFieldBeginInput(object)
drawTextField(object, true)
if object.text == "" then object.text = nil; drawTextField(object, false); buffer.draw() end
end
function GUI.textField(x, y, width, height, textFieldColor, textColor, textFieldFocusedColor, textFocusedColor, text, placeholderText, disabledState, invisibleState)
local object = GUI.object(x, y, width, height)
object.invisible = invisibleState
object.disabled = disabledState
object.colors = {
default = {
textField = textFieldColor,
text = textColor
},
focused = {
textField = textFieldFocusedColor,
text = textFocusedColor
},
disabled = {
textField = GUI.colors.disabled,
text = GUI.colors.disabledText,
}
}
object.text = text
object.placeholderText = placeholderText
object.isClicked = objectClicked
object.draw = drawTextField
object.input = textFieldBeginInput
object:draw()
return object
end
--------------------------------------------------------------------------------------------------------------------------------
--Функция по переносу слов на новую строку в зависимости от ограничения по ширине
function GUI.stringWrap(strings, limit)
local currentString = 1
while currentString <= #strings do
local words = {}; for word in string.gmatch(tostring(strings[currentString]), "[^%s]+") do table.insert(words, word) end
local newStringThatFormedFromWords, oldStringThatFormedFromWords = "", ""
local word = 1
local overflow = false
while word <= #words do
oldStringThatFormedFromWords = oldStringThatFormedFromWords .. (word > 1 and " " or "") .. words[word]
if unicode.len(oldStringThatFormedFromWords) > limit then
--ЕБЛО
if unicode.len(words[word]) > limit then
local left = unicode.sub(oldStringThatFormedFromWords, 1, limit)
local right = unicode.sub(strings[currentString], unicode.len(left) + 1, -1)
overflow = true
strings[currentString] = left
if strings[currentString + 1] then
strings[currentString + 1] = right .. " " .. strings[currentString + 1]
else
strings[currentString + 1] = right
end
end
break
else
newStringThatFormedFromWords = oldStringThatFormedFromWords
end
word = word + 1
end
if word <= #words and not overflow then
local fuckToAdd = table.concat(words, " ", word, #words)
if strings[currentString + 1] then
strings[currentString + 1] = fuckToAdd .. " " .. strings[currentString + 1]
else
strings[currentString + 1] = fuckToAdd
end
strings[currentString] = newStringThatFormedFromWords
end
currentString = currentString + 1
end
return strings
end
--------------------------------------------------------------------------------------------------------------------------------
function GUI.centeredText(centrationENUM, coordinate, color, text)
local textLength, x, y = unicode.len(text)
if centrationENUM == GUI.alignment.verticalCenter then
x, y = math.floor(buffer.screen.width / 2 - textLength / 2), coordinate
elseif centrationENUM == GUI.alignment.horizontalCenter then
x, y = coordinate, math.floor(buffer.screen.height / 2)
else
x, y = math.floor(buffer.screen.width / 2 - textLength / 2), math.floor(buffer.screen.height / 2)
end
buffer.text(x, y, color, text)
end
--------------------------------------------------------------------------------------------------------------------------------
return GUI
stringWra

View File

@ -1,6 +1,7 @@
---------------------------------------------- Библиотеки ------------------------------------------------------------------------
local libraries = {
advancedLua = "advancedLua",
computer = "computer",
ecs = "ECSAPI",
component = "component",
@ -227,7 +228,7 @@ local function drawErrorWindow(path, programVersion, errorLine, reason, showSend
)
--Стек
strings = GUI.stringWrap(MineOSCore.parseErrorMessage(reason, 4), stackWidth - 2)
strings = string.wrap(MineOSCore.parseErrorMessage(reason, 4), stackWidth - 2)
x = x + codeWidth
buffer.square(x, y, stackWidth, codeHeight, 0xFFFFFF)
x = x + 1

268
lib/advancedLua.lua Normal file
View File

@ -0,0 +1,268 @@
--[[
Advanced Lua Library v1.0 by ECS
This library extends a lot of default Lua methods
and adds some really cool features that haven't been
implemented yet, such as fastest table serialization,
table binary searching, string wrapping, numbers rounding, etc.
]]
_G.filesystem = _G.filesystem or require("filesystem")
_G.unicode = _G.unicode or require("unicode")
-------------------------------------------------- Math extensions --------------------------------------------------
function math.round(num)
if num >= 0 then return math.floor(num + 0.5) else return math.ceil(num - 0.5) end
end
function math.roundToDecimalPlaces(num, decimalPlaces)
local mult = 10 ^ (decimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
function math.doubleToString(num, digitCount)
return string.format("%." .. digitCount or 1 .. "f", num)
end
-------------------------------------------------- Table extensions --------------------------------------------------
local function doSerialize(array, text, prettyLook, indentationSymbol, oldIndentationSymbol, equalsSymbol)
text = {"{"}
table.insert(text, (prettyLook and "\n" or nil))
for key, value in pairs(array) do
local keyType, valueType, stringValue = type(key), type(value), tostring(value)
if keyType == "number" or keyType == "string" then
table.insert(text, (prettyLook and indentationSymbol or nil))
table.insert(text, "[")
table.insert(text, (keyType == "string" and table.concat({"\"", key, "\""}) or key))
table.insert(text, "]")
table.insert(text, equalsSymbol)
if valueType == "number" or valueType == "boolean" or valueType == "nil" then
table.insert(text, stringValue)
elseif valueType == "string" or valueType == "function" then
table.insert(text, "\"")
table.insert(text, stringValue)
table.insert(text, "\"")
elseif valueType == "table" then
table.insert(text, table.concat(doSerialize(value, text, prettyLook, table.concat({indentationSymbol, indentationSymbol}), table.concat({oldIndentationSymbol, indentationSymbol}), equalsSymbol)))
else
error("Unsupported table value type: " .. valueType)
end
table.insert(text, ",")
table.insert(text, (prettyLook and "\n" or nil))
else
error("Unsupported table key type: " .. keyType)
end
end
table.remove(text, (prettyLook and #text - 1 or #text))
table.insert(text, (prettyLook and oldIndentationSymbol or nil))
table.insert(text, "}")
return text
end
function table.serialize(array, prettyLook, indentationWidth, indentUsingTabs)
checkArg(1, array, "table")
indentationWidth = indentationWidth or 2
local indentationSymbol = indentUsingTabs and " " or " "
indentationSymbol, indentationSymbolHalf = string.rep(indentationSymbol, indentationWidth)
return table.concat(doSerialize(array, {}, prettyLook, indentationSymbol, "", prettyLook and " = " or "="))
end
function table.unserialize(serializedString)
checkArg(1, serializedString, "string")
local success, result = pcall(load("return " .. serializedString))
if success then return result else return nil, result end
end
function table.toFile(path, array, prettyLook, indentationWidth, indentUsingTabs, appendToFile)
checkArg(1, path, "string")
checkArg(2, array, "table")
filesystem.makeDirectory(filesystem.path(path) or "")
local file = io.open(path, appendToFile and "a" or "w")
file:write(table.serialize(array, prettyLook, indentationWidth, indentUsingTabs))
file:close()
end
function table.fromFile(path)
checkArg(1, path, "string")
if filesystem.exists(path) then
if filesystem.isDirectory(path) then
error("\"" .. path .. "\" is a directory")
else
local file = io.open(path, "r")
local data = table.unserialize(file:read("*a"))
file:close()
return data
end
else
error("\"" .. path .. "\" doesn't exists")
end
end
function table.copy(tableToCopy)
local function recursiveCopy(source, destination)
for key, value in pairs(source) do
if type(value) == "table" then
destination[key] = {}
recursiveCopy(source[key], destination[key])
else
destination[key] = value
end
end
end
local tableThatCopied = {}
recursiveCopy(tableToCopy, tableThatCopied)
return tableThatCopied
end
function table.binarySearch(t, requestedValue)
local function recursiveSearch(startIndex, endIndex)
local difference = endIndex - startIndex
local centerIndex = math.floor(difference / 2 + startIndex)
if difference > 1 then
if requestedValue >= t[centerIndex] then
return recursiveSearch(centerIndex, endIndex)
else
return recursiveSearch(startIndex, centerIndex)
end
else
if math.abs(requestedValue - t[startIndex]) > math.abs(t[endIndex] - requestedValue) then
return t[endIndex]
else
return t[startIndex]
end
end
end
return recursiveSearch(1, #t)
end
function table.size(t)
local size = 0
for key, value in pairs(t) do size = size + 1 end
return size
end
-------------------------------------------------- String extensions --------------------------------------------------
function string.unicodeFind(str, pattern, init, plain)
if init then
if init < 0 then
init = -#unicode.sub(str,init)
elseif init > 0 then
init = #unicode.sub(str, 1, init - 1) + 1
end
end
a, b = string.find(str, pattern, init, plain)
if a then
local ap, bp = str:sub(1, a - 1), str:sub(a,b)
a = unicode.len(ap) + 1
b = a + unicode.len(bp) - 1
return a, b
else
return a
end
end
function string.limit(text, size, fromLeft, noDots)
local length = unicode.len(text)
if length <= size then return text end
if fromLeft then
if noDots then
return unicode.sub(text, length - size + 1, -1)
else
return "" .. unicode.sub(text, length - size + 2, -1)
end
else
if noDots then
return unicode.sub(text, 1, size)
else
return unicode.sub(text, 1, size - 1) .. ""
end
end
end
function string.wrap(strings, limit)
strings = type(strings) == "string" and {strings} or strings
local currentString = 1
while currentString <= #strings do
local words = {}; for word in string.gmatch(tostring(strings[currentString]), "[^%s]+") do table.insert(words, word) end
local newStringThatFormedFromWords, oldStringThatFormedFromWords = "", ""
local word = 1
local overflow = false
while word <= #words do
oldStringThatFormedFromWords = oldStringThatFormedFromWords .. (word > 1 and " " or "") .. words[word]
if unicode.len(oldStringThatFormedFromWords) > limit then
if unicode.len(words[word]) > limit then
local left = unicode.sub(oldStringThatFormedFromWords, 1, limit)
local right = unicode.sub(strings[currentString], unicode.len(left) + 1, -1)
overflow = true
strings[currentString] = left
if strings[currentString + 1] then
strings[currentString + 1] = right .. " " .. strings[currentString + 1]
else
strings[currentString + 1] = right
end
end
break
else
newStringThatFormedFromWords = oldStringThatFormedFromWords
end
word = word + 1
end
if word <= #words and not overflow then
local fuckToAdd = table.concat(words, " ", word, #words)
if strings[currentString + 1] then
strings[currentString + 1] = fuckToAdd .. " " .. strings[currentString + 1]
else
strings[currentString + 1] = fuckToAdd
end
strings[currentString] = newStringThatFormedFromWords
end
currentString = currentString + 1
end
return strings
end
-------------------------------------------------- Playground --------------------------------------------------
-- local function safeCall(method, ...)
-- local arguments = {...}
-- return xpcall(function() return method(table.unpack(arguments)) end, debug.traceback)
-- end
-- local function safeCallString(str)
-- return safeCall(load(str))
-- end
-- local cyka = table.copy({123, 542, {abc = true, 16, 32, {cyka = false, haha = "abc"}}})
-- print(table.serialize(cyka, true))
-- print(safeCallString("return 123"))
------------------------------------------------------------------------------------------------------------------
return {loaded = true}

View File

@ -1,4 +1,5 @@
local libraries = {
advancedLua = "advancedLua",
colorlib = "colorlib",
image = "image",
buffer = "doubleBuffering",
@ -18,7 +19,7 @@ rayEngine.horizonPosition = math.floor(buffer.screen.height / 2)
rayEngine.minimapEnabled = true
rayEngine.compassEnabled = false
rayEngine.watchEnabled = false
rayEngine.drawFieldOfViewOnMinimap = true
rayEngine.drawFieldOfViewOnMinimap = false
rayEngine.chatShowTime = 4
rayEngine.chatHistory = {}
rayEngine.chatPanelWidth, rayEngine.chatPanelHeight = math.floor(buffer.screen.width * 0.4), math.floor(buffer.screen.height * 0.4)
@ -319,7 +320,7 @@ function rayEngine.watch(x, y)
end
local function addItemToChatHistory(text, color)
text = GUI.stringWrap({text}, rayEngine.chatPanelWidth - 2)
text = string.wrap({text}, rayEngine.chatPanelWidth - 2)
table.insert(rayEngine.chatHistory, {color = color, text = text})
if #rayEngine.chatHistory > rayEngine.chatHistoryLimit then table.remove(rayEngine.chatHistory, 1) end
end