0% found this document useful (0 votes)
432 views

Stadium Server

This document describes a stadium server mod for PES 2020 that allows customizing stadium assignments. It includes: 1) Instructions and code for a Lua script that runs a stadium server, allowing configuration of stadium assignments for home teams, competitions, weather, and more. 2) The script contains code for loading settings from configuration files, mapping stadium assignments, selecting random stadiums, and updating displayed information. 3) It provides customizable tables for overriding default competition assignments and configuring additional settings for the stadium server mod.

Uploaded by

Jairo Cruz
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
432 views

Stadium Server

This document describes a stadium server mod for PES 2020 that allows customizing stadium assignments. It includes: 1) Instructions and code for a Lua script that runs a stadium server, allowing configuration of stadium assignments for home teams, competitions, weather, and more. 2) The script contains code for loading settings from configuration files, mapping stadium assignments, selecting random stadiums, and updating displayed information. 3) It provides customizable tables for overriding default competition assignments and configuring additional settings for the stadium server mod.

Uploaded by

Jairo Cruz
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 26

-- Stadium server v1.

25 for PES 2020 - assign the stadium for either home team or
competition
-- Custom content is used, not LiveCPK/game: content\stadium-server is the root
-- author: zlac, 2018-2020
-- extra credits: juce
-- originally posted on evo-web

-- local new_stadium_path
local version = "1.25"
local stadiumroot = ".\\content\\stadium-server\\"
local stadium_switched = false
local stadium_name_switched = false
local last_choice
local settings

-- "minus 1" will be applied to all values > 0


local weather_TimeOfDay = 0 -- 0 (in-game selection), 1 (Day), 2 (Night)
local weather_TimeOfDay_Info = {["0"]="Default", ["1"]="Day", ["2"]="Night"}
local weather_Weather = 0 -- 0 (in-game selection), 1 (Fine/Sunny), 2 (Rainy), 3
(Snowy)
local weather_Weather_Info = {["0"]="Default", ["1"]="Fine/Sunny", ["2"]="Rainy",
["3"]="Snowy"}
local weather_WeatherEffects = 0 -- 0 (in-game selection), 3 (Force Rain/snow
falling)
local weather_WeatherEffects_Info = {["0"]="Default", ["3"]="Forced"}
local weather_Season = 0 -- 0 (in-game selection), 1 (Summer), 2 (Winter)
local weather_Season_Info = {["0"]="Default", ["1"]="Summer", ["2"]="Winter"}

--[[
local replay_stad_id = nil
local replay_source_stadium_map = nil
local replay_source_stadium_key = nil
]]--

local random_num_comp -- which stadium to select randomly in competition modes from


stadium server (depending on entries available per competition in
map_competition.txt)
local random_num_exhib -- which stadium to select randomly in exhibition modes from
stadium server
local rnd_server_or_cpk -- to serve random stadium from stadium server (depending
on entries available per competition in map_competition.txt) or from default .cpk
files (i.e. stadium server deactivates itself temporarily)

local team_assignment_map = {}
local competition_assignment_map = {}
local all_stadiums_map = {}

local info_text = ""


local weather_text = ""
local manual_stad_idx
local manual_stad_info = "Manually selected stadium: None"
local manual_selection_status = "Off"
local manual_selection_status_info = "Selection mode: automatic map assignments"
local total_stadiums

local _stadium_info = {}
local current_stadium_preview_path

local RELOAD_MAPS_KEY = 0x30 -- 0 key (not the NUMPAD zero!!)


local WEATHER_TIMEOFDAY_KEY = 0x33 -- 3 key (not the NUMPAD 7!!)
local WEATHER_WEATHER_KEY = 0x34 -- 4 key (not the NUMPAD 7!!)
local WEATHER_WEATHER_EFFECTS_KEY = 0x35 -- 5 key (not the NUMPAD 7!!)
local WEATHER_SEASON_KEY = 0x36 -- 6 key (not the NUMPAD 7!!)
local SET_AS_FAVORITE_STAD_KEY = 0x37 -- 7 key (not the NUMPAD 7!!)
local USE_FAVORITE_STAD_KEY = 0x38 -- 8 key (not the NUMPAD 8!!)
local SWITCH_SELECTION_MODE_KEY = 0x39 -- 9 key (not the NUMPAD 9!!)
local DEL_TEXT_KEY = 0x2E
local PREVIOUS_STAD_KEY = 0x21 -- Page Up
local NEXT_STAD_KEY = 0x22 -- Page Down

local stadium_config = {}

-- override_competitions contains comma-separated ID's of the competitions that


allow for team-assigned stadiums to have precedence before competiton-assigned
stadiums
-- .. e.g. you've assigned a home stadium for ALL exhibition mode matches (tid
65535) in map_competitions.txt, but you still want to use
-- .. custom home-team stadium for those teams that have it assigned in
map_teams.txt -> add 65535 in override_competitions
-- .. OR: you have assigned multiple stadiums to be selected randomly (e.g. for
EPL) for those teams that do not have their own stadiums, but you
-- .. still want to use custom home-team stadium for those teams that have it
assigned in map_teams.txt -> add 17 too (EPL id) in override_competitions
-- initially, all (at least, i hope so) Exhibition mode, League and League-Cup
matches are included in competition overrides
-- BEGIN CUSTOMIZABLE LUA TABLE
local override_competitions = {65535, -- Exhibition matches
4, -- UCL knockout stage
6, -- UEL knockout stage
10, -- Copa Libertadores knockout
stage
16, -- ACL knockout stage
17, 79, 23, 83, -- England 1st and
2nd div and cup and play offs
19, 80, 25, 87, 84, -- Spain 1st
and 2nd div and cup and supercup (2-legged supercup, home&away matches) and
playoffs
18, 82, 24, 85, -- Italy 1st and
2nd div and cup and playoffs
20, 81, 26, -- France 1st and 2nd
div and cup
22, 28, -- Portugal league and cup
21, 27, -- Netherlands league and
cup
30, 59, -- Argentina league and cup
29, 163, 31, -- Brazil 1st and 2nd
div and cup
67, 13400, 13401, 68, -- Chile
league (first and second stage) and cup
50, 53, -- PEU league and cup
51, 10200, 10201, 54, -- PLA league
(first and second stage) and cup
52, 55, -- PAS league and cup
120, 127, -- China league and cup
115, 155, 156, 157, 158, 159, 122, -- Belgium 1st
div (playoff groups 0 to 3, final knockout) and cup
116, 123, -- Russia 1st div and cup
117, 124, -- Switzerland 1st div and cup
118, 125, -- Turkey 1st div and cup
119, 23800, 23801, 160, 161, 126, -- Colombia 1st
div (first and second stage, knockout 0 and 1) and cup
133, 134, 135, 136, 137, -- Scotland 1st div
(playoff groups 0 to 2) and cup
141, 147, 148, 149, 150, 151, 142, -- Denmark 1st
div (playoff groups 0 to 3, final knockout) and cup
162, 164, -- Thailand 1st div and cup
}
-- END CUSTOMIZABLE LUA TABLE

local function nil2str(value)


if value ~= nil then
return value
else
return "N/A"
end
end

-- log only if detailed logging is required in config.ini


local function _log(msg)
-- are settings available & configured?
if settings and settings["detailed_logging"] then
if settings["detailed_logging"] == 1 then
log(msg)
end
-- fallback to default logging, if not
else
log(msg)
end
end

local function load_ini(filename)


local t = {}
local data = assert(io.lines(stadiumroot .. filename))
_log(filename .. " found in " .. stadiumroot)

for line in data do


local name, value = string.match(line, "^([%w_]+)%s*=%s*([-%w%d.]+)")
if name and value then
value = tonumber(value) or value
t[name] = value
_log(string.format("Using setting: %s = %s", name, value))
end
end
return t
end

local function load_addon_ini(filename)


local t = {}
local data = assert(io.lines(stadiumroot .. filename))
_log(filename .. " found in " .. stadiumroot)

for line in data do


local name, value = string.match(line, "^([%w_]+)%s*=%s*([-%w%d_ .]+)")
if name and value then
value = tonumber(value) or value
t[name] = value
_log(string.format("Using add-on mod: %s = %s", name, value))
end
end
return t
end

local function save_ini(filename)


local f = io.open(stadiumroot .. filename, "wt")
f:write(string.format("# StadiumServer settings. Generated by
StadiumServer.lua\n"))
f:write(string.format("# detailed_logging: 1 = more extensive logging; 0 =
bare-bones logging\n"))
f:write("\n")
local keys = {}
for name,value in pairs(settings) do
keys[#keys + 1] = name
end
table.sort(keys)
for i,name in ipairs(keys) do
local value = settings[name]
f:write(string.format("%s = %s\n", name, value))
end
f:write("\n")
f:close()
end

local function file_exists(name)


local f=io.open(name,"r")
if f~=nil then
io.close(f)
return true
else
return false
end
end

-- remove trailing and leading whitespace from string


local function trim(s)
return s:gsub("^%s*(.-)%s*$", "%1")
end

local function split(s, inSplitPattern)


local outResults = {}
-- chop off the trailing comment, if present
local theCommentStart = string.find( s, "#", 1 )
local data = s
if theCommentStart ~= nil then
data = string.sub(s, 1, theCommentStart-1)
end

-- now do the splits by main separator (inSplitPattern)


local theStart = 1
local theSplitStart, theSplitEnd = string.find( data, inSplitPattern,
theStart )
while theSplitStart do
outResults[#outResults+1] = trim(string.sub( data, theStart,
theSplitStart-1 ))
theStart = theSplitEnd + 1
theSplitStart, theSplitEnd = string.find( data, inSplitPattern,
theStart )
end
outResults[#outResults+1] = trim(string.sub( data, theStart ))
return outResults
end

local function clear_table(t)


for k,v in pairs(t) do
t[k]=nil
end
end

local function dump_table(o)


if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump_table(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end

local function print_arr(tbl)


for index, value in ipairs(tbl) do
log(" " .. value)
end
end

local function tableLength(T)


local count = 0
for _ in pairs(T) do
count = count + 1
end
return count
end

local function valueArrayExistsInTable(tbl, val, startAt)


for key, value in pairs(tbl) do
if val[startAt] == value[1] and val[startAt+1] == value[2] then
return true
end
end
return false
end

local function compare_stadium_names(a,b)


return string.lower(a[2]) < string.lower(b[2]) -- {stadium_ID, stadium_name,
stadium_path} triplets, compare names
end

local function merge_maps()


local idx = 1
clear_table(all_stadiums_map)

for key, row in pairs(team_assignment_map) do


if row[1] ~= nil and row[1] ~= "" and row[2] ~= nil and row[2] ~= "" and
row[3] ~= nil and row[3] ~= "" and not valueArrayExistsInTable(all_stadiums_map,
row, 1) then
all_stadiums_map[idx] = {row[1], row[2], row[3]}
idx = idx + 1
end
end

for key, value in pairs(competition_assignment_map) do


for index, row in ipairs(value) do
if row[1] ~= nil and row[1] ~= "" and row[2] ~= nil and row[2] ~=
"" and row[3] ~= nil and row[3] ~= "" and not
valueArrayExistsInTable(all_stadiums_map, row, 1) then
all_stadiums_map[idx] = {row[1], row[2], row[3]}
idx = idx + 1
end
-- see if the stadium for final match is already included ...
if row[4] ~= nil and row[4] ~= "" and row[5] ~= nil and row[5] ~=
"" and row[6] ~= nil and row[6] ~= "" and not
valueArrayExistsInTable(all_stadiums_map, row, 4) then
all_stadiums_map[idx] = {row[4], row[5], row[6]}
idx = idx + 1
end
end
end

-- dump_table(konami_stadiums_map)
-- log(dump_table(all_stadiums_map))

total_stadiums = tableLength(all_stadiums_map)
if total_stadiums > 0 then
manual_stad_idx = 1
end
log(string.format("%s unique stadiums available for random selection in
exhibition modes.", total_stadiums))
table.sort(all_stadiums_map, compare_stadium_names)
end

local function load_map_txt(filename)


local delim = ","

local data = assert(io.lines(stadiumroot .. filename))


log(filename .. " found in " .. stadiumroot .. filename)

if filename == "map_teams.txt" then


clear_table(team_assignment_map)
end
if filename == "map_competitions.txt" then
clear_table(competition_assignment_map)
end

for line in data do


line = trim(string.gsub(line, "^\239\187\191", "")) -- removes UTF BOM
bytes at the beginning of the first line in .txt file and leading/trailing
whitespaces in every line
local fields = split(line, delim)
if #fields > 1 then
for i=1,#fields do
fields[i] = trim(fields[i])
end
if fields[1] ~= nil and fields[1] ~= "" then
if filename == "map_teams.txt" and fields[2] ~= nil and fields[3]
~= nil and fields[4] ~= nil then
team_assignment_map[tonumber(fields[1])] = {fields[2],
fields[3], fields[4]}
_log(string.format(" ==> %s stadium assignment:: team_id: %s
-> stadium_id: %s, stadium: %s (%s)", filename, fields[1], fields[2], fields[4],
fields[3]))
end
if filename == "map_competitions.txt" and fields[2] ~= nil and
fields[3] ~= nil and fields[4] ~= nil and fields[5] ~= nil and fields[6] ~= nil and
fields[7] ~= nil then
if competition_assignment_map[tonumber(fields[1])] ~= nil then

table.insert(competition_assignment_map[tonumber(fields[1])], {fields[2],
fields[3], fields[4], fields[5], fields[6], fields[7]})
else
competition_assignment_map[tonumber(fields[1])] =
{ {fields[2], fields[3], fields[4], fields[5], fields[6], fields[7]} }
end
_log(string.format(" ==> %s stadium assignment:: competition:
%s -> stadium_id: %s, stadium: %s (%s) (finals: %s %s (%s))", filename, fields[1],
fields[2], fields[4], fields[3], fields[5], fields[7], fields[6]))
end
end
end
end
end

local function has_value(tab, val)


for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end

local function get_random_stad(n)


log("last_choice was: " .. tostring(last_choice))
last_choice = last_choice or math.random(1,n)
log("last_choice now: " .. tostring(last_choice))
return last_choice
end

local function select_random_stadium_source(ctx)


local tid = tonumber(ctx.tournament_id)

--select random stadium for exhibition mode


random_num_exhib = nil
if tid == 65535 and rnd_server_or_cpk == 1 then
-- if tid == 65535 and ( rnd_server_or_cpk == 1 or rnd_server_or_cpk == 2) then
local tblLen = tableLength(all_stadiums_map)
if tblLen == 1 then
random_num_exhib = 1
else
-- math.randomseed(os.time())
random_num_exhib = get_random_stad(tblLen) -- math.random(1, tblLen)
_log(string.format("Selecting random stadium from stadium server for
exhibition mode: %s (%s) ", all_stadiums_map[random_num_exhib][1],
all_stadiums_map[random_num_exhib][2]))
end
end

--now for competiton modes ... whenever game selects new home_team, pick a
random index of a stadium to be used on competition level (e.g. if multiple
stadiums are assigned to one competition_ID)
random_num_comp = nil
if tid < 65535 and competition_assignment_map[tid] ~= nil then
if #competition_assignment_map[tid] == 1 then
-- if there's only one stadium assigned to competition, set "random"
number to 1
random_num_comp = 1
else
-- if there are more stadiums, select one index rendomly
-- math.randomseed(os.time())
random_num_comp = get_random_stad(#competition_assignment_map[tid]) --
math.random(1, #competition_assignment_map[tid])
_log("Selecting random stadium for competition ID " .. tostring(tid) ..
": Stadium no. " .. tostring(random_num_comp) .. " (from " ..
tostring(#competition_assignment_map[tid]) .. " stadium(s) available)")
end
end

end

local function teams_selected(ctx, team_id)


local tid = tonumber(ctx.tournament_id)

-- reset ctx.stadium_server
ctx.stadium_server = nil

-- set_stadium event is called multiple times ... stadium_switched = false


would be better initialized when both team ID's are known???
stadium_switched = false
stadium_name_switched = false
last_choice = nil

if manual_selection_status == "Off" then


manual_selection_status_info = "Selection mode: automatic map
assignments"
manual_stad_info = string.format("Manually selected stadium: None")
current_stadium_preview_path = nil
end

-- if in-game stadium settings for exhibition modes are set to 'Random', then
decide where to choose the stadium from - stadium server or .cpk
--[[
math.randomseed(os.time())
rnd_server_or_cpk = math.random(1, 100)
if rnd_server_or_cpk % 2 == 0 then
rnd_server_or_cpk = 1 -- if even number, use stadium from stadium server
else
rnd_server_or_cpk = 2 -- otherwise if odd, use stadium from .cpk
end
]]--
-- newer approach, sider 5.1.4 - easier for getting Konami stadium previews,
all Konami stadiums must be assigned in map_competitions.txt to ID 0
rnd_server_or_cpk = 1 -- always use stadium server as a source, Konami's
stadiums are listed too
_log("If 'Random' in-game setting will be used in exhibition modes:: Source of
random stadiums - either stadium server (1) or from .cpk (2): " ..
tostring(rnd_server_or_cpk) )

end

local function is_it_stadium_file(filename)


filename = string.lower(filename)

if
string.match(filename, "asset\\model\\bg\\common") or -- sweeping match of
every gfx-related common asset for stadiums (too generic, perhaps??)
string.match(filename, "asset\\model\\bg\\st%d%d%d") or -- every stadium-
specific asset (stXXX)

-- adboards? better to avoid them ... only allow custom config.xml


database, for stadiums that want to remove adboards completely via blank template
string.match(filename, "common\\bg\\model\\bg\\bill\\config\\config
%.xml") or -- adboards config database

string.match(filename, "common\\bg\\model\\bg\\draw_parameter") or
string.match(filename, "common\\bg\\model\\bg\\tv") or

-- stadium names mentioned in commentary


string.match(filename, "%a%a%a\\sound\\awb\\50_main%.awb") or

string.match(filename, "common\\demo\\fixdemo") or
string.match(filename, "common\\demo\\fixdemoobj") or
string.match(filename, "common\\demo\\light") or
string.match(filename, "common\\demo\\mob") or
string.match(filename, "common\\demo\\prop") or

string.match(filename, "common\\render\\model\\bg\\hit\\stadium")
then
return true
else
return false
end
end

local function which_stadium_preview_tex(filename)


return string.match(string.lower(filename),
"common\\render\\thumbnail\\stadium\\(st%d+%.dds)")
end

local function get_stadium_preview_path(stadium_info)


if stadium_info then
local stadium_id = stadium_info[1]
local stadium_path = stadium_info[3]
-- log("Overlay preview path: " .. string.format("%s
%s\\common\\render\\thumbnail\\stadium\\st%03d.dds", stadiumroot, stadium_path,
stadium_id))
return string.format("%s%s\\common\\render\\thumbnail\\stadium\\st
%03d.dds", stadiumroot, stadium_path, stadium_id)
end
end

local function get_new_stadium_path(ctx)


local tid = tonumber(ctx.tournament_id)
local stadium_path
local custom_st_id
local custom_name

-- if tid and not ctx.is_replay_gallery then


if tid then
if tid == 65535 then
if manual_selection_status == "On" and manual_stad_idx then
-- manual selection from overlay trumps everything
stadium_path = all_stadiums_map[manual_stad_idx][3]
custom_name = all_stadiums_map[manual_stad_idx][2]
custom_st_id = all_stadiums_map[manual_stad_idx][1]
elseif rnd_server_or_cpk and rnd_server_or_cpk == 1 and
ctx.stadium_choice == 65534 and random_num_exhib ~= nil then
-- special case for exhibition mode with random stadium
selection enabled (stadium from stadium server (rnd_server_or_cpk == 1) ...
stadium_path = all_stadiums_map[random_num_exhib][3]
custom_name = all_stadiums_map[random_num_exhib][2]
custom_st_id = all_stadiums_map[random_num_exhib][1]
elseif rnd_server_or_cpk and rnd_server_or_cpk == 2 and
ctx.stadium_choice == 65534 then
return -- just leave, random .cpk stadium has been selected in
exhibition mode
elseif ctx.stadium_choice == 65533 then
if ctx.home_team ~= nil and
team_assignment_map[ctx.home_team] ~= nil then
-- individual home team assignments from
map_teams.txt will be used here
stadium_path = team_assignment_map[ctx.home_team][3]
custom_name = team_assignment_map[ctx.home_team][2]
custom_st_id = team_assignment_map[ctx.home_team][1]
end
end
else
if manual_selection_status == "On" and manual_stad_idx then
-- manual selection from overlay trumps everything
stadium_path = all_stadiums_map[manual_stad_idx][3]
custom_name = all_stadiums_map[manual_stad_idx][2]
custom_st_id = all_stadiums_map[manual_stad_idx][1]

elseif competition_assignment_map[tid] == nil and


team_assignment_map[ctx.home_team] ~= nil then -- and
has_value(teams_with_cpk_homegrounds, ctx.home_team) == false then
-- this particular competiton mode does not have the
stadium assigned via map_competitions.txt
-- .. individual home team assignments from map_teams.txt
will be used here, if the team does not already ...
stadium_path = team_assignment_map[ctx.home_team][3]
custom_name = team_assignment_map[ctx.home_team][2]
custom_st_id = team_assignment_map[ctx.home_team][1]

elseif competition_assignment_map[tid] ~= nil and


team_assignment_map[ctx.home_team] ~= nil and has_value(override_competitions, tid)
and ctx.match_info ~= 53 then
-- this particular competiton mode HAS the stadium assigned
via map_competitions.txt,
-- .. but it is also listed in override_competitions,
-- .. AND it is not FINAL match (e.g. in league cup, which
may possibly be held at neutral ground - and having stadium assigned already in
map_competitions.txt),
-- .. therefore, individual home team assignments from
map_teams.txt will be used here again
stadium_path = team_assignment_map[ctx.home_team][3]
custom_name = team_assignment_map[ctx.home_team][2]
custom_st_id = team_assignment_map[ctx.home_team][1]
else
-- nothing else but possible competition assignment in
map_competitions.txt
-- .. stadium from assignment from map_competitions.txt
will be used, if there is any
if tid < 65535 and competition_assignment_map[tid] ~= nil
then
if ctx.match_info == 53 and
competition_assignment_map[tid][random_num_comp][4] ~= "" and
competition_assignment_map[tid][random_num_comp][5] ~= "" and
competition_assignment_map[tid][random_num_comp][6] ~= "" then
-- is this the final match of a competition
(53)?
stadium_path = competition_assignment_map[tid]
[random_num_comp][6] -- use the stadium assigned for final match
custom_name = competition_assignment_map[tid]
[random_num_comp][5]
custom_st_id = competition_assignment_map[tid]
[random_num_comp][4]
elseif competition_assignment_map[tid]
[random_num_comp][1] ~= "" and competition_assignment_map[tid][random_num_comp][2]
~= "" and competition_assignment_map[tid][random_num_comp][3] ~= "" then
stadium_path = competition_assignment_map[tid]
[random_num_comp][3] -- use the regular stadium assigned for this competition
custom_name = competition_assignment_map[tid]
[random_num_comp][2]
custom_st_id = competition_assignment_map[tid]
[random_num_comp][1]
end
end
end
end
--[[
elseif ctx.is_replay_gallery and ctx.is_replay_gallery == true then
if replay_source_stadium_map == "all_stadiums_map" then
stadium_path = all_stadiums_map[replay_source_stadium_key][3]
custom_name = all_stadiums_map[replay_source_stadium_key][2]
custom_st_id = all_stadiums_map[replay_source_stadium_key][1]
elseif replay_source_stadium_map == "team_assignment_map" then
stadium_path = team_assignment_map[replay_source_stadium_key][3]
custom_name = team_assignment_map[replay_source_stadium_key][2]
custom_st_id = team_assignment_map[replay_source_stadium_key][1]
end
]]--
end

return stadium_path, custom_st_id, custom_name


end

local function get_stadium_addon_config(ctx, stadium_path)


local t = {}
if file_exists(stadiumroot .. stadium_path .. "\\AddOn\\addon_config.ini") then
t = load_addon_ini(stadium_path .. "\\AddOn\\addon_config.ini")
return t
end
end

local function check_for_addon_override(ctx, stadium_path, st_id, filename)


local override_found = false
local weatherPrefix = nil
local weatherTypePrefix = nil
local comp_id = tonumber(ctx.tournament_id)

if stadium_path and st_id and filename then

if ctx.season == 0 and ctx.timeofday == 0 then


weatherPrefix = "Summer_Day"
elseif ctx.season == 0 and ctx.timeofday == 1 then
weatherPrefix = "Summer_Night"
elseif ctx.season == 1 and ctx.timeofday == 0 then
weatherPrefix = "Winter_Day"
elseif ctx.season == 1 and ctx.timeofday == 1 then
weatherPrefix = "Winter_Night"
end
if ctx.weather == 0 then
weatherTypePrefix = "Fine"
elseif ctx.weather == 1 then
weatherTypePrefix = "Rainy"
elseif ctx.weather == 2 then
weatherTypePrefix = "Snowy"
end

if ctx.stadserv_addons_list then
-- weather-specific files for a specific stadium have priority ...
if override_found == false and weatherPrefix and weatherTypePrefix then
-- fine/rainy/snowy specifics first
for idx_key, mod_name in pairs(ctx.stadserv_addons_list) do
if file_exists(stadiumroot .. stadium_path .. "\\AddOn\\" ..
mod_name .. "\\" .. st_id .. "\\" .. weatherPrefix .. "\\" .. weatherTypePrefix ..
"\\".. filename) then
_log("Weather-type-specific, fixed-stadium AddOn file
found: " .. stadium_path .. "\\AddOn\\" .. mod_name .. "\\".. st_id .. "\\" ..
weatherPrefix .. "\\" .. weatherTypePrefix .. "\\" .. filename )
stadium_path = stadium_path .. "\\AddOn\\" .. mod_name ..
"\\".. st_id .. "\\" .. weatherPrefix .. "\\" .. weatherTypePrefix
-- _log("stadium_path (weather-type-specific): " ..
stadium_path)
override_found = true
break
end
end
-- if not fine/rain/snowy, then fallback to weather-specific that
considers only season and time of day
if override_found == false then
for idx_key, mod_name in pairs(ctx.stadserv_addons_list) do
if file_exists(stadiumroot .. stadium_path ..
"\\AddOn\\" .. mod_name .. "\\" .. st_id .. "\\" .. weatherPrefix .. "\\" ..
filename) then
_log("Weather-specific, fixed-stadium AddOn file found:
" .. stadium_path .. "\\AddOn\\" .. mod_name .. "\\".. st_id .. "\\" ..
weatherPrefix .. "\\" .. filename )
stadium_path = stadium_path .. "\\AddOn\\" ..
mod_name .. "\\".. st_id .. "\\" .. weatherPrefix
-- _log("stadium_path (weather-specific): " ..
stadium_path)
override_found = true
break
end
end
-- if not weather-specific, then perhaps there is a non
weather-specific version of a file for a specific stadium id?
if override_found == false then
-- fine/rainy/snowy specifics first
for idx_key, mod_name in pairs(ctx.stadserv_addons_list) do
if file_exists(stadiumroot .. stadium_path ..
"\\AddOn\\" .. mod_name .. "\\".. st_id .. "\\Any_Weather\\" ..
weatherTypePrefix .. "\\".. filename) then
_log("Any-weather (type-specific), fixed-stadium
AddOn file found: " .. stadium_path .. "\\AddOn\\" .. mod_name .. "\\".. st_id ..
"\\Any_Weather\\" .. weatherTypePrefix .. "\\".. filename )
stadium_path = stadium_path .. "\\AddOn\\" ..
mod_name .. "\\".. st_id.. "\\Any_Weather\\" .. weatherTypePrefix
-- _log("stadium_path (any-weather, type-specific):
" .. stadium_path)
override_found = true
break
end
end
-- if not fine/rain/snowy, then fallback to any-weather
if override_found == false then
for idx_key, mod_name in
pairs(ctx.stadserv_addons_list) do
if file_exists(stadiumroot .. stadium_path ..
"\\AddOn\\" .. mod_name .. "\\".. st_id .. "\\Any_Weather\\" .. filename) then
_log("Any-weather, fixed-stadium AddOn file
found: " .. stadium_path .. "\\AddOn\\" .. mod_name .. "\\".. st_id ..
"\\Any_Weather\\" .. filename )
stadium_path = stadium_path .. "\\AddOn\\" ..
mod_name .. "\\".. st_id.. "\\Any_Weather"
-- _log("stadium_path (any-weather): " ..
stadium_path)
override_found = true
break
end
end

-- if not non-weather fixed-stadium file too, then


perhaps there is a generic version of a file for any weather and any stadium id?
if override_found == false then
for idx_key, mod_name in
pairs(ctx.stadserv_addons_list) do
if file_exists(stadiumroot .. stadium_path ..
"\\AddOn\\" .. mod_name .. "\\Global\\" .. filename) then
_log("Global AddOn file found: " ..
stadium_path .. "\\AddOn\\" .. mod_name .. "\\Global\\" .. filename )
stadium_path = stadium_path ..
"\\AddOn\\" .. mod_name .. "\\Global"
-- _log("stadium_path (global): " ..
stadium_path)
override_found = true
break
end
end

-- competitionID-based overrides
(e.g. UCL stadium boards, etc.)
if override_found == false then
for idx_key, mod_name in
pairs(ctx.stadserv_addons_list) do
if
file_exists(stadiumroot .. stadium_path .. "\\AddOn\\" .. mod_name .. "\\Comp\\" ..
comp_id .. "\\" .. filename) then
_log("Competition-
based AddOn file found: " .. stadium_path .. "\\AddOn\\" .. mod_name ..
"\\Comp\\" .. comp_id .. "\\" .. filename )
stadium_path =
stadium_path .. "\\AddOn\\" .. mod_name .. "\\Comp\\" .. comp_id
--
_log("stadium_path (competition-based): " .. stadium_path)
override_found =
true
break
end
end

-- if not stadium/pack-global
file too, then perhaps there is a uber-generic version of a file for an entire
stadium server?
if override_found == false
then
if
file_exists(stadiumroot .. "\\Super-Global\\" .. filename) then

_log("StadiumServer-Global AddOn file found: " .. "Super-Global\\" ..


filename )
stadium_path =
"Super-Global"
--
_log("stadium_path (super-global): " .. stadium_path)
override_found =
true
end
end
end
end
end
end
end
end
end

end
-- if override_found == true then
-- _log("AddOn:: Overriden file path to be used: " .. stadium_path)
-- end

return stadium_path, override_found

end

local function make_key(ctx, filename)


local custom_st_id
local custom_name
-- if ctx.is_edit_mode == nil and stadium_switched == true then -- do something
only if edit mode is NOT active
if stadium_switched == true then
if is_it_stadium_file(filename) then -- any stadium file, but preview
local new_stadium_path
local custom_st_id
local custom_name
new_stadium_path, custom_st_id, custom_name = get_new_stadium_path(ctx)
if new_stadium_path and custom_st_id then
-- if new_stadium_path and custom_st_id and file_exists(stadiumroot ..
new_stadium_path .. "\\" .. filename) then
if string.match(string.lower(filename),
"common\\bg\\model\\bg\\bill\\config\\config.xml") then
if file_exists(stadiumroot .. new_stadium_path ..
"\\" .. filename) then
log("Custom adboards config.xml found: " ..
new_stadium_path .. "\\" .. filename)
end
end
-- let's check for possible AddOn files ...
new_stadium_path, ovr_found = check_for_addon_override(ctx,
new_stadium_path, custom_st_id, filename)
if ovr_found == true then
_log("AddOn:: Full overriden file path to be used:
" .. new_stadium_path .. "\\" .. filename)
end

return new_stadium_path .. "\\" .. filename


end
end
-- now override the preview, if the stadium has already been predetermined
by the game
local spt_fname = which_stadium_preview_tex(filename)
if spt_fname then
local new_stadium_path
local custom_st_id
local custom_name
new_stadium_path, custom_st_id, custom_name = get_new_stadium_path(ctx)
if new_stadium_path then
return string.gsub(new_stadium_path .. "\\" .. filename, "\\st%d%d
%d%.dds", string.format("\\st%s.dds", custom_st_id))
end
end
end
end

local function get_filepath(ctx, filename, key)


-- if ctx.is_edit_mode == nil then -- do something only if edit mode is NOT
active
if key and filename and filename ~= key then -- filename ~= key shoud
ensure that it really is a file from custom repository, with modified path
prefix???
-- log(string.format("Stadium file assignment for team ID %s
(competition ID %s) - %s\\%s", nil2str(ctx.home_team), nil2str(ctx.tournament_id),
stadiumroot, key))
return string.format("%s\\%s", stadiumroot, key)
end
-- end
end

-- local function get_stadium_data_from_konami_stadiums_map(stadium_id)


local function get_stadium_data_from_stadiums_map(stadium_id, stad_map)
-- if stadium_id then
if stadium_id and stad_map then
-- for key, value in pairs(konami_stadiums_map) do
for key, value in pairs(stad_map) do
if value[1] == string.format("%03d", stadium_id) then
return value[2], value[3]
end
end
end
end

-- this event allows only stadium_id to be changed in options!! other params are
read-only (time of day/weather/weather effects/season)
local function set_stadium(ctx, options)
random_num_exhib = nil
random_num_comp = nil

-- if ctx.is_edit_mode == nil and ctx.tournament_id then


if ctx.tournament_id then
local tid = tonumber(ctx.tournament_id)
local custom_st_id
local custom_name
local custom_path
local map_source

if tid == 65535 then


if manual_selection_status == "On" and manual_stad_idx then
-- manual selection from overlay trumps everything
custom_st_id = all_stadiums_map[manual_stad_idx][1]
custom_name = all_stadiums_map[manual_stad_idx][2]
custom_path = all_stadiums_map[manual_stad_idx][3]
stadium_switched = true
log("Switching to stadium with ID " .. custom_st_id .. "
(exhibition mode, manual selection via overlay)")
elseif ctx.stadium_choice and ctx.stadium_choice ~= 65533 and
ctx.stadium_choice ~= 65534 then
log("ctx.stadium_choice: " .. nil2str(ctx.stadium_choice))
-- exhibition modes, and the choice is neither "Home
stadium" nor "Random" (i.e. - the choice is fixed stadium)
-- therefore, do not change the stadium
return
elseif ctx.stadium_choice and ctx.stadium_choice == 65533 then
-- handle home team assignment via map_teams.txt
if manual_selection_status == "On" and manual_stad_idx then
-- manual selection from overlay trumps everything
custom_st_id = all_stadiums_map[manual_stad_idx][1]
custom_name = all_stadiums_map[manual_stad_idx][2]
custom_path = all_stadiums_map[manual_stad_idx][3]
stadium_switched = true
log("Switching to stadium with ID " ..
custom_st_id .. " (exhibition mode, manual selection via overlay)")
elseif ctx.home_team ~= nil and
team_assignment_map[ctx.home_team] ~= nil then
custom_st_id = team_assignment_map[ctx.home_team][1]
custom_name = team_assignment_map[ctx.home_team][2]
custom_path = team_assignment_map[ctx.home_team][3]
stadium_switched = true
map_source = "exhibition mode, team-level assignment"
log("Switching to stadium with ID " ..
custom_st_id .. " (exhibition mode, team-level assignment)")
end
elseif ctx.stadium_choice and ctx.stadium_choice == 65534 then
-- exhibition modes, the choice is "Random"
-- change the stadium depending on the value of
rnd_server_or_cpk
if rnd_server_or_cpk then
if rnd_server_or_cpk == 2 then
-- if .cpk is the source (rnd_server_or_cpk ==
2), do not change the stadium
select_random_stadium_source(ctx)
map_source = "exhibition mode, random
assignment (stadium from .cpk selected)"
manual_selection_status_info =
string.format("Selection mode: %s)", map_source)
return
else
-- Random setting in exhibition modes, stadium
server is the source - always allow for random selection, even if the team has
exclusive .cpk home ground
select_random_stadium_source(ctx)
custom_st_id = all_stadiums_map[random_num_exhib][1]
custom_name = all_stadiums_map[random_num_exhib][2]
custom_path = all_stadiums_map[random_num_exhib][3]
stadium_switched = true
map_source = "exhibition mode, random assignment"
log("Switching to stadium with ID " .. custom_st_id .. " ("
.. custom_name .. ")" .. " exhibition mode, random assignment")
end
end
end
else
if manual_selection_status == "On" and manual_stad_idx then
-- manual selection from overlay trumps everything
custom_st_id = all_stadiums_map[manual_stad_idx][1]
custom_name = all_stadiums_map[manual_stad_idx][2]
custom_path = all_stadiums_map[manual_stad_idx][3]
stadium_switched = true
log("Switching to stadium with ID " .. custom_st_id .. "
(competition mode, manual selection via overlay)")
elseif ctx.home_team ~= nil and competition_assignment_map[tid]
== nil and team_assignment_map[ctx.home_team] ~= nil then
custom_st_id = team_assignment_map[ctx.home_team][1]
custom_name = team_assignment_map[ctx.home_team][2]
custom_path = team_assignment_map[ctx.home_team][3]
stadium_switched = true
map_source = "competition mode, team-level assignment"
log("Switching to stadium with ID " .. custom_st_id .. "
(competition mode, team-level assignment)")
elseif ctx.home_team ~= nil and competition_assignment_map[tid]
~= nil and team_assignment_map[ctx.home_team] ~= nil and
has_value(override_competitions, tid) == true and ctx.match_info ~= 53 then
-- comptition assignment will be overriden by team
assignment
custom_st_id = team_assignment_map[ctx.home_team][1]
custom_name = team_assignment_map[ctx.home_team][2]
custom_path = team_assignment_map[ctx.home_team][3]
stadium_switched = true
map_source = "competition mode, team-level assignment
(overrides competition-level assignment)"
log("Switching to stadium with ID " .. custom_st_id .. "
(competition mode, team-level assignment (overrides competition-level
assignment))")
elseif tid < 65535 and competition_assignment_map[tid] ~= nil
then
select_random_stadium_source(ctx)
if ctx.match_info == 53 and competition_assignment_map[tid]
[random_num_comp][4] ~= "" and competition_assignment_map[tid][random_num_comp][5]
~= "" and competition_assignment_map[tid][random_num_comp][6] ~= "" then
-- is this the final match of a competition (53)?
custom_st_id = competition_assignment_map[tid]
[random_num_comp][4]
custom_name = competition_assignment_map[tid]
[random_num_comp][5]
custom_path = competition_assignment_map[tid][random_num_comp]
[6]
stadium_switched = true
map_source = "competition mode (final match),
competition-level assignment"
log("Switching to stadium with ID " ..
custom_st_id .. " (competition mode (final match of the competition), competition-
level assignment)")
else
-- if has_value(teams_with_cpk_homegrounds,
ctx.home_team) == false and competition_assignment_map[tid][random_num_comp][1] ~=
"" and competition_assignment_map[tid][random_num_comp][2] ~= "" and
competition_assignment_map[tid][random_num_comp][3] ~= "" then
if competition_assignment_map[tid][random_num_comp]
[1] ~= "" and competition_assignment_map[tid][random_num_comp][2] ~= "" and
competition_assignment_map[tid][random_num_comp][3] ~= "" then
-- competition mode, pre-finals, no
exclusive .cpk home ground -> change the stadium
custom_st_id = competition_assignment_map[tid]
[random_num_comp][1]
custom_name = competition_assignment_map[tid]
[random_num_comp][2]
custom_path = competition_assignment_map[tid]
[random_num_comp][3]
stadium_switched = true
map_source = "competition mode, competition-
level assignment"
log("Switching to stadium with ID " ..
custom_st_id .. " (competition mode (pre-finals stage of the competition),
competition-level assignment)")
end
end
end

end

if stadium_switched == true then


-- get_stadium_config(ctx)
ctx.stadserv_addons_list = get_stadium_addon_config(ctx, custom_path)
or {}
--log("After get_stadium_addon_config - addons_list dump: ")
--for k, v in pairs(ctx.stadserv_addons_list) do
-- log(k.. ": " .. v)
--end
if manual_selection_status == "Off" then
if custom_name then
manual_selection_status_info =
string.format("Selection mode: automatic map assignments (using stadium %s, %s)",
custom_name, map_source)
elseif not custom_name then
manual_selection_status_info =
string.format("Selection mode: %s)", map_source)
end
end
if custom_st_id and custom_path then
_stadium_info[1] = custom_st_id
_stadium_info[2] = custom_name
_stadium_info[3] = custom_path
current_stadium_preview_path =
get_stadium_preview_path(_stadium_info)
_log("current_stadium_preview_path: " ..
current_stadium_preview_path)
end
return { stadium = tonumber(custom_st_id) } -- Stadium id of the served
stadium
else
current_stadium_preview_path = nil
if manual_selection_status == "Off" then
if ctx.stadium_choice and ctx.stadium_choice == 65534 and
rnd_server_or_cpk and rnd_server_or_cpk == 2 then
manual_selection_status_info =
string.format("Selection mode: %s)", map_source)
else
manual_selection_status_info =
string.format("Selection mode: automatic map assignments (using stadium: %s)",
"Custom stadium not assigned, reverting to default")
end
end
end
end
end

local function change_gfx_preview_fallback(ctx)


-- bound to after_set_conditions event -- use it only for matches where .cpk
stadiums are used, to override potentialy old data
local custom_name
local custom_path
local tid = ctx.tournament_id

--- export custom path, name and id to context


ctx.stadium_server = nil
local custom_st_id
custom_path, custom_st_id, custom_name = get_new_stadium_path(ctx)
if custom_name and custom_st_id and custom_path then
ctx.stadium_server = {['path'] = custom_path, ['id'] = custom_st_id,
['name'] = custom_name}
log(string.format("ctx.stadium_server: {path=%s, id=%s, name=%s}",
custom_path, custom_st_id, custom_name))
end
----------

-- if tid == 65535 and ctx.stadium_choice and ctx.stadium_choice ~= 65533 and


ctx.stadium_choice ~= 65534 then
if tid == 65535 and ctx.stadium_choice and ctx.stadium_choice ~= 65533 and
ctx.stadium_choice ~= 65534 and manual_selection_status == "Off" then
-- exhibition modes, and the choice is neither "Home stadium" nor "Random"
(i.e. - the choice is fixed stadium)
custom_name, custom_path =
get_stadium_data_from_stadiums_map(ctx.stadium_choice, all_stadiums_map)
custom_st_id = ctx.stadium_choice
if custom_name and custom_path then
current_stadium_preview_path = string.format("%s
%s\\common\\render\\thumbnail\\stadium\\st%03d.dds", stadiumroot, custom_path,
ctx.stadium_choice)
manual_selection_status_info = string.format("Selection mode:
exhibition mode (%s: %s)", "Fixed stadium from in-game menu", custom_name)
else
manual_selection_status_info = string.format("Selection mode:
exhibition mode (using stadium: %s)", "Fixed stadium from in-game menu")
current_stadium_preview_path = nil
end
elseif tid == 65535 and ctx.stadium_choice and ctx.stadium_choice == 65533
and team_assignment_map[ctx.home_team] ~= nil and manual_selection_status == "Off"
then
-- exhibition modes, the choice is "Home", and the team is listed in
map_teams.txt
-- custom_name, custom_path =
get_stadium_data_from_stadiums_map(ctx.stadium, all_stadiums_map)
-- unfortunately, all_stadiums_map does not guarantee unique lookup per
stadium_id any more (it used to, when it contained only default Konami stadiums)
custom_path, _, custom_name = get_new_stadium_path(ctx) -- v1.21 fix
custom_st_id = ctx.stadium_choice
if custom_name and custom_path then
current_stadium_preview_path = string.format("%s
%s\\common\\render\\thumbnail\\stadium\\st%03d.dds", stadiumroot, custom_path,
ctx.stadium)
manual_selection_status_info = string.format("Selection mode:
exhibition mode (%s: %s)", "Team-level assignment", custom_name)
else
manual_selection_status_info = string.format("Selection mode:
exhibition mode (using stadium: %s)", "??? Exclusive .cpk homeground")
current_stadium_preview_path = nil
end

elseif tid == 65535 and ctx.stadium_choice and ctx.stadium_choice == 65533


and manual_selection_status == "Off" then
-- exhibition modes, the choice is "Home", but the team is not listed in
map_teams.txt
custom_name, custom_path = get_stadium_data_from_stadiums_map(ctx.stadium,
all_stadiums_map)
custom_st_id = ctx.stadium_choice
if custom_name and custom_path then
current_stadium_preview_path = string.format("%s
%s\\common\\render\\thumbnail\\stadium\\st%03d.dds", stadiumroot, custom_path,
ctx.stadium)
manual_selection_status_info = string.format("Selection mode:
exhibition mode (%s: %s)", "Default .cpk homeground", custom_name)
else
manual_selection_status_info = string.format("Selection mode:
exhibition mode (using stadium: %s)", "Default .cpk homeground")
current_stadium_preview_path = nil
end

elseif tid < 65535 and competition_assignment_map[tid] == nil and


team_assignment_map[ctx.home_team] ~= nil then
-- this particular competiton mode does not have the stadium assigned via
map_competitions.txt
-- .. individual home team assignments from map_teams.txt has been used for
that team, unless the team already ...

-- do nothing, simply return (correct data was probably displayed


already)
return

elseif tid < 65535 and competition_assignment_map[tid] ~= nil and


team_assignment_map[ctx.home_team] ~= nil and has_value(override_competitions, tid)
and ctx.match_info ~= 53 then
-- this particular competiton mode HAS the stadium assigned via
map_competitions.txt,
-- .. but it is also listed in override_competitions,
-- .. AND it is not FINAL match (e.g. in league cup, which may possibly be
held at neutral ground - and having stadium assigned already in
map_competitions.txt),
-- .. therefore, individual home team assignments from map_teams.txt has
been used for that team again

-- do nothing, simply return (correct data was probably displayed


already)
return

-- elseif tid < 65535 and competition_assignment_map[tid] == nil then


elseif tid < 65535 and competition_assignment_map[tid] == nil and
manual_selection_status == "Off" then
-- no assignment for home team, no assignment to competition ... one of the
default .cpk stadiums was probably selected
-- just handle the preview and name on overlay
custom_name, custom_path = get_stadium_data_from_stadiums_map(ctx.stadium,
all_stadiums_map)
custom_st_id = ctx.stadium_choice
if custom_name and custom_path then
current_stadium_preview_path = string.format("%s
%s\\common\\render\\thumbnail\\stadium\\st%03d.dds", stadiumroot, custom_path,
ctx.stadium)
manual_selection_status_info = string.format("Selection mode:
competition mode (%s: %s)", "Default .cpk stadium", custom_name)
else
manual_selection_status_info = string.format("Selection mode:
competition mode (using stadium: %s)", "Default .cpk stadium")
current_stadium_preview_path = nil
end

end

-- unless already done earlier, export stadium info if known


if not ctx.stadium_server and custom_st_id and custom_path and custom_name then
ctx.stadium_server = {['path'] = custom_path, ['id'] = custom_st_id,
['name'] = custom_name}
log(string.format("ctx.stadium_server: {path=%s, id=%s, name=%s}",
custom_path, custom_st_id, custom_name))
end

end

local function change_stadium_name(ctx, stadium_name, stadium_id, schedule_entry)


local home_team = ctx.home_team
local tournament_id = ctx.tournament_id
local match_info = ctx.match_info
if schedule_entry then
log(string.format("schedule_entry: {tournament_id=%s, match_info=%s,
home_team=%s, away_team=%s}",
schedule_entry.tournament_id,
schedule_entry.match_info,
schedule_entry.home_team,
schedule_entry.away_team
))
-- we have match-specific information
-- this happens, when ML displays a schedule bar
tournament_id = schedule_entry.tournament_id
match_info = schedule_entry.match_info
home_team = schedule_entry.home_team
end

-- if ctx.is_edit_mode == nil then -- do something only if edit mode is NOT


active
if ctx.tournament_id then -- ctx.tournament_id should not be available in EDIT
mode ...
if ctx.stadium_choice and ctx.tournament_id == 65535 and not
stadium_switched then
-- if it is exhibition mode and stadium selection has not been
finalized yet ==> then do nothing.
return
end

local new_stadium_path
local custom_st_id
local new_stadium_name

-- create context copy so that we can pass it to get_new_stadium_path


-- this copy may have modified values for tournament_id, match_info and
home_team (for ML schedule bar)
local ctx_copy = {}
for k,v in pairs(ctx) do
ctx_copy[k] = v
end
ctx_copy.tournament_id = tournament_id
ctx_copy.match_info = match_info
ctx_copy.home_team = home_team

new_stadium_path, custom_st_id, new_stadium_name =


get_new_stadium_path(ctx_copy)
if new_stadium_name ~= nil and new_stadium_name ~= "" then
_log(string.format("switching stadium-name: %s --> %s", stadium_name,
new_stadium_name))
stadium_name_switched = true
return new_stadium_name
end
end
end

local function set_weather_conditions(ctx, options)


local changed = false
local external_opts = nil

-- initial check if season is set via overlay - WeatherConditions.lua makes


decisions based on season
if weather_Season > 0 then
options.season = weather_Season - 1
end

-- delegate weather decisions to WeatherConditions module


if file_exists(ctx.sider_dir .. "\\modules\\WeatherConditions.lua") and
ctx.weather_conditions then
_log("StadiumServer calling WeatherConditions ... ")
external_opts = ctx.weather_conditions.set_conditions(ctx, options,
"StadiumServer")
if external_opts then
changed = true
options = external_opts
end
_log("StadiumServer finished calling WeatherConditions.")
else
log("WeatherConditions.lua script not found or its' weather_conditions
context is not available ...")
log("Script path: " .. ctx.sider_dir ..
"\\modules\\WeatherConditions.lua")
log("ctx.weather_conditions status: " ..
nil2str(ctx.weather_conditions))
end

-- and now override options returned from WeatherConditions.lua, if non-


default settings are selected via stadium-server's overlay
if weather_TimeOfDay > 0 then
options.timeofday = weather_TimeOfDay - 1
changed = true
end
if weather_Weather > 0 then
options.weather = weather_Weather - 1
changed = true
end
if weather_WeatherEffects > 0 then
options.weather_effects = weather_WeatherEffects - 1
changed = true
end
if weather_Season > 0 then
options.season = weather_Season - 1
changed = true
end

if changed then
return options
end

end

local opts = { image_width = 0.3, image_aspect_ratio = 1.777778 }


local function overlay_on(ctx)
weather_text = string.format("Weather settings: Time of day (%s), Type of
weather (%s), Force rain/snow (%s), Season (%s)\n",
weather_TimeOfDay_Info[tostring(weather_TimeOfDay)],
weather_Weather_Info[tostring(weather_Weather)],
weather_WeatherEffects_Info[tostring(weather_WeatherEffects)],
weather_Season_Info[tostring(weather_Season)]
)

local text = string.format("version %s\nStadiumServer commands:\nPress [0] to


reload map .txt files\nPress [DEL] to clear info messages\n\nWeather options
(always active, unless set to 'Default'):\n [3] To select time of day\n
[4] To select type of weather\n [5] To enforce rain/snow\n [6] To
select season of the year\n %s\nPress [9] to switch between using map
assignments/manual selection\n Manual selection mode subcommands:\n
[PageUp][PageDn] to manually select previous/next stadium\n [7] to set
current manual selection as favorite stadium\n [8] to use your favorite
stadium \n\n%s\n%s\n\n%s", version, weather_text, manual_selection_status_info,
manual_stad_info, info_text)
local image = current_stadium_preview_path
-- if image and ctx.stadium and not file_exists(current_stadium_preview_path)
then
-- let's try with super-global folder, for Konami's .cpk stadium previews
-- current_stadium_preview_path = string.format("%s\\Super-
Global\\common\\render\\thumbnail\\stadium\\st%03d.dds", stadiumroot, ctx.stadium)
-- end

return text, image, opts


end

local function key_down(ctx, vkey)


if vkey == RELOAD_MAPS_KEY then
_log("Starting manual map files reload ... ")
load_map_txt("map_teams.txt")
load_map_txt("map_competitions.txt")
merge_maps()
manual_stad_idx = nil
manual_stad_info = "Manually selected stadium: None"
if total_stadiums > 0 then
manual_stad_idx = 1
end
info_text = info_text .. "map_teams.txt and map_competitions.txt
reloaded\n"
_log("Manual map files reloading finished.")
elseif vkey == DEL_TEXT_KEY then
info_text = ""
elseif vkey == SWITCH_SELECTION_MODE_KEY then
if manual_selection_status == "Off" then
manual_selection_status = "On"
manual_selection_status_info = "Selection mode: manual selection
[PageUp]/[PageDn]"
manual_stad_info = string.format("Manually selected stadium: %s\n",
all_stadiums_map[manual_stad_idx][2])
current_stadium_preview_path =
get_stadium_preview_path(all_stadiums_map[manual_stad_idx])
else
manual_selection_status = "Off"
manual_selection_status_info = "Selection mode: automatic map
assignments"
manual_stad_info = string.format("Manually selected stadium: None")
info_text = ""
current_stadium_preview_path = nil
end
elseif vkey == PREVIOUS_STAD_KEY then
if manual_selection_status == "On" and total_stadiums > 0 and
manual_stad_idx then
manual_stad_idx = manual_stad_idx - 1
if manual_stad_idx < 1 then
manual_stad_idx = total_stadiums
end
manual_stad_info = string.format("Manually selected stadium: %s\n",
all_stadiums_map[manual_stad_idx][2])
current_stadium_preview_path =
get_stadium_preview_path(all_stadiums_map[manual_stad_idx])
end
elseif vkey == NEXT_STAD_KEY then
if manual_selection_status == "On" and total_stadiums > 0 and
manual_stad_idx then
manual_stad_idx = manual_stad_idx + 1
if manual_stad_idx > total_stadiums then
manual_stad_idx = 1
end
manual_stad_info = string.format("Manually selected stadium: %s\n",
all_stadiums_map[manual_stad_idx][2])
current_stadium_preview_path =
get_stadium_preview_path(all_stadiums_map[manual_stad_idx])
end
elseif vkey == SET_AS_FAVORITE_STAD_KEY then
if manual_selection_status == "On" and manual_stad_idx then
if all_stadiums_map[manual_stad_idx] then
settings["favorite_stadium"] = manual_stad_idx
save_ini("config.ini")
info_text = info_text .. string.format("Stadium %s saved as
favorite\n", all_stadiums_map[manual_stad_idx][2])
else
info_text = info_text .. "Could not save favorite stadium\n"
end
end
elseif vkey == USE_FAVORITE_STAD_KEY then
if manual_selection_status == "On" and settings["favorite_stadium"] then
if all_stadiums_map[tonumber(settings["favorite_stadium"])] then
manual_stad_idx = settings["favorite_stadium"]
manual_stad_info = string.format("Manually selected stadium: %s\n",
all_stadiums_map[manual_stad_idx][2])
info_text = info_text .. string.format("Favorite stadium %s set as
active\n", all_stadiums_map[manual_stad_idx][2])
current_stadium_preview_path =
get_stadium_preview_path(all_stadiums_map[manual_stad_idx])
else
info_text = info_text .. string.format("Could not find favorite
stadium (idx: %s)\n", settings["favorite_stadium"])
end
end
elseif vkey == WEATHER_TIMEOFDAY_KEY then
weather_TimeOfDay = weather_TimeOfDay + 1
if weather_TimeOfDay > 2 then
weather_TimeOfDay = 0
end
elseif vkey == WEATHER_WEATHER_KEY then
weather_Weather = weather_Weather + 1
if weather_Weather > 3 then
weather_Weather = 0
end
elseif vkey == WEATHER_WEATHER_EFFECTS_KEY then
if weather_WeatherEffects == 0 then
weather_WeatherEffects = 3
else
weather_WeatherEffects = 0
end
elseif vkey == WEATHER_SEASON_KEY then
weather_Season = weather_Season + 1
if weather_Season > 2 then
weather_Season = 0
end
end

end

local function init(ctx)


if stadiumroot:sub(1,1)=='.' then
stadiumroot = ctx.sider_dir .. stadiumroot
end
math.randomseed(os.time())
settings = load_ini("config.ini")
load_map_txt("map_teams.txt")
load_map_txt("map_competitions.txt")
merge_maps() -- create one master-table, which is going to have one entry for
every stadium assigned - either via teams or competitions

ctx.register("set_stadium", set_stadium)
ctx.register("set_conditions", set_weather_conditions)
ctx.register("get_stadium_name", change_stadium_name)
ctx.register("livecpk_make_key", make_key)
ctx.register("livecpk_get_filepath", get_filepath)
ctx.register("set_teams", teams_selected)
ctx.register("overlay_on", overlay_on)
ctx.register("key_down", key_down)
ctx.register("after_set_conditions", change_gfx_preview_fallback)
end

return { init = init }

You might also like