mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-24 21:12:50 +01:00
164 lines
4.6 KiB
Lua
164 lines
4.6 KiB
Lua
local ecs = require("ECSAPI")
|
||
|
||
local component = require "component"
|
||
local event = require "event"
|
||
local ser = require "serialization"
|
||
local unicode = require "unicode"
|
||
|
||
local gpu = component.gpu
|
||
|
||
-- КОНСТАНТЫ --
|
||
local bgColor = 0xffffff
|
||
local fgColor = 0x000000
|
||
local questionsFilePath = "schoolQuestions.lua"
|
||
local screenWidth, screenHeight = gpu.getResolution()
|
||
|
||
-- РАЗНОЕ --
|
||
function swap(array, index1, index2)
|
||
array[index1], array[index2] = array[index2], array[index1]
|
||
end
|
||
|
||
function shake(array)
|
||
local counter = #array
|
||
|
||
while counter > 1 do
|
||
local index = math.random(counter)
|
||
|
||
swap(array, index, counter)
|
||
counter = counter - 1
|
||
end
|
||
end
|
||
|
||
-- Информация о кнопках --
|
||
local buttons = {}
|
||
|
||
local buttonStyle = {
|
||
standart = {
|
||
buttonColor = 0xBBBBBB,
|
||
textColor = 0xffffff,
|
||
},
|
||
correct = {
|
||
buttonColor = 0x008800,
|
||
textColor = 0xffffff,
|
||
},
|
||
incorrect = {
|
||
buttonColor = 0xFF4444,
|
||
textColor = 0xffffff,
|
||
}
|
||
}
|
||
|
||
-- Информация о кол-ве вопросов и текущем вопросе --
|
||
local database
|
||
local currentQuestion = 1
|
||
local currentCategory = "Информатика"
|
||
local buttonsWidth = 0
|
||
|
||
-- Получение массива вопросов из файла --
|
||
local function readDatabase( filename )
|
||
local file = assert( io.open(filename, "r"), "File not found!" )
|
||
database = ser.unserialize( file:read("*a") )
|
||
file:close()
|
||
end
|
||
|
||
local xOffset, yOffset, spaceBetweenButtons = 4, 1, 2
|
||
local xPos, yPos
|
||
|
||
local function drawMain(x)
|
||
|
||
buttons = {}
|
||
buttonsWidth = 0
|
||
for i = 1, #database.categories[currentCategory].exercises[currentQuestion].answers do
|
||
buttonsWidth = buttonsWidth + spaceBetweenButtons + xOffset * 2 + unicode.len(database.categories[currentCategory].exercises[currentQuestion].answers[i])
|
||
end
|
||
buttonsWidth = buttonsWidth
|
||
|
||
xPos, yPos = math.floor(x + screenWidth / 2 - buttonsWidth / 2 - 1), math.floor(screenHeight / 2) - 3
|
||
|
||
ecs.square(1, yPos, screenWidth, 8, 0xFFFFFF)
|
||
|
||
ecs.colorText(x + math.floor(screenWidth / 2 - unicode.len(database.categories[currentCategory].exercises[currentQuestion].question) / 2 - 1), yPos, 0x262626, database.categories[currentCategory].exercises[currentQuestion].question)
|
||
yPos = yPos + 3
|
||
|
||
local xButtons = xPos
|
||
for i = 1, #database.categories[currentCategory].exercises[currentQuestion].answers do
|
||
local data = { ecs.drawAdaptiveButton(xButtons, yPos, xOffset, yOffset, database.categories[currentCategory].exercises[currentQuestion].answers[i], buttonStyle.standart.buttonColor, buttonStyle.standart.textColor) }
|
||
data.text = database.categories[currentCategory].exercises[currentQuestion].answers[i]
|
||
table.insert(buttons, data)
|
||
xButtons = xButtons + spaceBetweenButtons + xOffset * 2 + unicode.len(database.categories[currentCategory].exercises[currentQuestion].answers[i])
|
||
end
|
||
|
||
yPos = yPos - 3
|
||
end
|
||
|
||
local function startAnimation(speed)
|
||
for i = screenWidth - screenWidth*0.2, 1, -speed do
|
||
drawMain(i)
|
||
os.sleep(0.05)
|
||
end
|
||
end
|
||
|
||
local function drawProgress()
|
||
local width = math.floor(screenWidth * 0.65)
|
||
local xPos = math.floor(screenWidth / 2 - width / 2)
|
||
local yPos = math.floor(screenHeight / 2 + 5)
|
||
gpu.setBackground(0xFFFFFF)
|
||
|
||
gpu.setForeground(0xCCCCCC)
|
||
gpu.fill( xPos, yPos, width, 1, '▂' )
|
||
|
||
gpu.setForeground(0xBF2008)
|
||
gpu.fill( xPos, yPos, (width * (currentQuestion - 1)) / #database.categories[currentCategory].exercises, 1, '▂' )
|
||
end
|
||
|
||
local function endAnimation(speed)
|
||
for i = screenWidth, 1, -5 do
|
||
gpu.copy(1, yPos, screenWidth, 8, -speed, 0)
|
||
os.sleep(0.05)
|
||
end
|
||
end
|
||
|
||
local function test()
|
||
local animationSpeed = 6
|
||
ecs.square(1, 1, screenWidth, screenHeight, 0xFFFFFF)
|
||
|
||
for i = 1, #database.categories[currentCategory].exercises do
|
||
currentQuestion = i
|
||
local correctAnswer = database.categories[currentCategory].exercises[i].correctAnswer
|
||
|
||
drawProgress()
|
||
startAnimation(animationSpeed)
|
||
|
||
local doWhile = true
|
||
while doWhile do
|
||
if exitWhile then break end
|
||
local e = {event.pull()}
|
||
if e[1] == "touch" then
|
||
for key = 1, #buttons do
|
||
if ecs.clickedAtArea(e[3], e[4], buttons[key][1], buttons[key][2], buttons[key][3], buttons[key][4]) then
|
||
if key == correctAnswer then
|
||
ecs.drawAdaptiveButton(buttons[key][1], buttons[key][2], xOffset, yOffset, buttons[key].text, buttonStyle.correct.buttonColor, buttonStyle.correct.textColor)
|
||
else
|
||
ecs.drawAdaptiveButton(buttons[key][1], buttons[key][2], xOffset, yOffset, buttons[key].text, buttonStyle.incorrect.buttonColor, buttonStyle.incorrect.textColor)
|
||
end
|
||
doWhile = false
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
endAnimation(animationSpeed)
|
||
end
|
||
|
||
ecs.square(1, 1, screenWidth, screenHeight, 0xFFFFFF)
|
||
end
|
||
|
||
readDatabase(questionsFilePath)
|
||
test()
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|