if isDemo() then return end
require "ISUI/ISPanel"
require "ISUI/ISButton"
require "ISUI/ISInventoryPane"
require "ISUI/ISResizeWidget"
require "ISUI/ISMouseDrag"
require "defines"
LoadGameScreen = ISPanelJoypad:derive("LoadGameScreen");
local FONT_HGT_SMALL = getTextManager():getFontHeight(UIFont.Small)
local FONT_HGT_LARGE = getTextManager():getFontHeight(UIFont.Large)
local FONT_HGT_TITLE = getTextManager():getFontHeight(UIFont.Title)
-- -- -- -- --
-- -- -- -- --
-- -- -- -- --
local SaveInfoPanel = ISPanelJoypad:derive("LoadGameScreen_InfoPanel")
function SaveInfoPanel:createChildren()
self.richText = ISRichTextPanel:new(0, 10, 200, 200)
self.richText:initialise()
self.richText:instantiate()
self.richText.background = false
self.richText.marginLeft = 10
self.richText:setAnchorBottom(true)
self.richText:setAnchorRight(true)
self.richText:setVisible(false)
self.richText:setScrollWithParent(true)
self:addChild(self.richText)
end
function SaveInfoPanel:setRichText()
local selectedItem = self.parent.listbox.items[self.parent.listbox.selected]
if selectedItem == self.richTextItem then return end
self.richTextItem = selectedItem
local text = "
" .. selectedItem.item.saveName .. " "
local mode = getTextOrNull("IGUI_Gametime_" .. selectedItem.item.gameMode)
if not mode then mode = selectedItem.item.gameMode end
text = text .. getText("IGUI_Gametime_GameMode", mode) .. " "
text = text .. selectedItem.item.lastPlayed .. " "
self.parent:checkMapsAvailable(selectedItem.item)
local mapName = selectedItem.item.mapName
local folders = mapName:split(";")
text = text .. getText("UI_Map") .. " "
for _,folder in ipairs(folders) do
if selectedItem.item.mapMissing[folder] then
text = text .. " "
else
text = text .. " "
end
local info = getMapInfo(folder)
if info then
folder = info.title
end
text = text .. folder .. " "
end
text = text .. " "
text = text .. getText("UI_LoadGameScreen_Mods") .. " "
local activeMods = selectedItem.item.activeMods
if activeMods == nil then
text = text .. getText("UI_LoadGameScreen_NoModsTxt") .. " "
elseif activeMods:getMods():isEmpty() then
text = text .. getText("UI_LoadGameScreen_NoMods") .. " "
else
for i=1,activeMods:getMods():size() do
local modID = activeMods:getMods():get(i-1)
local modInfo = getModInfoByID(modID)
if modInfo == nil then
text = text .. " "
elseif not modInfo:isAvailable() then
text = text .. " "
modID = modInfo:getName()
else
text = text .. " "
modID = modInfo:getName()
end
text = text .. modID .. " "
end
end
text = text .. " "
local canNotLoadText = " " .. getText("UI_worldscreen_SaveCannotBeLoaded")
local versionText = " " .. getText("UI_worldscreen_SavefileVersion", selectedItem.item.worldVersion or '???', IsoWorld.getWorldVersion())
text = text .. getText("UI_WorldVersion") ..selectedItem.item.worldVersion .. " "
local worldVersion = tonumber(selectedItem.item.worldVersion)
if not worldVersion or not selectedItem.item.mapName then
text = text .. canNotLoadText .. " " .. getText("UI_mainscreen_SavefileNotFound") .. " "
elseif not selectedItem.item.mapsAvailable then
text = text .. canNotLoadText .. " " .. getText("UI_worldscreen_MapNotFound") .. " "
elseif selectedItem.item.worldVersion == 0 then
text = text .. canNotLoadText .. " " .. getText("UI_worldscreen_SavefileCorrupt") .. " "
-- elseif selectedItem.item.worldVersion == 175 then
-- text = text .. canNotLoadText .. " " .. getText("UI_worldscreen_SavefileOld") .. " " .. getText("UI_worldscreen_SavefileUseBeta41_50") .. versionText .. " "
elseif selectedItem.item.worldVersion <= 175 then
text = text .. canNotLoadText .. " " .. getText("UI_worldscreen_SavefileOld") .. versionText .. " "
elseif selectedItem.item.worldVersion > IsoWorld.getWorldVersion() then
text = text .. canNotLoadText .. " " .. getText("UI_worldscreen_SavefileNewerThanGame") .. versionText .. " "
end
self.richText.text = text
self.richText:paginate()
end
function SaveInfoPanel:prerender()
self:setStencilRect(0, 0, self.width, self.height)
local selectedItem = self.parent.listbox.items[self.parent.listbox.selected]
local thumbHeight = 256
if selectedItem.thumb == nil and selectedItem.thumbMissing ~= true then
-- FIXME: should unload these after choosing a savegame
selectedItem.thumb = getTextureFromSaveDir("thumb.png", selectedItem.text)
if selectedItem.thumb == nil then
selectedItem.thumbMissing = true
end
end
if selectedItem.thumb then
thumbHeight = selectedItem.thumb:getHeight()
local BreakPoint = (self.width - thumbHeight) / 2
self:drawTexture(selectedItem.thumb, BreakPoint, 10, 1, 1, 1, 1)
end
local descRectWidth = self.width
local descRectHeight = self.height
-- ISRichTextPanel.drawMargins = true
self.richText:setX(0)
self.richText:setY(thumbHeight + 10 + self:getYScroll())
self.richText:setWidth(self.width - 17)
self.richText:setVisible(true)
self:setRichText()
self:setScrollHeight(thumbHeight + 10 + self.richText:getHeight())
self:doRightJoystickScrolling(20, 20)
end
function SaveInfoPanel:render()
self:clearStencilRect()
if self.joyfocus then
self:drawRectBorder(0, -self:getYScroll(), self:getWidth(), self:getHeight(), 0.4, 0.2, 1.0, 1.0);
self:drawRectBorder(1, 1-self:getYScroll(), self:getWidth()-2, self:getHeight()-2, 0.4, 0.2, 1.0, 1.0);
else
self:drawRectBorderStatic(0, 0, self.width, self.height, 0.3, 1, 1, 1)
end
end
function SaveInfoPanel:onMouseWheel(del)
self:setYScroll(self:getYScroll() - (del * 50))
return true
end
function SaveInfoPanel:onJoypadDirUp(joypadData)
self:setYScroll(self:getYScroll() + 48)
end
function SaveInfoPanel:onJoypadDirDown(joypadData)
self:setYScroll(self:getYScroll() - 48)
end
-- -- -- -- --
-- -- -- -- --
-- -- -- -- --
local ConfigPanel = ISPanelJoypad:derive("LoadGameScreen_ConfigPanel")
function ConfigPanel:createChildren()
local x = 20
local y = 20
local buttonHgt = math.max(25, FONT_HGT_SMALL + 3 * 2)
local buttonWid = 200
local richText = self:createRichText(x, y, getText("UI_LoadGameScreen_ChooseModsText"))
y = richText:getBottom()
self.buttonMods = self:createButton(x, y, buttonWid, buttonHgt,
getText("UI_LoadGameScreen_ButtonChooseMods"),
ConfigPanel.onChooseMods)
y = self.buttonMods:getBottom()
-----
richText = self:createRichText(x, y + 10, getText("UI_LoadGameScreen_ChoosePlayer1"))
y = richText:getBottom()
local comboHgt = math.max(buttonHgt, FONT_HGT_SMALL + 3 * 2)
local combo = ISComboBox:new(x, y, 200, comboHgt, self, self.onPlayerSelected)
self:addChild(combo)
combo.disabled = true
combo.selected = 1
self.comboPlayer1 = combo
y = self.comboPlayer1:getBottom()
self.buttonNewPlayer = ISButton:new(combo:getRight() + 10, combo.y, buttonWid, comboHgt, getText("UI_LoadGameScreen_ButtonNewPlayer"), self, ConfigPanel.onNewPlayer)
self:addChild(self.buttonNewPlayer)
y = self.buttonNewPlayer:getBottom()
-----
if isDesktopOpenSupported() then
richText = self:createRichText(x, y + 10, getText("UI_LoadGameScreen_BrowseFilesText"))
y = richText:getBottom()
self.buttonBrowse = self:createButton(x, y, buttonWid, buttonHgt,
getText("UI_LoadGameScreen_ButtonBrowseFiles"),
ConfigPanel.onBrowseFiles)
y = self.buttonBrowse:getBottom()
end
-----
richText = self:createRichText(x, y + 10, getText("UI_LoadGameScreen_RenameSavefileText"))
y = richText:getBottom()
local entry = ISTextEntryBox:new("", x, y, 200, comboHgt)
self:addChild(entry)
self.renameSavefileEntry = entry
self.buttonRenameSavefile = ISButton:new(entry:getRight() + 10, entry.y, buttonWid, comboHgt, getText("UI_LoadGameScreen_ButtonRenameSavefile"), self, ConfigPanel.onRenameSavefile)
self:addChild(self.buttonRenameSavefile)
y = entry:getBottom()
-----
if getDebug() then
local richText = self:createRichText(x, y + 10, "DEBUG: Delete selected files from this savefile.")
y = richText:getBottom()
local comboHgt = math.max(buttonHgt, FONT_HGT_SMALL + 3 * 2)
local combo = ISComboBox:new(x, y, 200, comboHgt)
self:addChild(combo)
combo:addOptionWithData("chunkdata_x_y.bin", "DeleteChunkDataXYBin")
combo:addOptionWithData("map_x_y.bin", "DeleteMapXYBin")
combo:addOptionWithData("map_meta.bin", "DeleteMapMetaBin")
combo:addOptionWithData("map_zone.bin", "DeleteMapZoneBin")
combo:addOptionWithData("map_t.bin", "DeleteMapTBin")
combo:addOptionWithData("players.db", "DeletePlayersDB")
combo:addOptionWithData("reanimated.bin", "DeleteReanimatedBin")
combo:addOptionWithData("vehicles.db", "DeleteVehiclesDB")
combo:addOptionWithData("z_outfits.bin", "DeleteZOutfitsBin")
combo:addOptionWithData("zpop_virtual.bin", "DeleteZPopVirtualBin")
combo:addOptionWithData("zpop_x_y.bin", "DeleteZPopXYBin")
combo.selected = 1
self.comboDeleteFiles = combo
button = ISButton:new(combo:getRight() + 10, combo.y, buttonWid, comboHgt, "DELETE", self, ConfigPanel.onDeleteFiles)
self:addChild(button)
self.buttonDeleteFiles = button
y = button:getBottom()
end
self:setScrollChildren(true)
self:setScrollHeight(y + 20)
self:insertNewLineOfButtons(self.buttonMods)
self:insertNewLineOfButtons(self.comboPlayer1, self.buttonNewPlayer)
self:insertNewLineOfButtons(self.renameSavefileEntry, self.buttonRenameSavefile)
if self.buttonBrowse then
self:insertNewLineOfButtons(self.buttonBrowse)
end
if self.comboDeleteFiles then
self:insertNewLineOfButtons(self.comboDeleteFiles, self.buttonDeleteFiles)
end
self.joypadIndexY = 1
self.joypadIndex = 1
self.joypadButtons = self.joypadButtonsY[self.joypadIndexY]
end
function ConfigPanel:createRichText(x, y, richText1)
local richText = ISRichTextPanel:new(0, y, self.width, 20)
richText:initialise()
richText:instantiate()
richText:setAnchorRight(true)
richText.background = false
richText.marginLeft = 20
richText:setScrollWithParent(true)
self:addChild(richText)
richText.text = richText1
richText:paginate()
return richText
end
function ConfigPanel:createButton(x, y, buttonWid, buttonHgt, buttonText, command)
local button = ISButton:new(x, y, buttonWid, buttonHgt, buttonText, self, command)
-- button:setScrollWithParent(true)
self:addChild(button)
return button
end
function ConfigPanel:prerender()
self:setStencilRect(0, 0, self.width, self.height)
ISPanelJoypad.prerender(self)
if self:validateSavefileName(self.renameSavefileEntry:getText()) then
self.renameSavefileEntry.borderColor.r = 0.4
self.renameSavefileEntry.borderColor.g = 0.4
self.renameSavefileEntry.borderColor.b = 0.4
self.renameSavefileEntry.borderColor.a = 1.0
self.buttonRenameSavefile:setEnable(true)
else
self.renameSavefileEntry.borderColor.r = 0.4
self.renameSavefileEntry.borderColor.g = 0.0
self.renameSavefileEntry.borderColor.b = 0.0
self.renameSavefileEntry.borderColor.a = 0.9
self.buttonRenameSavefile:setEnable(false)
if not self.renameSavefileEntry:isFocused() then
self.renameSavefileEntry:setText(self.saveInfo.saveName)
end
end
end
function ConfigPanel:render()
self:clearStencilRect()
if self.joyfocus then
self:drawRectBorder(0, -self:getYScroll(), self:getWidth(), self:getHeight(), 0.4, 0.2, 1.0, 1.0);
self:drawRectBorder(1, 1-self:getYScroll(), self:getWidth()-2, self:getHeight()-2, 0.4, 0.2, 1.0, 1.0);
end
ISPanelJoypad.render(self)
end
function ConfigPanel:onChooseMods(button)
LoadGameScreen.instance:hideConfigPanel()
LoadGameScreen.instance:setVisible(false)
local selected = LoadGameScreen.instance.listbox.items[LoadGameScreen.instance.listbox.selected]
local folder = selected.text
ModSelector.instance:setExistingSavefile(folder)
ModSelector.instance:populateListBox(getModDirectoryTable())
ModSelector.instance:setVisible(true, self.parent.joyfocus)
ModSelector.showNagPanel()
end
function ConfigPanel:validateSavefileName(text)
if text == self.saveInfo.saveName then return true end
local worldName = sanitizeWorldName(text)
if worldName == "" or worldName ~= text or luautils.stringStarts(worldName, ".") or luautils.stringEnds(worldName, ".") then
return false
end
local checkExistName = self.saveInfo.gameMode .. getFileSeparator() .. worldName
if checkExistName ~= self.checkExistsName then
self.checkExistsName = checkExistName
self.checkExist = checkSaveFolderExists(checkExistName)
end
return not self.checkExist
end
function ConfigPanel:setSavefile(folder, info)
local combo = self.comboPlayer1
combo:clear()
if not info.playerAlive then
combo:addOptionWithData(getText("UI_LoadGameScreen_NoPlayer1"), nil)
combo.selected = 1
end
combo.disabled = #info.players == 0
for _,player in ipairs(info.players) do
if not player.isDead then
combo:addOptionWithData(player.name, player)
if player.sqlID == 1 then
combo.selected = #combo.options
end
end
end
self.renameSavefileEntry:setText(info.saveName)
self.checkExistsName = nil
self.saveFolder = folder
self.saveInfo = info
end
function ConfigPanel:onPlayerSelected(combo)
local player = combo:getOptionData(combo.selected)
if not player then return end -- NONE
setSavefilePlayer1(self.saveInfo.gameMode, self.saveInfo.saveName, player.sqlID)
-- Update the list of players
local info = getSaveInfo(self.saveFolder)
self.saveInfo.playerAlive = info.playerAlive
self.saveInfo.players = info.players
self:setSavefile(self.saveFolder, self.saveInfo)
end
function ConfigPanel:onNewPlayer(combo)
setSavefilePlayer1(self.saveInfo.gameMode, self.saveInfo.saveName, -1)
-- Update the list of players
local info = getSaveInfo(self.saveFolder)
self.saveInfo.playerAlive = info.playerAlive
self.saveInfo.players = info.players
self:setSavefile(self.saveFolder, self.saveInfo)
-- Create a new character
if LoadGameScreen.instance.playButton:isEnabled() then
LoadGameScreen.instance.playButton:forceClick()
end
end
function ConfigPanel:onRenameSavefile(button)
if renameSavefile(self.saveInfo.gameMode, self.saveInfo.saveName, self.renameSavefileEntry:getText()) then
self.saveInfo.saveName = self.renameSavefileEntry:getText()
self.checkExistsName = self.saveInfo.saveName
end
end
function ConfigPanel:onBrowseFiles(button)
local selected = LoadGameScreen.instance.listbox.items[LoadGameScreen.instance.listbox.selected]
local folder = getAbsoluteSaveFolderName(selected.text)
showFolderInDesktop(folder)
end
function ConfigPanel:onDeleteFiles(button)
local selected = LoadGameScreen.instance.listbox.items[LoadGameScreen.instance.listbox.selected]
local folder = selected.text
local arg = self.comboDeleteFiles:getOptionData(self.comboDeleteFiles.selected)
manipulateSavefile(folder, arg)
end
function ConfigPanel:onMouseWheel(del)
self:setYScroll(self:getYScroll() - (del * 50))
return true
end
-- -- -- -- --
-- -- -- -- --
-- -- -- -- --
function LoadGameScreen:initialise()
ISPanel.initialise(self);
end
--************************************************************************--
--** ISPanel:instantiate
--**
--************************************************************************--
function LoadGameScreen:instantiate()
--self:initialise();
self.javaObject = UIElement.new(self);
self.javaObject:setX(self.x);
self.javaObject:setY(self.y);
self.javaObject:setHeight(self.height);
self.javaObject:setWidth(self.width);
self.javaObject:setAnchorLeft(self.anchorLeft);
self.javaObject:setAnchorRight(self.anchorRight);
self.javaObject:setAnchorTop(self.anchorTop);
self.javaObject:setAnchorBottom(self.anchorBottom);
end
function LoadGameScreen:setSaveGamesList()
self.listbox:clear();
local dirs = getFullSaveDirectoryTable();
for i, k in ipairs(dirs) do
local newSave = {};
-- we create an item with somes info, like the last time we played that save
local info = getSaveInfo(k)
newSave.lastPlayed = getLastPlayedDate(k);
newSave.worldVersion = info.worldVersion or 'unknown'
newSave.mapName = info.mapName or 'Muldraugh, KY'
newSave.activeMods = info.activeMods
newSave.saveName = info.saveName;
newSave.gameMode = info.gameMode;
newSave.playerAlive = info.playerAlive
newSave.players = info.players
self.listbox:addItem(k, newSave);--{age = self:getWorldAge(k)});
end
end
function LoadGameScreen:hasChoices()
return #self.listbox.items > 0
end
function LoadGameScreen:create()
local buttonHgt = math.max(25, FONT_HGT_SMALL + 3 * 2)
self.listbox = ISScrollingListBox:new(16, self.startY, self.width / 2, self.height - 5 - buttonHgt - self.startY - 10);
self.listbox:initialise();
self.listbox:instantiate();
self.listbox:setAnchorLeft(true);
-- self.listbox:setAnchorRight(true);
self.listbox:setAnchorTop(true);
self.listbox:setAnchorBottom(true);
self.listbox.drawBorder = true
self.listbox.itemheight = FONT_HGT_SMALL + FONT_HGT_LARGE + 10;
self.listbox.doDrawItem = LoadGameScreen.drawMap;
self.listbox:setOnMouseDoubleClick(self, LoadGameScreen.onDblClickWorld);
self.listbox:setOnMouseDownFunction(self, LoadGameScreen.onClickWorld);
self.listbox.onGainJoypadFocus = self.onGainJoypadFocus_child
self.listbox.onLoseJoypadFocus = self.onLoseJoypadFocus_child
self.listbox.onJoypadBeforeDeactivate = self.onJoypadBeforeDeactivate_child
self.listbox.onJoypadDirRight = self.onJoypadDirRight_child
self:addChild(self.listbox);
self.configPanel = ConfigPanel:new(self.listbox.x, self.listbox.y, self.listbox.width, self.listbox.height)
self.configPanel:initialise()
self.configPanel:instantiate()
self.configPanel:setAnchorLeft(true)
self.configPanel:setAnchorTop(true)
self.configPanel:setAnchorBottom(true)
self.configPanel:addScrollBars()
self.configPanel.onGainJoypadFocus = self.onGainJoypadFocus_child
self.configPanel.onLoseJoypadFocus = self.onLoseJoypadFocus_child
self.configPanel.onJoypadDirRight = self.onJoypadDirRight_child
self.configPanel.onJoypadBeforeDeactivate = self.onJoypadBeforeDeactivate_child
self:addChild(self.configPanel)
self.configPanel:setVisible(false)
local x = self.listbox:getRight() + 16
self.infoPanel = SaveInfoPanel:new(x, self.startY, self.width - 16 - x, self.listbox.height)
self.infoPanel.onGainJoypadFocus = self.onGainJoypadFocus_child
self.infoPanel.onJoypadDirLeft = self.onJoypadDirLeft_child
self.infoPanel:initialise()
self.infoPanel:instantiate()
self.infoPanel:setAnchorLeft(false)
self.infoPanel:setAnchorRight(false)
self.infoPanel:setAnchorTop(true)
self.infoPanel:setAnchorBottom(true)
self.infoPanel:addScrollBars()
self:addChild(self.infoPanel)
self.backButton = ISButton:new(16, self.height - buttonHgt - 5, 100, buttonHgt, getText("UI_btn_back"), self, LoadGameScreen.onOptionMouseDown);
self.backButton.internal = "BACK";
self.backButton:initialise();
self.backButton:instantiate();
self.backButton:setAnchorLeft(true);
self.backButton:setAnchorTop(false);
self.backButton:setAnchorBottom(true);
self.backButton.borderColor = {r=1, g=1, b=1, a=0.1};
self.backButton:setFont(UIFont.Small);
self.backButton:ignoreWidthChange();
self.backButton:ignoreHeightChange();
self:addChild(self.backButton);
self.playButton = ISButton:new(self.width - 116, self.height - buttonHgt - 5, 100, buttonHgt, getText("UI_btn_play"), self, LoadGameScreen.onOptionMouseDown);
self.playButton.internal = "PLAY";
self.playButton:initialise();
self.playButton:instantiate();
self.playButton:setAnchorLeft(false);
self.playButton:setAnchorRight(true);
self.playButton:setAnchorTop(false);
self.playButton:setAnchorBottom(true);
self.playButton.borderColor = {r=1, g=1, b=1, a=0.1};
self.playButton:setSound("activate", nil)
self:addChild(self.playButton);
self.configButton = ISButton:new(self.playButton.x - 110, self.height - buttonHgt - 5, 100, buttonHgt, getText("UI_LoadGameScreen_ButtonConfig"), self, LoadGameScreen.onOptionMouseDown);
self.configButton.internal = "CONFIG";
self.configButton:initialise();
self.configButton:instantiate();
self.configButton:setAnchorLeft(false);
self.configButton:setAnchorRight(true);
self.configButton:setAnchorTop(false);
self.configButton:setAnchorBottom(true);
self.configButton.borderColor = {r=1, g=1, b=1, a=0.1};
self:addChild(self.configButton);
self.deleteButton = ISButton:new(self.configButton.x - 110, self.height - buttonHgt - 5, 100, buttonHgt, getText("UI_btn_delete"), self, LoadGameScreen.onOptionMouseDown);
self.deleteButton.internal = "DELETE";
self.deleteButton:initialise();
self.deleteButton:instantiate();
self.deleteButton:setAnchorLeft(false);
self.deleteButton:setAnchorRight(true);
self.deleteButton:setAnchorTop(false);
self.deleteButton:setAnchorBottom(true);
self.deleteButton.borderColor = {r=1, g=1, b=1, a=0.1};
self.deleteButton:setFont(UIFont.Small);
self.deleteButton:ignoreWidthChange();
self.deleteButton:ignoreHeightChange();
self:addChild(self.deleteButton);
self.playButton:setX(self.width - 16 - self.playButton.width)
self.configButton:setX(self.playButton.x - 10 - self.configButton.width)
self.deleteButton:setX(self.configButton.x - 10 - self.deleteButton.width)
self.richText = ISRichTextPanel:new(16, 10, 500,200);
self.richText:initialise();
self.richText.background = false;
self.richText:setAnchorBottom(true);
self.richText:setAnchorRight(true);
self.richText:setVisible(false);
self:addChild(self.richText);
self:setVisible(false);
end
function LoadGameScreen:drawMap(y, item, alt)
local isMouseOver = self.mouseoverselected == item.index and not self:isMouseOverScrollBar()
if self.selected == item.index then
self:drawRect(0, (y), self:getWidth(), self.itemheight-1, 0.3, 0.7, 0.35, 0.15);
elseif isMouseOver then
self:drawRect(1, y + 1, self:getWidth() - 2, item.height - 2, 0.95, 0.05, 0.05, 0.05);
end
local mode = getTextOrNull("IGUI_Gametime_" .. item.item.gameMode)
if not mode then mode = item.item.gameMode end
self:drawText(mode, 20, (y)+5, 0.9, 0.9, 0.9, 0.9, UIFont.NewSmall);
self:drawText(item.item.saveName, 20, (y)+5+FONT_HGT_SMALL, 0.9, 0.9, 0.9, 0.9, UIFont.NewLarge);
self:drawRectBorder(0, (y), self:getWidth(), self.itemheight-1, 0.5, self.borderColor.r, self.borderColor.g, self.borderColor.b);
if not item.item.playerAlive and self.parent.deadTexture then
local tex = self.parent.deadTexture
local dy = (self.itemheight - tex:getHeightOrig()) / 2
self:drawTexture(tex, self:getWidth() - 24 - tex:getWidthOrig(), y + dy, 1, 1, 1, 1)
end
self.itemheightoverride[item.text] = self.itemheight;
y = y + self.itemheightoverride[item.text];
return y;
end
function LoadGameScreen:render()
self.deleteButton:setVisible(false);
self.playButton:setVisible(false);
if self.listbox.items[self.listbox.selected] then
self.playButton:setVisible(true);
self.configButton:setVisible(true);
self.deleteButton:setVisible(true);
end
end
function LoadGameScreen:prerender()
LoadGameScreen.instance = self
ISPanel.prerender(self);
self:drawTextCentre(getText("UI_LoadGameScreen_title"), self.width / 2, 10, 1, 1, 1, 1, UIFont.Title);
self:disableBtn()
end
LoadGameScreen.onClickWorld = function()
if MainScreen.instance.loadScreen.modal then
MainScreen.instance.loadScreen.modal:setVisible(false);
MainScreen.instance.loadScreen.modal:removeFromUIManager();
end
end
function LoadGameScreen:showConfigPanel()
self.listbox:setVisible(false)
local item = self.listbox.items[self.listbox.selected]
self.configPanel:setSavefile(item.text, item.item)
self.configPanel:setVisible(true, self.joyfocus)
self.configButton:setTitle(getText("UI_LoadGameScreen_ButtonFiles"))
end
function LoadGameScreen:hideConfigPanel()
self.listbox:setVisible(true, self.joyfocus)
self.configPanel:setVisible(false)
self.configButton:setTitle(getText("UI_LoadGameScreen_ButtonConfig"))
end
function LoadGameScreen:onOptionMouseDown(button, x, y)
if self.modal then
self.modal:setVisible(false);
self.modal = nil;
end
if button.internal == "BACK" then
self:hideConfigPanel()
self:setVisible(false);
MainScreen.instance.bottomPanel:setVisible(true);
if self.joyfocus then
self.joyfocus.focus = MainScreen.instance;
updateJoypadFocus(self.joyfocus);
end
end
if button.internal == "PLAY" then
self:hideConfigPanel()
self:clickPlay();
end
if button.internal == "DELETE" then
self.modal = ISModalDialog:new((getCore():getScreenWidth() / 2) - 130, (getCore():getScreenHeight() / 2) - 60, 260, 120, getText("UI_worldscreen_deletesave"), true, self, LoadGameScreen.onDeleteModalClick);
self.modal:initialise();
self.modal:addToUIManager();
if self.joyfocus then
self.joyfocus.focus = self.modal;
updateJoypadFocus(self.joyfocus);
end
end
if button.internal == "CONFIG" then
if self.listbox:isVisible() then
self:showConfigPanel()
else
self:hideConfigPanel()
end
end
end
function LoadGameScreen:onDblClickWorld()
self.playButton:forceClick()
end
function LoadGameScreen:clickPlay()
local sel = self.listbox.items[self.listbox.selected];
if not sel then
return
end
self:setVisible(false);
MainScreen.instance.bottomPanel:setVisible(true);
if self.joyfocus then
self.joyfocus.focus = MainScreen.instance;
updateJoypadFocus(self.joyfocus);
end
local gameMode = sel.item.gameMode;
local saveName = sel.item.saveName;
MainScreen.continueLatestSave(gameMode, saveName);
end
function LoadGameScreen:onDeleteModalClick(button)
if LoadGameScreen.instance.joyfocus then
LoadGameScreen.instance.joyfocus.focus = LoadGameScreen.instance.listbox
updateJoypadFocus(LoadGameScreen.instance.joyfocus)
end
if button.internal == "YES" then
local sel = LoadGameScreen.instance.listbox.items[LoadGameScreen.instance.listbox.selected];
LoadGameScreen.instance.listbox:removeItemByIndex(LoadGameScreen.instance.listbox.selected)
deleteSave(sel.text);
LoadGameScreen.instance.listbox.joypadListIndex = 1;
LoadGameScreen.instance.listbox.selected = 1;
if #LoadGameScreen.instance.listbox.items == 0 then
LoadGameScreen.instance:setVisible(false);
MainScreen.instance.loadOption:setVisible(false)
MainScreen.instance.latestSaveOption:setVisible(false)
MainScreen.instance.soloScreen:setVisible(true, self.joyfocus)
MainScreen.instance.soloScreen.onMenuItemMouseDown(MainScreen.instance.soloScreen.survival,0,0);
else
LoadGameScreen.instance:setVisible(true, self.joyfocus);
end
end
end
function LoadGameScreen:onErrorLoadingClick(button)
if LoadGameScreen.instance.joyfocus then
LoadGameScreen.instance.joyfocus.focus = LoadGameScreen.instance.listbox
updateJoypadFocus(LoadGameScreen.instance.joyfocus)
end
end
function LoadGameScreen:onGainJoypadFocus(joypadData)
ISPanelJoypad.onGainJoypadFocus(self, joypadData);
if self.listbox:isVisible() then
joypadData.focus = self.listbox;
self.listbox.joypadFocused = true;
else
joypadData.focus = self.configPanel;
end
updateJoypadFocus(joypadData);
end
function LoadGameScreen:onJoypadBeforeDeactivate(joypadData)
self.playButton:clearJoypadButton()
self.backButton:clearJoypadButton()
self.configButton:clearJoypadButton()
self.deleteButton:clearJoypadButton()
self.listbox.joypadFocused = false
self.joyfocus = nil
end
function LoadGameScreen:onGainJoypadFocus_child(joypadData)
ISPanelJoypad.onGainJoypadFocus(self, joypadData)
self:setISButtonForA(self.parent.playButton)
self:setISButtonForB(self.parent.backButton)
self:setISButtonForX(self.parent.configButton)
self:setISButtonForY(self.parent.deleteButton)
if self == self.parent.listbox then
self.joypadFocused = true
end
if #self.joypadButtons >= 1 and self.joypadIndex <= #self.joypadButtons then
self.joypadButtons[self.joypadIndex]:setJoypadFocused(true, joypadData)
end
end
function LoadGameScreen:onLoseJoypadFocus_child(joypadData)
ISPanelJoypad.onLoseJoypadFocus(self, joypadData)
self:clearJoypadFocus()
if self == self.parent.listbox then
self.joypadFocused = false
end
end
function LoadGameScreen:onJoypadBeforeDeactivate_child(joypadData)
self.parent:onJoypadBeforeDeactivate(joypadData)
end
function LoadGameScreen:onJoypadDirLeft_child(joypadData)
joypadData.focus = self.parent.listbox:isVisible() and self.parent.listbox or self.parent.configPanel
updateJoypadFocus(joypadData)
end
function LoadGameScreen:onJoypadDirRight_child(joypadData)
local children = self:getVisibleChildren(self.joypadIndexY)
if #children > 0 and self.joypadIndex ~= #children then
ISPanelJoypad.onJoypadDirRight(self)
return
end
self.parent.listbox.joypadFocused = false
joypadData.focus = self.parent.infoPanel
updateJoypadFocus(joypadData)
end
function LoadGameScreen:getChallenge(item)
for i,challenge in ipairs(LastStandChallenge) do
if challenge.gameMode == item.gameMode then
return challenge
end
end
return nil
end
function LoadGameScreen:checkChallenge(item)
local challenge = self:getChallenge(item)
if challenge then
if challenge.world ~= item.mapName then
-- The map is available but is the wrong one for this challenge.
end
end
end
function LoadGameScreen:checkMapsAvailable(item)
if item.mapsAvailable ~= nil then
return item.mapsAvailable
end
item.mapsAvailable = true
item.mapMissing = {}
local activeMods = item.activeMods or ActiveMods.getById("default")
self.mapGroups:createGroups(activeMods, true, true)
local lotDirs = self.mapGroups:getAllMapsInOrder()
local mapNames = luautils.split(item.mapName, ";")
for i=1,#mapNames do
if not lotDirs:contains(mapNames[i]) then
item.mapsAvailable = false
item.mapMissing[mapNames[i]] = true
end
end
return item.mapsAvailable
end
function LoadGameScreen:disableBtn()
local sel = self.listbox.items[self.listbox.selected]
if sel and sel.item then
local worldVersion = tonumber(sel.item.worldVersion)
if not worldVersion or not sel.item.mapName then
self.playButton:setEnable(false)
elseif worldVersion > IsoWorld.getWorldVersion() then
self.playButton:setEnable(false)
elseif worldVersion <= 175 then
self.playButton:setEnable(false)
elseif not self:checkMapsAvailable(sel.item) then
self.playButton:setEnable(false)
else
self.playButton:setEnable(true)
end
else
self.playButton:setEnable(false)
self.configButton:setEnable(false)
self.deleteButton:setEnable(false)
end
end
function LoadGameScreen:onSavefileModsChanged(folder)
for _,item in ipairs(self.listbox.items) do
if item.text == folder then
local info = getSaveInfo(folder)
item.item.activeMods = info.activeMods
item.item.mapsAvailable = nil
self.infoPanel.richTextItem = nil
break
end
end
end
function LoadGameScreen:onResolutionChange(oldw, oldh, neww, newh)
self.listbox:setWidth(self.width / 2)
self.configPanel:setWidth(self.width / 2)
local x = self.listbox:getRight() + 16
self.infoPanel:setX(x)
self.infoPanel:setWidth(self.width - 16 - x)
end
function LoadGameScreen:new(x, y, width, height)
local o = {}
--o.data = {}
o = ISPanelJoypad:new(x, y, width, height);
setmetatable(o, self)
self.__index = self
o.x = x;
o.y = y;
o.backgroundColor = {r=0, g=0, b=0, a=0.3};
o.borderColor = {r=1, g=1, b=1, a=0.2};
o.width = width;
o.height = height;
o.anchorLeft = true;
o.anchorRight = false;
o.anchorTop = true;
o.anchorBottom = false;
o.itemheightoverride = {}
o.selected = 1;
o.startY = 10 + FONT_HGT_TITLE + 10;
o.deadTexture = getTexture("media/ui/Moodles/Moodle_Icon_Dead.png")
o.mapGroups = MapGroups.new()
LoadGameScreen.instance = o;
return o
end
function LoadGameScreen.OnKeyPressed(key)
if LoadGameScreen.instance and LoadGameScreen.instance:isVisible() then
local listbox = LoadGameScreen.instance.listbox
if not listbox:isReallyVisible() then return end
if (key == Keyboard.KEY_DELETE) then
LoadGameScreen.instance.deleteButton:forceClick()
end
if (key == Keyboard.KEY_UP) then
listbox.selected = listbox.selected - 1
if listbox.selected <= 0 then
listbox.selected = listbox:size()
end
listbox:ensureVisible(listbox.selected)
end
if key == Keyboard.KEY_DOWN then
listbox.selected = listbox.selected + 1
if listbox.selected > listbox:size() then
listbox.selected = 1
end
listbox:ensureVisible(listbox.selected)
end
end
end
function LoadGameScreen_onModsModified()
local self = LoadGameScreen.instance
if self and self.listbox and self:isReallyVisible() then
self.infoPanel.richTextItem = nil
for _,item in ipairs(self.listbox.items) do
item.item.mapsAvailable = nil
end
end
end
Events.OnModsModified.Add(LoadGameScreen_onModsModified)
Events.OnKeyPressed.Add(LoadGameScreen.OnKeyPressed)