definition.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #pragma once
  2. #include <cstddef>
  3. #include <cstdint>
  4. #include <string_view>
  5. namespace sunrise::state::build_data::items::catalysts {
  6. /** The target build contains fewer than 128 exotic weapon catalyst-shaped sockets. */
  7. inline constexpr std::size_t kDefinitionCapacity = 128;
  8. /** All bits set mark a catalyst relation with no completion-value requirement. */
  9. inline constexpr std::uint16_t kUnavailableCompletionValueIndex = 0xFFFFU;
  10. /** All bits set mark a catalyst relation with no acquired-state gate. */
  11. inline constexpr std::uint16_t kUnavailableAcquisitionIndex = 0xFFFFU;
  12. /** Release status from the build-scoped Season 11 availability data. */
  13. enum class Availability : std::uint8_t {
  14. released = 0,
  15. placeholder = 1,
  16. unsupported = 2,
  17. };
  18. /** Safe catalog and resolver outcomes. */
  19. enum class Error : std::uint8_t {
  20. none = 0,
  21. noCatalyst,
  22. placeholderOnly,
  23. unsupportedBuild,
  24. missingReleased,
  25. ambiguousLifecycle,
  26. invalidSocket,
  27. invalidPlug,
  28. invalidEffect,
  29. invalidAcquisition,
  30. invalidCompletion,
  31. invalidItemState,
  32. };
  33. /**
  34. * @param error Catalog or item-resolution result.
  35. * @return Stable log name for the result.
  36. */
  37. [[nodiscard]] constexpr std::string_view error_name(Error error) noexcept {
  38. switch (error) {
  39. case Error::none:
  40. return "none";
  41. case Error::noCatalyst:
  42. return "no_catalyst";
  43. case Error::placeholderOnly:
  44. return "placeholder_only";
  45. case Error::unsupportedBuild:
  46. return "unsupported_build";
  47. case Error::missingReleased:
  48. return "missing_released";
  49. case Error::ambiguousLifecycle:
  50. return "ambiguous_lifecycle";
  51. case Error::invalidSocket:
  52. return "invalid_socket";
  53. case Error::invalidPlug:
  54. return "invalid_plug";
  55. case Error::invalidEffect:
  56. return "invalid_effect";
  57. case Error::invalidAcquisition:
  58. return "invalid_acquisition";
  59. case Error::invalidCompletion:
  60. return "invalid_completion";
  61. case Error::invalidItemState:
  62. return "invalid_item_state";
  63. }
  64. return "unknown";
  65. }
  66. /** One build-derived exotic weapon catalyst relation. */
  67. struct Definition {
  68. std::uint32_t itemDefinitionHash{};
  69. std::uint16_t itemDefinitionIndex{};
  70. /** Unsupported rows use the unavailable item-index value. */
  71. std::uint16_t completedPlugDefinitionIndex{};
  72. /** Item row that supplies the completed catalyst's native perks and stat changes. */
  73. std::uint16_t effectDefinitionIndex{};
  74. /** Family-5 acquired-state slot that makes the catalyst socket visible. */
  75. std::uint16_t acquisitionDefinitionIndex{kUnavailableAcquisitionIndex};
  76. /** Family-5 value slot used by legacy catalyst completion expressions. */
  77. std::uint16_t completionValueIndex{kUnavailableCompletionValueIndex};
  78. std::uint8_t socketLane{};
  79. Availability availability{Availability::unsupported};
  80. /** Required value for a legacy completion expression; zero when no value is needed. */
  81. std::int32_t completionValue{};
  82. };
  83. /** The only state a released catalyst exposes to callers. */
  84. struct CompletedCatalyst {
  85. std::uint8_t socketLane{};
  86. std::uint16_t completedPlugDefinitionIndex{};
  87. std::uint16_t effectDefinitionIndex{};
  88. std::uint16_t acquisitionDefinitionIndex{kUnavailableAcquisitionIndex};
  89. std::uint16_t completionValueIndex{kUnavailableCompletionValueIndex};
  90. std::int32_t completionValue{};
  91. };
  92. /** Result of scanning one effect item's postfix completion expressions. */
  93. enum class CompletionConditionState : std::uint8_t {
  94. absent = 0,
  95. present = 1,
  96. ambiguous = 2,
  97. };
  98. /** One item definition's build-derived legacy completion value. */
  99. struct CompletionCondition {
  100. std::uint16_t itemDefinitionIndex{};
  101. std::uint16_t valueIndex{kUnavailableCompletionValueIndex};
  102. std::int32_t value{};
  103. CompletionConditionState state{CompletionConditionState::absent};
  104. };
  105. /** Result of reading one socket type's acquired-state rule. */
  106. enum class AcquisitionState : std::uint8_t {
  107. absent = 0,
  108. present = 1,
  109. ambiguous = 2,
  110. };
  111. /** One socket type's build-derived Family-5 acquisition gate. */
  112. struct AcquisitionGate {
  113. std::uint16_t socketType{};
  114. std::uint16_t definitionIndex{kUnavailableAcquisitionIndex};
  115. AcquisitionState state{AcquisitionState::absent};
  116. };
  117. /** One resolver result. Errors never carry a completed state. */
  118. struct Result {
  119. Error error{Error::noCatalyst};
  120. Availability availability{Availability::unsupported};
  121. CompletedCatalyst completed{};
  122. };
  123. /** Whole-catalog counts plus the first unsafe released relation. */
  124. struct Report {
  125. std::size_t released{};
  126. std::size_t placeholder{};
  127. std::size_t unsupported{};
  128. Error error{Error::none};
  129. std::uint32_t itemDefinitionHash{};
  130. std::uint8_t socketLane{};
  131. };
  132. /** Result of the one catalog-aware catalyst item change. */
  133. enum class ApplyResult : std::uint8_t {
  134. unchanged = 0,
  135. completed,
  136. failed,
  137. };
  138. } // namespace sunrise::state::build_data::items::catalysts