311 lines
9.7 KiB
Lua
311 lines
9.7 KiB
Lua
--[[
|
|
Copyright (c) 2014 Team Sparkle
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
]]
|
|
|
|
-- Master server to use.
|
|
MASTER_URL = "http://magicannon.com:27790/master.json"
|
|
|
|
-- Time in seconds between auto-updates, or nil to disable
|
|
AUTO_REFRESH_RATE = nil
|
|
|
|
-- Some arguments...
|
|
argv = {...}
|
|
|
|
-- Connect to master server
|
|
dofile("pkg/iceball/lib/http.lua")
|
|
server_list = true
|
|
latest_version = nil
|
|
master_http = http_new {url = MASTER_URL}
|
|
if not master_http then
|
|
server_list = false
|
|
end
|
|
|
|
-- A creative hack to make this whole thing work.
|
|
function arg_closure(arg_array, offset)
|
|
offset = offset or 1
|
|
|
|
if #arg_array == 0 then
|
|
return
|
|
elseif offset == #arg_array then
|
|
return arg_array[offset]
|
|
else
|
|
return arg_array[offset], arg_closure(arg_array, offset+1)
|
|
end
|
|
end
|
|
|
|
-- Some libraries
|
|
dofile("pkg/iceball/lib/font.lua")
|
|
dofile("pkg/base/lib_sdlkey.lua")
|
|
|
|
-- Some other stuff that needs done early
|
|
local page = 0
|
|
local page_prev_active = false
|
|
local page_next_active = false
|
|
|
|
local function update_page_buttons()
|
|
if type(server_list) ~= "table" then
|
|
page = 0
|
|
end
|
|
|
|
if page > 0 then
|
|
page_prev_active = true
|
|
else
|
|
page_prev_active = false
|
|
end
|
|
if type(server_list) == "table" and page < math.ceil(#server_list / 9) - 1 then
|
|
page_next_active = true
|
|
else
|
|
page_next_active = false
|
|
end
|
|
end
|
|
|
|
local function join_server(sid)
|
|
if type(server_list) ~= "table" then
|
|
return
|
|
end
|
|
local idx = (page * 9) + sid
|
|
if idx <= #server_list then
|
|
local sv = server_list[idx]
|
|
client.join_server(sv.address, sv.port, arg_closure(argv))
|
|
-- client.mk_sys_execv("-c", sv.address, sv.port, arg_closure(argv))
|
|
end
|
|
end
|
|
|
|
-- Some hooks
|
|
function client.hook_key(key, state, modif, uni)
|
|
if not state then
|
|
if key == SDLK_l then
|
|
client.create_server(20737, "pkg/base", arg_closure(argv))
|
|
-- client.mk_sys_execv("-s", "20737", "pkg/base", arg_closure(argv))
|
|
elseif key == SDLK_c then
|
|
client.create_launcher("pkg/iceball/config")
|
|
-- client.mk_sys_execv("-l", "pkg/iceball/config")
|
|
elseif key == SDLK_ESCAPE then
|
|
client.hook_tick = nil
|
|
elseif key >= SDLK_1 and key <= SDLK_9 then
|
|
join_server((key - SDLK_1) + 1)
|
|
elseif key >= SDLK_KP1 and key <= SDLK_KP9 then
|
|
join_server((key - SDLK_KP1) + 1)
|
|
elseif key == SDLK_r then
|
|
master_http = http_new {url = MASTER_URL}
|
|
elseif key == SDLK_LEFT then
|
|
if page > 0 then
|
|
page = page - 1
|
|
update_page_buttons()
|
|
end
|
|
elseif key == SDLK_RIGHT then
|
|
if type(server_list) == "table" then
|
|
if page < math.ceil(#server_list / 9) - 1 then
|
|
page = page + 1
|
|
update_page_buttons()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--render pre-load
|
|
local screen_width, screen_height = client.screen_get_dims()
|
|
|
|
local font = font_dejavu_bold[18]
|
|
local ch = font.iheight
|
|
local text_offset = ch+ch --cha cha cha! \o/
|
|
|
|
local img_row_bkg_width = screen_width - 2*text_offset
|
|
local img_row_bkg = common.img_new(img_row_bkg_width, ch + 2)
|
|
common.img_fill(img_row_bkg, 0x99111111)
|
|
local img_row_official_bkg = common.img_new(img_row_bkg_width, ch + 2)
|
|
common.img_fill(img_row_official_bkg, 0x99555500)
|
|
local img_row_bkg_transparent = common.img_new(img_row_bkg_width, ch + 2)
|
|
common.img_fill(img_row_bkg_transparent, 0x22111111)
|
|
|
|
local img_button_bkg_width = 120
|
|
local img_button_bkg_height = ch + 2
|
|
local img_button_bkg = common.img_new(img_button_bkg_width, img_button_bkg_height)
|
|
common.img_fill(img_button_bkg, 0x99111111)
|
|
local img_button_bkg_transparent = common.img_new(img_button_bkg_width, img_button_bkg_height)
|
|
common.img_fill(img_button_bkg_transparent, 0x22111111)
|
|
|
|
local img_splash = common.img_load("pkg/iceball/gfx/splash_logo.png", "png")
|
|
local img_splash_width, img_splash_height
|
|
local img_splash_width_scaled, img_splash_height_scaled
|
|
|
|
local splashtweenprogress_scale = 0.9
|
|
local splashtweenprogress_y = 1.0
|
|
|
|
client.map_fog_set(16, 136, 189, 100)
|
|
function client.hook_render()
|
|
--splash sequence
|
|
if not img_splash_width then
|
|
img_splash_width, img_splash_height = common.img_get_dims(img_splash)
|
|
end
|
|
|
|
if splashtweenprogress_scale > 0.25 then
|
|
if splashtweenprogress_scale > 0.85 then
|
|
splashtweenprogress_scale = splashtweenprogress_scale - 0.001 --would be nice to do this with frame delta time
|
|
elseif splashtweenprogress_scale < 0.5 then
|
|
splashtweenprogress_scale = splashtweenprogress_scale - 0.0112
|
|
else
|
|
splashtweenprogress_scale = splashtweenprogress_scale - 0.068
|
|
end
|
|
end
|
|
if splashtweenprogress_y < 2.0 and splashtweenprogress_scale < 0.85 then
|
|
splashtweenprogress_y = splashtweenprogress_y + 0.1
|
|
end
|
|
img_splash_width_scaled = img_splash_width*splashtweenprogress_scale
|
|
img_splash_height_scaled = img_splash_height*splashtweenprogress_scale
|
|
local splash_x, splash_y
|
|
splash_x = (screen_width/2) - (img_splash_width_scaled/2)
|
|
splash_y = (screen_height/(2/splashtweenprogress_y)) - img_splash_height_scaled
|
|
client.img_blit(img_splash, splash_x, splash_y, img_splash_width_scaled, img_splash_height_scaled, 0, 0, 0xFFFFFFFF, splashtweenprogress_scale, splashtweenprogress_scale)
|
|
--splash sequence end
|
|
|
|
if splashtweenprogress_scale <= 0.5 then --don't draw the rest until the splash finishes
|
|
|
|
|
|
font.render(text_offset, ch*0, "Press L for a local server on port 20737", 0xFFEEEEEE)
|
|
font.render(text_offset, ch*1, "Press Escape to quit", 0xFFEEEEEE)
|
|
font.render(text_offset, ch*2, "Press C to change your settings", 0xFFEEEEEE)
|
|
font.render(text_offset, ch*3, "Press R to update the server list", 0xFFEEEEEE)
|
|
font.render(text_offset, ch*4, "Press a number to join a server", 0xFFEEEEEE)
|
|
font.render(text_offset, ch*6, "Server list:", 0xFFEEEEEE)
|
|
|
|
local i
|
|
if server_list == true then
|
|
font.render(text_offset, ch*7, "Fetching...", 0xFFEEEEEE)
|
|
elseif server_list == false then
|
|
font.render(text_offset, ch*7, "Could not connect to the server list. Are you connected to the internet?", 0xFFEEEEEE)
|
|
elseif server_list == nil then
|
|
font.render(text_offset, ch*7, "Failed to fetch the server list.", 0xFFEEEEEE)
|
|
else
|
|
-- Draw version string
|
|
local version_string = nil
|
|
local version_colour = nil
|
|
if common.version.num < latest_version then
|
|
version_string = "Update available! ("..common.version.str..")"
|
|
version_colour = 0xFFE81515
|
|
local download_text = "Download the latest version at http://iceball.build"
|
|
font.render(
|
|
screen_width - font.string_width(download_text) - text_offset,
|
|
ch * 1,
|
|
download_text,
|
|
0xFFCFC511
|
|
)
|
|
else
|
|
version_string = "Up to date! ("..common.version.str..")"
|
|
version_colour = 0xFF86CF11
|
|
end
|
|
|
|
font.render(
|
|
screen_width - font.string_width(version_string) - text_offset,
|
|
0,
|
|
version_string,
|
|
version_colour
|
|
)
|
|
|
|
-- Draw server list
|
|
local empty_start = 10
|
|
for i=1,9 do
|
|
local sid = page * 9 + i
|
|
if sid > #server_list then
|
|
empty_start = i
|
|
break
|
|
end
|
|
|
|
local sv = server_list[sid]
|
|
|
|
if sv.official then
|
|
-- TODO: Maybe make this a column or something? Could have columns for official and favourites
|
|
client.img_blit(img_row_official_bkg, text_offset-2, (ch+4)*(8+i-1) - 1)
|
|
else
|
|
client.img_blit(img_row_bkg, text_offset-2, (ch+4)*(8+i-1) - 1)
|
|
end
|
|
|
|
font.render(text_offset, (ch+4)*(8+i-1), sid..": "..sv.name
|
|
.." - "..sv.players_current.."/"..sv.players_max
|
|
.." - "..sv.mode
|
|
.." - "..sv.map, 0xFFEEEEEE)
|
|
|
|
end
|
|
-- common.img_fill(img_row_bkg, 0x22111111)
|
|
for i=empty_start,9 do
|
|
client.img_blit(img_row_bkg_transparent, text_offset-2, (ch+4)*(8+i-1) - 1)
|
|
end
|
|
--common.img_fill(img_row_bkg, 0x99111111)
|
|
|
|
-- Draw prev/next buttons
|
|
local button_pos_x = screen_width - text_offset - 2 - img_button_bkg_width
|
|
local button_pos_y = (ch+4)*17 - 1
|
|
local label_offset = (img_button_bkg_width / 2) - (font.string_width("<") / 2)
|
|
if page_next_active then
|
|
client.img_blit(img_button_bkg, button_pos_x, button_pos_y)
|
|
else
|
|
client.img_blit(img_button_bkg_transparent, button_pos_x, button_pos_y)
|
|
end
|
|
font.render(
|
|
button_pos_x + label_offset,
|
|
button_pos_y,
|
|
">",
|
|
0xFFEEEEEE
|
|
)
|
|
button_pos_x = button_pos_x - 2 - img_button_bkg_width
|
|
if page_prev_active then
|
|
client.img_blit(img_button_bkg, button_pos_x, button_pos_y)
|
|
else
|
|
client.img_blit(img_button_bkg_transparent, button_pos_x, button_pos_y)
|
|
end
|
|
font.render(
|
|
button_pos_x + label_offset,
|
|
button_pos_y,
|
|
"<",
|
|
0xFFEEEEEE
|
|
)
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
server_refresh = 0
|
|
function client.hook_tick(sec_current, sec_delta)
|
|
-- Fetch the master server list if possible.
|
|
if master_http then
|
|
local status = master_http.update()
|
|
if status == nil then
|
|
master_http = nil
|
|
server_refresh = sec_current
|
|
server_list = nil
|
|
elseif status ~= true then
|
|
print(status)
|
|
result = common.json_parse(status)
|
|
latest_version = result and result.iceball_version
|
|
server_list = result and result.servers
|
|
master_http = nil
|
|
server_refresh = sec_current
|
|
update_page_buttons()
|
|
end
|
|
elseif AUTO_REFRESH_RATE and server_refresh + AUTO_REFRESH_RATE < sec_current then
|
|
master_http = http_new {url = MASTER_URL}
|
|
end
|
|
|
|
return 0.01
|
|
end
|
|
|