using Godot; using System; using System.Collections; using System.Collections.Generic; using System.Linq; public partial class game : Control { private settings_popup _SettingsPopup; private settings_popup SettingsPopup { get { _SettingsPopup ??= GetNode("%SettingsPopup"); return _SettingsPopup; } } [Export] private Vector2 _CardSize = new(200, 200); public Vector2 CardSize { get => _CardSize; set { _CardSize = value; if (IsNodeReady()) PropogateCardSize(); } } public void SetCardSize(Vector2 size) { CardSize = size; } protected void PropogateCardSize() { foreach (var r in GetNode("%RowContainer").GetChildren().OfType()) r.CardSize = _CardSize; foreach (var c in GetNode("%UnassignedCardContainer").GetChildren().OfType()) c.CustomMinimumSize = _CardSize; SetContainerMinima(); } public IEnumerable Rows => GetNode("%RowContainer").GetChildren().OfType(); // Called when the node enters the scene tree for the first time. public override void _Ready() { var rows = this.GetAllDescendents().ToArray(); for (int i = 0; i < 20; i++) { var c = card.MakeCard(GetTree()); c.CardName = $"Card {c.CardId}"; if (GD.RandRange(0, 1) == 1) { //add to a row var r = rows[GD.RandRange(0, rows.Length - 1)]; r.AddCard(c); } else { AddUnassignedCard(c); } } PropogateCardSize(); } public override void _UnhandledInput(InputEvent @event) { if (@event.IsActionPressed("OpenMenu")) { if (SettingsPopup.Visible) { SettingsPopup.ClosePopup(); } else { SettingsPopup.ShowPopup(); } GetViewport().SetInputAsHandled(); } } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { } public void SetContainerMinima() { // var node = GetNode("%RowContainer"); // node.CustomMinimumSize = new Vector2(0, _CardSize.Y * node.GetChildCount()); } public row GetRowById(string id) => GetTree().GetNodesInGroup("RowGroup").OfType() .FirstOrDefault(r => r.RowId == id); public void AddRow(row row, string after = null) { if (after is not null) { var r = GetRowById(after) ?? throw new Exception("row id does not exist"); r.AddSibling(row); } else { var node = GetNode("%RowContainer"); node.AddChild(row); node.MoveChild(row, 0); } SetContainerMinima(); } public void RemoveRow(string id) { var r = GetRowById(id); GetNode("%RowContainer").RemoveChild(r); SetContainerMinima(); } public void AddUnassignedCard(card c) { c.CustomMinimumSize = _CardSize; var node = GetNode("%UnassignedCardContainer"); node.AddChild(c); } public card RemoveUnassignedCard(string id) { var node = GetNode("%UnassignedCardContainer"); var c = node.GetAllDescendents().FirstOrDefault(x => x.CardId == id); if (c is not null) { node.RemoveChild(c); } return c; } public void EditCardInMenu(card c) { GetNode("%CardEditPopup").ActivateForCard(c); } public card ClaimCard(string id) { foreach (row r in Rows) { if (r.TryRemoveCard(id) is card c) return c; } return RemoveUnassignedCard(id); } public card FindCard(string id) { if (string.IsNullOrWhiteSpace(id)) return null; foreach (var c in this.GetAllDescendents()) if (c.CardId == id) return c; return null; } public row FindRow(string id) { foreach (var r in this.GetAllDescendents()) if (r.RowId == id) return r; return null; } #region Commands public void MoveCard(string cardId, string targetRowId, int? toIndex = null) { var r = FindRow(targetRowId); if (r is null) throw new Exception($"row {r.RowId} not found"); var c = ClaimCard(cardId); if (c is null) throw new Exception($"card {c.CardId} not found"); r.AddCard(c, toIndex); } public void MoveRow(string rowId, int toIndex) { var r = FindRow(rowId); if (r is null) throw new Exception($"row {r.RowId} not found"); //TODO what if out of range? r.GetParent().MoveChild(r, toIndex); } public void DeleteCards(params string[] cardId) { //don't claim any cards unless all of them are found if (!cardId.Select(FindCard).All(x => x is not null)) throw new Exception("not all cards found"); foreach (var c in cardId.Select(ClaimCard)) { c.QueueFree(); } } public void DeleteRow(string rowId, bool deleteCards = false) { var r = FindRow(rowId); if (r is null) throw new Exception($"row {r.RowId} not found"); if (!deleteCards) { var unassigned = GetNode("%UnassignedCardContainer"); foreach (var c in r.Cards.ToArray()) c.Reparent(unassigned); } //GetNode("%RowContainer").RemoveChild(r); r.QueueFree(); } public void CreateCard(string title = null, ImageWithMetadata image = null) { var c = card.MakeCard(GetTree()); if (!string.IsNullOrWhiteSpace(title)) c.CardName = title; if (image is not null) { c.SetTexture(ImageTexture.CreateFromImage(image.Image)); c.SetStretchMode(image.StretchMode); } AddUnassignedCard(c); } public void CreateRow(Color? color = null, string title = null) { var scn = GD.Load("res://row.tscn"); var r = scn.Instantiate() as row; if (!string.IsNullOrWhiteSpace(title)) r.RowText = title; if (color is Color color1) r.RowColor = color1; AddRow(r); } public void RenameCard(string cardId, string newName) { FindCard(cardId).CardName = newName; } public void RenameRow(string rowId, string newTitle) { GetRowById(rowId).RowText = newTitle; } public void RecolorRow(string rowId, Color color) { GetRowById(rowId).RowColor = color; } public void ChangeCardImage(string cardId, ImageWithMetadata image) { var c = FindCard(cardId); if (c is null) throw new Exception($"card {c.CardId} not found"); c.SetTexture(ImageTexture.CreateFromImage(image.Image)); c.SetStretchMode(image.StretchMode); } #endregion //Commands }