From 26cc567b7f9822c52e01219822351cf900b8bef6 Mon Sep 17 00:00:00 2001 From: En Yi Date: Mon, 6 Nov 2023 21:36:23 +0800 Subject: [PATCH] Add emitter config to asset file loading --- engine/assets.c | 2 +- engine/assets.h | 2 +- engine/particle_sys.h | 1 + scene_test.c | 9 --------- scenes/assets_loader.c | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/engine/assets.c b/engine/assets.c index 19ca3f9..af94556 100644 --- a/engine/assets.c +++ b/engine/assets.c @@ -142,7 +142,7 @@ Font* add_font(Assets_t* assets, const char* name, const char* path) return &fonts[fnt_idx].font; } -EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name, Sprite_t* sprite) +EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name) { uint8_t emitter_idx = n_loaded[5]; assert(emitter_idx < MAX_EMITTER_CONF); diff --git a/engine/assets.h b/engine/assets.h index 7e5747b..37517bd 100644 --- a/engine/assets.h +++ b/engine/assets.h @@ -59,7 +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); -EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name, Sprite_t* sprite); +EmitterConfig_t* add_emitter_conf(Assets_t* assets, const char* name); Texture2D* get_texture(Assets_t* assets, const char* name); Sprite_t* get_sprite(Assets_t* assets, const char* name); diff --git a/engine/particle_sys.h b/engine/particle_sys.h index 5c21f53..8c81e52 100644 --- a/engine/particle_sys.h +++ b/engine/particle_sys.h @@ -10,6 +10,7 @@ typedef enum PartEmitterType { EMITTER_BURST = 0, + EMITTER_UNKNOWN, } PartEmitterType_t; typedef struct Particle diff --git a/scene_test.c b/scene_test.c index d2d4835..fec6d74 100644 --- a/scene_test.c +++ b/scene_test.c @@ -62,15 +62,6 @@ int main(void) scenes[0] = &scene.scene; change_scene(&engine, 0); - EmitterConfig_t* conf = add_emitter_conf(&engine.assets, "pe_burst", get_sprite(&engine.assets, "bomb")); - conf->launch_range[0] = 240; - conf->launch_range[1] = 300; - conf->one_shot = true; - conf->speed_range[0] = 200; - conf->speed_range[1] = 300; - conf->particle_lifetime[0] = 30; - conf->particle_lifetime[1] = 110; - #if defined(PLATFORM_WEB) puts("Setting emscripten main loop"); emscripten_set_main_loop(update_loop, 0, 1); diff --git a/scenes/assets_loader.c b/scenes/assets_loader.c index 106ce84..bf9a615 100644 --- a/scenes/assets_loader.c +++ b/scenes/assets_loader.c @@ -36,6 +36,27 @@ static bool parse_sprite_info(char* sprite_info_str, SpriteInfo_t* spr_info) return data_count == 6; } +static bool parse_emitter_info(char* emitter_info_str, EmitterConfig_t* conf) +{ + char emitter_type; + uint8_t one_shot; + int data_count = sscanf( + emitter_info_str, "%c,%f-%f,%f-%f,%u-%u,%c", + &emitter_type, + conf->launch_range, conf->launch_range + 1, + conf->speed_range, conf->speed_range + 1, + conf->particle_lifetime, conf->particle_lifetime + 1, + &one_shot + ); + + if (data_count == 8) + { + conf->type = (emitter_type == 'b') ? EMITTER_BURST : EMITTER_UNKNOWN; + conf->one_shot = (one_shot == 1); + } + return data_count == 8; +} + bool load_from_rres(const char* file, Assets_t* assets) { RresFileInfo_t rres_file; @@ -192,6 +213,10 @@ bool load_from_infofile(const char* file, Assets_t* assets) { info_type = SOUND_INFO; } + else if (strcmp(tmp, "Emitter") == 0) + { + info_type = EMITTER_INFO; + } else if (strcmp(tmp, "LevelPack") == 0) { info_type = LEVELPACK_INFO; @@ -265,6 +290,19 @@ bool load_from_infofile(const char* file, Assets_t* assets) spr->speed = spr_info.speed; } break; + case EMITTER_INFO: + { + EmitterConfig_t parsed_conf; + if (!parse_emitter_info(info_str, &parsed_conf)) + { + printf("Parse error for emitter %s", name); + break; + } + EmitterConfig_t* conf = add_emitter_conf(assets, name); + *conf = parsed_conf; + printf("Added Emitter %s\n", name); + } + break; default: break; }