Runtime and build - Move all projects to .NET 10 with SDK-style project files and a shared Directory.Build.props (WIN/LINUX, x86/x64 defines) - Load managed and unmanaged dependencies from libs/managed and libs/unmanaged through assembly and native library resolvers - Compile party modes with Roslyn instead of CodeDom - Update AppVeyor to the .NET 10 SDK and dotnet test - Download the FFmpeg and gstreamer runtimes from the dependencies repository during the build - Remove the VC++ 2015-2022 runtime check, no dependency needs it anymore Graphics and windowing - Replace the Direct3D 9 renderer with Direct3D 11 (Vortice) - Pace Direct3D 11 frames with a frame latency waitable swap chain - Move window, input and message boxes to SDL3 - Replace System.Drawing with SkiaSharp and WinForms with SDL3 and a software renderer Video and audio - Replace Acinerella with FFmpeg 8.1.3 (FFmpeg.AutoGen) - Add hardware accelerated video decoding (D3D11VA, DXVA2, VideoToolbox, VAAPI, VDPAU) with software fallback - Convert YUV video frames to RGB on the GPU in Direct3D 11 and OpenGL - Add the video options HardwareDecoding, GpuColorConversion, DecoderThreads and VideoDownscaleResolution - Update OpenAL to OpenTK 4 and NAudio recording to WasapiRecorder Fixes - Fix the song preview start and shorten the reporter buttons - Fix a crash when opening the highscore without a selected song - Use the options slide highlight in the party mode screens to avoid brightness flicker on VRR displays - Disable GameInput in the x86 build, SDL3 crashes in GameInputCreate on 32-bit systems with the GameInput runtime installed - Fix a truncation warning in PitchTracker
1005 lines
33 KiB
C#
1005 lines
33 KiB
C#
#region license
|
|
// This file is part of Vocaluxe.
|
|
//
|
|
// Vocaluxe is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Vocaluxe is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
|
|
#endregion
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using VocaluxeLib.Profile;
|
|
|
|
namespace VocaluxeLib.Menu
|
|
{
|
|
public abstract class CMenuPartyNameSelection : CMenuParty
|
|
{
|
|
private bool _AllPlayerSelected
|
|
{
|
|
get
|
|
{
|
|
for (var team = 0; team < _NumTeams; team++)
|
|
{
|
|
if (_TeamList[team].Count < _NumPlayerTeams[team])
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
protected bool _Teams = true;
|
|
protected int _NumTeams = -1;
|
|
protected int _NumPlayer = -1;
|
|
protected int[] _NumPlayerTeams;
|
|
protected bool _AllowChangePlayerNum = true;
|
|
protected bool _AllowChangeTeamNum = true;
|
|
protected bool _ChangePlayerNumDynamic = true;
|
|
protected bool _ChangeTeamNumDynamic = true;
|
|
private int _CurrentTeam;
|
|
|
|
private bool _AvatarsChanged;
|
|
private bool _ProfilesChanged;
|
|
|
|
private bool _SelectingKeyboardActive;
|
|
private bool _SelectingFast;
|
|
private int _SelectingFastPlayerNr;
|
|
private Guid _SelectedProfileId = Guid.Empty;
|
|
|
|
private CStatic _ChooseAvatarStatic;
|
|
private int _OldMouseX;
|
|
private int _OldMouseY;
|
|
|
|
private const string _ButtonNext = "ButtonNext";
|
|
private const string _ButtonBack = "ButtonBack";
|
|
private const string _ButtonRandom = "ButtonRandom";
|
|
private const string _ButtonIncreaseTeams = "ButtonIncreaseTeams";
|
|
private const string _ButtonDecreaseTeams = "ButtonDecreaseTeams";
|
|
private const string _ButtonIncreasePlayer = "ButtonIncreasePlayer";
|
|
private const string _ButtonDecreasePlayer = "ButtonDecreasePlayer";
|
|
private const string _SelectSlideTeams = "SelectSlideTeams";
|
|
private const string _SelectSlidePlayer = "SelectSlidePlayer";
|
|
private const string _NameSelection = "NameSelection";
|
|
|
|
protected List<Guid>[] _TeamList;
|
|
|
|
public override void Init()
|
|
{
|
|
base.Init();
|
|
_ThemeButtons = new string[] { _ButtonBack, _ButtonNext, _ButtonRandom, _ButtonIncreaseTeams, _ButtonDecreaseTeams, _ButtonIncreasePlayer, _ButtonDecreasePlayer };
|
|
_ThemeSelectSlides = new string[] { _SelectSlideTeams, _SelectSlidePlayer };
|
|
_ThemeNameSelections = new string[] { _NameSelection };
|
|
|
|
_ChooseAvatarStatic = GetNewStatic();
|
|
_ChooseAvatarStatic.Visible = false;
|
|
_ChooseAvatarStatic.Aspect = EAspect.Crop;
|
|
|
|
CBase.Profiles.AddProfileChangedCallback(_OnProfileChanged);
|
|
}
|
|
|
|
public void SetPartyModeData(int numPlayer)
|
|
{
|
|
SetPartyModeData(1, numPlayer, new int[] { numPlayer });
|
|
_CurrentTeam = 0;
|
|
}
|
|
|
|
public void SetPartyModeData(int numTeams, int numPlayer, int[] numPlayerTeams)
|
|
{
|
|
_NumTeams = numTeams;
|
|
_NumPlayer = numPlayer;
|
|
_NumPlayerTeams = numPlayerTeams;
|
|
|
|
_TeamList = new List<Guid>[_NumTeams > 0 ? _NumTeams : 1];
|
|
|
|
if (_NumTeams != _NumPlayerTeams.Length)
|
|
{
|
|
_NumPlayerTeams = new int[_NumTeams];
|
|
}
|
|
|
|
for (var i = 0; i < _TeamList.Length; i++)
|
|
{
|
|
_TeamList[i] = new List<Guid>();
|
|
}
|
|
|
|
_UpdateSlides();
|
|
_LoadProfiles();
|
|
_UpdateButtonVisibility();
|
|
_UpdateButtonState();
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
public void SetPartyModeProfiles(List<Guid>[] teamProfiles)
|
|
{
|
|
_TeamList = teamProfiles;
|
|
|
|
for (var t = 0; t < _TeamList.Length; t++)
|
|
{
|
|
foreach (var id in _TeamList[t])
|
|
{
|
|
_NameSelections[_NameSelection].UseProfile(id);
|
|
}
|
|
}
|
|
|
|
_UpdateSlides();
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
public override bool HandleInput(SKeyEvent keyEvent)
|
|
{
|
|
//Check if selecting with keyboard is active
|
|
if (_SelectingKeyboardActive)
|
|
{
|
|
//Handle left/right/up/down
|
|
_NameSelections[_NameSelection].HandleInput(keyEvent);
|
|
var numPressed = -1;
|
|
var resetSelection = false;
|
|
switch (keyEvent.Key)
|
|
{
|
|
case Keys.Enter:
|
|
//Check, if a player is selected
|
|
if (_NameSelections[_NameSelection].SelectedId != Guid.Empty)
|
|
{
|
|
_SelectedProfileId = _NameSelections[_NameSelection].SelectedId;
|
|
|
|
if (!CBase.Profiles.IsProfileIdValid(_SelectedProfileId))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
_AddPlayer(_CurrentTeam, _SelectedProfileId);
|
|
}
|
|
|
|
//Started selecting with 'P'
|
|
if (_SelectingFast)
|
|
{
|
|
if (!_ChangePlayerNumDynamic && _TeamList[_CurrentTeam].Count == _NumPlayerTeams[_CurrentTeam])
|
|
{
|
|
resetSelection = true;
|
|
}
|
|
else if (_TeamList[_CurrentTeam].Count == _PartyMode.MaxPlayersPerTeam)
|
|
{
|
|
resetSelection = true;
|
|
}
|
|
}
|
|
else if (!_SelectingFast)
|
|
{
|
|
resetSelection = true;
|
|
}
|
|
|
|
break;
|
|
|
|
case Keys.Escape:
|
|
case Keys.Back:
|
|
resetSelection = true;
|
|
break;
|
|
|
|
case Keys.D1:
|
|
case Keys.NumPad1:
|
|
numPressed = 1;
|
|
break;
|
|
|
|
case Keys.D2:
|
|
case Keys.NumPad2:
|
|
numPressed = 2;
|
|
break;
|
|
|
|
case Keys.D3:
|
|
case Keys.NumPad3:
|
|
numPressed = 3;
|
|
break;
|
|
|
|
case Keys.D4:
|
|
case Keys.NumPad4:
|
|
numPressed = 4;
|
|
break;
|
|
|
|
case Keys.D5:
|
|
case Keys.NumPad5:
|
|
numPressed = 5;
|
|
break;
|
|
|
|
case Keys.D6:
|
|
case Keys.NumPad6:
|
|
numPressed = 6;
|
|
break;
|
|
|
|
case Keys.D7:
|
|
case Keys.NumPad7:
|
|
numPressed = 7;
|
|
break;
|
|
|
|
case Keys.D8:
|
|
case Keys.NumPad8:
|
|
numPressed = 8;
|
|
break;
|
|
|
|
case Keys.D9:
|
|
case Keys.NumPad9:
|
|
numPressed = 9;
|
|
break;
|
|
}
|
|
|
|
if (numPressed > 0 || resetSelection)
|
|
{
|
|
if (numPressed == _SelectingFastPlayerNr || resetSelection)
|
|
{
|
|
//Reset all values
|
|
_SelectingFastPlayerNr = 0;
|
|
_SelectingKeyboardActive = false;
|
|
_NameSelections[_NameSelection].FastSelection(false, -1);
|
|
}
|
|
else if (numPressed <= _NumPlayerTeams[_CurrentTeam])
|
|
{
|
|
_SelectingFastPlayerNr = numPressed;
|
|
_NameSelections[_NameSelection].FastSelection(true, numPressed);
|
|
}
|
|
|
|
_SelectingFast = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
base.HandleInput(keyEvent);
|
|
|
|
var numPressed = 0;
|
|
|
|
switch (keyEvent.Key)
|
|
{
|
|
case Keys.Back:
|
|
case Keys.Escape:
|
|
Back();
|
|
break;
|
|
|
|
case Keys.Enter:
|
|
if (_Buttons[_ButtonBack].Selected)
|
|
{
|
|
Back();
|
|
}
|
|
|
|
if (_Buttons[_ButtonNext].Selected)
|
|
{
|
|
Next();
|
|
}
|
|
|
|
if (_Buttons[_ButtonRandom].Selected)
|
|
{
|
|
_SelectRandom();
|
|
}
|
|
|
|
if (_Buttons[_ButtonIncreaseTeams].Selected)
|
|
{
|
|
IncreaseTeamNum();
|
|
}
|
|
|
|
if (_Buttons[_ButtonDecreaseTeams].Selected)
|
|
{
|
|
DecreaseTeamNum();
|
|
}
|
|
|
|
if (_Buttons[_ButtonIncreasePlayer].Selected)
|
|
{
|
|
IncreasePlayerNum(_CurrentTeam);
|
|
}
|
|
|
|
if (_Buttons[_ButtonDecreasePlayer].Selected)
|
|
{
|
|
DecreasePlayerNum(_CurrentTeam);
|
|
}
|
|
|
|
break;
|
|
|
|
case Keys.Delete:
|
|
if (_SelectSlides[_SelectSlidePlayer].Selected && _SelectSlides[_SelectSlidePlayer].NumValues > 0)
|
|
{
|
|
var index = _SelectSlides[_SelectSlidePlayer].Selection;
|
|
_RemovePlayerByIndex(_CurrentTeam, index);
|
|
_UpdatePlayerSlide();
|
|
}
|
|
|
|
break;
|
|
|
|
case Keys.Left:
|
|
case Keys.Right:
|
|
if (_SelectSlides[_SelectSlideTeams].Selected)
|
|
{
|
|
_OnChangeTeamSlide();
|
|
}
|
|
|
|
break;
|
|
|
|
case Keys.P:
|
|
if (!_SelectingKeyboardActive)
|
|
{
|
|
_SelectingFastPlayerNr = _CurrentTeam + 1;
|
|
_SelectingFast = true;
|
|
//_ResetPlayerSelections();
|
|
}
|
|
|
|
break;
|
|
|
|
case Keys.D1:
|
|
case Keys.NumPad1:
|
|
numPressed = 1;
|
|
break;
|
|
|
|
case Keys.D2:
|
|
case Keys.NumPad2:
|
|
numPressed = 2;
|
|
break;
|
|
|
|
case Keys.D3:
|
|
case Keys.NumPad3:
|
|
numPressed = 3;
|
|
break;
|
|
|
|
case Keys.D4:
|
|
case Keys.NumPad4:
|
|
numPressed = 4;
|
|
break;
|
|
|
|
case Keys.D5:
|
|
case Keys.NumPad5:
|
|
numPressed = 5;
|
|
break;
|
|
|
|
case Keys.D6:
|
|
case Keys.NumPad6:
|
|
numPressed = 6;
|
|
break;
|
|
|
|
case Keys.D7:
|
|
case Keys.NumPad7:
|
|
numPressed = 7;
|
|
break;
|
|
|
|
case Keys.D8:
|
|
case Keys.NumPad8:
|
|
numPressed = 8;
|
|
break;
|
|
|
|
case Keys.D9:
|
|
case Keys.NumPad9:
|
|
numPressed = 9;
|
|
break;
|
|
|
|
case Keys.Subtract:
|
|
if (_SelectSlides[_SelectSlideTeams].Selected)
|
|
{
|
|
DecreaseTeamNum();
|
|
}
|
|
else if (_SelectSlides[_SelectSlidePlayer].Selected)
|
|
{
|
|
DecreasePlayerNum(_CurrentTeam);
|
|
}
|
|
|
|
break;
|
|
|
|
case Keys.Add:
|
|
if (_SelectSlides[_SelectSlideTeams].Selected)
|
|
{
|
|
IncreaseTeamNum();
|
|
}
|
|
else if (_SelectSlides[_SelectSlidePlayer].Selected)
|
|
{
|
|
IncreasePlayerNum(_CurrentTeam);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if (numPressed > 0)
|
|
{
|
|
if (_ChangeTeamNumDynamic && numPressed < _PartyMode.MaxTeams && numPressed > _SelectSlides[_SelectSlideTeams].NumValues)
|
|
{
|
|
while (numPressed < _PartyMode.MaxTeams)
|
|
{
|
|
IncreaseTeamNum();
|
|
}
|
|
}
|
|
|
|
if (numPressed <= _SelectSlides[_SelectSlideTeams].NumValues)
|
|
{
|
|
_SelectSlides[_SelectSlideTeams].SelectedTag = numPressed;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_SelectingFastPlayerNr > 0 && _SelectingFastPlayerNr <= _NumPlayerTeams[_CurrentTeam])
|
|
{
|
|
_SelectingKeyboardActive = true;
|
|
_NameSelections[_NameSelection].FastSelection(true, _SelectingFastPlayerNr);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool HandleMouse(SMouseEvent mouseEvent)
|
|
{
|
|
var stopSelectingFast = false;
|
|
|
|
if (_SelectingFast)
|
|
{
|
|
_NameSelections[_NameSelection].HandleMouse(mouseEvent);
|
|
}
|
|
else
|
|
{
|
|
base.HandleMouse(mouseEvent);
|
|
}
|
|
|
|
//Check if LeftButton is hold and Select-Mode inactive
|
|
if (mouseEvent.LBH && _SelectedProfileId == Guid.Empty && !_SelectingFast)
|
|
{
|
|
//Save mouse-coords
|
|
_OldMouseX = mouseEvent.X;
|
|
_OldMouseY = mouseEvent.Y;
|
|
//Check if mouse if over tile
|
|
if (_NameSelections[_NameSelection].IsOverTile(mouseEvent))
|
|
{
|
|
//Get player-number of tile
|
|
_SelectedProfileId = _NameSelections[_NameSelection].TilePlayerId(mouseEvent);
|
|
if (_SelectedProfileId != Guid.Empty)
|
|
{
|
|
//Update of Drag/Drop-Texture
|
|
var selectedPlayer = _NameSelections[_NameSelection].TilePlayerAvatar(mouseEvent);
|
|
_ChooseAvatarStatic.Visible = true;
|
|
_ChooseAvatarStatic.MaxRect = selectedPlayer.Rect;
|
|
_ChooseAvatarStatic.Z = CBase.Settings.GetZNear();
|
|
_ChooseAvatarStatic.Color = new SColorF(1, 1, 1, 1);
|
|
_ChooseAvatarStatic.Texture = selectedPlayer.Texture;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Check if LeftButton is hold and Select-Mode active
|
|
if (mouseEvent.LBH && _SelectedProfileId != Guid.Empty && !_SelectingFast)
|
|
{
|
|
//Update coords for Drag/Drop-Texture
|
|
_ChooseAvatarStatic.X += mouseEvent.X - _OldMouseX;
|
|
_ChooseAvatarStatic.Y += mouseEvent.Y - _OldMouseY;
|
|
_OldMouseX = mouseEvent.X;
|
|
_OldMouseY = mouseEvent.Y;
|
|
}
|
|
// LeftButton isn't hold anymore, but Select-Mode is still active -> "Drop" of Avatar
|
|
else if (_SelectedProfileId != Guid.Empty && !_SelectingFast)
|
|
{
|
|
//Check if mouse is in drop-area
|
|
if (CHelper.IsInBounds(_SelectSlides[_SelectSlidePlayer].Rect, mouseEvent))
|
|
{
|
|
if (!CBase.Profiles.IsProfileIdValid(_SelectedProfileId))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
_AddPlayer(_CurrentTeam, _SelectedProfileId);
|
|
}
|
|
|
|
//Reset variables
|
|
_SelectedProfileId = Guid.Empty;
|
|
_ChooseAvatarStatic.Visible = false;
|
|
}
|
|
|
|
if (mouseEvent.LB && _SelectingFast)
|
|
{
|
|
if (_NameSelections[_NameSelection].IsOverTile(mouseEvent))
|
|
{
|
|
//Get player-number of tile
|
|
_SelectedProfileId = _NameSelections[_NameSelection].TilePlayerId(mouseEvent);
|
|
if (_SelectedProfileId != Guid.Empty)
|
|
{
|
|
if (!CBase.Profiles.IsProfileIdValid(_SelectedProfileId))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
_AddPlayer(_CurrentTeam, _SelectedProfileId);
|
|
|
|
if (!_ChangePlayerNumDynamic && _TeamList[_CurrentTeam].Count == _NumPlayerTeams[_CurrentTeam])
|
|
{
|
|
stopSelectingFast = true;
|
|
}
|
|
else if (_TeamList[_CurrentTeam].Count == _PartyMode.MaxPlayersPerTeam)
|
|
{
|
|
stopSelectingFast = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
stopSelectingFast = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
else if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent))
|
|
{
|
|
if (_Buttons[_ButtonBack].Selected)
|
|
{
|
|
Back();
|
|
}
|
|
|
|
if (_Buttons[_ButtonNext].Selected)
|
|
{
|
|
Next();
|
|
}
|
|
|
|
if (_Buttons[_ButtonRandom].Selected)
|
|
{
|
|
_SelectRandom();
|
|
}
|
|
|
|
if (_Buttons[_ButtonIncreaseTeams].Selected)
|
|
{
|
|
IncreaseTeamNum();
|
|
}
|
|
|
|
if (_Buttons[_ButtonDecreaseTeams].Selected)
|
|
{
|
|
DecreaseTeamNum();
|
|
}
|
|
|
|
if (_Buttons[_ButtonIncreasePlayer].Selected)
|
|
{
|
|
IncreasePlayerNum(_CurrentTeam);
|
|
}
|
|
|
|
if (_Buttons[_ButtonDecreasePlayer].Selected)
|
|
{
|
|
DecreasePlayerNum(_CurrentTeam);
|
|
}
|
|
|
|
if (_SelectSlides[_SelectSlideTeams].Selected)
|
|
{
|
|
_OnChangeTeamSlide();
|
|
}
|
|
|
|
//Update Tiles-List
|
|
_NameSelections[_NameSelection].UpdateList();
|
|
}
|
|
|
|
if (mouseEvent.LD && _NameSelections[_NameSelection].IsOverTile(mouseEvent) && !_SelectingFast)
|
|
{
|
|
_SelectedProfileId = _NameSelections[_NameSelection].TilePlayerId(mouseEvent);
|
|
if (_SelectedProfileId != Guid.Empty)
|
|
{
|
|
if (!CBase.Profiles.IsProfileIdValid(_SelectedProfileId))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
_AddPlayer(_CurrentTeam, _SelectedProfileId);
|
|
}
|
|
}
|
|
|
|
if (mouseEvent.RB && _SelectingFast)
|
|
{
|
|
stopSelectingFast = true;
|
|
}
|
|
else if (mouseEvent.RB)
|
|
{
|
|
var exit = true;
|
|
if (_SelectSlides[_SelectSlidePlayer].Selected && _TeamList[_CurrentTeam].Count > _SelectSlides[_SelectSlidePlayer].Selection)
|
|
{
|
|
var currentSelection = _SelectSlides[_SelectSlidePlayer].Selection;
|
|
var id = _TeamList[_CurrentTeam][currentSelection];
|
|
_RemovePlayer(_CurrentTeam, id);
|
|
_UpdatePlayerSlide();
|
|
exit = false;
|
|
}
|
|
|
|
if (exit)
|
|
{
|
|
Back();
|
|
}
|
|
}
|
|
|
|
if (mouseEvent.MB && _SelectingFast)
|
|
{
|
|
if (!_ChangePlayerNumDynamic && _TeamList[_CurrentTeam].Count == _NumPlayerTeams[_CurrentTeam])
|
|
{
|
|
stopSelectingFast = true;
|
|
}
|
|
else if (_TeamList[_CurrentTeam].Count == _PartyMode.MaxPlayersPerTeam)
|
|
{
|
|
stopSelectingFast = true;
|
|
}
|
|
}
|
|
else if (mouseEvent.MB)
|
|
{
|
|
_SelectingFast = true;
|
|
_SelectingFastPlayerNr = _CurrentTeam + 1;
|
|
_SelectingKeyboardActive = true;
|
|
_NameSelections[_NameSelection].FastSelection(true, _SelectingFastPlayerNr);
|
|
}
|
|
|
|
//Check mouse-wheel for scrolling
|
|
if (mouseEvent.Wheel != 0)
|
|
{
|
|
if (CHelper.IsInBounds(_NameSelections[_NameSelection].Rect, mouseEvent))
|
|
{
|
|
var offset = _NameSelections[_NameSelection].Offset + mouseEvent.Wheel;
|
|
_NameSelections[_NameSelection].UpdateList(offset);
|
|
}
|
|
}
|
|
|
|
if (stopSelectingFast)
|
|
{
|
|
_SelectingFast = false;
|
|
_SelectingFastPlayerNr = 0;
|
|
_SelectingKeyboardActive = false;
|
|
_NameSelections[_NameSelection].FastSelection(false, -1);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void LoadTheme(string xmlPath)
|
|
{
|
|
base.LoadTheme(xmlPath);
|
|
_SelectSlides[_SelectSlidePlayer].DrawTextures = true;
|
|
_SelectSlides[_SelectSlidePlayer].SelectByHovering = true;
|
|
_AddStatic(_ChooseAvatarStatic);
|
|
}
|
|
|
|
public override bool UpdateGame()
|
|
{
|
|
if (_ProfilesChanged || _AvatarsChanged)
|
|
{
|
|
_LoadProfiles();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void OnShow()
|
|
{
|
|
_NameSelections[_NameSelection].Init();
|
|
|
|
base.OnShow();
|
|
|
|
_UpdateButtonVisibility();
|
|
_UpdateButtonState();
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
public abstract void Back();
|
|
public abstract void Next();
|
|
|
|
public void IncreaseTeamNum()
|
|
{
|
|
if (!_AllowChangeTeamNum)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_NumTeams + 1 <= _PartyMode.MaxTeams)
|
|
{
|
|
_NumTeams++;
|
|
var numPlayerTeams = _NumPlayerTeams;
|
|
var teamList = _TeamList;
|
|
_NumPlayerTeams = new int[_NumTeams];
|
|
_TeamList = new List<Guid>[_NumTeams];
|
|
for (var i = 0; i < _NumPlayerTeams.Length; i++)
|
|
{
|
|
if (i < numPlayerTeams.Length)
|
|
{
|
|
_NumPlayerTeams[i] = numPlayerTeams[i];
|
|
_TeamList[i] = teamList[i];
|
|
}
|
|
else
|
|
{
|
|
//Get average num players per teams as default player number
|
|
_NumPlayerTeams[i] = _NumPlayer / (_NumTeams - 1);
|
|
_NumPlayer += _NumPlayerTeams[i];
|
|
_TeamList[i] = new List<Guid>();
|
|
}
|
|
}
|
|
}
|
|
|
|
_UpdateButtonState();
|
|
_UpdateTeamSlide();
|
|
}
|
|
|
|
public void DecreaseTeamNum()
|
|
{
|
|
if (!_AllowChangeTeamNum)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_NumTeams - 1 >= _PartyMode.MinTeams)
|
|
{
|
|
_NumTeams--;
|
|
}
|
|
|
|
_UpdateButtonState();
|
|
_UpdateTeamSlide();
|
|
}
|
|
|
|
public void IncreasePlayerNum(int team)
|
|
{
|
|
if (!_AllowChangePlayerNum)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_NumPlayerTeams.Length > team)
|
|
{
|
|
if (_NumPlayerTeams[team] + 1 <= _PartyMode.MaxPlayersPerTeam)
|
|
{
|
|
_NumPlayerTeams[team]++;
|
|
}
|
|
|
|
_UpdatePlayerSlide();
|
|
}
|
|
|
|
_UpdateButtonState();
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
public void DecreasePlayerNum(int team)
|
|
{
|
|
if (!_AllowChangePlayerNum)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_NumPlayerTeams.Length > team)
|
|
{
|
|
if (_NumPlayerTeams[team] - 1 >= _PartyMode.MinPlayersPerTeam)
|
|
{
|
|
_NumPlayerTeams[team]--;
|
|
}
|
|
|
|
if (_TeamList[team].Count > _NumPlayerTeams[team])
|
|
{
|
|
_RemovePlayerByIndex(team, _NumPlayerTeams[team] - 1);
|
|
}
|
|
|
|
_UpdatePlayerSlide();
|
|
}
|
|
|
|
_UpdateButtonState();
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
#region private methods
|
|
private void _OnProfileChanged(EProfileChangedFlags flags)
|
|
{
|
|
if (EProfileChangedFlags.Avatar == (EProfileChangedFlags.Avatar & flags))
|
|
{
|
|
_AvatarsChanged = true;
|
|
}
|
|
|
|
if (EProfileChangedFlags.Profile == (EProfileChangedFlags.Profile & flags))
|
|
{
|
|
_ProfilesChanged = true;
|
|
}
|
|
}
|
|
|
|
private void _LoadProfiles()
|
|
{
|
|
_NameSelections[_NameSelection].UpdateList();
|
|
|
|
_UpdateSlides();
|
|
_OnChangeTeamSlide();
|
|
|
|
_ProfilesChanged = false;
|
|
_AvatarsChanged = false;
|
|
}
|
|
|
|
private void _UpdateSlides()
|
|
{
|
|
_UpdateTeamSlide();
|
|
_UpdatePlayerSlide();
|
|
}
|
|
|
|
private void _OnChangeTeamSlide()
|
|
{
|
|
if (_CurrentTeam == _SelectSlides[_SelectSlideTeams].Selection)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_CurrentTeam = _SelectSlides[_SelectSlideTeams].Selection;
|
|
_UpdatePlayerSlide();
|
|
_UpdateButtonState();
|
|
}
|
|
|
|
private void _UpdatePlayerSlide()
|
|
{
|
|
var selection = _SelectSlides[_SelectSlidePlayer].Selection;
|
|
_SelectSlides[_SelectSlidePlayer].Clear();
|
|
|
|
var maxPlayers = Math.Min(_TeamList[_CurrentTeam].Count, _NumPlayerTeams[_CurrentTeam]);
|
|
|
|
for (var i = 0; i < maxPlayers; i++)
|
|
{
|
|
var name = CBase.Profiles.GetPlayerName(_TeamList[_CurrentTeam][i]);
|
|
var avatar = CBase.Profiles.GetAvatar(_TeamList[_CurrentTeam][i]);
|
|
_SelectSlides[_SelectSlidePlayer].AddValue(name, avatar);
|
|
}
|
|
|
|
for (var i = maxPlayers; i < _NumPlayerTeams[_CurrentTeam]; i++)
|
|
{
|
|
_SelectSlides[_SelectSlidePlayer].AddValue("", _NameSelections[_NameSelection].TextureEmptyTile);
|
|
}
|
|
|
|
if (selection >= maxPlayers)
|
|
{
|
|
selection = maxPlayers - 1;
|
|
}
|
|
|
|
_SelectSlides[_SelectSlidePlayer].Selection = selection;
|
|
}
|
|
|
|
private void _UpdateTeamSlide()
|
|
{
|
|
var sel = _SelectSlides[_SelectSlideTeams].Selection;
|
|
|
|
_SelectSlides[_SelectSlideTeams].Visible = _Teams;
|
|
_SelectSlides[_SelectSlideTeams].Clear();
|
|
for (var i = 1; i <= _NumTeams; i++)
|
|
{
|
|
_SelectSlides[_SelectSlideTeams].AddValue("Team " + i, null, i);
|
|
}
|
|
|
|
_SelectSlides[_SelectSlideTeams].Selection = Math.Min(sel, _SelectSlides[_SelectSlideTeams].NumValues - 1);
|
|
}
|
|
|
|
private void _UpdateButtonVisibility()
|
|
{
|
|
_Buttons[_ButtonIncreaseTeams].Visible = _AllowChangeTeamNum && _Teams && _PartyMode.MinTeams != _PartyMode.MaxTeams;
|
|
_Buttons[_ButtonDecreaseTeams].Visible = _AllowChangeTeamNum && _Teams && _PartyMode.MinTeams != _PartyMode.MaxTeams;
|
|
_Buttons[_ButtonIncreasePlayer].Visible = _AllowChangePlayerNum;
|
|
_Buttons[_ButtonDecreasePlayer].Visible = _AllowChangePlayerNum;
|
|
}
|
|
|
|
private void _UpdateButtonState()
|
|
{
|
|
_Buttons[_ButtonIncreaseTeams].Selectable = _NumTeams < _PartyMode.MaxTeams;
|
|
_Buttons[_ButtonDecreaseTeams].Selectable = _NumTeams > _PartyMode.MinTeams;
|
|
if (_NumPlayerTeams != null && _NumPlayerTeams.Length > _CurrentTeam)
|
|
{
|
|
_Buttons[_ButtonIncreasePlayer].Selectable = _NumPlayerTeams[_CurrentTeam] < _PartyMode.MaxPlayersPerTeam;
|
|
_Buttons[_ButtonDecreasePlayer].Selectable = _NumPlayerTeams[_CurrentTeam] > _PartyMode.MinPlayersPerTeam;
|
|
}
|
|
else
|
|
{
|
|
_Buttons[_ButtonIncreasePlayer].Selectable = false;
|
|
_Buttons[_ButtonDecreasePlayer].Selectable = false;
|
|
}
|
|
}
|
|
|
|
private void _AddPlayer(int team, Guid profileId, bool updateElements = true)
|
|
{
|
|
if (profileId == Guid.Empty)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!CBase.Profiles.IsProfileIdValid(profileId))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_TeamList[team].Contains(profileId))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_TeamList[team].Count >= _PartyMode.MaxPlayersPerTeam)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var targetIndex = -1;
|
|
|
|
if (_TeamList[team].Count < _NumPlayerTeams[team])
|
|
{
|
|
targetIndex = _TeamList[team].Count;
|
|
}
|
|
else if (!_ChangePlayerNumDynamic)
|
|
{
|
|
targetIndex = _SelectSlides[_SelectSlidePlayer].Selection;
|
|
|
|
if (targetIndex < 0 || targetIndex >= _NumPlayerTeams[team])
|
|
{
|
|
targetIndex = _NumPlayerTeams[team] - 1;
|
|
}
|
|
}
|
|
|
|
if (targetIndex < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (targetIndex < _TeamList[team].Count)
|
|
{
|
|
var oldId = _TeamList[team][targetIndex];
|
|
_NameSelections[_NameSelection].RemoveUsedProfile(oldId);
|
|
_TeamList[team][targetIndex] = profileId;
|
|
}
|
|
else
|
|
{
|
|
_TeamList[team].Add(profileId);
|
|
}
|
|
|
|
_NameSelections[_NameSelection].UseProfile(profileId);
|
|
|
|
if (updateElements)
|
|
{
|
|
_UpdatePlayerSlide();
|
|
_SelectSlides[_SelectSlidePlayer].Selection = targetIndex;
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
}
|
|
|
|
private void _RemoveAllPlayer()
|
|
{
|
|
for (var t = 0; t < _TeamList.Length; t++)
|
|
{
|
|
var ids = new List<Guid>();
|
|
ids.AddRange(_TeamList[t]);
|
|
foreach (var id in ids)
|
|
{
|
|
_RemovePlayer(t, id);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void _RemovePlayerByIndex(int team, int index)
|
|
{
|
|
if (_TeamList[team].Count > index)
|
|
{
|
|
var id = _TeamList[team][index];
|
|
_TeamList[team].RemoveAt(index);
|
|
_NameSelections[_NameSelection].RemoveUsedProfile(id);
|
|
}
|
|
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
private void _RemovePlayer(int team, Guid profileId)
|
|
{
|
|
_TeamList[team].Remove(profileId);
|
|
_NameSelections[_NameSelection].RemoveUsedProfile(profileId);
|
|
|
|
_UpdateNextButtonVisibility();
|
|
}
|
|
|
|
private void _SelectRandom()
|
|
{
|
|
_RemoveAllPlayer();
|
|
for (var t = 0; t < _NumPlayerTeams.Length; t++)
|
|
{
|
|
for (var p = 0; p < _NumPlayerTeams[t]; p++)
|
|
{
|
|
var profileId = _NameSelections[_NameSelection].GetRandomUnusedProfile();
|
|
if (profileId != Guid.Empty)
|
|
{
|
|
_AddPlayer(t, profileId);
|
|
}
|
|
}
|
|
}
|
|
|
|
_UpdatePlayerSlide();
|
|
_UpdateButtonVisibility();
|
|
}
|
|
|
|
private void _UpdateNextButtonVisibility()
|
|
{
|
|
_Buttons[_ButtonNext].Visible = _AllPlayerSelected;
|
|
}
|
|
#endregion
|
|
}
|
|
} |