mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-04 20:57:49 +00:00
339 lines
11 KiB
Lua
339 lines
11 KiB
Lua
-- Written by Kip Turner, Copyright ROBLOX 2015
|
|
|
|
-- App's Main
|
|
|
|
local CoreGui = Game:GetService("CoreGui")
|
|
local ContentProvider = Game:GetService("ContentProvider")
|
|
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
|
|
local Modules = GuiRoot:FindFirstChild("Modules")
|
|
-- TODO: Will use for re-auth when finished
|
|
local UserInputService = game:GetService('UserInputService')
|
|
local PlatformService = nil
|
|
pcall(function() PlatformService = game:GetService('PlatformService') end)
|
|
|
|
local Utility = require(Modules:FindFirstChild('Utility'))
|
|
local GlobalSettings = require(Modules:FindFirstChild('GlobalSettings'))
|
|
local AppHubModule = require(Modules:FindFirstChild('AppHub'))
|
|
local ScreenManager = require(Modules:FindFirstChild('ScreenManager'))
|
|
local Errors = require(Modules:FindFirstChild('Errors'))
|
|
local ErrorOverlay = require(Modules:FindFirstChild('ErrorOverlay'))
|
|
local EventHub = require(Modules:FindFirstChild('EventHub'))
|
|
local GameGenreModule = require(Modules:FindFirstChild('GameGenre'))
|
|
local GameDetailModule = require(Modules:FindFirstChild('GameDetail'))
|
|
local OverscanScreenModule = require(Modules:FindFirstChild('OverscanScreen'))
|
|
local EngagementScreenModule = require(Modules:FindFirstChild('EngagementScreen'))
|
|
local BadgeScreenModule = require(Modules:FindFirstChild('BadgeScreen'))
|
|
local CameraManager = require(Modules:FindFirstChild('CameraManager'))
|
|
local FriendsData = require(Modules:FindFirstChild('FriendsData'))
|
|
local UserData = require(Modules:FindFirstChild('UserData'))
|
|
local SoundManager = require(Modules:FindFirstChild('SoundManager'))
|
|
local AchievementManager = require(Modules:FindFirstChild('AchievementManager'))
|
|
local HeroStatsManager = require(Modules:FindFirstChild('HeroStatsManager'))
|
|
local ControllerStateManager = require(Modules:FindFirstChild('ControllerStateManager'))
|
|
local Strings = require(Modules:FindFirstChild('LocalizedStrings'))
|
|
|
|
local TIME_BETWEEN_BACKGROUND_TRANSITIONS = 30
|
|
local CROSSFADE_DURATION = 1.5
|
|
|
|
local BACKGROUND_ASSETS =
|
|
{
|
|
'Home_screen_01.png';
|
|
'Home_screen_02.png';
|
|
'Home_screen_03.png';
|
|
'Home_screen_04.png';
|
|
}
|
|
|
|
local AppHomeContainer = Utility.Create'Frame'
|
|
{
|
|
Size = UDim2.new(1, 0, 1, 0);
|
|
BackgroundTransparency = 0;
|
|
BorderSizePixel = 0;
|
|
BackgroundColor3 = Color3.new(0,0,0);
|
|
Name = 'AppHomeContainer';
|
|
Parent = GuiRoot;
|
|
}
|
|
|
|
|
|
local BackgroundAssetIndex = 1
|
|
local Background = Utility.Create'ImageLabel'
|
|
{
|
|
Size = UDim2.new(1, 0, 1, 0);
|
|
BackgroundTransparency = 0;
|
|
BorderSizePixel = 0;
|
|
Name = 'Background';
|
|
Image = 'rbxasset://textures/ui/Shell/Background/' .. BACKGROUND_ASSETS[BackgroundAssetIndex];
|
|
Parent = AppHomeContainer;
|
|
}
|
|
local CrossfadeBackground = Utility.Create'ImageLabel'
|
|
{
|
|
Size = UDim2.new(1, 0, 1, 0);
|
|
BackgroundTransparency = 1;
|
|
BorderSizePixel = 0;
|
|
Name = 'CrossfadeBackground';
|
|
Image = '';
|
|
Parent = Background;
|
|
}
|
|
|
|
Background.ImageTransparency = 0
|
|
|
|
-- get fast flags for 3D backgrounds
|
|
local Is3DBackgroundEnabled = true
|
|
|
|
|
|
-- print ("BACKGROUND")
|
|
-- print (Background3DSuccess)
|
|
-- print (Background3DValue)
|
|
|
|
local soundHandle = SoundManager:Play('BackgroundLoop', 0.33, true)
|
|
if soundHandle then
|
|
local bgmLoopConn = nil
|
|
bgmLoopConn = soundHandle.DidLoop:connect(function(soundId, loopCount)
|
|
-- print("DidLoop BackgroundLoop" , soundId, "times:", loopCount)
|
|
if loopCount >= 1 then
|
|
bgmLoopConn = Utility.DisconnectEvent(bgmLoopConn)
|
|
if soundHandle then
|
|
-- print("Volume fade out")
|
|
SoundManager:TweenSound(soundHandle, 0.1, 3)
|
|
-- Utility.PropertyTweener(soundHandle, 'Volume', soundHandle.Volume, 0.1, 3, Utility.EaseInOutQuad, true)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
if Is3DBackgroundEnabled then
|
|
spawn(function()
|
|
|
|
while true do
|
|
local queueSize = ContentProvider.RequestQueueSize
|
|
|
|
if queueSize == 0 then
|
|
CameraManager:StartTransitionScreenEffect()
|
|
CameraManager:EnableCameraControl()
|
|
|
|
spawn(function()
|
|
CameraManager:CameraMoveToAsync()
|
|
end)
|
|
|
|
AppHomeContainer.BackgroundTransparency = 1
|
|
Background.BackgroundTransparency = 1;
|
|
Background.ImageTransparency = 1
|
|
CrossfadeBackground.ImageTransparency = 1
|
|
|
|
Utility.PropertyTweener(Background, 'ImageTransparency', 0, 1, CROSSFADE_DURATION, Utility.EaseInOutQuad, true)
|
|
break
|
|
end
|
|
|
|
wait(0.01)
|
|
end
|
|
|
|
end)
|
|
else
|
|
spawn(function()
|
|
|
|
CameraManager:StartTransitionScreenEffect()
|
|
|
|
while true do
|
|
wait(TIME_BETWEEN_BACKGROUND_TRANSITIONS)
|
|
|
|
-- 1-based modulo indexing
|
|
BackgroundAssetIndex = ((BackgroundAssetIndex) % #BACKGROUND_ASSETS) + 1
|
|
|
|
CrossfadeBackground.Image = Background.Image
|
|
CrossfadeBackground.ImageTransparency = 0
|
|
Background.Image = 'rbxasset://textures/ui/Shell/Background/' .. BACKGROUND_ASSETS[BackgroundAssetIndex];
|
|
Background.ImageTransparency = 1
|
|
|
|
Utility.PropertyTweener(Background, 'ImageTransparency', 1, 0, CROSSFADE_DURATION, Utility.EaseInOutQuad, true)
|
|
wait(CROSSFADE_DURATION)
|
|
Utility.PropertyTweener(CrossfadeBackground, 'ImageTransparency', 0, 1, CROSSFADE_DURATION, Utility.EaseInOutQuad, true)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local AspectRatioProtector = Utility.Create'Frame'
|
|
{
|
|
Size = UDim2.new(1, 0, 1, 0);
|
|
Position = UDim2.new(0,0,0,0);
|
|
BackgroundTransparency = 1;
|
|
Name = 'AspectRatioProtector';
|
|
Parent = CrossfadeBackground;
|
|
}
|
|
|
|
local function OnAbsoluteSizeChanged()
|
|
local newSize = Utility.CalculateFit(GuiRoot, Vector2.new(16,9))
|
|
if newSize ~= AspectRatioProtector.Size then
|
|
AspectRatioProtector.Size = newSize
|
|
Utility.CalculateAnchor(AspectRatioProtector, UDim2.new(0.5,0,0.5,0), Utility.Enum.Anchor.Center)
|
|
end
|
|
end
|
|
|
|
GuiRoot.Changed:connect(function(prop)
|
|
if prop == 'AbsoluteSize' then
|
|
OnAbsoluteSizeChanged()
|
|
end
|
|
end)
|
|
OnAbsoluteSizeChanged()
|
|
|
|
local ActionSafeContainer = Utility.Create'Frame'
|
|
{
|
|
Size = UDim2.new(1, 0, 1, 0) - (GlobalSettings.ActionSafeInset + GlobalSettings.ActionSafeInset);
|
|
Position = UDim2.new(0,0,0,0) + GlobalSettings.ActionSafeInset;
|
|
BackgroundTransparency = 1;
|
|
Name = 'ActionSafeContainer';
|
|
Parent = AspectRatioProtector;
|
|
}
|
|
|
|
local titleActionSafeDelta = GlobalSettings.TitleSafeInset -- - GlobalSettings.ActionSafeInset
|
|
|
|
local TitleSafeContainer = Utility.Create'Frame'
|
|
{
|
|
Size = UDim2.new(1, 0, 1, 0) - (titleActionSafeDelta + titleActionSafeDelta);
|
|
Position = UDim2.new(0,0,0,0) + titleActionSafeDelta;
|
|
BackgroundTransparency = 1;
|
|
Name = 'TitleSafeContainer';
|
|
Parent = ActionSafeContainer;
|
|
}
|
|
|
|
local EngagementScreen = EngagementScreenModule()
|
|
EngagementScreen:SetParent(TitleSafeContainer)
|
|
|
|
local userInputConn = nil
|
|
|
|
local function returnToEngagementScreen()
|
|
if ScreenManager:ContainsScreen(EngagementScreen) then
|
|
while ScreenManager:GetTopScreen() ~= EngagementScreen do
|
|
ScreenManager:CloseCurrent()
|
|
end
|
|
else
|
|
while ScreenManager:GetTopScreen() do
|
|
ScreenManager:CloseCurrent()
|
|
end
|
|
ScreenManager:OpenScreen(EngagementScreen)
|
|
end
|
|
end
|
|
|
|
local AppHub = nil
|
|
local OverscanScreen = nil
|
|
local function onAuthenticationSuccess(isNewLinkedAccount)
|
|
-- Set UserData
|
|
UserData:Initialize()
|
|
|
|
-- Unwind Screens if needed - this will be needed once we put in account linking
|
|
returnToEngagementScreen()
|
|
|
|
AppHub = AppHubModule()
|
|
AppHub:SetParent(TitleSafeContainer)
|
|
|
|
EventHub:addEventListener(EventHub.Notifications["OpenGameDetail"], "gameDetail",
|
|
function(placeId, placeName, iconId, gameData)
|
|
local gameDetail = GameDetailModule(placeId, placeName, iconId, gameData)
|
|
gameDetail:SetParent(TitleSafeContainer);
|
|
ScreenManager:OpenScreen(gameDetail);
|
|
end);
|
|
EventHub:addEventListener(EventHub.Notifications["OpenGameGenre"], "gameGenre",
|
|
function(sortName, gameCollection)
|
|
local gameGenre = GameGenreModule(sortName, gameCollection)
|
|
gameGenre:SetParent(TitleSafeContainer);
|
|
ScreenManager:OpenScreen(gameGenre);
|
|
end);
|
|
EventHub:addEventListener(EventHub.Notifications["OpenBadgeScreen"], "gameBadges",
|
|
function(badgeData, previousScreenName)
|
|
local badgeScreen = BadgeScreenModule(badgeData, previousScreenName)
|
|
badgeScreen:SetParent(TitleSafeContainer);
|
|
ScreenManager:OpenScreen(badgeScreen);
|
|
end)
|
|
EventHub:addEventListener(EventHub.Notifications["OpenSocialScreen"], "socialScreen",
|
|
function(socialScreen)
|
|
socialScreen:SetParent(TitleSafeContainer);
|
|
ScreenManager:OpenScreen(socialScreen);
|
|
end)
|
|
EventHub:addEventListener(EventHub.Notifications["OpenSettingsScreen"], "settingsScreen",
|
|
function(settingsScreen)
|
|
settingsScreen:SetParent(TitleSafeContainer);
|
|
ScreenManager:OpenScreen(settingsScreen);
|
|
end)
|
|
OverscanScreen = OverscanScreenModule(AppHomeContainer)
|
|
EventHub:addEventListener(EventHub.Notifications["OpenOverscanScreen"], "openOverscan", function(data) ScreenManager:OpenScreen(OverscanScreen) end)
|
|
|
|
Utility.DisconnectEvent(userInputConn)
|
|
userInputConn = UserInputService.InputBegan:connect(function(input, processed)
|
|
if input.KeyCode == Enum.KeyCode.ButtonX then
|
|
EventHub:dispatchEvent(EventHub.Notifications["TestXButtonPressed"])
|
|
end
|
|
end)
|
|
|
|
-- disable control control
|
|
CameraManager:DisableCameraControl()
|
|
|
|
print("User and Event initialization finished. Opening AppHub")
|
|
ScreenManager:OpenScreen(AppHub);
|
|
|
|
ControllerStateManager:Initialize()
|
|
-- retro check
|
|
ControllerStateManager:CheckUserConnected()
|
|
|
|
-- show info popup to users on newly linked accounts
|
|
if isNewLinkedAccount == true then
|
|
local titleAndMsg = {
|
|
Title = Strings:LocalizedString('PlatformLinkInfoTitle');
|
|
Msg = Strings:LocalizedString('PlatformLinkInfoMessage');
|
|
}
|
|
ScreenManager:OpenScreen(ErrorOverlay(titleAndMsg, true), false)
|
|
end
|
|
end
|
|
|
|
local function onReAuthentication(reauthenticationReason)
|
|
print("Beging Reauth, cleaning things up")
|
|
-- unwind ScreenManager
|
|
returnToEngagementScreen()
|
|
|
|
UserData:Reset()
|
|
FriendsData.Reset()
|
|
AppHub = nil
|
|
OverscanScreen = nil
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenGameDetail"], "gameDetail")
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenGameGenre"], "gameGenre")
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenBadgeScreen"], "gameBadges")
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenSocialScreen"], "socialScreen")
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenOverscanScreen"], "openOverscan")
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenSocialScreen"], "socialScreen")
|
|
EventHub:removeEventListener(EventHub.Notifications["OpenSettingsScreen"], "settingsScreen")
|
|
userInputConn = Utility.DisconnectEvent(userInputConn)
|
|
print("Reauth complete. Return to engagement screen.")
|
|
|
|
-- show reason overlay
|
|
local alert = Errors.Reauthentication[reauthenticationReason] or Errors.Default
|
|
ScreenManager:OpenScreen(ErrorOverlay(alert, true), false)
|
|
|
|
-- re-enable camera control
|
|
CameraManager:EnableCameraControl()
|
|
end
|
|
|
|
local function onGameJoin(joinResult)
|
|
-- 0 is success, anything else is an error
|
|
local joinSuccess = joinResult == 0
|
|
if not joinSuccess then
|
|
local err = Errors.GameJoin[joinResult] or Errors.Default
|
|
ScreenManager:OpenScreen(ErrorOverlay(err), false)
|
|
end
|
|
EventHub:dispatchEvent(EventHub.Notifications["GameJoin"], joinSuccess)
|
|
end
|
|
|
|
if PlatformService then
|
|
PlatformService.UserAccountChanged:connect(onReAuthentication)
|
|
PlatformService.GameJoined:connect(onGameJoin)
|
|
end
|
|
|
|
EventHub:addEventListener(EventHub.Notifications["AuthenticationSuccess"], "authUserSuccess", function(isNewLinkedAccount)
|
|
print("User authenticated, initializing app shell")
|
|
onAuthenticationSuccess(isNewLinkedAccount)
|
|
end);
|
|
-- EventHub:addEventListener(EventHub.Notifications["OpenEngagementScreen"], "",
|
|
-- function()
|
|
-- ScreenManager:OpenScreen(EngagementScreen)
|
|
-- end);
|
|
ScreenManager:OpenScreen(EngagementScreen)
|
|
|
|
UserInputService.MouseIconEnabled = false
|
|
|