diff --git a/engine/assets.c b/engine/assets.c index b9ba3e2..290d256 100644 --- a/engine/assets.c +++ b/engine/assets.c @@ -8,7 +8,7 @@ #include "zstd.h" #include -uint8_t n_loaded[5] = {0}; +uint8_t n_loaded[6] = {0}; // Hard limit number of typedef struct TextureData @@ -36,12 +36,18 @@ typedef struct LevelPackData LevelPack_t pack; char name[MAX_NAME_LEN]; }LevelPackData_t; +typedef struct PartEmitterData +{ + ParticleEmitter_t emitter; + char name[MAX_NAME_LEN]; +}ParticleEmitterData_t; static TextureData_t textures[MAX_TEXTURES]; static FontData_t fonts[MAX_FONTS]; static SoundData_t sfx[MAX_SOUNDS]; static SpriteData_t sprites[MAX_SPRITES]; static LevelPackData_t levelpacks[MAX_LEVEL_PACK]; +static ParticleEmitterData_t emitters[MAX_PARTICLE_EMITTER]; #define DECOMPRESSOR_INBUF_LEN 4096 #define DECOMPRESSOR_OUTBUF_LEN 4096 @@ -106,7 +112,7 @@ Sprite_t* add_sprite(Assets_t* assets, const char* name, Texture2D* texture) { uint8_t spr_idx = n_loaded[1]; assert(spr_idx < MAX_SPRITES); - memset(sprites + spr_idx, 0, sizeof(Sprite_t)); + memset(sprites + spr_idx, 0, sizeof(SpriteData_t)); sprites[spr_idx].sprite.texture = texture; strncpy(sprites[spr_idx].name, name, MAX_NAME_LEN); sc_map_put_s64(&assets->m_sprites, sprites[spr_idx].name, spr_idx); @@ -136,6 +142,18 @@ Font* add_font(Assets_t* assets, const char* name, const char* path) return &fonts[fnt_idx].font; } +ParticleEmitter_t* add_part_emitter(Assets_t* assets, const char* name, Sprite_t* sprite) +{ + uint8_t emitter_idx = n_loaded[5]; + assert(emitter_idx < MAX_PARTICLE_EMITTER); + memset(emitters + emitter_idx, 0, sizeof(ParticleEmitterData_t)); + emitters[emitter_idx].emitter.spr = sprite; + strncpy(emitters[emitter_idx].name, name, MAX_NAME_LEN); + sc_map_put_s64(&assets->m_emitters, emitters[emitter_idx].name, emitter_idx); + n_loaded[5]++; + return &emitters[emitter_idx].emitter; +} + LevelPack_t* add_level_pack(Assets_t* assets, const char* name, const char* path) { FILE* file = fopen(path, "rb"); @@ -165,6 +183,7 @@ LevelPack_t* add_level_pack(Assets_t* assets, const char* name, const char* path return &levelpacks[pack_idx].pack; } + static LevelPack_t* add_level_pack_zst(Assets_t* assets, const char* name, FILE* file) { LevelPackData_t* pack_info = levelpacks + n_loaded[4]; @@ -338,6 +357,7 @@ void init_assets(Assets_t* assets) sc_map_init_s64(&assets->m_textures, MAX_TEXTURES, 0); sc_map_init_s64(&assets->m_sounds, MAX_SOUNDS, 0); sc_map_init_s64(&assets->m_levelpacks, MAX_LEVEL_PACK, 0); + sc_map_init_s64(&assets->m_emitters, MAX_PARTICLE_EMITTER, 0); level_decompressor.ctx = ZSTD_createDCtx(); } @@ -365,6 +385,7 @@ void free_all_assets(Assets_t* assets) sc_map_clear_s64(&assets->m_sounds); sc_map_clear_s64(&assets->m_sprites); sc_map_clear_s64(&assets->m_levelpacks); + sc_map_clear_s64(&assets->m_emitters); memset(n_loaded, 0, sizeof(n_loaded)); } @@ -376,6 +397,7 @@ void term_assets(Assets_t* assets) sc_map_term_s64(&assets->m_sounds); sc_map_term_s64(&assets->m_sprites); sc_map_term_s64(&assets->m_levelpacks); + sc_map_term_s64(&assets->m_emitters); ZSTD_freeDCtx(level_decompressor.ctx); } @@ -399,6 +421,17 @@ Sprite_t* get_sprite(Assets_t* assets, const char* name) return NULL; } +ParticleEmitter_t* get_emitter(Assets_t* assets, const char* name) +{ + uint8_t emitter_idx = sc_map_get_s64(&assets->m_emitters, name); + if (sc_map_found(&assets->m_emitters)) + { + return &emitters[emitter_idx].emitter; + } + return NULL; +} + + Sound* get_sound(Assets_t* assets, const char* name) { uint8_t snd_idx = sc_map_get_s64(&assets->m_sounds, name); diff --git a/engine/assets.h b/engine/assets.h index d51b172..e941909 100644 --- a/engine/assets.h +++ b/engine/assets.h @@ -4,6 +4,7 @@ #include "EC.h" #include "raylib.h" #include "rres.h" +#include "particle_sys.h" typedef struct Assets { @@ -12,6 +13,7 @@ typedef struct Assets struct sc_map_s64 m_fonts; struct sc_map_s64 m_sprites; struct sc_map_s64 m_levelpacks; + struct sc_map_s64 m_emitters; }Assets_t; typedef struct LevelTileInfo @@ -57,6 +59,7 @@ Texture2D* add_texture_rres(Assets_t* assets, const char* name, const char* file LevelPack_t* add_level_pack_rres(Assets_t* assets, const char* name, const char* filename, const RresFileInfo_t* rres_file); Sprite_t* add_sprite(Assets_t* assets, const char* name, Texture2D* texture); +ParticleEmitter_t* add_part_emitter(Assets_t* assets, const char* name, Sprite_t* sprite); Texture2D* get_texture(Assets_t* assets, const char* name); Sprite_t* get_sprite(Assets_t* assets, const char* name);