From c775f79e185f08203c8c73ae44ccf855296ec9cd Mon Sep 17 00:00:00 2001 From: tudor <7089284+tudddorrr@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:36:29 +0000 Subject: [PATCH 1/4] stats history API --- .../Playground/Scenes/Playground.unity | 229 +++++++++++++++++- .../Scripts/Stats/GetStatHistory.cs | 35 +++ .../Scripts/Stats/GetStatHistory.cs.meta | 2 + .../Playground/Scripts/Stats/TrackStat.cs | 4 +- .../com.trytalo.talo/Runtime/APIs/StatsAPI.cs | 27 ++- .../Runtime/Entities/PlayerStat.cs | 14 ++ .../Runtime/Entities/PlayerStat.cs.meta | 2 + .../Runtime/Entities/PlayerStatSnapshot.cs | 13 + .../Entities/PlayerStatSnapshot.cs.meta | 2 + .../com.trytalo.talo/Runtime/Entities/Stat.cs | 21 ++ .../Runtime/Entities/Stat.cs.meta | 2 + .../Responses/ChannelsIndexResponse.cs | 1 + .../Responses/LeaderboardEntriesResponse.cs | 5 +- .../Runtime/Responses/StatsHistoryResponse.cs | 12 + .../Responses/StatsHistoryResponse.cs.meta | 2 + .../Runtime/Responses/StatsPutResponse.cs | 8 + .../Responses/StatsPutResponse.cs.meta | 2 + 17 files changed, 374 insertions(+), 7 deletions(-) create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Entities/Stat.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Entities/Stat.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs.meta diff --git a/Assets/Samples/Playground/Scenes/Playground.unity b/Assets/Samples/Playground/Scenes/Playground.unity index 7674a8d..a36d364 100644 --- a/Assets/Samples/Playground/Scenes/Playground.unity +++ b/Assets/Samples/Playground/Scenes/Playground.unity @@ -2232,6 +2232,153 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1057299517} m_CullTransparentMesh: 1 +--- !u!1 &1085447290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1085447291} + - component: {fileID: 1085447295} + - component: {fileID: 1085447294} + - component: {fileID: 1085447293} + - component: {fileID: 1085447292} + m_Layer: 5 + m_Name: GetStatHistoryButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1085447291 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085447290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1461738294} + m_Father: {fileID: 1550727585} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1085447292 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085447290} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1085447293} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1085447295} + m_TargetAssemblyTypeName: GetStatHistory, Assembly-CSharp + m_MethodName: OnButtonClick + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1085447293 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085447290} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1085447294 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085447290} + m_CullTransparentMesh: 1 +--- !u!114 &1085447295 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085447290} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9f84fa83a0c9549ed84f7a85ca1e94e1, type: 3} + m_Name: + m_EditorClassIdentifier: + statInternalName: gold-collected --- !u!1 &1101604971 GameObject: m_ObjectHideFlags: 0 @@ -2744,7 +2891,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 75724ad42a62f154881cbf6668c7da8f, type: 3} m_Name: m_EditorClassIdentifier: - statInternalName: + statInternalName: gold-collected change: 1 --- !u!114 &1324085947 MonoBehaviour: @@ -3146,6 +3293,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1454318102} m_CullTransparentMesh: 1 +--- !u!1 &1461738293 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1461738294} + - component: {fileID: 1461738296} + - component: {fileID: 1461738295} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1461738294 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461738293} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1085447291} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1461738295 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461738293} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Get stat history +--- !u!222 &1461738296 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461738293} + m_CullTransparentMesh: 1 --- !u!1 &1484174633 GameObject: m_ObjectHideFlags: 0 @@ -3404,6 +3630,7 @@ RectTransform: m_Children: - {fileID: 1899797262} - {fileID: 1324085945} + - {fileID: 1085447291} m_Father: {fileID: 2079681527} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} diff --git a/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs b/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs new file mode 100644 index 0000000..4fddc79 --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; +using TaloGameServices; +using System.Linq; + +public class GetStatHistory : MonoBehaviour +{ + public string statInternalName; + + public void OnButtonClick() + { + FetchHistory(); + } + + private async void FetchHistory() + { + if (string.IsNullOrEmpty(statInternalName)) + { + ResponseMessage.SetText("statInternalName not set on GetStatHistoryButton"); + return; + } + + try + { + var res = await Talo.Stats.GetHistory(statInternalName); + + ResponseMessage.SetText($"{statInternalName} changed by: {string.Join(", ", res.history.Select((item) => item.change))}"); + } + catch (Exception err) + { + ResponseMessage.SetText(err.Message); + throw err; + } + } +} diff --git a/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs.meta b/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs.meta new file mode 100644 index 0000000..27deedd --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9f84fa83a0c9549ed84f7a85ca1e94e1 \ No newline at end of file diff --git a/Assets/Samples/Playground/Scripts/Stats/TrackStat.cs b/Assets/Samples/Playground/Scripts/Stats/TrackStat.cs index 6f6be02..c509184 100644 --- a/Assets/Samples/Playground/Scripts/Stats/TrackStat.cs +++ b/Assets/Samples/Playground/Scripts/Stats/TrackStat.cs @@ -22,9 +22,9 @@ private async void Track() try { - await Talo.Stats.Track(statInternalName, change); + var res = await Talo.Stats.Track(statInternalName, change); - ResponseMessage.SetText($"{statInternalName} changed by {change}"); + ResponseMessage.SetText($"{statInternalName} changed by {change}, new value is {res.playerStat.value}"); } catch (Exception err) { diff --git a/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs b/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs index cba8c32..220889c 100644 --- a/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs +++ b/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; @@ -8,14 +9,36 @@ public class StatsAPI : BaseAPI { public StatsAPI() : base("v1/game-stats") { } - public async Task Track(string internalName, float change = 1f) + public async Task Track(string internalName, float change = 1f) { Talo.IdentityCheck(); var uri = new Uri($"{baseUrl}/{internalName}"); var content = JsonUtility.ToJson(new StatsPutRequest { change = change }); - await Call(uri, "PUT", content); + var json = await Call(uri, "PUT", content); + return JsonUtility.FromJson(json); + } + + public async Task GetHistory(string internalName, int page = 0, DateTime? startDate = null, DateTime? endDate = null) + { + Talo.IdentityCheck(); + + var queryParams = new List { $"page={page}" }; + if (startDate.HasValue) + { + queryParams.Add($"startDate={Uri.EscapeDataString(startDate.Value.ToString("O"))}"); + } + if (endDate.HasValue) + { + queryParams.Add($"endDate={Uri.EscapeDataString(endDate.Value.ToString("O"))}"); + } + + var queryString = string.Join("&", queryParams); + var uri = new Uri($"{baseUrl}/{internalName}/history?{queryString}"); + + var json = await Call(uri, "GET"); + return JsonUtility.FromJson(json); } } } diff --git a/Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs new file mode 100644 index 0000000..da819bb --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs @@ -0,0 +1,14 @@ +using System; + +namespace TaloGameServices +{ + [Serializable] + public class PlayerStat + { + public int id; + public Stat stat; + public float value; + public string createdAt; + public string updatedAt; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs.meta b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs.meta new file mode 100644 index 0000000..ee5836d --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 39d482c6d986841989a126c181279c8a \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs new file mode 100644 index 0000000..1ea279a --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs @@ -0,0 +1,13 @@ +using System; + +namespace TaloGameServices +{ + [Serializable] + public class PlayerStatSnapshot + { + public float change; + public float value; + public float globalValue; + public string createdAt; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs.meta b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs.meta new file mode 100644 index 0000000..536122f --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 31be07d2d1dd34d26a5aed1f23212c62 \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/Entities/Stat.cs b/Packages/com.trytalo.talo/Runtime/Entities/Stat.cs new file mode 100644 index 0000000..05227c7 --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Entities/Stat.cs @@ -0,0 +1,21 @@ +using System; + +namespace TaloGameServices +{ + [Serializable] + public class Stat + { + public int id; + public string internalName; + public string name; + public bool global; + public float globalValue; + public float defaultValue; + public float maxChange; + public float? minValue; + public float? maxValue; + public int minTimeBetweenUpdates; + public string createdAt; + public string updatedAt; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Entities/Stat.cs.meta b/Packages/com.trytalo.talo/Runtime/Entities/Stat.cs.meta new file mode 100644 index 0000000..3854e8a --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Entities/Stat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9264ceb8843c9466bbb7e11915b8bf3d \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/Responses/ChannelsIndexResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/ChannelsIndexResponse.cs index 532806e..a4d6d45 100644 --- a/Packages/com.trytalo.talo/Runtime/Responses/ChannelsIndexResponse.cs +++ b/Packages/com.trytalo.talo/Runtime/Responses/ChannelsIndexResponse.cs @@ -5,6 +5,7 @@ public class ChannelsIndexResponse { public Channel[] channels; public int count; + public int itemsPerPage; public bool isLastPage; } } diff --git a/Packages/com.trytalo.talo/Runtime/Responses/LeaderboardEntriesResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/LeaderboardEntriesResponse.cs index a9c9fb2..866525e 100644 --- a/Packages/com.trytalo.talo/Runtime/Responses/LeaderboardEntriesResponse.cs +++ b/Packages/com.trytalo.talo/Runtime/Responses/LeaderboardEntriesResponse.cs @@ -3,8 +3,9 @@ [System.Serializable] public class LeaderboardEntriesResponse { - public LeaderboardEntry[] entries = new LeaderboardEntry[0]; + public LeaderboardEntry[] entries; public int count; - public bool isLastPage = true; + public int itemsPerPage; + public bool isLastPage; } } diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs new file mode 100644 index 0000000..25b1c4f --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs @@ -0,0 +1,12 @@ +namespace TaloGameServices +{ + [System.Serializable] + public class StatsHistoryResponse + { + public PlayerStatSnapshot[] history; + public int count; + public int itemsPerPage; + + public bool isLastPage; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs.meta b/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs.meta new file mode 100644 index 0000000..55ddee4 --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 602f8af67f71c4d07af13b57de05c6cb \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs new file mode 100644 index 0000000..398367e --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs @@ -0,0 +1,8 @@ +namespace TaloGameServices +{ + [System.Serializable] + public class StatsPutResponse + { + public PlayerStat playerStat; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs.meta b/Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs.meta new file mode 100644 index 0000000..65ddbec --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsPutResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 005f9a43c5df4416295844e0b8024128 \ No newline at end of file From 67ea4d42e9d56c18804680eea6e962afc542de6f Mon Sep 17 00:00:00 2001 From: tudor <7089284+tudddorrr@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:41:48 +0000 Subject: [PATCH 2/4] global stats history api --- .../Playground/Scenes/Playground.unity | 231 +++++++++++++++++- .../Scripts/Stats/GetGlobalHistory.cs | 34 +++ .../Scripts/Stats/GetGlobalHistory.cs.meta | 2 + .../Scripts/Stats/GetStatHistory.cs | 3 +- .../com.trytalo.talo/Runtime/APIs/StatsAPI.cs | 23 ++ .../Runtime/Entities/PlayerStatSnapshot.cs | 1 + .../Responses/StatsGlobalHistoryResponse.cs | 24 ++ .../StatsGlobalHistoryResponse.cs.meta | 2 + .../Runtime/Responses/StatsHistoryResponse.cs | 1 - 9 files changed, 317 insertions(+), 4 deletions(-) create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs.meta diff --git a/Assets/Samples/Playground/Scenes/Playground.unity b/Assets/Samples/Playground/Scenes/Playground.unity index a36d364..3c9edcf 100644 --- a/Assets/Samples/Playground/Scenes/Playground.unity +++ b/Assets/Samples/Playground/Scenes/Playground.unity @@ -721,6 +721,153 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 131549789} m_CullTransparentMesh: 1 +--- !u!1 &182147967 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 182147968} + - component: {fileID: 182147972} + - component: {fileID: 182147971} + - component: {fileID: 182147970} + - component: {fileID: 182147969} + m_Layer: 5 + m_Name: GetGlobalStatHistoryButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &182147968 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182147967} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1719263428} + m_Father: {fileID: 1550727585} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &182147969 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182147967} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 182147970} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 182147972} + m_TargetAssemblyTypeName: GetGlobalHistory, Assembly-CSharp + m_MethodName: OnButtonClick + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &182147970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182147967} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &182147971 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182147967} + m_CullTransparentMesh: 1 +--- !u!114 &182147972 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182147967} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 864b7e25db3084b89ba752287d6b6d74, type: 3} + m_Name: + m_EditorClassIdentifier: + statInternalName: --- !u!1 &288578214 GameObject: m_ObjectHideFlags: 0 @@ -2378,7 +2525,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9f84fa83a0c9549ed84f7a85ca1e94e1, type: 3} m_Name: m_EditorClassIdentifier: - statInternalName: gold-collected + statInternalName: --- !u!1 &1101604971 GameObject: m_ObjectHideFlags: 0 @@ -2891,7 +3038,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 75724ad42a62f154881cbf6668c7da8f, type: 3} m_Name: m_EditorClassIdentifier: - statInternalName: gold-collected + statInternalName: change: 1 --- !u!114 &1324085947 MonoBehaviour: @@ -3631,6 +3778,7 @@ RectTransform: - {fileID: 1899797262} - {fileID: 1324085945} - {fileID: 1085447291} + - {fileID: 182147968} m_Father: {fileID: 2079681527} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -4057,6 +4205,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1717956219} m_CullTransparentMesh: 1 +--- !u!1 &1719263427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1719263428} + - component: {fileID: 1719263430} + - component: {fileID: 1719263429} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1719263428 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1719263427} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 182147968} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1719263429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1719263427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Get global history +--- !u!222 &1719263430 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1719263427} + m_CullTransparentMesh: 1 --- !u!1 &1720564332 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs b/Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs new file mode 100644 index 0000000..4ae0991 --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs @@ -0,0 +1,34 @@ +using System; +using UnityEngine; +using TaloGameServices; + +public class GetGlobalHistory : MonoBehaviour +{ + public string statInternalName; + + public void OnButtonClick() + { + FetchGlobalHistory(); + } + + private async void FetchGlobalHistory() + { + if (string.IsNullOrEmpty(statInternalName)) + { + ResponseMessage.SetText("statInternalName not set on GetGlobalHistoryButton"); + return; + } + + try + { + var res = await Talo.Stats.GetGlobalHistory(statInternalName); + + ResponseMessage.SetText($"Min: {res.globalValue.minValue}, max: {res.globalValue.maxValue}, median: {res.globalValue.medianValue}, average: {res.globalValue.averageValue}, average change: {res.globalValue.averageChange}"); + } + catch (Exception err) + { + ResponseMessage.SetText(err.Message); + throw err; + } + } +} diff --git a/Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs.meta b/Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs.meta new file mode 100644 index 0000000..b61caf3 --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetGlobalHistory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 864b7e25db3084b89ba752287d6b6d74 \ No newline at end of file diff --git a/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs b/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs index 4fddc79..c4641e1 100644 --- a/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs +++ b/Assets/Samples/Playground/Scripts/Stats/GetStatHistory.cs @@ -23,8 +23,9 @@ private async void FetchHistory() try { var res = await Talo.Stats.GetHistory(statInternalName); + var changeString = res.count > 0 ? string.Join(", ", res.history.Select((item) => item.change)) : "no changes"; - ResponseMessage.SetText($"{statInternalName} changed by: {string.Join(", ", res.history.Select((item) => item.change))}"); + ResponseMessage.SetText($"{statInternalName} changed by: {changeString}"); } catch (Exception err) { diff --git a/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs b/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs index 220889c..61ae5e4 100644 --- a/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs +++ b/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs @@ -40,5 +40,28 @@ public async Task GetHistory(string internalName, int page var json = await Call(uri, "GET"); return JsonUtility.FromJson(json); } + + public async Task GetGlobalHistory(string internalName, int page = 0, string playerId = "", DateTime? startDate = null, DateTime? endDate = null) + { + var queryParams = new List { $"page={page}" }; + if (!string.IsNullOrEmpty(playerId)) + { + queryParams.Add($"playerId={playerId}"); + } + if (startDate.HasValue) + { + queryParams.Add($"startDate={Uri.EscapeDataString(startDate.Value.ToString("O"))}"); + } + if (endDate.HasValue) + { + queryParams.Add($"endDate={Uri.EscapeDataString(endDate.Value.ToString("O"))}"); + } + + var queryString = string.Join("&", queryParams); + var uri = new Uri($"{baseUrl}/{internalName}/global-history?{queryString}"); + + var json = await Call(uri, "GET"); + return JsonUtility.FromJson(json); + } } } diff --git a/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs index 1ea279a..cedb2a4 100644 --- a/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs +++ b/Packages/com.trytalo.talo/Runtime/Entities/PlayerStatSnapshot.cs @@ -5,6 +5,7 @@ namespace TaloGameServices [Serializable] public class PlayerStatSnapshot { + public PlayerAlias playerAlias; public float change; public float value; public float globalValue; diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs new file mode 100644 index 0000000..39500c7 --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs @@ -0,0 +1,24 @@ +using System; + +namespace TaloGameServices +{ + [Serializable] + public struct GlobalValueMetrics + { + public float minValue; + public float maxValue; + public float medianValue; + public float averageValue; + public float averageChange; + } + + [Serializable] + public class StatsGlobalHistoryResponse + { + public PlayerStatSnapshot[] history; + public GlobalValueMetrics globalValue; + public int count; + public int itemsPerPage; + public bool isLastPage; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs.meta b/Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs.meta new file mode 100644 index 0000000..6553b8f --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsGlobalHistoryResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a8eeabff1b572459d8a6ccf4aa8e3ba4 \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs index 25b1c4f..fa958c2 100644 --- a/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsHistoryResponse.cs @@ -6,7 +6,6 @@ public class StatsHistoryResponse public PlayerStatSnapshot[] history; public int count; public int itemsPerPage; - public bool isLastPage; } } From a02b611cdc6503054b45c63d2d822014d573d288 Mon Sep 17 00:00:00 2001 From: tudor <7089284+tudddorrr@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:31:48 +0000 Subject: [PATCH 3/4] get and index stat apis --- .../Playground/Scenes/Playground.unity | 468 +++++++++++++++++- .../Playground/Scripts/Stats/GetAllStats.cs | 27 + .../Scripts/Stats/GetAllStats.cs.meta | 2 + .../Playground/Scripts/Stats/GetStat.cs | 34 ++ .../Playground/Scripts/Stats/GetStat.cs.meta | 2 + .../com.trytalo.talo/Runtime/APIs/StatsAPI.cs | 18 + .../Runtime/Responses/StatResponse.cs | 8 + .../Runtime/Responses/StatResponse.cs.meta | 2 + .../Runtime/Responses/StatsIndexResponse.cs | 8 + .../Responses/StatsIndexResponse.cs.meta | 2 + 10 files changed, 564 insertions(+), 7 deletions(-) create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs.meta create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetStat.cs create mode 100644 Assets/Samples/Playground/Scripts/Stats/GetStat.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs.meta create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs create mode 100644 Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs.meta diff --git a/Assets/Samples/Playground/Scenes/Playground.unity b/Assets/Samples/Playground/Scenes/Playground.unity index 3c9edcf..980a641 100644 --- a/Assets/Samples/Playground/Scenes/Playground.unity +++ b/Assets/Samples/Playground/Scenes/Playground.unity @@ -179,7 +179,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 20 + m_Spacing: 10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -480,7 +480,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 20 + m_Spacing: 10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -868,6 +868,85 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: statInternalName: +--- !u!1 &229056243 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 229056244} + - component: {fileID: 229056246} + - component: {fileID: 229056245} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &229056244 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 229056243} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1909633279} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &229056245 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 229056243} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Get all stats +--- !u!222 &229056246 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 229056243} + m_CullTransparentMesh: 1 --- !u!1 &288578214 GameObject: m_ObjectHideFlags: 0 @@ -2289,7 +2368,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 20 + m_Spacing: 10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -2363,7 +2442,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 20 + m_Spacing: 10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -2663,7 +2742,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 20 + m_Spacing: 10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -3134,6 +3213,153 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1324085944} m_CullTransparentMesh: 1 +--- !u!1 &1381655564 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1381655565} + - component: {fileID: 1381655569} + - component: {fileID: 1381655568} + - component: {fileID: 1381655567} + - component: {fileID: 1381655566} + m_Layer: 5 + m_Name: GetStatButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1381655565 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381655564} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2060248632} + m_Father: {fileID: 1550727585} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1381655566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381655564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1381655567} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1381655569} + m_TargetAssemblyTypeName: GetStat, Assembly-CSharp + m_MethodName: OnButtonClick + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1381655567 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381655564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1381655568 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381655564} + m_CullTransparentMesh: 1 +--- !u!114 &1381655569 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1381655564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9c964365b73394ebf87ba80c817fe59e, type: 3} + m_Name: + m_EditorClassIdentifier: + statInternalName: --- !u!1 &1393724384 GameObject: m_ObjectHideFlags: 0 @@ -3776,6 +4002,8 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1899797262} + - {fileID: 1909633279} + - {fileID: 1381655565} - {fileID: 1324085945} - {fileID: 1085447291} - {fileID: 182147968} @@ -3804,7 +4032,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 20 + m_Spacing: 10 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 @@ -4693,6 +4921,153 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1899797261} m_CullTransparentMesh: 1 +--- !u!1 &1909633278 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1909633279} + - component: {fileID: 1909633283} + - component: {fileID: 1909633282} + - component: {fileID: 1909633281} + - component: {fileID: 1909633280} + m_Layer: 5 + m_Name: GetAllStatsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1909633279 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1909633278} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 229056244} + m_Father: {fileID: 1550727585} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1909633280 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1909633278} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1909633281} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1909633283} + m_TargetAssemblyTypeName: GetAllStats, Assembly-CSharp + m_MethodName: OnButtonClick + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1909633281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1909633278} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1909633282 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1909633278} + m_CullTransparentMesh: 1 +--- !u!114 &1909633283 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1909633278} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97878412af55348cd93fdd4ef8ecf7e5, type: 3} + m_Name: + m_EditorClassIdentifier: + statInternalName: --- !u!1 &1989410050 GameObject: m_ObjectHideFlags: 0 @@ -4919,6 +5294,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2015254663} m_CullTransparentMesh: 1 +--- !u!1 &2060248631 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2060248632} + - component: {fileID: 2060248634} + - component: {fileID: 2060248633} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2060248632 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060248631} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1381655565} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2060248633 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060248631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Get stat +--- !u!222 &2060248634 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060248631} + m_CullTransparentMesh: 1 --- !u!1 &2079681526 GameObject: m_ObjectHideFlags: 0 @@ -5022,7 +5476,7 @@ MonoBehaviour: m_StartCorner: 0 m_StartAxis: 0 m_CellSize: {x: 300, y: 240} - m_Spacing: {x: 40, y: 40} + m_Spacing: {x: 40, y: 20} m_Constraint: 0 m_ConstraintCount: 2 --- !u!1 &2106635468 diff --git a/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs b/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs new file mode 100644 index 0000000..2a8691c --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using UnityEngine; +using TaloGameServices; + +public class GetAllStats : MonoBehaviour +{ + public void OnButtonClick() + { + FetchStats(); + } + + private async void FetchStats() + { + try + { + var res = await Talo.Stats.GetStats(); + var internalNames = res.Length > 0 ? string.Join(", ", res.Select((item) => item.internalName)) : "no stats"; + ResponseMessage.SetText($"Stats: {internalNames}"); + } + catch (Exception err) + { + ResponseMessage.SetText(err.Message); + throw err; + } + } +} diff --git a/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs.meta b/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs.meta new file mode 100644 index 0000000..4a903b9 --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 97878412af55348cd93fdd4ef8ecf7e5 \ No newline at end of file diff --git a/Assets/Samples/Playground/Scripts/Stats/GetStat.cs b/Assets/Samples/Playground/Scripts/Stats/GetStat.cs new file mode 100644 index 0000000..0f6f298 --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetStat.cs @@ -0,0 +1,34 @@ +using System; +using UnityEngine; +using TaloGameServices; + +public class GetStat : MonoBehaviour +{ + public string statInternalName; + + public void OnButtonClick() + { + FetchStat(); + } + + private async void FetchStat() + { + if (string.IsNullOrEmpty(statInternalName)) + { + ResponseMessage.SetText("statInternalName not set on GetStatButton"); + return; + } + + try + { + var res = await Talo.Stats.GetStat(statInternalName); + + ResponseMessage.SetText($"{res.name} is{(res.global ? "" : " not")} a global stat, with a default value of {res.defaultValue}"); + } + catch (Exception err) + { + ResponseMessage.SetText(err.Message); + throw err; + } + } +} diff --git a/Assets/Samples/Playground/Scripts/Stats/GetStat.cs.meta b/Assets/Samples/Playground/Scripts/Stats/GetStat.cs.meta new file mode 100644 index 0000000..f226861 --- /dev/null +++ b/Assets/Samples/Playground/Scripts/Stats/GetStat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9c964365b73394ebf87ba80c817fe59e \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs b/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs index 61ae5e4..1e0f9af 100644 --- a/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs +++ b/Packages/com.trytalo.talo/Runtime/APIs/StatsAPI.cs @@ -9,6 +9,24 @@ public class StatsAPI : BaseAPI { public StatsAPI() : base("v1/game-stats") { } + public async Task GetStats() + { + var uri = new Uri(baseUrl); + var json = await Call(uri, "GET"); + + var res = JsonUtility.FromJson(json); + return res.stats; + } + + public async Task GetStat(string internalName) + { + var uri = new Uri($"{baseUrl}/{internalName}"); + var json = await Call(uri, "GET"); + + var res = JsonUtility.FromJson(json); + return res.stat; + } + public async Task Track(string internalName, float change = 1f) { Talo.IdentityCheck(); diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs new file mode 100644 index 0000000..b0c3147 --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs @@ -0,0 +1,8 @@ +namespace TaloGameServices +{ + [System.Serializable] + public class StatResponse + { + public Stat stat; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs.meta b/Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs.meta new file mode 100644 index 0000000..cd70acd --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3c0927ee22a89462a9a64917dad309d6 \ No newline at end of file diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs b/Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs new file mode 100644 index 0000000..f4f9fac --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs @@ -0,0 +1,8 @@ +namespace TaloGameServices +{ + [System.Serializable] + public class StatsIndexResponse + { + public Stat[] stats; + } +} diff --git a/Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs.meta b/Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs.meta new file mode 100644 index 0000000..405bfc7 --- /dev/null +++ b/Packages/com.trytalo.talo/Runtime/Responses/StatsIndexResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 742e29b7cdf484f0eb5e16e37214c248 \ No newline at end of file From e3cf967d21ee7c49661f6bee2661d15f2c81ce2a Mon Sep 17 00:00:00 2001 From: tudor <7089284+tudddorrr@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:55:35 +0000 Subject: [PATCH 4/4] formatting --- Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs | 2 +- Assets/Samples/Playground/Scripts/Stats/GetStat.cs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs b/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs index 2a8691c..389ec74 100644 --- a/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs +++ b/Assets/Samples/Playground/Scripts/Stats/GetAllStats.cs @@ -16,7 +16,7 @@ private async void FetchStats() { var res = await Talo.Stats.GetStats(); var internalNames = res.Length > 0 ? string.Join(", ", res.Select((item) => item.internalName)) : "no stats"; - ResponseMessage.SetText($"Stats: {internalNames}"); + ResponseMessage.SetText($"Stats: {internalNames}"); } catch (Exception err) { diff --git a/Assets/Samples/Playground/Scripts/Stats/GetStat.cs b/Assets/Samples/Playground/Scripts/Stats/GetStat.cs index 0f6f298..ed12a10 100644 --- a/Assets/Samples/Playground/Scripts/Stats/GetStat.cs +++ b/Assets/Samples/Playground/Scripts/Stats/GetStat.cs @@ -22,8 +22,7 @@ private async void FetchStat() try { var res = await Talo.Stats.GetStat(statInternalName); - - ResponseMessage.SetText($"{res.name} is{(res.global ? "" : " not")} a global stat, with a default value of {res.defaultValue}"); + ResponseMessage.SetText($"{res.name} is{(res.global ? "" : " not")} a global stat, with a default value of {res.defaultValue}"); } catch (Exception err) {