diff --git a/scene_test.c b/scene_test.c index 569c216..43a3cc9 100644 --- a/scene_test.c +++ b/scene_test.c @@ -1,5 +1,6 @@ #include "mempool.h" #include "scene_impl.h" +#include "ent_impl.h" #include "assets_loader.h" #include #include @@ -25,6 +26,7 @@ int main(void) init_assets(&engine.assets); load_from_infofile("res/assets.info", &engine.assets); + init_player_creation("res/player_spr.info", &engine.assets); LevelScene_t scene; scene.scene.engine = &engine; @@ -34,6 +36,7 @@ int main(void) scenes[0] = &scene.scene; change_scene(&engine, 0); + while(true) { diff --git a/scenes/assets_loader.c b/scenes/assets_loader.c index 2da265c..a4642ab 100644 --- a/scenes/assets_loader.c +++ b/scenes/assets_loader.c @@ -42,9 +42,8 @@ bool load_from_infofile(const char* file, Assets_t* assets) return false; } - static char buffer[256]; + char buffer[256]; char* tmp; - char tmp2[32]; size_t line_num = 0; AssetInfoType_t info_type = INVALID_INFO; diff --git a/scenes/ent_impl.h b/scenes/ent_impl.h index 75ea041..aad635a 100644 --- a/scenes/ent_impl.h +++ b/scenes/ent_impl.h @@ -3,6 +3,7 @@ #include "entManager.h" #include "assets.h" +bool init_player_creation(const char* info_file, Assets_t* assets); Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets); Entity_t* create_crate(EntityManager_t* ent_manager, Assets_t* assets, bool metal); diff --git a/scenes/player_ent.c b/scenes/player_ent.c index 0f76f2b..a1d4d21 100644 --- a/scenes/player_ent.c +++ b/scenes/player_ent.c @@ -1,5 +1,7 @@ #include "ent_impl.h" #include "constants.h" +#include +#include #define N_PLAYER_SPRITES 2 enum PlayerSpriteEnum @@ -47,11 +49,58 @@ Entity_t* create_player(EntityManager_t* ent_manager, Assets_t* assets) }; CSprite_t* p_cspr = add_component(ent_manager, p_ent, CSPRITE_T); p_cspr->sprites = player_sprite_map; - p_cspr->sprites[0].sprite = get_sprite(assets, "plr_stand"); - p_cspr->sprites[0].offset = (Vector2){0, -20}; - p_cspr->sprites[1].sprite = get_sprite(assets, "plr_stand"); - p_cspr->sprites[1].offset = (Vector2){0, -20}; p_cspr->transition_func = &player_sprite_transition_func; return p_ent; } + +bool init_player_creation(const char* info_file, Assets_t* assets) +{ + static bool already_init = false; + + if (already_init) return false; + + FILE* in_file = fopen(info_file, "r"); + if (in_file == NULL) + { + printf("Unable to open file %s\n", info_file); + return false; + } + + char buffer[256]; + char* tmp; + size_t line_num = 0; + uint8_t i = 0; + while (true) + { + tmp = fgets(buffer, 256, in_file); + if (tmp == NULL) break; + tmp[strcspn(tmp, "\r\n")] = '\0'; + + if (i == N_PLAYER_SPRITES) break; + + char* name = strtok(buffer, ":"); + char* info_str = strtok(NULL, ":"); + if (name == NULL || info_str == NULL) return false; + + while(*name == ' ' || *name == '\t') name++; + while(*info_str == ' ' || *info_str == '\t') info_str++; + + Vector2 offset; + int data_count = sscanf( + info_str, "%f,%f", + &offset.x, &offset.y + ); + if (data_count !=2) + { + printf("Unable to parse info for player at line %lu\n", line_num); + return false; + } + Sprite_t* spr = get_sprite(assets, name); + player_sprite_map[i].sprite = spr; + player_sprite_map[i].offset = offset; + i++; + } + already_init = true; + return true; +}