mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 02:59:20 +01:00
148 lines
4.7 KiB
Lua
148 lines
4.7 KiB
Lua
local component = require("component")
|
||
local ecs = require("ECSAPI")
|
||
local hologram
|
||
local c = 23
|
||
|
||
-----------------------------------------------------------
|
||
|
||
if not component.isAvailable("hologram") then
|
||
ecs.error("Этой программе необходим голографический проектор 2 уровня.")
|
||
return
|
||
else
|
||
hologram = component.hologram
|
||
end
|
||
|
||
-----------------------------------------------------------
|
||
|
||
local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true,
|
||
{"EmptyLine"},
|
||
{"CenterText", ecs.colors.orange, "Настройки анимации"},
|
||
{"EmptyLine"},
|
||
{"Selector", 0xFFFFFF, ecs.colors.orange, "Снегопад", "Легкий снежок", "Что-то сыпется", "Без осадков"},
|
||
{"Selector", 0xFFFFFF, ecs.colors.orange, "Легкое вращение", "Быстрое вращение", "Турбина", "Дюраселл", "Без вращения"},
|
||
{"EmptyLine"},
|
||
{"CenterText", ecs.colors.orange, "Размер елочки"},
|
||
{"EmptyLine"},
|
||
{"Slider", ecs.colors.white, ecs.colors.orange, 1, 100, 50, "", ""},
|
||
{"EmptyLine"},
|
||
{"CenterText", ecs.colors.white, "Программа закрывается через"},
|
||
{"CenterText", ecs.colors.white, "CTRL + ALT + C"},
|
||
{"EmptyLine"},
|
||
{"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}}
|
||
)
|
||
|
||
local snowMode, rotationMode, scale, buttonPress = data[1], data[2], data[3], data[4]
|
||
|
||
scale = scale * 4 / 100
|
||
|
||
if snowMode == "Снегопад" then
|
||
snowMode = 0
|
||
elseif snowMode == "Легкий снежок" then
|
||
snowMode = 0.2
|
||
elseif snowMode == "Что-то сыпется" then
|
||
snowMode = 0.5
|
||
end
|
||
|
||
if rotationMode == "Легкое вращение" then
|
||
rotationMode = 5
|
||
elseif rotationMode == "Быстрое вращение" then
|
||
rotationMode = 15
|
||
elseif rotationMode == "Турбина" then
|
||
rotationMode = 25
|
||
elseif rotationMode == "Дюраселл" then
|
||
rotationMode = 35
|
||
elseif rotationMode == "Без вращения" then
|
||
rotationMode = 0
|
||
end
|
||
|
||
if buttonPress == "Отмена" then return end
|
||
|
||
-----------------------------------------------------------
|
||
|
||
-- создаем модель елки
|
||
local tSpruce = {3, 2, 2, 2, 2, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 4, 6, 8, 7, 6, 5, 4, 3, 6, 5, 4, 3, 2, 3, 2, 1}
|
||
|
||
-- создаем таблицу с падающими снежинками
|
||
local tSnow = {}
|
||
|
||
-- создаем палитру цветов
|
||
hologram.setPaletteColor(1, 0xFFFFFF) -- снег
|
||
hologram.setPaletteColor(2, 0x221100) -- ствол
|
||
hologram.setPaletteColor(3, 0x005522) -- хвоя
|
||
|
||
local function cricle(x0, y, z0, R, i) -- задействуем алгоритм Брезенхэма для рисования кругов
|
||
local x = R
|
||
local z = 0
|
||
local err = -R
|
||
while z <= x do
|
||
hologram.set(x + x0, y, z + z0, i)
|
||
hologram.set(z + x0, y, x + z0, i)
|
||
hologram.set(-x + x0, y, z + z0, i)
|
||
hologram.set(-z + x0, y, x + z0, i)
|
||
hologram.set(-x + x0, y, -z + z0, i)
|
||
hologram.set(-z + x0, y, -x + z0, i)
|
||
hologram.set(x + x0, y, -z + z0, i)
|
||
hologram.set(z + x0, y, -x + z0, i)
|
||
z = z + 1
|
||
if err <= 0 then
|
||
err = err + (2 * z + 1)
|
||
else
|
||
x = x - 1
|
||
err = err + (2 * (z - x) + 1)
|
||
end
|
||
end
|
||
end
|
||
|
||
local function spruce() -- рисуем ель
|
||
for i = 1, 5 do
|
||
cricle(c, i, c, tSpruce[i], 2) -- отрисовываем основание ствола
|
||
cricle(c, i, c, tSpruce[i]-1, 2)
|
||
end
|
||
for j = 5, #tSpruce do
|
||
cricle(c, j, c, tSpruce[j]-1, 3) -- отрисовываем хвою
|
||
cricle(c, j, c, tSpruce[j]-2, 3)
|
||
end
|
||
end
|
||
|
||
local function gen_snow() -- генерируем снежинку
|
||
local x, y, z = math.random(1, 46), 32, math.random(1, 46)
|
||
table.insert(tSnow,{x=x,y=y,z=z})
|
||
hologram.set(x, y, z, 1)
|
||
end
|
||
|
||
local function falling_snow() -- сдвигаем снежинки вниз
|
||
local i=1
|
||
while i<=#tSnow do
|
||
if tSnow[i].y>1 then
|
||
local x,y,z=tSnow[i].x+math.random(-1, 1), tSnow[i].y-1, tSnow[i].z+math.random(-1, 1)
|
||
if x<1 then x=1 end
|
||
if x>46 then x=46 end
|
||
if z<1 then z=1 end
|
||
if z>46 then z=46 end
|
||
c=hologram.get(x, y, z)
|
||
if c==0 or c==1 then
|
||
hologram.set(tSnow[i].x, tSnow[i].y, tSnow[i].z, 0)
|
||
tSnow[i].x, tSnow[i].y, tSnow[i].z=x,y,z
|
||
hologram.set(x, y, z, 1)
|
||
i=i+1
|
||
else
|
||
table.remove(tSnow,i)
|
||
end
|
||
else
|
||
table.remove(tSnow,i)
|
||
end
|
||
os.sleep(snowMode)
|
||
end
|
||
end
|
||
|
||
ecs.info("auto", "auto", "", "Счастливого нового года!")
|
||
|
||
hologram.clear()
|
||
hologram.setScale(scale)
|
||
hologram.setRotationSpeed(rotationMode, 0, 23, 0)
|
||
|
||
spruce()
|
||
while 1 do
|
||
gen_snow()
|
||
falling_snow()
|
||
end |