local f0_local0 = module local f0_local1, f0_local2 = ... f0_local0( f0_local1, package.seeall ) CoD.PrintModuleLoad( _NAME ) function PushSplitScreenMenu() MatchRules.SetUsingMatchRulesData( 1 ) Engine.PLMRefreshData() end function SplitScreenStartGame( f2_arg0, f2_arg1 ) if Engine.GetDvarString( "ui_gametype" ) == "horde" then Lobby.SetBotsConnectType( 0 ) Engine.SetDvarBool( "squad_use_hosts_squad", false ) elseif SvS.IsSvS() then if Lobby.GetBotsConnectType() == 0 then Lobby.SetBotsConnectType( 1 ) end Lobby.SetBotsTeamLimit( Lobby.BotTeams.Friendly, SvS.MaxSquadSize ) Lobby.SetBotsTeamLimit( Lobby.BotTeams.Enemy, SvS.MaxSquadSize ) Engine.SetDvarBool( "squad_use_hosts_squad", true ) elseif Lobby.GetBotsConnectType() == 0 then Lobby.SetBotsConnectType( 1 ) Engine.SetDvarBool( "squad_use_hosts_squad", false ) end local f2_local0 = LUI.FlowManager.GetMenuScopedDataFromElement( f2_arg0 ) f2_local0.startingController = f2_arg1.controller CharacterScene.FreeCharacterScene() local f2_local1 = LUI.mp_menus.Aliens.LobbyGetIntroVideo() if f2_local1 and f2_local1 ~= "" and not LUI.mp_menus.Aliens.HasSeenVideo( f2_arg1.controller, f2_local1 ) then LUI.mp_menus.Aliens.SetHasSeenVideo( f2_arg1.controller, f2_local1 ) LUI.mp_menus.Aliens.AliensPlayVideo( f2_arg1.controller, f2_local1, { name = "start_transition_to_game", immediate = true } ) else f2_arg0:dispatchEventToRoot( { name = "start_transition_to_game", immediate = true } ) end end function StartTheGameHandler( f3_arg0, f3_arg1 ) local f3_local0 = LUI.FlowManager.GetMenuScopedDataFromElement( f3_arg0 ) Engine.SetDvarBool( "splitscreen_ingame", true ) Lobby.StartServer( f3_local0.startingController ) LUI.UIRoot.BlockButtonInput( Engine.GetLuiRoot(), false, "LobbyTransitionToGame" ) end function SplitScreenGameSetup( f4_arg0, f4_arg1 ) LUI.FlowManager.RequestAddMenu( f4_arg0, "gamesetup_menu_main", true, f4_arg1.controller, false ) end function SplitScreenEditSquad( f5_arg0, f5_arg1 ) Cac.SetEditSquadMember( Cac.GetActiveSquadMember( f5_arg1.controller ) ) LUI.FlowManager.RequestAddMenu( f5_arg0, "cac_edit_main", true, f5_arg1.controller, false, { open_char_list = true, squadLocation = "privateMatchSquadMembers", squadMemberIndex = Cac.GetEditSquadMember(), classLocation = "loadouts", allowMemberSwap = true } ) end function LeaveSplitScreen( f6_arg0, f6_arg1 ) if Lobby.GetBotsConnectType() > 0 then Lobby.SetBotsConnectType( 0 ) end LUI.FlowManager.RequestLeaveMenu( f6_arg0 ) end function GameSetupCreateHandler( f7_arg0, f7_arg1 ) LUI.FlowManager.RequestSetStack( f7_arg0, { { name = "mp_main_menu" }, { name = "menu_splitscreensignin" } } ) local f7_local0 = Engine.GetFirstActiveController() f7_arg0:dispatchEventToRoot( LUI.ButtonHelperText.CommonEvents.addBackButton ) f7_arg0:processEvent( LUI.ButtonHelperText.CommonEvents.addGameSummaryButton ) Engine.SetDvarBool( "splitscreen_ingame", false ) Engine.Exec( MPConfig.default_dvars, f7_local0 ) if Engine.IsAliensMode() then LUI.mp_menus.Aliens.AliensRunConfig( f7_local0 ) LUI.mp_menus.Aliens.InitGameTypeToAliens() end if Engine.IsXbox360() and Engine.AnyContentDamaged and Engine.AnyContentDamaged() then LUI.FlowManager.RequestPopupMenu( f7_arg0, "mp_damaged_content_popup", false, f7_local0 ) else TryForceOpenAfterActionReport( f7_arg0, f7_arg1 ) end if Engine.GetDvarBool( "xblive_competitionmatch" ) and not Engine.IsAliensMode() then MLG.SetUsingMLGRules( false ) MatchRules.LoadMatchRulesDataDefault() f7_arg0:processEvent( { name = "create_class_update_restrictions", controller = f7_local0 } ) end Cac.ValidateAllPlayersPrivateSquadMembers() end function GameSetupOptionsFeeder( f8_arg0 ) local f8_local0 = Engine.IsAliensMode() local f8_local1 = {} if not f8_arg0.slot then DebugPrint( "[WARNING] CAC: using cac slot index 0, this is only ok if you are editing a menu" ) local f8_local2 = 0 end local f8_local3 = Cac.GetCustomClassLoc( f8_arg0.classLocation ) f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "start_game_btn_id", properties = { button_text = Engine.Localize( "@LUA_MENU_START_GAME_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_DESC_START_MATCH" ), button_action_func = SplitScreenStartGame } } if not f8_local0 then f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "game_setup_btn_id", properties = { button_text = Engine.Localize( "@LUA_MENU_GAME_SETUP_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_DESC_GAME_SETUP" ), button_action_func = SplitScreenGameSetup } } f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "create_squad_btn_id", properties = { button_text = Engine.Localize( "@LUA_MENU_CREATE_A_CLASS_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_DESC_CREATE_A_CLASS" ), button_action_func = SplitScreenEditSquad, button_over_func = TriggerUpdateRestrictionsIcon, button_up_func = TriggerUpdateRestrictionsIcon }, handlers = { create_class_update_restrictions = TriggerUpdateRestrictionsIcon }, children = { { type = "lobby_restriction_icon" } } } else f8_local1[#f8_local1 + 1] = LUI.mp_menus.AliensLoadout.GetAliensLoadoutButton() if LUI.mp_menus.Aliens.ExtinctionHasMapSelection() then f8_local1[#f8_local1 + 1] = LUI.mp_menus.Aliens.MapSelectionButton() end if LUI.mp_menus.Aliens.ExtinctionHasModeSelection() then f8_local1[#f8_local1 + 1] = LUI.mp_menus.Aliens.ModeSelectionButton() end if LUI.mp_menus.Aliens.ExtinctionHasDifficultySelection() then f8_local1[#f8_local1 + 1] = LUI.mp_menus.Aliens.DifficultySelectionButton() end if LUI.mp_menus.Aliens.CanAccessIntelMenu() then f8_local1[#f8_local1 + 1] = LUI.mp_menus.AliensIntel.GetAliensIntelButton() end end local f8_local4 = MatchRules.GetData( "gametype" ) if not f8_local0 and f8_local4 ~= "horde" then local f8_local5 = tonumber( Engine.TableLookup( GameTypesTable.File, GameTypesTable.Cols.Ref, f8_local4, GameTypesTable.Cols.TeamChoice ) ) if f8_local5 and f8_local5 == 1 then if not SvS.IsSvS() then f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "friendly_bot_button_id", states = { default = { leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = 0, right = GenericMenuDims.menu_right_more, top = 0, bottom = GenericButtonSettings.Styles.GradientButton.height } }, properties = { variant = GenericButtonSettings.Variants.Select, content_margin = 40, content_width = 225, text_padding_with_content = 275, button_text = Engine.Localize( "@LUA_MENU_FRIENDLY_BOTS_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_FRIENDLY_BOTS_DESC" ), button_display_func = FriendlyBotButtonDisplayText, button_left_func = FriendlyBotButtonLeft, button_right_func = FriendlyBotButtonRight, button_over_func = MBh.EmitEventToRoot( { name = "lobby_slide_disable", dispatchChildren = true, immediate = true } ) } } f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "friendly_bots_difficulty_button_id", states = { default = { leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = 0, right = GenericMenuDims.menu_right_more, top = 0, bottom = GenericButtonSettings.Styles.GradientButton.height } }, properties = { variant = GenericButtonSettings.Variants.Select, content_margin = 40, content_width = 225, text_padding_with_content = 275, button_text = Engine.Localize( "@LUA_MENU_BOTDIFFICULTY_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_FRIENDLY_BOTDIFFICULTY_DESC" ), button_display_func = FriendlyBotsDifficultyButtonDisplayText, button_left_func = FriendlyBotsDifficultyButtonLeft, button_right_func = FriendlyBotsDifficultyButtonRight, button_over_func = MBh.EmitEventToRoot( { name = "lobby_slide_disable", dispatchChildren = true, immediate = true } ) } } f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "enemy_bot_button_id", states = { default = { leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = 0, right = GenericMenuDims.menu_right_more, top = 0, bottom = GenericButtonSettings.Styles.GradientButton.height } }, properties = { variant = GenericButtonSettings.Variants.Select, content_margin = 40, content_width = 225, text_padding_with_content = 275, button_text = Engine.Localize( "@LUA_MENU_ENEMY_BOTS_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_ENEMY_BOTS_DESC" ), button_display_func = EnemyBotButtonDisplayText, button_left_func = EnemyBotButtonLeft, button_right_func = EnemyBotButtonRight, button_over_func = MBh.EmitEventToRoot( { name = "lobby_slide_disable", dispatchChildren = true, immediate = true } ) } } end f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "enemy_bots_difficulty_button_id", states = { default = { leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = 0, right = GenericMenuDims.menu_right_more, top = 0, bottom = GenericButtonSettings.Styles.GradientButton.height } }, properties = { variant = GenericButtonSettings.Variants.Select, content_margin = 40, content_width = 225, text_padding_with_content = 275, button_text = Engine.Localize( "@LUA_MENU_BOTDIFFICULTY_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_ENEMY_BOTDIFFICULTY_DESC" ), button_display_func = EnemyBotsDifficultyButtonDisplayText, button_left_func = EnemyBotsDifficultyButtonLeft, button_right_func = EnemyBotsDifficultyButtonRight, button_over_func = MBh.EmitEventToRoot( { name = "lobby_slide_disable", dispatchChildren = true, immediate = true } ) } } else f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "bot_button_id", states = { default = { leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = 0, right = GenericMenuDims.menu_right_more, top = 0, bottom = GenericButtonSettings.Styles.GradientButton.height } }, properties = { variant = GenericButtonSettings.Variants.Select, content_margin = 40, content_width = 225, text_padding_with_content = 275, button_text = Engine.Localize( "@LUA_MENU_BOTS_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_BOTS_DESC" ), button_display_func = FFABotButtonDisplayText, button_left_func = FFABotButtonLeft, button_right_func = FFABotButtonRight, button_over_func = MBh.EmitEventToRoot( { name = "lobby_slide_disable", dispatchChildren = true, immediate = true } ) } } f8_local1[#f8_local1 + 1] = { type = "UIGenericButton", id = "bots_difficulty_button_id", states = { default = { leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = 0, right = GenericMenuDims.menu_right_more, top = 0, bottom = GenericButtonSettings.Styles.GradientButton.height } }, properties = { variant = GenericButtonSettings.Variants.Select, content_margin = 40, content_width = 225, text_padding_with_content = 275, button_text = Engine.Localize( "@LUA_MENU_BOTDIFFICULTY_CAPS" ), desc_text = Engine.Localize( "@LUA_MENU_BOTDIFFICULTY_DESC" ), button_display_func = FFABotsDifficultyButtonDisplayText, button_left_func = FFABotsDifficultyButtonLeft, button_right_func = FFABotsDifficultyButtonRight, button_over_func = MBh.EmitEventToRoot( { name = "lobby_slide_disable", dispatchChildren = true, immediate = true } ) } } end f8_local1[#f8_local1 + 1] = { type = "UITimer", id = "bot_button_timer_id", properties = { event = "bot_button_refresh", interval = 200 } } end f8_local1[#f8_local1 + 1] = { type = "button_desc_text", id = "splitscreen_gamesetup_description_id" } return f8_local1 end function menu_gamesetup_splitscreen() local f9_local0 = Engine.IsAliensMode() local f9_local1 = { type = "UIElement", id = "menu_splitscreen_gamesetup_root", states = { default = { topAnchor = true, bottomAnchor = true, leftAnchor = true, rightAnchor = true, top = 0, bottom = 0, left = 0, right = 0 } }, handlers = { menu_create = GameSetupCreateHandler, start_transition_to_game = HandleStartTransitionToGame, open_after_action_report = OpenAfterActionReport, lobby_transition_complete = StartTheGameHandler } } local f9_local2 = {} local f9_local3 = { type = "generic_menu_title", id = "splitscreen_menu_title" } local f9_local4 = {} local f9_local5 if f9_local0 then f9_local5 = Engine.Localize( "@LUA_MENU_LOCAL_PLAY_CAPS" ) if not f9_local5 then else f9_local4.menu_title = f9_local5 f9_local3.properties = f9_local4 f9_local3.handlers = { lobby_transition_to_game = MBh.AnimateToState( "hidden", Lobby.TransitionTime ), lobby_rollback_transition_to_game = MBh.AnimateToState( "default", Lobby.TransitionTime ) } f9_local4 = { type = "UIVerticalList", id = "live_splitscreen_options_id", states = { default = { alignment = LUI.Alignment.Top, leftAnchor = true, rightAnchor = false, topAnchor = true, bottomAnchor = false, left = GenericMenuDims.menu_left, right = GenericMenuDims.menu_right, top = GenericMenuDims.menu_top, bottom = GenericMenuDims.menu_bottom, alpha = 1 }, hidden = { alpha = 0 } }, childrenFeeder = GameSetupOptionsFeeder, handlers = { lobby_transition_to_game = MBh.AnimateToState( "hidden", Lobby.TransitionTime ), lobby_rollback_transition_to_game = MBh.AnimateToState( "default", Lobby.TransitionTime ), bot_button_refresh = BotButtonRefresh, menu_create = BotButtonRefresh } } f9_local5 = { type = "splitscreen_member_list" } local f9_local6 = { type = "lobby_loading_widget" } local f9_local7 = { type = "lobby_game_type_title" } local f9_local8 = { type = "lobby_game_type_icon" } local f9_local9 = { type = "UIBindButton", id = "lobby_bind_buttons_id", handlers = { button_secondary = LeaveSplitScreen, button_select = OpenAfterActionReport } } local f9_local10 = { type = "UIElement", id = "LowerSliderID", states = { default = { leftAnchor = true, rightAnchor = true, topAnchor = true, bottomAnchor = true, left = 0, right = 0, top = 0, bottom = 0, alpha = 1 }, hidden = { leftAnchor = true, rightAnchor = true, topAnchor = true, bottomAnchor = true, left = 0, right = 0, top = 100, bottom = 100, alpha = 0 } }, handlers = { lobby_transition_to_game = MBh.AnimateToState( "hidden", Lobby.TransitionTime ), lobby_rollback_transition_to_game = MBh.AnimateToState( "default", Lobby.TransitionTime ) }, children = { { type = "map_info_text", id = "map_info_text_id" }, { type = "button_helper_text_main", id = "cac_button_helper_text_id" }, { type = "online_friends_widget", id = "online_friends_widget_id" } } } f9_local2[1] = f9_local3 f9_local2[2] = f9_local4 f9_local2[3] = f9_local5 f9_local2[4] = f9_local6 f9_local2[5] = f9_local7 f9_local2[6] = f9_local8 f9_local2[7] = f9_local9 f9_local2[8] = f9_local10 f9_local1.children = f9_local2 return f9_local1 end end f9_local5 = Engine.Localize( "@LUA_MENU_SPLITSCREEN_CAPS" ) end function PlayerCardDummyData( f10_arg0, f10_arg1, f10_arg2 ) f10_arg0:processEvent( { gamertag = "player" .. f10_arg2 + 1, clantag = "NVST", rank = 18, prestige = 0, background = "0", patchEmblem = "0", patchShape = "0", name = "update_playercard" } ) end function FillPlayerData( f11_arg0, f11_arg1, f11_arg2 ) if not Lobby.GetControllerForSplitScreenSlot then PlayerCardDummyData( f11_arg0, f11_arg1, f11_arg2 ) return end local f11_local0 = Lobby.GetControllerForSplitScreenSlot( f11_arg2 ) if f11_local0 and Engine.HasPlayerData( f11_local0 ) then local f11_local1 = LUI.mp_menus.Aliens local f11_local2 = nil if Engine.IsAliensMode() then f11_local2 = Lobby.GetAlienRankForXP( f11_local1.getAliensExperience( f11_local0 ) ) else f11_local2 = Lobby.GetRankForXP( Engine.GetPlayerDataEx( f11_local0, CoD.StatsGroup.Ranked, "experience" ) ) end local f11_local3 = { gamertag = Engine.GetUsernameByController( f11_local0 ), clantag = Engine.GetCustomClanTag( f11_local0 ) or "", rank = f11_local2 } if Engine.IsAliensMode() then f11_local3.prestige = f11_local1.getAliensPrestigeLevel( f11_local0 ) else f11_local3.prestige = Engine.GetPlayerDataEx( f11_local0, CoD.StatsGroup.Ranked, "prestige" ) end if Engine.IsAliensMode() then local f11_local4 = "squadMembers" local f11_local5 = 0 f11_local3.background = Engine.GetPlayerDataEx( f11_local0, CoD.StatsGroup.Ranked, f11_local4, f11_local5, "background" ) f11_local3.patchEmblem = Engine.GetPlayerDataEx( f11_local0, CoD.StatsGroup.Ranked, f11_local4, f11_local5, "patch" ) f11_local3.patchShape = Engine.GetPlayerDataEx( f11_local0, CoD.StatsGroup.Ranked, f11_local4, f11_local5, "patchbacking" ) else local f11_local4 = Cac.GetSquadLoc() local f11_local5 = AAR.GetRoundSquadMember( f11_local0 ) f11_local3.background = Cac.GetBackgroundIndex( f11_local0, f11_local4, f11_local5 ) f11_local3.patchEmblem = Cac.GetPatchIndex( f11_local0, f11_local4, f11_local5 ) f11_local3.patchShape = Cac.GetPatchbackingIndex( f11_local0, f11_local4, f11_local5 ) end f11_local3.name = "update_playercard" f11_arg0:processEvent( f11_local3 ) end end function splitscreenMemberFeeder( f12_arg0 ) local f12_local0 = {} local f12_local1 = Engine.SplitscreenPlayerCount() local f12_local2 = 70 for f12_local3 = 1, f12_local1, 1 do local f12_local6 = f12_local3 f12_local0[#f12_local0 + 1] = { type = "playercard", id = "playercard_id" .. f12_local6, properties = { additional_handlers = { menu_create = function ( f13_arg0, f13_arg1 ) FillPlayerData( f13_arg0, f13_arg1, f12_local6 - 1 ) end, update_cards = function ( f14_arg0, f14_arg1 ) FillPlayerData( f14_arg0, f14_arg1, f12_local6 - 1 ) end } }, states = { default = { leftAnchor = true, rightAnchor = true, topAnchor = true, bottomAnchor = false, left = 0, right = 0, top = 0, bottom = f12_local2 } } } end f12_local0[#f12_local0 + 1] = { type = "UITimer", properties = { event = "update_player_cards", interval = 750, disposable = false } } return f12_local0 end function HandleUpdatePlayerCards( f15_arg0, f15_arg1 ) if f15_arg0.properties.numPlayers ~= Engine.SplitscreenPlayerCount() then f15_arg0.properties.numPlayers = Engine.SplitscreenPlayerCount() f15_arg0:closeChildren() f15_arg0:processEvent( { name = "menu_refresh" } ) end f15_arg0:processEvent( { name = "update_cards" } ) end function splitscreen_member_list() return { type = "UIVerticalList", id = "splitscreen_memberlist_id", properties = { numPlayers = Engine.SplitscreenPlayerCount() }, childrenFeeder = splitscreenMemberFeeder, states = { default = { leftAnchor = false, rightAnchor = true, topAnchor = true, bottomAnchor = true, left = -500, right = -50, top = 150, bottom = 0, spacing = 60 }, hidden = { leftAnchor = false, rightAnchor = true, topAnchor = true, bottomAnchor = true, left = 100, right = 650, top = 150, bottom = 0, spacing = 60 } }, handlers = { lobby_transition_to_game = MBh.AnimateToState( "hidden", Lobby.TransitionTime ), lobby_rollback_transition_to_game = MBh.AnimateToState( "default", Lobby.TransitionTime ), update_player_cards = HandleUpdatePlayerCards } } end LUI.MenuBuilder.registerDef( "menu_gamesetup_splitscreen", menu_gamesetup_splitscreen ) LUI.MenuBuilder.registerDef( "splitscreen_member_list", splitscreen_member_list ) LUI.FlowManager.RegisterStackPushBehaviour( "menu_gamesetup_splitscreen", PushSplitScreenMenu ) LockTable( _M )