287 lines
6.1 KiB
Lua

local component = require("component")
local gpu = component.gpu
local event = require("event")
local ecs = require("ECSAPI")
local color = require("color")
---------------------------
local xOld, yOld = gpu.getResolution()
local xSize, ySize = 160, 50
gpu.setResolution(xSize, ySize)
local players = {}
local xCenter, yCenter = math.floor(xSize/4 - 15), math.floor(ySize/2)
local xScore, yScore = 106, 5
local symbols = {
["1"] = {
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
{0, 1, 1, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
{0, 1, 1, 1, 0},
},
["2"] = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{0, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 0},
{1, 0, 0, 0, 0},
{1, 1, 1, 1, 1},
},
["3"] = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{0, 0, 0, 0, 1},
{0, 0, 1, 1, 0},
{0, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
},
["4"] = {
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 1, 1, 1, 1},
{0, 0, 0, 0, 1},
{0, 0, 0, 0, 1},
{0, 0, 0, 0, 1},
},
["5"] = {
{1, 1, 1, 1, 1},
{1, 0, 0, 0, 0},
{1, 0, 0, 0, 0},
{1, 1, 1, 1, 0},
{0, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
},
["6"] = {
{0, 0, 1, 1, 1},
{0, 1, 0, 0, 0},
{1, 0, 0, 0, 0},
{1, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
},
["7"] = {
{1, 1, 1, 1, 1},
{0, 0, 0, 0, 1},
{0, 0, 0, 1, 0},
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
},
["8"] = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
},
["9"] = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 1},
{0, 0, 0, 0, 1},
{0, 0, 0, 1, 0},
{1, 1, 1, 0, 0},
},
["0"] = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0},
}
}
--OBJECTS, CYKA
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
local function SetPixel(x, y, color)
ecs.square(x*2, y, 2, 1, color)
end
local function GetDistance(x1, y1, x2, y2)
local distance
distance = math.sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2))
return distance
end
local function drawKrug(x1, y1, r, color)
for x = x1 - r, x1 + r do
for y = y1 - r, y1 + r do
if GetDistance(x1, y1, x, y) <= r then
SetPixel(x, y, color)
end
end
end
end
local function drawMishen()
for i = 0, 9 do
local color = 0xffffff
if i % 2 == 0 then
color = 0x010101
end
drawKrug(xCenter, yCenter, 20 - i*2, color)
end
SetPixel(xCenter, yCenter, 0xff0000)
end
local function AddPlayer(name)
if not players[name] then
players[name] = {0, color.HSBToInteger(math.random(0, 359), 1, math.random(50, 100) / 100)}
end
end
local function AddScore(name, score)
players[name][1] = players[name][1] + score
end
local function GetScore(x, y)
local score = 1
local distance = GetDistance(xCenter, yCenter, x, y)
if distance == 0 then
score = 25
else
for i = 0, 6 do
if distance <= 20 - i*3 then
score = score + 2
end
end
end
return score
end
local function showPlayers(x, y)
local width = 40
local nicknameLimit = 20
local mode = false
local counter = 1
local stro4ka = string.rep(" ", nicknameLimit)..""..string.rep(" ", width - nicknameLimit)
ecs.colorTextWithBack(x, y, 0xffffff, ecs.colors.blue, stro4ka)
gpu.set(x + 1, y, "Имя игрока")
gpu.set(x + nicknameLimit + 2, y, "Очки")
for key, val in pairs(players) do
local color = 0xffffff
if mode then
color = color - 0x222222
end
gpu.setForeground(0x262626)
gpu.setBackground(color)
gpu.set(x, y + counter, stro4ka)
gpu.set(x + 3, y + counter, ecs.stringLimit("end", key, nicknameLimit - 4))
gpu.set(x + nicknameLimit + 2, y + counter, tostring(players[key][1]))
ecs.colorTextWithBack(x + 1, y + counter, players[key][2], color, "")
counter = counter + 1
mode = not mode
end
end
local function drawSymb(x, y, symb, color)
for i = 1, 7 do
for j = 1, 5 do
if symbols[symb][i][j] == 1 then
SetPixel(x + j - 1, y + i - 1, color)
end
end
end
end
local function drawText(x, y, text, color)
if text >=10 then
drawSymb(x, y, tostring(math.floor(text/10)), color)
drawSymb(x + 6, y, tostring(math.floor(text%10)), color)
else
drawSymb(x, y, tostring(text), color)
end
end
local function isIn(x1, y1, x2, y2, xClick, yClick)
if xClick >= x1 and xClick <= x2 and yClick >=y1 and yClick <= y2 then
return true
else
return false
end
end
local function drawLastScore(x, y, score, color)
ecs.square((x + 6) * 2, y, 35, 7, 0x262626)
drawKrug(x + 3, y + 3, 3, color)
drawText(x + 9, y, score, 0xffffff)
local yPos = 34
newObj("Buttons", "Заново", ecs.drawAdaptiveButton(xScore, yPos, 18, 1, "Заново", ecs.colors.blue, 0xffffff))
yPos = yPos + 4
newObj("Buttons", "Выйти ", ecs.drawAdaptiveButton(xScore, yPos, 18, 1, "Выйти ", ecs.colors.blue, 0xffffff))
end
local function Tir()
ecs.prepareToExit()
showPlayers(xScore, yScore)
drawLastScore(xScore / 2, 22, 0, 0xffffff)
drawMishen()
while true do
local e = {event.pull()}
if e[1] == "touch" then
for key, val in pairs(obj["Buttons"]) do
if ecs.clickedAtArea(e[3], e[4], obj["Buttons"][key][1], obj["Buttons"][key][2], obj["Buttons"][key][3], obj["Buttons"][key][4]) then
ecs.drawAdaptiveButton(obj["Buttons"][key][1], obj["Buttons"][key][2], 18, 1, key, 0xffffff, 0x000000)
os.sleep(0.5)
if key == "Выйти " then
return "exit"
else
players = {}
return 0
end
end
end
e[3] = e[3]/2
AddPlayer(e[6])
AddScore(e[6], GetScore(e[3], e[4]))
SetPixel(e[3], e[4], players[e[6]][2])
showPlayers(xScore, yScore)
drawLastScore(xScore / 2, 22, GetScore(e[3], e[4]),players[e[6]][2])
end
end
end
--------------------------
gpu.setBackground(0x262626)
gpu.fill(1, 1, xSize, ySize, " ")
while true do
local exit = Tir()
if exit == "exit" then break end
end
gpu.setResolution(xOld, yOld)
ecs.prepareToExit()