2
0

MultiplayerSampleTypes.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0 OR MIT
  5. *
  6. */
  7. #pragma once
  8. #include <AzCore/Asset/AssetSerializer.h>
  9. #include <AzFramework/Spawnable/Spawnable.h>
  10. #include <AzNetworking/DataStructures/FixedSizeBitset.h>
  11. #include <AzNetworking/Utilities/QuantizedValues.h>
  12. #include <Multiplayer/MultiplayerTypes.h>
  13. namespace MultiplayerSample
  14. {
  15. constexpr AZStd::string_view WinningCoinCountSetting = "/MultiplayerSample/Settings/WinningCoinCount";
  16. constexpr AZStd::string_view KnockbackDistanceByEnergyBallSetting = "/MultiplayerSample/Settings/EnergyBall/KnockbackDistanceMeters";
  17. constexpr AZStd::string_view EnergyBallSpeedSetting = "/MultiplayerSample/Settings/EnergyBall/Speed";
  18. constexpr AZStd::string_view EnergyBallArmorDamageSetting = "/MultiplayerSample/Settings/EnergyBall/ArmorDamage";
  19. constexpr AZStd::string_view EnergyCannonFiringPeriodSetting = "/MultiplayerSample/Settings/EnergyCannon/FiringPeriodMilliseconds";
  20. using StickAxis = AzNetworking::QuantizedValues<1, 1, -1, 1>;
  21. using MouseAxis = AzNetworking::QuantizedValues<1, 2, -1, 1>;
  22. //! Various character animation states.
  23. enum class CharacterAnimState
  24. {
  25. Idle,
  26. Sprinting,
  27. Crouching,
  28. Jumping,
  29. Falling,
  30. Landing,
  31. Climbing,
  32. Aiming,
  33. Shooting,
  34. Hit,
  35. Dying,
  36. MAX
  37. };
  38. using CharacterAnimStateBitset = AzNetworking::FixedSizeBitset<static_cast<AZStd::size_t>(CharacterAnimState::MAX)>;
  39. enum class Action
  40. {
  41. Default,
  42. Strafing,
  43. Sprinting,
  44. Jumping,
  45. Crouching,
  46. COUNT = Crouching + 1
  47. };
  48. AZ_ENUM_CLASS(SoundEffect,
  49. Unused,
  50. // Player Sounds
  51. PlayerFootSteps,
  52. PlayerExertion,
  53. PlayerKnockedDown,
  54. ArmorBreaking,
  55. ArmorMend,
  56. PlayerOuch,
  57. LadderClimb,
  58. ShutDown,
  59. // Game Event Sounds
  60. CountDown,
  61. GemPickup,
  62. VictoryFanfare,
  63. LosingFanfare,
  64. RoundStart,
  65. RoundEnd,
  66. GameEnd,
  67. // Laser Pistol
  68. LaserPistolMuzzleFlash,
  69. LaserPistolImpact,
  70. // Bubble Gun
  71. BubbleGunBuildup,
  72. BubbleGunMuzzleFlash,
  73. BubbleGunProjectile,
  74. BubbleGunImpact,
  75. // Environment
  76. JumpPadLaunch,
  77. TeleporterUse,
  78. // Energy Ball Trap
  79. EnergyBallTrapRisingOutOfTheGround,
  80. EnergyBallTrapBuildup, // followed by muzzle flash
  81. EnergyBallTrapProjectile,
  82. EnergyBallTrapImpact,
  83. EnergyBallTrapOnCooldown // plays when you try to fire it during cooldown
  84. );
  85. using RoundTimeSec = AzNetworking::QuantizedValues<1, 2, 0, 3600>; // 1 hour max round duration
  86. static constexpr int MaxSupportedPlayers = 10;
  87. // Temporary match player state.
  88. struct PlayerCoinState
  89. {
  90. Multiplayer::NetEntityId m_playerId = Multiplayer::InvalidNetEntityId;
  91. uint16_t m_coins = 0;
  92. friend bool operator==(const PlayerCoinState& lhs, const PlayerCoinState& rhs)
  93. {
  94. return lhs.m_playerId == rhs.m_playerId
  95. && lhs.m_coins == rhs.m_coins;
  96. }
  97. friend bool operator!=(const PlayerCoinState& lhs, const PlayerCoinState& rhs)
  98. {
  99. return !(lhs == rhs);
  100. }
  101. bool Serialize(AzNetworking::ISerializer& serializer)
  102. {
  103. return serializer.Serialize(m_playerId, "PlayerId") && serializer.Serialize(m_coins, "Coins");
  104. }
  105. };
  106. using PlayerNameString = AZStd::fixed_string<50>;
  107. struct PlayerState
  108. {
  109. PlayerNameString m_playerName;
  110. uint32_t m_score = 0; // coins collected
  111. uint8_t m_remainingArmor = 0;
  112. bool operator!=(const PlayerState& rhs) const;
  113. bool Serialize(AzNetworking::ISerializer& serializer);
  114. };
  115. inline bool PlayerState::Serialize(AzNetworking::ISerializer& serializer)
  116. {
  117. return serializer.Serialize(m_playerName, "Name")
  118. && serializer.Serialize(m_score, "Score")
  119. && serializer.Serialize(m_remainingArmor, "Armor");
  120. }
  121. inline bool PlayerState::operator!=(const PlayerState& rhs) const
  122. {
  123. return m_playerName != rhs.m_playerName
  124. || m_score != rhs.m_score
  125. || m_remainingArmor != rhs.m_remainingArmor;
  126. }
  127. struct MatchResultsSummary
  128. {
  129. PlayerNameString m_winningPlayerName;
  130. AZStd::vector<PlayerState> m_playerStates;
  131. bool operator!=(const MatchResultsSummary& rhs) const;
  132. bool Serialize(AzNetworking::ISerializer& serializer);
  133. };
  134. inline bool MatchResultsSummary::Serialize(AzNetworking::ISerializer& serializer)
  135. {
  136. return serializer.Serialize(m_winningPlayerName, "winningPlayerName")
  137. && serializer.Serialize(m_playerStates, "playerStates");
  138. }
  139. inline bool MatchResultsSummary::operator!=(const MatchResultsSummary& rhs) const
  140. {
  141. return m_winningPlayerName != rhs.m_winningPlayerName;
  142. }
  143. struct PlayerResetOptions
  144. {
  145. bool m_resetArmor = false;
  146. uint16_t m_coinPenalty = 0;
  147. bool Serialize(AzNetworking::ISerializer& serializer);
  148. };
  149. inline bool PlayerResetOptions::Serialize(AzNetworking::ISerializer& serializer)
  150. {
  151. return serializer.Serialize(m_resetArmor, "resetArmor")
  152. && serializer.Serialize(m_coinPenalty, "coinPenalty");
  153. }
  154. //! Defines a gem type with an asset and a tag name.
  155. class GemSpawnable
  156. {
  157. public:
  158. AZ_RTTI(GemSpawnable, "{393888AE-F158-40CB-9AA0-46767BDA5694}");
  159. virtual ~GemSpawnable() = default;
  160. static void Reflect(AZ::ReflectContext* context);
  161. AZStd::string m_tag;
  162. AzFramework::SpawnableAsset m_gemAsset;
  163. AZ::u16 m_scoreValue = 1;
  164. };
  165. using GemSpawnableVector = AZStd::vector<GemSpawnable>;
  166. //! Defines a weighted chance for a gem type to spawn in a given round.
  167. class GemWeightChance
  168. {
  169. public:
  170. AZ_RTTI(GemWeightChance, "{B9B5C6A7-895D-407A-90B7-26FB10C6DA22}");
  171. virtual ~GemWeightChance() = default;
  172. static void Reflect(AZ::ReflectContext* context);
  173. AZStd::string m_tag;
  174. float m_weight = 1.f;
  175. };
  176. //! Defines chances for gem types to spawn in a given round.
  177. class RoundSpawnTable
  178. {
  179. public:
  180. AZ_RTTI(RoundSpawnTable, "{3AB30950-F71A-4F96-9BB0-C1C44B2A53CC}");
  181. virtual ~RoundSpawnTable() = default;
  182. static void Reflect(AZ::ReflectContext* context);
  183. AZStd::vector<GemWeightChance> m_gemWeights;
  184. };
  185. using RoundSpawnTableVector = AZStd::vector<RoundSpawnTable>;
  186. }
  187. namespace AZ
  188. {
  189. AZ_TYPE_INFO_SPECIALIZE(MultiplayerSample::SoundEffect, "{1A214937-62F2-4724-A66C-CC3E9D4F1F2F}");
  190. AZ_TYPE_INFO_SPECIALIZE(MultiplayerSample::CharacterAnimState, "{2DC36B4D-3B14-45A8-911A-60F8732F6A88}");
  191. AZ_TYPE_INFO_SPECIALIZE(MultiplayerSample::Action, "{1BFDEBD3-ED36-465D-BFA0-9160CFB24F37}");
  192. }