mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-24 13:02:49 +01:00
НУКА
This commit is contained in:
parent
f7101d0bb3
commit
d6a3ca108e
@ -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",
|
||||
|
||||
@ -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
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@ -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])
|
||||
|
||||
--Делаем дату пиздатой
|
||||
|
||||
975
NewAppsTest.txt
975
NewAppsTest.txt
@ -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",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
320
lib/ECSAPI.lua
320
lib/ECSAPI.lua
@ -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
|
||||
|
||||
|
||||
554
lib/GUI.lua
554
lib/GUI.lua
@ -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
|
||||
@ -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
268
lib/advancedLua.lua
Normal 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}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user