level.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #pragma once
  2. #include <stddef.h>
  3. #include "entity.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. typedef struct GameManager GameManager;
  8. typedef struct {
  9. void (*alloc)(Level* level, GameManager* manager, void* context);
  10. void (*free)(Level* level, GameManager* manager, void* context);
  11. void (*start)(Level* level, GameManager* manager, void* context);
  12. void (*stop)(Level* level, GameManager* manager, void* context);
  13. size_t context_size;
  14. } LevelBehaviour;
  15. /** Level reset callback */
  16. typedef void (*LevelClearCallback)(Level* level, void* context);
  17. /**
  18. * @brief Clear entities and call callback at the start of the next update
  19. *
  20. * @param level level instance
  21. * @param callback callback
  22. * @param context context
  23. */
  24. void level_clear(Level* level, LevelClearCallback callback, void* context);
  25. /**
  26. * @brief Add an entity to the level
  27. *
  28. * @param level level instance
  29. * @param behaviour entity behaviour
  30. * @return Entity*
  31. */
  32. Entity* level_add_entity(Level* level, const EntityDescription* behaviour);
  33. /**
  34. * @brief Remove an entity from the level
  35. *
  36. * @param level level instance
  37. * @param entity entity to remove
  38. */
  39. void level_remove_entity(Level* level, Entity* entity);
  40. /**
  41. * @brief Send an event to all entities of a certain type in the level
  42. *
  43. * @param level level instance
  44. * @param sender entity that sends the event
  45. * @param receiver_desc entity description that will receive the event, NULL for all entities
  46. * @param type event type
  47. * @param value event value
  48. */
  49. void level_send_event(
  50. Level* level,
  51. Entity* sender,
  52. const EntityDescription* receiver_desc,
  53. uint32_t type,
  54. EntityEventValue value);
  55. /**
  56. * @brief Get the count of entities of a certain type in the level, or all entities if description is NULL
  57. *
  58. * @param level level instance
  59. * @param description entity description, NULL for all entities
  60. * @return size_t entity count
  61. */
  62. size_t level_entity_count(const Level* level, const EntityDescription* description);
  63. /**
  64. * @brief Get an entity of a certain type in the level
  65. * Returns NULL if the index is out of bounds
  66. *
  67. * @param level level instance
  68. * @param description entity description, NULL for all entities
  69. * @param index entity index
  70. * @return Entity* entity
  71. */
  72. Entity* level_entity_get(const Level* level, const EntityDescription* description, size_t index);
  73. /**
  74. * @brief Get the context of the level
  75. *
  76. * @param level level instance
  77. * @return void* context
  78. */
  79. void* level_context_get(Level* level);
  80. /**
  81. * @brief Check if the level contains an entity
  82. *
  83. * @param level level instance
  84. * @param entity entity
  85. * @return true if the level contains the entity
  86. */
  87. bool level_contains_entity(const Level* level, const Entity* entity);
  88. #ifdef __cplusplus
  89. }
  90. #endif