diff --git a/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardModel.cs b/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardModel.cs index 1590d1fb..aaad1923 100644 --- a/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardModel.cs +++ b/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardModel.cs @@ -22,7 +22,7 @@ namespace Cgs.CardGameView.Multiplayer public class CardModel : CgsNetPlayable, ICardDisplay, ICardDropHandler, IStackDropHandler { public const string DropErrorMessage = "Error: Card dropped on Card outside of play area!"; - public string DiscardPrompt => $"Delete cannot be undone. Delete {gameObject.name}?"; + public override string DeletePrompt => $"Delete cannot be undone. Delete {gameObject.name}?"; private const float ZoomHoldTime = 0.5f; private const float MovementSpeed = 600f; @@ -243,8 +243,18 @@ protected override void OnUpdatePlayable() if (Inputs.IsOption && CardViewer.Instance.PreviewCardModel == this || HoldTime > ZoomHoldTime) RequestZoomOnThis(); - if (CurrentDragPhase == DragPhase.End && !IsProcessingSecondaryDragAction && PlaceHolder != null) + if (ParentCardZone == null && CurrentDragPhase == DragPhase.End && !IsMovingToPlaceHolder) + { + Debug.LogWarning( + "OnUpdatePlayable: ParentCardZone == null && CurrentDragPhase == DragPhase.End && !IsMovingToPlaceHolder"); + if (PlaceHolder == null) + { + Debug.LogWarning("OnUpdatePlayable: PlaceHolder == null"); + RecoverLostPlaceholder(); + } + IsMovingToPlaceHolder = true; + } UpdateForMovingToPlaceHolder(); } @@ -348,15 +358,15 @@ public void OnDrop(CardModel cardModel) PlayController.Instance.CreateCardStack(PlayController.DefaultStackName, cards, Position, Rotation, !IsFacedown); - Debug.Log($"Discarding {cardModel.gameObject.name} and {gameObject.name} OnDrop"); - cardModel.Discard(); - Discard(); + Debug.Log($"OnDrop {cardModel.gameObject.name} on {gameObject.name} delete"); + cardModel.RequestDelete(); + RequestDelete(); } public void OnDrop(CardStack cardStack) { cardStack.RequestInsert(0, Id); - Discard(); + RequestDelete(); } public static CardModel CreateDrag(PointerEventData eventData, GameObject gameObject, Transform transform, @@ -423,7 +433,7 @@ protected override void PostDragPlayable(PointerEventData eventData) { var dropTargetCardModel = DropTarget.GetComponent(); - var shouldDiscard = false; + var shouldDeleteOnDropTarget = false; if (Visibility.blocksRaycasts && ParentCardZone != null && ParentCardZone.Type == CardZoneType.Area || PlaceHolderCardZone != null && PlaceHolderCardZone.Type == CardZoneType.Area || dropTargetCardModel != null && dropTargetCardModel.ParentCardZone != null && @@ -435,13 +445,15 @@ protected override void PostDragPlayable(PointerEventData eventData) if (isPointerOverDropTarget) { DropTarget.OnDrop(eventData); - shouldDiscard = PlaySettings.AutoStackCards || dropTargetCardModel == null; + shouldDeleteOnDropTarget = PlaySettings.AutoStackCards || dropTargetCardModel == null; + Debug.LogWarning("shouldDeleteOnDropTarget: " + shouldDeleteOnDropTarget); } } - if (shouldDiscard) + if (shouldDeleteOnDropTarget) { - Discard(); + Debug.Log("PostDragPlayable::shouldDeleteOnDropTarget"); + RequestDelete(); return; } @@ -465,7 +477,10 @@ protected override void PostDragPlayable(PointerEventData eventData) if (PlaceHolder != null) IsMovingToPlaceHolder = true; else if (ParentCardZone == null) - Discard(); + { + Debug.LogWarning($"PostDragPlayable Lost PlaceHolder and ParentCardZone for {gameObject.name}!"); + RecoverLostPlaceholder(); + } else if (ParentCardZone.Type == CardZoneType.Area) SnapToGrid(); } @@ -484,7 +499,7 @@ protected override void ActOnDrag() public override void SnapToGrid() { - if (ToDiscard) + if (ToDelete) return; var gridPosition = CalculateGridPosition(); @@ -514,8 +529,8 @@ public override void SnapToGrid() PlayController.Instance.CreateCardStack(PlayController.DefaultStackName, cards, siblingCardModel.Position, siblingCardModel.Rotation, !siblingCardModel.IsFacedown); - siblingCardModel.Discard(); - Discard(); + siblingCardModel.RequestDelete(); + RequestDelete(); return; } @@ -524,7 +539,7 @@ public override void SnapToGrid() continue; siblingCardStack.OnDrop(this); - Discard(); + RequestDelete(); return; } } @@ -628,9 +643,8 @@ private void FinishMovingToPlaceHolder() { if (PlaceHolder == null) { - Debug.Log($"Discarding {gameObject.name} MoveToPlaceHolder"); - Discard(); - return; + Debug.LogWarning($"FinishMovingToPlaceHolder Lost PlaceHolder for {gameObject.name}!"); + RecoverLostPlaceholder(); } var previousParentCardZone = ParentCardZone; @@ -648,6 +662,19 @@ private void FinishMovingToPlaceHolder() IsMovingToPlaceHolder = false; } + private void RecoverLostPlaceholder() + { + if (PlayController.Instance == null) + { + RequestDelete(); + return; + } + + PlaceHolderCardZone = PlayController.Instance.playAreaCardZone; + if (!Vector2.zero.Equals(Position)) + PlaceHolder.localPosition = Position; + } + private void ParentToCanvas(Vector3 targetPosition) { Debug.Log($"ParentToCanvas {gameObject.name}"); @@ -674,7 +701,7 @@ private void ParentToCanvas(Vector3 targetPosition) CreateDrag(CurrentPointerEventData, gameObject, transform, Value, IsFacedown, PlaceHolderCardZone); if (IsSpawned) - DespawnAndDestroyServerRpc(); + DeleteServerRpc(); else Destroy(gameObject); } @@ -715,27 +742,9 @@ public void OnChangeIsFacedown(bool oldValue, bool newValue) Value.UnregisterDisplay(this); } - public void PromptDiscard() - { - CardGameManager.Instance.Messenger.Prompt(DiscardPrompt, Discard); - } - - private void Discard() - { - Debug.Log($"Discarding {gameObject.name}"); - ToDiscard = true; - if (IsSpawned) - DespawnAndDestroyServerRpc(); - else - Destroy(gameObject); - } - - [ServerRpc(RequireOwnership = false)] - private void DespawnAndDestroyServerRpc() + public override void PromptDelete() { - Debug.Log($"DespawnAndDestroyServerRpc {gameObject.name}"); - MyNetworkObject.Despawn(); - Destroy(gameObject); + CardGameManager.Instance.Messenger.Prompt(DeletePrompt, RequestDelete); } public override void OnDestroy() diff --git a/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardZone.cs b/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardZone.cs index b9070606..85e7b6e3 100644 --- a/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardZone.cs +++ b/Assets/Scripts/Cgs/CardGameView/Multiplayer/CardZone.cs @@ -272,7 +272,7 @@ public void OnAdd(CardModel cardModel) if (Type == CardZoneType.Area) cardModel.SnapToGrid(); - if (cardModel.ToDiscard) + if (cardModel.ToDelete) return; foreach (var onAddCardDelegate in OnAddCardActions) diff --git a/Assets/Scripts/Cgs/CardGameView/Multiplayer/CgsNetPlayable.cs b/Assets/Scripts/Cgs/CardGameView/Multiplayer/CgsNetPlayable.cs index 4b2796d3..08f645c5 100644 --- a/Assets/Scripts/Cgs/CardGameView/Multiplayer/CgsNetPlayable.cs +++ b/Assets/Scripts/Cgs/CardGameView/Multiplayer/CgsNetPlayable.cs @@ -73,19 +73,21 @@ public GameObject Container public Vector2 Position { - get => IsSpawned ? _positionNetworkVariable.Value : transform.localPosition; + get => IsSpawned ? _positionNetworkVariable.Value : _position; set { - transform.localPosition = value; + _position = value; + transform.localPosition = _position; if (!IsSpawned) return; if (IsServer) - _positionNetworkVariable.Value = transform.localPosition; + _positionNetworkVariable.Value = _position; else - RequestUpdatePosition(transform.localPosition); + RequestUpdatePosition(_position); } } + private Vector2 _position = Vector2.zero; private NetworkVariable _positionNetworkVariable; public Quaternion Rotation @@ -117,7 +119,7 @@ public Quaternion Rotation private float _disownedTime; private Vector2 _previousPosition; - public bool ToDiscard { get; protected set; } + public bool ToDelete { get; protected set; } public virtual string ViewValue => ""; @@ -188,10 +190,16 @@ public override void OnNetworkSpawn() ParentTo(Container == null ? PlayController.Instance.playAreaCardZone.transform : Container.transform); if (IsServer && !Vector2.zero.Equals(transform.localPosition)) - _positionNetworkVariable.Value = transform.localPosition; + { + _position = transform.localPosition; + _positionNetworkVariable.Value = _position; + } if (!Vector2.zero.Equals(Position)) - transform.localPosition = Position; + { + _position = Position; + transform.localPosition = _position; + } if (IsServer && !Quaternion.identity.Equals(transform.localRotation)) _rotationNetworkVariable.Value = transform.localRotation; @@ -392,7 +400,7 @@ public void OnEndDrag(PointerEventData eventData) PostDragPlayable(eventData); - if (IsSpawned && IsOwner && !ToDiscard) + if (IsSpawned && IsOwner && !ToDelete) RemoveOwnershipServerRpc(); } @@ -454,9 +462,10 @@ protected virtual void UpdatePosition() var rectTransform = (RectTransform) transform; rectTransform.position = targetPosition; rectTransform.SetAsLastSibling(); + _position = rectTransform.localPosition; if (IsOwner) - RequestUpdatePosition(rectTransform.localPosition); + RequestUpdatePosition(_position); } public virtual void SnapToGrid() @@ -464,9 +473,10 @@ public virtual void SnapToGrid() var rectTransform = (RectTransform) transform; var gridPosition = CalculateGridPosition(); rectTransform.position = gridPosition; + _position = rectTransform.localPosition; if (IsOwner) - RequestUpdatePosition(rectTransform.localPosition); + RequestUpdatePosition(_position); } protected Vector2 CalculateGridPosition() @@ -532,7 +542,8 @@ private void UpdatePositionServerRpc(Vector2 position) [PublicAPI] public void OnChangePosition(Vector2 oldValue, Vector2 newValue) { - transform.localPosition = newValue; + _position = newValue; + transform.localPosition = _position; } private void RequestUpdateRotation(Quaternion rotation) @@ -564,13 +575,15 @@ public void HideHighlightClientRpc() HighlightMode = HighlightMode.Off; } - public void PromptDelete() + public virtual void PromptDelete() { CardGameManager.Instance.Messenger.Prompt(DeletePrompt, RequestDelete); } - protected void RequestDelete() + public void RequestDelete() { + Debug.Log($"RequestDelete {gameObject.name}"); + ToDelete = true; if (IsSpawned) DeleteServerRpc(); else @@ -578,8 +591,9 @@ protected void RequestDelete() } [ServerRpc(RequireOwnership = false)] - private void DeleteServerRpc() + protected void DeleteServerRpc() { + Debug.Log($"DeleteServerRpc {gameObject.name}"); MyNetworkObject.Despawn(); Destroy(gameObject); } diff --git a/Assets/Scripts/Cgs/CardGameView/Viewer/CardActionPanel.cs b/Assets/Scripts/Cgs/CardGameView/Viewer/CardActionPanel.cs index decac81f..6c95a1e7 100644 --- a/Assets/Scripts/Cgs/CardGameView/Viewer/CardActionPanel.cs +++ b/Assets/Scripts/Cgs/CardGameView/Viewer/CardActionPanel.cs @@ -170,7 +170,7 @@ public void Discard() public static void Discard(CardModel cardModel) { - cardModel.PromptDiscard(); + cardModel.PromptDelete(); } public void Hide() diff --git a/Assets/Scripts/Cgs/CardGameView/Viewer/StackViewer.cs b/Assets/Scripts/Cgs/CardGameView/Viewer/StackViewer.cs index c5652a09..19d9ee46 100644 --- a/Assets/Scripts/Cgs/CardGameView/Viewer/StackViewer.cs +++ b/Assets/Scripts/Cgs/CardGameView/Viewer/StackViewer.cs @@ -126,6 +126,7 @@ public void Sync(int handIndex, CardZone cardZone, Text nameText, Text countText public void OnDrop(CardModel cardModel) { AddCard(cardModel.Value); + cardModel.RequestDelete(); } public void AddCard(UnityCard card)