1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-08 00:39:30 +02:00
ComfyFactorio/modules/difficulty_vote.lua

140 lines
6.0 KiB
Lua
Raw Normal View History

2019-08-14 16:16:42 +02:00
local event = require 'utils.event'
2019-10-28 18:38:36 +02:00
local Server = require 'utils.server'
2019-08-14 16:16:42 +02:00
local difficulties = {
[1] = {name = "Peaceful", value = 0.25, color = {r=0.00, g=0.45, b=0.00}, print_color = {r=0.00, g=0.8, b=0.00}},
2019-08-20 22:33:47 +02:00
[2] = {name = "Piece of cake", value = 0.5, color = {r=0.00, g=0.35, b=0.00}, print_color = {r=0.00, g=0.6, b=0.00}},
[3] = {name = "Easy", value = 0.75, color = {r=0.00, g=0.25, b=0.00}, print_color = {r=0.00, g=0.4, b=0.00}},
2019-08-14 21:16:56 +02:00
[4] = {name = "Normal", value = 1, color = {r=0.00, g=0.00, b=0.25}, print_color = {r=0.0, g=0.0, b=0.5}},
2019-08-14 16:16:42 +02:00
[5] = {name = "Hard", value = 1.5, color = {r=0.25, g=0.00, b=0.00}, print_color = {r=0.4, g=0.0, b=0.00}},
[6] = {name = "Nightmare", value = 3, color = {r=0.35, g=0.00, b=0.00}, print_color = {r=0.6, g=0.0, b=0.00}},
[7] = {name = "Impossible", value = 5, color = {r=0.45, g=0.00, b=0.00}, print_color = {r=0.8, g=0.0, b=0.00}}
2019-08-15 12:38:24 +02:00
}
2019-08-14 21:16:56 +02:00
2019-08-14 16:16:42 +02:00
local function difficulty_gui()
2019-09-21 11:47:09 +02:00
local tooltip = "Current difficulty of the map is " .. difficulties[global.difficulty_vote_index].name
tooltip = tooltip .. "."
2019-08-14 16:16:42 +02:00
for _, player in pairs(game.connected_players) do
2019-09-21 11:47:09 +02:00
if player.gui.top["difficulty_gui"] then
player.gui.top["difficulty_gui"].caption = difficulties[global.difficulty_vote_index].name
player.gui.top["difficulty_gui"].tooltip = tooltip
player.gui.top["difficulty_gui"].style.font_color = difficulties[global.difficulty_vote_index].print_color
else
local b = player.gui.top.add { type = "button", caption = difficulties[global.difficulty_vote_index].name, tooltip = tooltip, name = "difficulty_gui" }
b.style.font = "heading-2"
b.style.font_color = difficulties[global.difficulty_vote_index].print_color
b.style.minimal_height = 38
end
2019-08-14 16:16:42 +02:00
end
end
local function poll_difficulty(player)
2019-08-14 21:16:56 +02:00
if player.gui.center["difficulty_poll"] then player.gui.center["difficulty_poll"].destroy() return end
2019-08-15 12:38:24 +02:00
if not global.difficulty_poll_closing_timeout then global.difficulty_poll_closing_timeout = 54000 end
if game.tick > global.difficulty_poll_closing_timeout then
if player.online_time ~= 0 then
local t = math.abs(math.floor((global.difficulty_poll_closing_timeout - game.tick) / 3600))
local str = "Votes have closed " .. t
str = str .. " minute"
if t > 1 then str = str .. "s" end
str = str .. " ago."
player.print(str)
end
return
end
2019-08-14 16:16:42 +02:00
local frame = player.gui.center.add { type = "frame", caption = "Vote difficulty:", name = "difficulty_poll", direction = "vertical" }
for i = 1, 7, 1 do
local b = frame.add({type = "button", name = tostring(i), caption = difficulties[i].name})
b.style.font_color = difficulties[i].color
b.style.font = "heading-2"
b.style.minimal_width = 160
end
local b = frame.add({type = "label", caption = "- - - - - - - - - - - - - - - - - -"})
2019-08-15 12:38:24 +02:00
local b = frame.add({type = "button", name = "close", caption = "Close (" .. math.floor((global.difficulty_poll_closing_timeout - game.tick) / 3600) .. " minutes left)"})
2019-08-14 16:16:42 +02:00
b.style.font_color = {r=0.66, g=0.0, b=0.66}
b.style.font = "heading-3"
b.style.minimal_width = 96
end
local function set_difficulty()
local a = 0
2019-08-14 21:16:56 +02:00
local vote_count = 0
2019-08-14 16:16:42 +02:00
for _, d in pairs(global.difficulty_player_votes) do
a = a + d
2019-08-14 21:16:56 +02:00
vote_count = vote_count + 1
2019-08-14 16:16:42 +02:00
end
2019-09-08 00:22:17 +02:00
if vote_count == 0 then return end
2019-08-14 21:16:56 +02:00
a = a / vote_count
2019-08-14 16:16:42 +02:00
local new_index = math.round(a, 0)
if global.difficulty_vote_index ~= new_index then
2019-08-21 01:17:06 +02:00
local message = table.concat({">> Map difficulty has changed to ", difficulties[new_index].name, " difficulty!"})
game.print(message, difficulties[new_index].print_color)
2019-10-28 18:38:36 +02:00
Server.to_discord_embed(message)
2019-08-14 16:16:42 +02:00
end
global.difficulty_vote_index = new_index
2019-08-14 21:16:56 +02:00
global.difficulty_vote_value = difficulties[new_index].value
2019-08-14 16:16:42 +02:00
end
2019-08-20 22:33:47 +02:00
function reset_difficulty_poll()
global.difficulty_vote_value = 1
global.difficulty_vote_index = 4
global.difficulty_player_votes = {}
global.difficulty_poll_closing_timeout = game.tick + 54000
for _, p in pairs(game.connected_players) do
if p.gui.center["difficulty_poll"] then p.gui.center["difficulty_poll"].destroy() end
poll_difficulty(p)
end
difficulty_gui()
end
2019-08-14 16:16:42 +02:00
local function on_player_joined_game(event)
local player = game.players[event.player_index]
if not global.difficulty_vote_value then global.difficulty_vote_value = 1 end
if not global.difficulty_vote_index then global.difficulty_vote_index = 4 end
if not global.difficulty_player_votes then global.difficulty_player_votes = {} end
2019-09-21 11:47:09 +02:00
if not global.difficulty_poll_closing_timeout then global.difficulty_poll_closing_timeout = 54000 end
2019-09-08 00:22:17 +02:00
if game.tick < global.difficulty_poll_closing_timeout then
if not global.difficulty_player_votes[player.name] then
poll_difficulty(player)
end
2019-09-13 13:10:41 +02:00
else
if player.gui.center["difficulty_poll"] then player.gui.center["difficulty_poll"].destroy() end
2019-09-08 00:22:17 +02:00
end
2019-08-14 16:16:42 +02:00
difficulty_gui()
end
2019-09-08 00:22:17 +02:00
local function on_player_left_game(event)
if game.tick > global.difficulty_poll_closing_timeout then return end
local player = game.players[event.player_index]
if not global.difficulty_player_votes[player.name] then return end
global.difficulty_player_votes[player.name] = nil
set_difficulty()
2019-09-27 17:34:33 +02:00
difficulty_gui()
2019-09-08 00:22:17 +02:00
end
2019-08-14 16:16:42 +02:00
local function on_gui_click(event)
if not event then return end
if not event.element then return end
if not event.element.valid then return end
2019-08-14 21:16:56 +02:00
local player = game.players[event.element.player_index]
if event.element.name == "difficulty_gui" then
poll_difficulty(player)
return
end
2019-08-15 12:38:24 +02:00
if event.element.type ~= "button" then return end
2019-08-14 16:16:42 +02:00
if event.element.parent.name ~= "difficulty_poll" then return end
2019-10-05 04:18:18 +02:00
if event.element.name == "close" then event.element.parent.destroy() return end
if game.tick > global.difficulty_poll_closing_timeout then event.element.parent.destroy() return end
2019-08-14 16:16:42 +02:00
local i = tonumber(event.element.name)
game.print(player.name .. " has voted for " .. difficulties[i].name .. " difficulty!", difficulties[i].print_color)
2019-08-14 21:16:56 +02:00
global.difficulty_player_votes[player.name] = i
2019-08-14 16:16:42 +02:00
set_difficulty()
difficulty_gui()
event.element.parent.destroy()
end
2019-09-08 00:22:17 +02:00
event.add(defines.events.on_player_joined_game, on_player_joined_game)
event.add(defines.events.on_player_left_game, on_player_left_game)
event.add(defines.events.on_gui_click, on_gui_click)