DemoStatisticsComponent.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "DemoStatisticsComponent.h"
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Serialization/EditContextConstants.inl>
  11. #include <AzCore/Serialization/SerializeContext.h>
  12. #include <LyShine/Bus/UiCanvasBus.h>
  13. #include <LyShine/Bus/UiTextBus.h>
  14. #include <LyShine/Bus/World/UiCanvasRefBus.h>
  15. namespace AppleKraken
  16. {
  17. void DemoStatisticsComponent::Activate()
  18. {
  19. DemoStatisticsNotificationBus::Handler::BusConnect();
  20. m_applesGathered = 0;
  21. m_applesFailed = 0;
  22. // default to our own EntityId if no UI entity is specified
  23. if (!m_uiEntity.IsValid())
  24. {
  25. m_uiEntity = GetEntityId();
  26. }
  27. }
  28. void DemoStatisticsComponent::Deactivate()
  29. {
  30. DemoStatisticsNotificationBus::Handler::BusDisconnect();
  31. }
  32. void DemoStatisticsComponent::Reflect(AZ::ReflectContext* context)
  33. {
  34. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  35. {
  36. serialize->Class<DemoStatisticsComponent, AZ::Component>()->Version(1)->Field("UiEntity", &DemoStatisticsComponent::m_uiEntity);
  37. if (AZ::EditContext* ec = serialize->GetEditContext())
  38. {
  39. ec->Class<DemoStatisticsComponent>("Demo Statistics", "Demo statistics for picked apples")
  40. ->ClassElement(AZ::Edit::ClassElements::EditorData, "Handles counting of interesting events and their UI")
  41. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game"))
  42. ->Attribute(AZ::Edit::Attributes::Category, "AppleKraken")
  43. ->DataElement(
  44. AZ::Edit::UIHandlers::EntityId,
  45. &DemoStatisticsComponent::m_uiEntity,
  46. "Entity with Ui canvas reference ",
  47. "Element which will display the text of statistics");
  48. }
  49. }
  50. }
  51. void DemoStatisticsComponent::AddApple(const AppleEvent& appleEvent)
  52. {
  53. if (IsFailed(appleEvent))
  54. {
  55. m_applesFailed++;
  56. }
  57. else
  58. {
  59. m_applesGathered++;
  60. }
  61. DisplayNumberOfApples();
  62. }
  63. void DemoStatisticsComponent::OnApplePickerSpawned(const AZ::EntityId& entityId)
  64. {
  65. m_applePickerStatus.push_back({ entityId, "READY" });
  66. UpdateTextField(m_applePickerCountElementName, "", m_applePickerStatus.size());
  67. DisplayStatus();
  68. }
  69. void DemoStatisticsComponent::SetApplePickerStatus(const AZ::EntityId& entityId, const AZStd::string& status)
  70. {
  71. for (ApplePickerStatus& applePicker : m_applePickerStatus)
  72. {
  73. if (applePicker.m_entityId == entityId)
  74. {
  75. applePicker.m_status = status;
  76. break;
  77. }
  78. }
  79. DisplayStatus();
  80. }
  81. bool DemoStatisticsComponent::IsFailed(const Tags& tags)
  82. {
  83. return HasTag(tags, kPickingFailedEventTag);
  84. }
  85. // TODO Currently not used, but will be soon
  86. bool DemoStatisticsComponent::IsAutomated(const Tags& tags)
  87. {
  88. return HasTag(tags, kPickingAutomatedEventTag);
  89. }
  90. bool DemoStatisticsComponent::HasTag(const AppleEvent& appleEvent, const AZStd::string& tag)
  91. {
  92. return AZStd::find(appleEvent.cbegin(), appleEvent.cend(), tag) != appleEvent.cend();
  93. }
  94. void DemoStatisticsComponent::DisplayNumberOfApples()
  95. {
  96. UpdateTextField(m_appleGatheredElementName, "", m_applesGathered);
  97. UpdateTextField(m_appleFailedElementName, "", m_applesFailed);
  98. }
  99. void DemoStatisticsComponent::DisplayStatus()
  100. {
  101. UpdateTextField(m_applePickerCountElementName, "", static_cast<uint16_t>(m_applePickerStatus.size()));
  102. int row = 0;
  103. for (const ApplePickerStatus& applePicker : m_applePickerStatus)
  104. {
  105. // increment row here so the display number starts at 1
  106. const AZStd::string& elementName = AZStd::string::format("%s%d", m_applePickerStatusElementName.c_str(), row++);
  107. const AZStd::string& label = AZStd::string::format("APPLEKRAKEN%d %s", row, applePicker.m_status.c_str());
  108. UpdateTextField(elementName, label, 0, true);
  109. }
  110. }
  111. void DemoStatisticsComponent::UpdateTextField(
  112. const AZStd::string& fieldName, const AZStd::string& label, uint16_t counter, bool labelOnly)
  113. {
  114. AZ::EntityId uiCanvas;
  115. EBUS_EVENT_ID_RESULT(uiCanvas, m_uiEntity, UiCanvasRefBus, GetCanvas);
  116. if (!uiCanvas.IsValid())
  117. {
  118. AZ_Warning("DemoStatisticsComponent", false, "%s does not have a UiCanvasRef attached\n", m_uiEntity.ToString().c_str());
  119. return;
  120. }
  121. AZ::EntityId uiTextEntity;
  122. UiCanvasBus::EventResult(uiTextEntity, uiCanvas, &UiCanvasInterface::FindElementEntityIdByName, fieldName);
  123. if (!uiTextEntity.IsValid())
  124. {
  125. AZ_Warning("DemoStatisticsComponent", false, "ui canvas doest not have a %s field\n", fieldName.c_str());
  126. return;
  127. }
  128. if (labelOnly)
  129. {
  130. UiTextBus::Event(uiTextEntity, &UiTextInterface::SetText, label);
  131. }
  132. else
  133. {
  134. UiTextBus::Event(uiTextEntity, &UiTextInterface::SetText, AZStd::string::format("%s %d", label.c_str(), counter));
  135. }
  136. }
  137. } // namespace AppleKraken