1
0

TabletopCheckerSetup.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using JetBrains.Annotations;
  2. using Robust.Shared.Map;
  3. using Robust.Shared.Prototypes;
  4. using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
  5. namespace Content.Server.Tabletop
  6. {
  7. [UsedImplicitly]
  8. public sealed partial class TabletopCheckerSetup : TabletopSetup
  9. {
  10. [DataField("prototypePieceWhite", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
  11. public string PrototypePieceWhite = default!;
  12. [DataField("prototypeCrownWhite", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
  13. public string PrototypeCrownWhite = default!;
  14. [DataField("prototypePieceBlack", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
  15. public string PrototypePieceBlack = default!;
  16. [DataField("prototypeCrownBlack", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
  17. public string PrototypeCrownBlack = default!;
  18. public override void SetupTabletop(TabletopSession session, IEntityManager entityManager)
  19. {
  20. session.Entities.Add(
  21. entityManager.SpawnEntity(BoardPrototype, session.Position.Offset(-1, 0))
  22. );
  23. SpawnPieces(session, entityManager, session.Position.Offset(-4.5f, 3.5f));
  24. }
  25. private void SpawnPieces(TabletopSession session, IEntityManager entityManager, MapCoordinates left)
  26. {
  27. static float GetOffset(float offset) => offset * 1f /* separation */;
  28. Span<EntityUid> pieces = stackalloc EntityUid[42];
  29. var pieceIndex = 0;
  30. // Pieces
  31. for (var offsetY = 0; offsetY < 3; offsetY++)
  32. {
  33. var checker = offsetY % 2;
  34. for (var offsetX = 0; offsetX < 8; offsetX += 2)
  35. {
  36. // Prevents an extra piece on the middle row
  37. if (checker + offsetX > 8) continue;
  38. pieces[pieceIndex] = entityManager.SpawnEntity(
  39. PrototypePieceBlack,
  40. left.Offset(GetOffset(offsetX + (1 - checker)), GetOffset(offsetY * -1))
  41. );
  42. pieces[pieceIndex] = entityManager.SpawnEntity(
  43. PrototypePieceWhite,
  44. left.Offset(GetOffset(offsetX + checker), GetOffset(offsetY - 7))
  45. );
  46. pieceIndex += 2;
  47. }
  48. }
  49. const int NumCrowns = 3;
  50. const float Overlap = 0.25f;
  51. const float xOffset = 9f / 32;
  52. const float xOffsetBlack = 9 + xOffset;
  53. const float xOffsetWhite = 8 + xOffset;
  54. // Crowns
  55. for (var i = 0; i < NumCrowns; i++)
  56. {
  57. var step = -(Overlap * i);
  58. pieces[pieceIndex] = entityManager.SpawnEntity(
  59. PrototypeCrownBlack,
  60. left.Offset(GetOffset(xOffsetBlack), GetOffset(step))
  61. );
  62. pieces[pieceIndex + 1] = entityManager.SpawnEntity(
  63. PrototypeCrownWhite,
  64. left.Offset(GetOffset(xOffsetWhite), GetOffset(step))
  65. );
  66. pieceIndex += 2;
  67. }
  68. // Spares
  69. for (var i = 0; i < 6; i++)
  70. {
  71. var step = -((Overlap * (NumCrowns + 2)) + (Overlap * i));
  72. pieces[pieceIndex] = entityManager.SpawnEntity(
  73. PrototypePieceBlack,
  74. left.Offset(GetOffset(xOffsetBlack), GetOffset(step))
  75. );
  76. pieces[pieceIndex] = entityManager.SpawnEntity(
  77. PrototypePieceWhite,
  78. left.Offset(GetOffset(xOffsetWhite), GetOffset(step))
  79. );
  80. pieceIndex += 2;
  81. }
  82. for (var i = 0; i < pieces.Length; i++)
  83. {
  84. session.Entities.Add(pieces[i]);
  85. }
  86. }
  87. }
  88. }