From a501a9755d75019acfc5367c3b3f8fdf7d730d55 Mon Sep 17 00:00:00 2001
From: KoalaTrapLord <265133236+KoalaTrapLord@users.noreply.github.com>
Date: Thu, 19 Mar 2026 05:13:00 +0000
Subject: [PATCH] fix(unity): resolve all 32 C# compilation errors
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- CardModel: add missing `id` field
- CardModel: `imageUrl` → `imageUri` (match JSON property name)
- DeckModel: `commanderName` → `commander` (match JSON property name)
- PreconDeck: `imageUrl` → `imageUri`
- Add missing `PreconListWrapper` model class
- Add `using UnityEngine.Networking` to CollectionController,
DeckGeneratorController, PreconController
- Remove double StartCoroutine() wrapping on ApiClient calls
(GetRaw/PatchRaw/Delete/PostRaw already return Coroutine)
Affected: CollectionController, DeckBuilderController,
DeckGeneratorController, ScannerController, CoachController
---
.../Assets/Scripts/Animation/CardController.cs | 4 ++--
unity-client/Assets/Scripts/Models/CardModel.cs | 1 +
.../Assets/Scripts/Models/PreconListWrapper.cs | 13 +++++++++++++
unity-client/Assets/Scripts/UI/CoachController.cs | 8 ++++----
.../Assets/Scripts/UI/CollectionController.cs | 13 +++++++------
.../Assets/Scripts/UI/DeckBuilderController.cs | 14 +++++++-------
.../Assets/Scripts/UI/DeckGeneratorController.cs | 5 +++--
unity-client/Assets/Scripts/UI/PreconController.cs | 11 ++++++-----
.../Assets/Scripts/UI/ScannerController.cs | 8 ++++----
9 files changed, 47 insertions(+), 30 deletions(-)
create mode 100644 unity-client/Assets/Scripts/Models/PreconListWrapper.cs
diff --git a/unity-client/Assets/Scripts/Animation/CardController.cs b/unity-client/Assets/Scripts/Animation/CardController.cs
index b7f9783..41896de 100644
--- a/unity-client/Assets/Scripts/Animation/CardController.cs
+++ b/unity-client/Assets/Scripts/Animation/CardController.cs
@@ -94,8 +94,8 @@ namespace CommanderAILab.Animation
frontFaceImage.sprite = lowResPlaceholder;
// Async load high-res from Scryfall
- if (!string.IsNullOrEmpty(card.imageUrl))
- ImageCache.Instance.GetSprite(card.imageUrl, sprite =>
+ if (!string.IsNullOrEmpty(card.imageUri))
+ ImageCache.Instance.GetSprite(card.imageUri, sprite =>
{
if (frontFaceImage != null) frontFaceImage.sprite = sprite;
});
diff --git a/unity-client/Assets/Scripts/Models/CardModel.cs b/unity-client/Assets/Scripts/Models/CardModel.cs
index c081b4c..3af49da 100644
--- a/unity-client/Assets/Scripts/Models/CardModel.cs
+++ b/unity-client/Assets/Scripts/Models/CardModel.cs
@@ -11,6 +11,7 @@ namespace CommanderAILab.Models
[Serializable]
public class CardModel
{
+ [JsonProperty("id")] public string id;
[JsonProperty("name")] public string name;
[JsonProperty("oracle_id")] public string oracleId;
[JsonProperty("scryfall_id")] public string scryfallId;
diff --git a/unity-client/Assets/Scripts/Models/PreconListWrapper.cs b/unity-client/Assets/Scripts/Models/PreconListWrapper.cs
new file mode 100644
index 0000000..5e7fa15
--- /dev/null
+++ b/unity-client/Assets/Scripts/Models/PreconListWrapper.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using Newtonsoft.Json;
+
+namespace CommanderAILab.Models
+{
+ /// Wrapper for the precon list returned by /api/lab/precons.
+ [Serializable]
+ public class PreconListWrapper
+ {
+ [JsonProperty("precons")] public List precons;
+ }
+}
diff --git a/unity-client/Assets/Scripts/UI/CoachController.cs b/unity-client/Assets/Scripts/UI/CoachController.cs
index 00e9456..c60e26c 100644
--- a/unity-client/Assets/Scripts/UI/CoachController.cs
+++ b/unity-client/Assets/Scripts/UI/CoachController.cs
@@ -395,7 +395,7 @@ namespace CommanderAILab.UI
};
string body = JsonConvert.SerializeObject(payload);
- StartCoroutine(ApiClient.Instance.PostRaw("/api/coach/chat", body,
+ ApiClient.Instance.PostRaw("/api/coach/chat", body,
json =>
{
_isWaiting = false;
@@ -416,7 +416,7 @@ namespace CommanderAILab.UI
sendButton.interactable = true;
typingIndicator.gameObject.SetActive(false);
ShowError($"Chat failed: {err}");
- }));
+ });
}
private void AddUserBubble(string text)
@@ -532,14 +532,14 @@ namespace CommanderAILab.UI
preconCompareText.text = "Refreshing precon database...";
string body = JsonConvert.SerializeObject(new { });
- StartCoroutine(ApiClient.Instance.PostRaw("/api/lab/precons/refresh", body,
+ ApiClient.Instance.PostRaw("/api/lab/precons/refresh", body,
json =>
{
if (preconCompareText != null)
preconCompareText.text = "Precon database refreshed!";
LoadPrecons();
},
- err => ShowError($"Precon refresh failed: {err}")));
+ err => ShowError($"Precon refresh failed: {err}"));
}
// ── Export to Simulator ───────────────────────────────────────
diff --git a/unity-client/Assets/Scripts/UI/CollectionController.cs b/unity-client/Assets/Scripts/UI/CollectionController.cs
index f020a01..d8233a6 100644
--- a/unity-client/Assets/Scripts/UI/CollectionController.cs
+++ b/unity-client/Assets/Scripts/UI/CollectionController.cs
@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
+using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
@@ -184,9 +185,9 @@ namespace CommanderAILab.UI
_sortField = SortFieldFromDropdown(sortDropdown.value);
string path = BuildQueryPath(page);
- StartCoroutine(ApiClient.Instance.GetRaw(path,
+ ApiClient.Instance.GetRaw(path,
json => OnPageLoaded(json, page),
- errMsg => OnLoadError(errMsg)));
+ errMsg => OnLoadError(errMsg));
}
private string BuildQueryPath(int page)
@@ -257,9 +258,9 @@ namespace CommanderAILab.UI
// Async image load
var img = tile.GetComponentInChildren();
- if (img != null && !string.IsNullOrEmpty(card.imageUrl))
+ if (img != null && !string.IsNullOrEmpty(card.imageUri))
{
- ImageCache.Instance.GetSprite(card.imageUrl, sprite =>
+ ImageCache.Instance.GetSprite(card.imageUri, sprite =>
{
if (img != null) img.sprite = sprite;
});
@@ -297,9 +298,9 @@ namespace CommanderAILab.UI
detailQuantity.text = $"Owned: {card.ownedQty}";
// Load card art on front face
- if (!string.IsNullOrEmpty(card.imageUrl))
+ if (!string.IsNullOrEmpty(card.imageUri))
{
- ImageCache.Instance.GetSprite(card.imageUrl, sprite =>
+ ImageCache.Instance.GetSprite(card.imageUri, sprite =>
{
if (detailCardFront != null) detailCardFront.sprite = sprite;
});
diff --git a/unity-client/Assets/Scripts/UI/DeckBuilderController.cs b/unity-client/Assets/Scripts/UI/DeckBuilderController.cs
index 630901d..fd9cd92 100644
--- a/unity-client/Assets/Scripts/UI/DeckBuilderController.cs
+++ b/unity-client/Assets/Scripts/UI/DeckBuilderController.cs
@@ -266,9 +266,9 @@ namespace CommanderAILab.UI
if (!string.IsNullOrEmpty(color))
path += $"&colors={UnityWebRequest.EscapeURL(color)}";
- StartCoroutine(ApiClient.Instance.GetRaw(path,
+ ApiClient.Instance.GetRaw(path,
json => PopulateCommanderResults(json),
- err => ShowError($"Commander search failed:\n{err}")));
+ err => ShowError($"Commander search failed:\n{err}"));
}
private void PopulateCommanderResults(string json)
@@ -300,7 +300,7 @@ namespace CommanderAILab.UI
{
_commander = card;
selectedCommanderText.text = $"Commander: {card.name}";
- if (_activeDeck != null) _activeDeck.commanderName = card.name;
+ if (_activeDeck != null) _activeDeck.commander = card.name;
_isDirty = true;
}
@@ -322,17 +322,17 @@ namespace CommanderAILab.UI
_activeDeck.cards = _deckCards;
string json = JsonConvert.SerializeObject(_activeDeck);
string path = $"/api/decks/{_activeDeck.id}";
- StartCoroutine(ApiClient.Instance.PatchRaw(path, json,
+ ApiClient.Instance.PatchRaw(path, json,
_ => { _isDirty = false; LoadDecks(); },
- err => ShowError($"Save failed:\n{err}")));
+ err => ShowError($"Save failed:\n{err}"));
}
private void OnDeleteDeck()
{
if (_activeDeck == null) return;
- StartCoroutine(ApiClient.Instance.Delete($"/api/decks/{_activeDeck.id}",
+ ApiClient.Instance.Delete($"/api/decks/{_activeDeck.id}",
_ => { _activeDeck = null; _deckCards.Clear(); LoadDecks(); },
- err => ShowError($"Delete failed:\n{err}")));
+ err => ShowError($"Delete failed:\n{err}"));
}
// ── Charts ────────────────────────────────────────────────────────────
diff --git a/unity-client/Assets/Scripts/UI/DeckGeneratorController.cs b/unity-client/Assets/Scripts/UI/DeckGeneratorController.cs
index 78049ab..ecbe1b5 100644
--- a/unity-client/Assets/Scripts/UI/DeckGeneratorController.cs
+++ b/unity-client/Assets/Scripts/UI/DeckGeneratorController.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using UnityEngine;
+using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
@@ -114,9 +115,9 @@ namespace CommanderAILab.UI
string q = commanderSearchInput.text.Trim();
if (string.IsNullOrEmpty(q)) return;
string path = $"/api/collection?search={UnityWebRequest.EscapeURL(q)}&type=Legendary+Creature&per_page=20";
- StartCoroutine(ApiClient.Instance.GetRaw(path,
+ ApiClient.Instance.GetRaw(path,
json => PopulateCommanderResults(json),
- err => ShowError($"Commander search failed:\n{err}")));
+ err => ShowError($"Commander search failed:\n{err}"));
}
private void PopulateCommanderResults(string json)
diff --git a/unity-client/Assets/Scripts/UI/PreconController.cs b/unity-client/Assets/Scripts/UI/PreconController.cs
index cd4d75b..a87bfe9 100644
--- a/unity-client/Assets/Scripts/UI/PreconController.cs
+++ b/unity-client/Assets/Scripts/UI/PreconController.cs
@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
+using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
@@ -77,7 +78,7 @@ namespace CommanderAILab.UI
public string colorIdentity;
public int cardCount;
public string theme;
- public string imageUrl;
+ public string imageUri;
}
[Serializable]
@@ -246,11 +247,11 @@ namespace CommanderAILab.UI
btn.onClick.AddListener(() => ShowDetail(captured));
// Load commander image async
- if (!string.IsNullOrEmpty(precon.imageUrl))
+ if (!string.IsNullOrEmpty(precon.imageUri))
{
var img = card.GetComponentInChildren();
if (img != null)
- StartCoroutine(LoadImageAsync(precon.imageUrl, img));
+ StartCoroutine(LoadImageAsync(precon.imageUri, img));
}
}
@@ -287,8 +288,8 @@ namespace CommanderAILab.UI
detailInstallButton.GetComponentInChildren().text =
installed ? "Installed" : "Install to Forge";
- if (!string.IsNullOrEmpty(precon.imageUrl))
- StartCoroutine(LoadImageAsync(precon.imageUrl, detailCommanderImage));
+ if (!string.IsNullOrEmpty(precon.imageUri))
+ StartCoroutine(LoadImageAsync(precon.imageUri, detailCommanderImage));
}
// ========================================================
diff --git a/unity-client/Assets/Scripts/UI/ScannerController.cs b/unity-client/Assets/Scripts/UI/ScannerController.cs
index a9b3943..fb99684 100644
--- a/unity-client/Assets/Scripts/UI/ScannerController.cs
+++ b/unity-client/Assets/Scripts/UI/ScannerController.cs
@@ -292,8 +292,8 @@ namespace CommanderAILab.UI
resultSet.text = card.set;
resultOracleText.text = card.oracleText;
resultConfidence.text = $"Confidence: {confidence:P0}";
- if (!string.IsNullOrEmpty(card.imageUrl))
- ImageCache.Instance.GetSprite(card.imageUrl, s => { if (resultCardImage != null) resultCardImage.sprite = s; });
+ if (!string.IsNullOrEmpty(card.imageUri))
+ ImageCache.Instance.GetSprite(card.imageUri, s => { if (resultCardImage != null) resultCardImage.sprite = s; });
AddToHistory(card);
}
@@ -320,9 +320,9 @@ namespace CommanderAILab.UI
{
if (_scannedCard == null) return;
var body = JsonConvert.SerializeObject(new { card_id = _scannedCard.id, qty = 1 });
- StartCoroutine(ApiClient.Instance.PostRaw("/api/collection/add", body,
+ ApiClient.Instance.PostRaw("/api/collection/add", body,
_ => cameraStatusText.text = $"Added {_scannedCard.name} to collection",
- err => ShowError($"Add to collection failed:\n{err}")));
+ err => ShowError($"Add to collection failed:\n{err}"));
}
private void OnAddToDeck()