638 lines
17 KiB
Lua
638 lines
17 KiB
Lua
|
|
--init fake r2 so that LD and ET scenarios index files can be loaded
|
|
|
|
|
|
GameR2Loading =
|
|
{
|
|
CurrentFile = "",
|
|
CurrentPath = "",
|
|
RingAccess = false,
|
|
bypassRingAccess = true
|
|
}
|
|
|
|
|
|
|
|
|
|
function GameR2Loading:getLoadingWindow()
|
|
return getUI("ui:interface:ring_scenario_loading_window")
|
|
end
|
|
|
|
function GameR2Loading:getFileName()
|
|
return self:getLoadingWindow():find("Name")
|
|
end
|
|
|
|
function GameR2Loading:clear()
|
|
GameR2Loading.CurrentFile = ""
|
|
GameR2Loading.CurrentPath = ""
|
|
GameR2Loading.RingAccess = false
|
|
self:getFileName().hardtext = ""
|
|
self:getLoadingWindow().active = false
|
|
|
|
local window = self:getLoadingWindow()
|
|
--this part of the code correspond to method "updateSize" for lua defined form
|
|
local rollouts = window:find("rollouts")
|
|
local deltaH = 40
|
|
window:invalidateCoords()
|
|
window:updateCoords()
|
|
local newHReal = rollouts.h_real
|
|
-- must resize the parent
|
|
local newH = newHReal + deltaH
|
|
local yOffset = newH - window.h
|
|
--propertySheet.h = newH
|
|
window.y = window.y + yOffset / 2
|
|
window.pop_min_h = newH
|
|
window.pop_max_h = newH
|
|
window:invalidateCoords()
|
|
window:updateCoords()
|
|
end
|
|
|
|
-------------------------------------------------------
|
|
-- Setters for scenario information from header
|
|
-------------------------------------------------------
|
|
function GameR2Loading:setScenarioTitle(header)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local titleWidget = win:find("Title")
|
|
--local titleWidget = getUI("ui:interface:r2ed_form_LoadScenario:content:enclosing:rollouts:0:prop_table:r_Title:widget_group:scenario_title")
|
|
if header.Title then
|
|
titleWidget.hardtext = header.Title
|
|
else
|
|
titleWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioDesc(header)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local descWidget = win:find("Description")
|
|
if header.ShortDescription then
|
|
descWidget.hardtext = header.ShortDescription
|
|
else
|
|
descWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioRules(header)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local rulesWidget = win:find("Rules")
|
|
if header.Rules then
|
|
rulesWidget.hardtext = header.Rules
|
|
else
|
|
rulesWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioLevel(header)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local lvlWidget = win:find("Level")
|
|
if header.Level then
|
|
lvlWidget.hardtext = header.Level
|
|
else
|
|
lvlWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioLanguage(header)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local lvlWidget = win:find("Language")
|
|
if header.Language then
|
|
local language = "uiR2ED"..header.Language
|
|
lvlWidget.hardtext = i18n.get(language):toUtf8()
|
|
else
|
|
lvlWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioRingAccess(header)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local accessWidget = win:find("RingPointsLevel")
|
|
--
|
|
--Bypassed ring access while not properly working when entering the ring from ryzom
|
|
if self.bypassRingAccess == true then
|
|
accessWidget.active = false
|
|
local accessWidgetTitle = win:find("RingPointsLevel_Caption")
|
|
accessWidgetTitle.active = false
|
|
return
|
|
end
|
|
------------------------
|
|
--------------------------
|
|
|
|
local okButton = win:find("validate")
|
|
|
|
if getDbProp("SERVER:USER:IS_NEWBIE") == 1 and isPlayerFreeTrial() and not header.OtherCharAccess or header.OtherCharAccess ~= "RoSOnly" then
|
|
accessWidget.hardtext = i18n.get("uiR2EDLoadScenario_No"):toUtf8()
|
|
okButton.frozen = true
|
|
end
|
|
|
|
if header.RingPointLevel then
|
|
self.RingAccess = game.checkRingAccess(header.RingPointLevel)
|
|
if self.RingAccess == true then
|
|
|
|
accessWidget.hardtext = i18n.get("uiR2EDLoadScenario_Yes"):toUtf8()
|
|
else
|
|
accessWidget.hardtext = i18n.get("uiR2EDLoadScenario_No"):toUtf8()
|
|
end
|
|
|
|
okButton.frozen = not self.RingAccess
|
|
else
|
|
accessWidget.hardtext = ""
|
|
okButton.frozen = false
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioAuthor(header, rating)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local authorWidget = win:find("Author")
|
|
--local ratingStr = " ("..tostring(rating)..")"
|
|
if header.CreateBy then
|
|
authorWidget.hardtext = header.CreateBy
|
|
else
|
|
authorWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
|
|
--RATINGS
|
|
function GameR2Loading:setScenarioFunRating(rating)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local funWidget = win:find("FunRating")
|
|
if rating then
|
|
funWidget.hardtext = tostring(rating)
|
|
else
|
|
funWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioDifficultyRating(rating)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local diffWidget = win:find("DifficultyRating")
|
|
if rating then
|
|
diffWidget.hardtext = tostring(rating)
|
|
else
|
|
diffWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioAccessibilityRating(rating)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local accessWidget = win:find("AccessibilityRating")
|
|
if rating then
|
|
accessWidget.hardtext = tostring(rating)
|
|
else
|
|
accessWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioOriginalityRating(rating)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local origWidget = win:find("OriginalityRating")
|
|
if rating then
|
|
origWidget.hardtext = tostring(rating)
|
|
else
|
|
origWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioDirectionRating(rating)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local directionWidget = win:find("DirectionRating")
|
|
if rating then
|
|
directionWidget.hardtext = tostring(rating)
|
|
else
|
|
directionWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
function GameR2Loading:setScenarioRRPTotal(rrpTotal)
|
|
local win = self:getLoadingWindow()
|
|
assert(win)
|
|
local rrpWidget = win:find("RRPTotal")
|
|
if rrpTotal then
|
|
rrpWidget.hardtext = tostring(rrpTotal)
|
|
else
|
|
rrpWidget.hardtext = ""
|
|
end
|
|
end
|
|
|
|
|
|
function GameR2Loading:initWindow()
|
|
if not r2 then
|
|
r2 = {}
|
|
end
|
|
|
|
local emptyHeader = {}
|
|
self:setScenarioTitle(emptyHeader)
|
|
self:setScenarioDesc(emptyHeader)
|
|
self:setScenarioRules(emptyHeader)
|
|
self:setScenarioLevel(emptyHeader)
|
|
self:setScenarioLanguage(emptyHeader)
|
|
self:setScenarioRingAccess(emptyHeader)
|
|
self:setScenarioAuthor(emptyHeader, 0)
|
|
|
|
--self:setScenarioFunRating()
|
|
--self:setScenarioDifficultyRating()
|
|
--self:setScenarioOriginalityRating()
|
|
--self:setScenarioAccessibilityRating()
|
|
--self:setScenarioDirectionRating()
|
|
--self:setScenarioRRPTotal()
|
|
|
|
self:getFileName().hardtext = ""
|
|
|
|
|
|
end
|
|
|
|
function GameR2Loading:setCurrSelectedFile(filename, path)
|
|
local window = self:getLoadingWindow()
|
|
assert(window)
|
|
|
|
if getUICaller().pushed then
|
|
getUICaller().pushed = true
|
|
end
|
|
|
|
--formInstance.LastFileButton = getUICaller()
|
|
--r2.CurrentForm.Env.FormInstance.Name = filename
|
|
--GameR2Loading.Env.FormInstance.Name = filename
|
|
|
|
local formName = window:find("Name")
|
|
formName.hardtext = filename
|
|
GameR2Loading.CurrentFile = filename
|
|
|
|
GameR2Loading.CurrentPath = path
|
|
|
|
local header = game.getFileHeader(path..filename)
|
|
|
|
--tmp
|
|
local authorRating = 42
|
|
--debugInfo("### CHECKING BODYMD5 ###")
|
|
--if header and header.BodyMD5 then
|
|
-- debugInfo("BodyMD5: *" ..tostring(header.BodyMD5))
|
|
-- game.getScenarioAverageScores(tostring(header.BodyMD5))
|
|
--end
|
|
--debugInfo("### ****** ###")
|
|
|
|
if header then
|
|
self:setScenarioTitle(header)
|
|
self:setScenarioAuthor(header, authorRating)
|
|
self:setScenarioDesc(header)
|
|
self:setScenarioRules(header)
|
|
self:setScenarioLevel(header)
|
|
self:setScenarioLanguage(header)
|
|
self:setScenarioRingAccess(header)
|
|
|
|
--self:setScenarioFunRating(42)
|
|
--self:setScenarioDifficultyRating(43)
|
|
--self:setScenarioOriginalityRating(44)
|
|
--self:setScenarioAccessibilityRating(45)
|
|
--self:setScenarioDirectionRating(46)
|
|
--self:setScenarioRRPTotal(47)
|
|
end
|
|
|
|
--this part of the code corresponds to method "updateSize" for lua defined form
|
|
local rollouts = window:find("rollouts")
|
|
local deltaH = 40
|
|
window:invalidateCoords()
|
|
window:updateCoords()
|
|
local newHReal = rollouts.h_real
|
|
-- must resize the parent
|
|
local newH = newHReal + deltaH
|
|
local yOffset = newH - window.h
|
|
--propertySheet.h = newH
|
|
window.y = window.y + yOffset / 2
|
|
window.pop_min_h = newH
|
|
window.pop_max_h = newH
|
|
window:invalidateCoords()
|
|
window:updateCoords()
|
|
end
|
|
|
|
|
|
function GameR2Loading:buildScenarioTree()
|
|
|
|
local window = self:getLoadingWindow()
|
|
if not window then
|
|
debugInfo("GameR2Loading:buildScenarioTree: failed to get ui")
|
|
return
|
|
end
|
|
|
|
local tree = window:find('tree_list')
|
|
assert(tree)
|
|
|
|
local rootNode = SNode()
|
|
rootNode.Id = "root"
|
|
rootNode.Text = "Scenarios"
|
|
rootNode.Opened = false
|
|
--rootNode.Bitmap = "r2ed_icon_macro_components.tga"
|
|
tree:setRootNode(rootNode)
|
|
|
|
function addNodeToParent(name, id, parentId)
|
|
local parentNode = rootNode:getNodeFromId(parentId)
|
|
|
|
addedNode = SNode()
|
|
--local text = i18n.hasTranslation(parentCategory)
|
|
--if not text then text = parentCategory else text = i18n.get(parentCategory) end
|
|
addedNode.Text = name
|
|
addedNode.Id = id
|
|
addedNode.Opened = false
|
|
parentNode:addChild(addedNode)
|
|
end
|
|
|
|
function parseDirectory(nodeId, searchPath)
|
|
local destNode = rootNode:getNodeFromId(nodeId)
|
|
local autosaveNode = rootNode:getNodeFromId("autosave")
|
|
local files = getPathContent(searchPath)
|
|
table.sort(files)
|
|
for k, v in pairs(files) do
|
|
if string.lower(nlfile.getExtension(v)) == "r2" then
|
|
local shortFilename = nlfile.getFilename(v)
|
|
local shortFileEscape=string.gsub(shortFilename, "'", "\\'")
|
|
local fileLeaf= SNode()
|
|
fileLeaf.Id = shortFilename
|
|
local len = string.len(shortFilename) - 3
|
|
fileLeaf.Text = string.sub(shortFilename,0, len)
|
|
fileLeaf.AHName = "lua"
|
|
fileLeaf.AHParams = "GameR2Loading:setCurrSelectedFile('" .. shortFileEscape .. "', '"..searchPath.."')"
|
|
|
|
--if autosave file, plug it in the autosave branch
|
|
if string.find(shortFilename, "autosave") ~= nil then
|
|
autosaveNode:addChild(fileLeaf)
|
|
else
|
|
destNode:addChild(fileLeaf)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function loadLDScenariosFromFile()
|
|
--if using a bnp, use doFile method instead
|
|
local fileListOk = loadfile("examples/r2_leveldesign_scenarios.lua")
|
|
if fileListOk then
|
|
fileListOk()
|
|
end
|
|
local files = r2.LevelDesignScenarios
|
|
for parentId, fileEntries in pairs(files) do
|
|
local parentNode = rootNode:getNodeFromId(parentId)
|
|
if not parentNode then
|
|
addNodeToParent(parentId, parentId, "root")
|
|
parentNode = rootNode:getNodeFromId(parentId)
|
|
end
|
|
for k, v in pairs(fileEntries) do
|
|
local fileLeaf= SNode()
|
|
fileLeaf.Id = v[1]
|
|
local len = string.len(v[1]) - 3
|
|
fileLeaf.Text = string.gsub(string.sub(v[1],0, len), "_", " ")
|
|
fileLeaf.AHName = "lua"
|
|
fileLeaf.AHParams = "GameR2Loading:setCurrSelectedFile('" .. v[1] .. "', './Examples/')"
|
|
parentNode:addChild(fileLeaf)
|
|
end
|
|
end
|
|
end
|
|
|
|
function loadETScenariosFromFile()
|
|
--if using a bnp, use doFile method instead
|
|
local fileListOk = loadfile("examples/r2_event_team_scenarios.lua")
|
|
if fileListOk then
|
|
fileListOk()
|
|
end
|
|
local files = r2.EventTeamScenarios
|
|
for parentId, fileEntries in pairs(files) do
|
|
local parentNode = rootNode:getNodeFromId(parentId)
|
|
if not parentNode then
|
|
addNodeToParent(parentId, parentId, "root")
|
|
parentNode = rootNode:getNodeFromId(parentId)
|
|
end
|
|
for k, v in pairs(fileEntries) do
|
|
local fileLeaf= SNode()
|
|
fileLeaf.Id = v[1]
|
|
local len = string.len(v[1]) - 3
|
|
fileLeaf.Text = string.gsub(string.sub(v[1],0, len), "_", " ")
|
|
fileLeaf.AHName = "lua"
|
|
fileLeaf.AHParams = "GameR2Loading:setCurrSelectedFile('" .. v[1] .. "', './Examples/')"
|
|
parentNode:addChild(fileLeaf)
|
|
end
|
|
end
|
|
end
|
|
|
|
function loadNewbieScenariosFromFile()
|
|
--if using a bnp, use doFile method instead
|
|
local fileListOk = loadfile("examples/r2_newbieland_scenarios.lua")
|
|
if fileListOk then
|
|
fileListOk()
|
|
end
|
|
local files = r2.NewbielandScenarios
|
|
if files then
|
|
for parentId, fileEntries in pairs(files) do
|
|
local parentNode = rootNode:getNodeFromId(parentId)
|
|
if not parentNode then
|
|
addNodeToParent(parentId, parentId, "root")
|
|
parentNode = rootNode:getNodeFromId(parentId)
|
|
end
|
|
for k, v in pairs(fileEntries) do
|
|
local fileLeaf= SNode()
|
|
fileLeaf.Id = v[1]
|
|
local len = string.len(v[1]) - 3
|
|
fileLeaf.Text = string.gsub(string.sub(v[1],0, len), "_", " ")
|
|
fileLeaf.AHName = "lua"
|
|
fileLeaf.AHParams = "GameR2Loading:setCurrSelectedFile('" .. v[1] .. "', './Examples/')"
|
|
parentNode:addChild(fileLeaf)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--LEVELDESIGN SCENARIOS
|
|
--addNodeToParent("Examples", "examples", "root")
|
|
--addNodeToParent("Simple", "simple", "examples")
|
|
loadLDScenariosFromFile()
|
|
|
|
--EVENTTEAM SCENARIOS
|
|
loadETScenariosFromFile()
|
|
|
|
--NEWBIELAND SCENARIOS
|
|
loadNewbieScenariosFromFile()
|
|
|
|
--MY SCENARIOS
|
|
addNodeToParent("My Files", "my_files", "root")
|
|
addNodeToParent("Autosave", "autosave", "my_files")
|
|
addNodeToParent("My scenarios", "my_scenarios", "my_files")
|
|
parseDirectory("my_scenarios", "./My_scenarios/")
|
|
|
|
--Tmp branch for old scenarios
|
|
addNodeToParent("Old scenarios", "old", "root")
|
|
parseDirectory("old", "./")
|
|
|
|
tree:forceRebuild()
|
|
end
|
|
|
|
|
|
|
|
function GameR2Loading:displayLoadingWindow()
|
|
|
|
self:initWindow()
|
|
local isInNoobLand = getDbProp("SERVER:USER:IS_NEWBIE")
|
|
if isInNoobLand == 1 and isPlayerFreeTrial() then
|
|
self:buildNewbielandScenarioTree()
|
|
else
|
|
self:buildScenarioTree()
|
|
end
|
|
local window = self:getLoadingWindow()
|
|
if not window then
|
|
debugInfo("GameR2Loading:DisplayLoadingWindow: failed to get ui")
|
|
return
|
|
end
|
|
--this part of the code correspond to method "updateSize" for lua defined form
|
|
local rollouts = window:find("rollouts")
|
|
local deltaH = 40
|
|
window:invalidateCoords()
|
|
window:updateCoords()
|
|
local newHReal = rollouts.h_real
|
|
-- must resize the parent
|
|
local newH = newHReal + deltaH
|
|
local yOffset = newH - window.h
|
|
--propertySheet.h = newH
|
|
window.y = window.y + yOffset / 2
|
|
window.pop_min_h = newH
|
|
window.pop_max_h = newH
|
|
window:invalidateCoords()
|
|
window:updateCoords()
|
|
window.active = true
|
|
|
|
local scenarioControlWnd = getUI("ui:interface:r2ed_scenario_control")
|
|
if scenarioControlWnd.active then
|
|
scenarioControlWnd.active = false
|
|
end
|
|
end
|
|
|
|
|
|
function GameR2Loading:validateLoading()
|
|
|
|
if GameR2Loading.CurrentFile == "" then
|
|
messageBox(i18n.get("uiR2EDLoadScenario_InvalidFileName"))
|
|
return
|
|
end
|
|
|
|
local filename = GameR2Loading.CurrentFile
|
|
|
|
if string.find(filename, '.r2', -3) == nil then
|
|
messageBox(i18n.get("uiR2EDLoadScenario_InvalidFileName"))
|
|
return
|
|
end
|
|
|
|
if GameR2Loading.CurrentPath == "" then
|
|
messageBox(i18n.get("uiR2EDLoadScenario_InvalidFileName"))
|
|
return
|
|
end
|
|
local path = GameR2Loading.CurrentPath
|
|
|
|
local extendedFileName = filename
|
|
if path and path ~= "" then
|
|
extendedFileName = path..filename
|
|
end
|
|
|
|
if getDbProp("SERVER:USER:IS_NEWBIE")==0 then
|
|
getUI("ui:interface:r2ed_scenario_control").active=true
|
|
runAH(nil, "scenario_information", "ScenarioName="..extendedFileName)
|
|
else
|
|
runAH(nil, "init_scenario_control", "")
|
|
runAH(nil, "scenario_information", "ScenarioName="..extendedFileName)
|
|
runAH(nil, "load_scenario", "")
|
|
end
|
|
self:getLoadingWindow().active = false
|
|
self:clear()
|
|
|
|
end
|
|
|
|
function GameR2Loading:cancelLoading()
|
|
self:getLoadingWindow().active = false
|
|
self:clear()
|
|
runAH(nil, "open_ring_sessions", "")
|
|
end
|
|
|
|
function GameR2Loading:getTreeTooltip()
|
|
local tree = getUI("ui:interface:ring_scenario_loading_window"):find('tree_list')
|
|
|
|
local isInNoobLand = getDbProp("SERVER:USER:IS_NEWBIE")
|
|
if isInNoobLand == 1 and isPlayerFreeTrial() then
|
|
tree.tooltip = i18n.get("uiR2EdPropertyToolTip_LoadScenario_LoadScenario_NewbieTreeInfo"):toUtf8()
|
|
else
|
|
tree.tooltip = i18n.get("uiR2EdPropertyToolTip_LoadScenario_LoadScenario_TreeInfo"):toUtf8()
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
------ NEWBIELAND LOADING WINDOW
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
function GameR2Loading:buildNewbielandScenarioTree()
|
|
|
|
local window = self:getLoadingWindow()
|
|
if not window then
|
|
debugInfo("GameR2Loading:buildScenarioTree: failed to get ui")
|
|
return
|
|
end
|
|
|
|
local tree = window:find('tree_list')
|
|
assert(tree)
|
|
|
|
local rootNode = SNode()
|
|
rootNode.Id = "root"
|
|
rootNode.Text = "Scenarios"
|
|
rootNode.Opened = false
|
|
--rootNode.Bitmap = "r2ed_icon_macro_components.tga"
|
|
tree:setRootNode(rootNode)
|
|
|
|
function addNodeToParent(name, id, parentId)
|
|
local parentNode = rootNode:getNodeFromId(parentId)
|
|
|
|
addedNode = SNode()
|
|
--local text = i18n.hasTranslation(parentCategory)
|
|
--if not text then text = parentCategory else text = i18n.get(parentCategory) end
|
|
addedNode.Text = name
|
|
addedNode.Id = id
|
|
addedNode.Opened = false
|
|
parentNode:addChild(addedNode)
|
|
end
|
|
|
|
function loadNewbieScenariosFromFile()
|
|
--if using a bnp, use doFile method instead
|
|
local fileListOk = loadfile("examples/r2_newbieland_scenarios.lua")
|
|
if fileListOk then
|
|
fileListOk()
|
|
end
|
|
local files = r2.NewbielandScenarios
|
|
for parentId, fileEntries in pairs(files) do
|
|
local parentNode = rootNode:getNodeFromId(parentId)
|
|
if not parentNode then
|
|
addNodeToParent(parentId, parentId, "root")
|
|
parentNode = rootNode:getNodeFromId(parentId)
|
|
end
|
|
for k, v in pairs(fileEntries) do
|
|
local fileLeaf= SNode()
|
|
fileLeaf.Id = v[1]
|
|
local len = string.len(v[1]) - 3
|
|
fileLeaf.Text = string.gsub(string.sub(v[1],0, len), "_", " ")
|
|
fileLeaf.AHName = "lua"
|
|
fileLeaf.AHParams = "GameR2Loading:setCurrSelectedFile('" .. v[1] .. "', './Examples/')"
|
|
parentNode:addChild(fileLeaf)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
--NEWBIELAND SCENARIOS
|
|
loadNewbieScenariosFromFile()
|
|
|
|
tree:forceRebuild()
|
|
end
|
|
|