diff --git a/assets/entities/turret.symtres b/assets/entities/turret.symtres index f2a7a74..bd73074 100644 --- a/assets/entities/turret.symtres +++ b/assets/entities/turret.symtres @@ -61,7 +61,7 @@ Entity bouding_box_min : -0.500 -0.500 -0.500 source_filename : sounds/windy_ambience.ogg sound_type : 2 - sound_max_distance : 60.0000 + sound_max_distance : 30.0000 name : Turret_Ambient_Sound bouding_box_max : 0.500 0.500 0.500 sound_attenuation_type : 2 diff --git a/assets/scenes/Level_1.symtres b/assets/scenes/scene_1.symtres similarity index 93% rename from assets/scenes/Level_1.symtres rename to assets/scenes/scene_1.symtres index d920e6a..6533864 100755 --- a/assets/scenes/Level_1.symtres +++ b/assets/scenes/scene_1.symtres @@ -10,6 +10,8 @@ Scene_Config debug_draw_enabled : false debug_draw_mode : 0 ambient_light : 0.100 0.100 0.100 + init_func : scene_1 + cleanup_func : scene_1 } Player diff --git a/src/common/hashmap.c b/src/common/hashmap.c index fb0227b..d8ebbb8 100755 --- a/src/common/hashmap.c +++ b/src/common/hashmap.c @@ -51,7 +51,7 @@ unsigned int hashmap_generate_hash(const char* key) return index % HASH_MAP_NUM_BUCKETS; } -struct Hashmap* hashmap_new(void) +struct Hashmap* hashmap_create(void) { struct Hashmap* hashmap = malloc(sizeof(*hashmap)); if(!hashmap) diff --git a/src/common/hashmap.h b/src/common/hashmap.h index 8443f3f..5b7edbe 100755 --- a/src/common/hashmap.h +++ b/src/common/hashmap.h @@ -11,7 +11,7 @@ struct Hashmap; struct Variant; -struct Hashmap* hashmap_new(void); +struct Hashmap* hashmap_create(void); void hashmap_free(struct Hashmap* hashmap); void hashmap_copy(struct Hashmap* from, struct Hashmap* to); void hashmap_value_remove(struct Hashmap* hashmap, const char* key); diff --git a/src/common/parser.c b/src/common/parser.c index 5f42789..3a062d2 100755 --- a/src/common/parser.c +++ b/src/common/parser.c @@ -197,7 +197,7 @@ struct Parser* parser_load_objects(FILE* file, const char* filename) // Read into intermediate parser object and add it to the objects list struct Parser_Object* object = array_grow(parser->objects, struct Parser_Object); object->type = parser_object_type_from_str(type_str); - object->data = hashmap_new(); + object->data = hashmap_create(); char format_str[64]; char key_str[HASH_MAX_KEY_LEN]; @@ -313,7 +313,7 @@ struct Parser_Object* parser_object_new(struct Parser* parser, int type) return NULL; } object->type = type; - object->data = hashmap_new(); + object->data = hashmap_create(); return object; } diff --git a/src/common/version.h b/src/common/version.h index 3eb9ea1..e610257 100755 --- a/src/common/version.h +++ b/src/common/version.h @@ -4,7 +4,7 @@ /* Auto generated version file. DO NOT MODIFY */ #define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MINOR 1 -#define SYMMETRY_VERSION_REVISION 326 +#define SYMMETRY_VERSION_REVISION 327 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/console.c b/src/game/console.c index b26826e..011a346 100755 --- a/src/game/console.c +++ b/src/game/console.c @@ -57,7 +57,7 @@ void console_init(struct Console* console) console->messages[i].type = CMT_NONE; } - console->commands = hashmap_new(); + console->commands = hashmap_create(); hashmap_ptr_set(console->commands, "scene_empty", &console_command_scene_empty); hashmap_ptr_set(console->commands, "scene_save", &console_command_scene_save); hashmap_ptr_set(console->commands, "scene_load", &console_command_scene_load); diff --git a/src/game/game.c b/src/game/game.c index 9e445e5..219f798 100755 --- a/src/game/game.c +++ b/src/game/game.c @@ -36,6 +36,7 @@ #include "im_render.h" #include "event.h" #include "../common/limits.h" +#include "scene_funcs.h" #define UNUSED(a) (void)a #define MIN_NUM(a,b) ((a) < (b) ? (a) : (b)) @@ -67,19 +68,21 @@ bool game_init(struct Window* window, struct Hashmap* cvars) } else { - game_state->window = window; - game_state->cvars = cvars; - game_state->is_initialized = false; - game_state->fixed_delta_time = 1.f / 60.f; - game_state->game_mode = GAME_MODE_GAME; - game_state->renderer = calloc(1, sizeof(*game_state->renderer)); - game_state->scene = calloc(1, sizeof(*game_state->scene)); - game_state->console = calloc(1, sizeof(*game_state->console)); - game_state->editor = calloc(1, sizeof(*game_state->editor)); - game_state->gui = calloc(1, sizeof(*game_state->gui)); - game_state->event_manager = calloc(1, sizeof(*game_state->event_manager)); - game_state->sound = calloc(1, sizeof(*game_state->sound)); - game_state->debug_vars = calloc(1, sizeof(*game_state->debug_vars)); + game_state->window = window; + game_state->cvars = cvars; + game_state->is_initialized = false; + game_state->fixed_delta_time = 1.f / 60.f; + game_state->game_mode = GAME_MODE_GAME; + game_state->renderer = calloc(1, sizeof(*game_state->renderer)); + game_state->scene = calloc(1, sizeof(*game_state->scene)); + game_state->console = calloc(1, sizeof(*game_state->console)); + game_state->editor = calloc(1, sizeof(*game_state->editor)); + game_state->gui = calloc(1, sizeof(*game_state->gui)); + game_state->event_manager = calloc(1, sizeof(*game_state->event_manager)); + game_state->sound = calloc(1, sizeof(*game_state->sound)); + game_state->debug_vars = calloc(1, sizeof(*game_state->debug_vars)); + game_state->scene_init_func_table = hashmap_create(); + game_state->scene_cleanup_func_table = hashmap_create(); log_message_callback_set(game_on_log_message); log_warning_callback_set(game_on_log_warning); @@ -94,8 +97,10 @@ bool game_init(struct Window* window, struct Hashmap* cvars) { log_message("Loaded GL extentions"); } - + hashmap_ptr_set(game_state->scene_init_func_table, "scene_1", &scene_1_init); + hashmap_ptr_set(game_state->scene_cleanup_func_table, "scene_1", &scene_1_cleanup); + event_manager_init(game_state->event_manager); input_init(); shader_init(); @@ -104,10 +109,6 @@ bool game_init(struct Window* window, struct Hashmap* cvars) gui_init(game_state->gui); console_init(game_state->console); geom_init(); - //physics_init(); - //physics_gravity_set(0.f, -9.8f, 0.f); - //physics_body_set_moved_callback(entity_rigidbody_on_move); - //physics_body_set_collision_callback(entity_rigidbody_on_collision); sound_init(game_state->sound); debug_vars_init(game_state->debug_vars); @@ -118,7 +119,7 @@ bool game_init(struct Window* window, struct Hashmap* cvars) /* Debug scene setup */ //game_scene_setup(); - scene_load(game_state->scene, "Level_1", DIRT_INSTALL); + scene_load(game_state->scene, "scene_1", DIRT_INSTALL); game_state->is_initialized = true; return game_state->is_initialized; } @@ -1958,6 +1959,8 @@ void game_cleanup(void) free(game_state->gui); free(game_state->sound); free(game_state->debug_vars); + hashmap_free(game_state->scene_init_func_table); + hashmap_free(game_state->scene_cleanup_func_table); } free(game_state); game_state = NULL; diff --git a/src/game/game.h b/src/game/game.h index ab148a1..8e34ddf 100755 --- a/src/game/game.h +++ b/src/game/game.h @@ -36,6 +36,8 @@ struct Game_State struct Hashmap* cvars; struct Sound* sound; struct Debug_Vars* debug_vars; + struct Hashmap* scene_init_func_table; + struct Hashmap* scene_cleanup_func_table; }; diff --git a/src/game/input.c b/src/game/input.c index 4d9041e..6e63492 100755 --- a/src/game/input.c +++ b/src/game/input.c @@ -25,7 +25,7 @@ void input_init(void) event_manager_subscribe(event_manager, EVT_KEY_PRESSED, &input_on_key); event_manager_subscribe(event_manager, EVT_KEY_RELEASED, &input_on_key); - key_bindings = hashmap_new(); + key_bindings = hashmap_create(); /* Default keys for fallback */ struct Key_Binding forward_keys = {KEY_W, KMOD_NONE, KEY_UP, KMOD_NONE, KS_INACTIVE}; diff --git a/src/game/scene.c b/src/game/scene.c index 40ff4c0..179dbb4 100755 --- a/src/game/scene.c +++ b/src/game/scene.c @@ -20,6 +20,7 @@ #include "sound_source.h" #include "enemy.h" #include "event.h" +#include "scene_funcs.h" #include #include @@ -86,6 +87,8 @@ void scene_init(struct Scene* scene) editor_init_entities(game_state->editor); scene->active_camera_index = game_state_get()->game_mode == GAME_MODE_GAME ? CAM_GAME : CAM_EDITOR; + scene->init = &scene_init_stub; + scene->cleanup = &scene_cleanup_stub; } bool scene_load(struct Scene* scene, const char* filename, int directory_type) @@ -132,6 +135,7 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type) { struct Hashmap* scene_data = object->data; struct Render_Settings* render_settings = &game_state_get()->renderer->settings; + struct Game_State* game_state = game_state_get(); if(hashmap_value_exists(scene_data, "fog_type")) render_settings->fog.mode = hashmap_int_get(scene_data, "fog_type"); if(hashmap_value_exists(scene_data, "fog_density")) render_settings->fog.density = hashmap_float_get(scene_data, "fog_density"); @@ -143,6 +147,9 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type) if(hashmap_value_exists(scene_data, "debug_draw_enabled")) render_settings->debug_draw_enabled = hashmap_bool_get(scene_data, "debug_draw_enabled"); if(hashmap_value_exists(scene_data, "debug_draw_mode")) render_settings->debug_draw_mode = hashmap_int_get(scene_data, "debug_draw_mode"); if(hashmap_value_exists(scene_data, "debug_draw_physics")) render_settings->debug_draw_physics = hashmap_bool_get(scene_data, "debug_draw_physics"); + + scene->init = hashmap_value_exists(scene_data, "init_func") ? hashmap_ptr_get(game_state->scene_init_func_table, hashmap_str_get(scene_data, "init_func")) : &scene_init_stub; + scene->cleanup = hashmap_value_exists(scene_data, "cleanup_func") ? hashmap_ptr_get(game_state->scene_cleanup_func_table, hashmap_str_get(scene_data, "cleanup_func")) : &scene_init_stub; num_objects_loaded++; } break; @@ -211,6 +218,7 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type) strncpy(scene->filename, filename, MAX_FILENAME_LEN); if(num_objects_loaded > 0) { + scene->init(scene); struct Event_Manager* event_manager = game_state_get()->event_manager; struct Event* scene_loaded_event = event_manager_create_new_event(event_manager); scene_loaded_event->type = EVT_SCENE_LOADED; @@ -349,6 +357,7 @@ void scene_write_entity_entry(struct Scene* scene, struct Entity* entity, struct void scene_destroy(struct Scene* scene) { assert(scene); + scene->cleanup(scene); for(int i = 0; i < MAX_SCENE_ENTITIES; i++) scene_entity_base_remove(scene, &scene->entities[i]); for(int i = 0; i < MAX_SCENE_CAMERAS; i++) scene_camera_remove(scene, &scene->cameras[i]); diff --git a/src/game/scene.h b/src/game/scene.h index 354d5e7..0d94f4d 100755 --- a/src/game/scene.h +++ b/src/game/scene.h @@ -8,6 +8,9 @@ struct Ray; struct Raycast_Result; +typedef void (*Scene_Init_Func)(struct Scene* scene); +typedef void (*Scene_Cleanup_Func)(struct Scene* scene); + struct Scene { char filename[MAX_FILENAME_LEN]; @@ -21,6 +24,8 @@ struct Scene struct Enemy enemies[MAX_SCENE_ENEMIES]; char entity_archetypes[MAX_SCENE_ENTITY_ARCHETYPES][MAX_FILENAME_LEN]; int active_camera_index; + Scene_Init_Func init; + Scene_Cleanup_Func cleanup; }; void scene_init(struct Scene* scene); diff --git a/src/game/scene_funcs.c b/src/game/scene_funcs.c new file mode 100644 index 0000000..86c622e --- /dev/null +++ b/src/game/scene_funcs.c @@ -0,0 +1,23 @@ +#include "scene_funcs.h" + +#include "../common/log.h" + +void scene_init_stub(struct Scene* scene) +{ + log_warning("Scene Init Stub Called"); +} + +void scene_cleanup_stub(struct Scene* scene) +{ + log_warning("Scene Cleanup Stub Called"); +} + +void scene_1_init(struct Scene* scene) +{ + log_message("Scene 1 init called"); +} + +void scene_1_cleanup(struct Scene* scene) +{ + log_message("Scene 1 cleanup called"); +} diff --git a/src/game/scene_funcs.h b/src/game/scene_funcs.h new file mode 100644 index 0000000..32679c9 --- /dev/null +++ b/src/game/scene_funcs.h @@ -0,0 +1,12 @@ +#ifndef SCENE_FUNCS_H +#define SCENE_FUNCS_H + +#include "scene.h" + +void scene_init_stub(struct Scene* scene); +void scene_cleanup_stub(struct Scene* scene); +void scene_1_init(struct Scene* scene); +void scene_1_cleanup(struct Scene* scene); + + +#endif \ No newline at end of file diff --git a/src/system/main.c b/src/system/main.c index f230b19..b7861f0 100755 --- a/src/system/main.c +++ b/src/system/main.c @@ -52,7 +52,7 @@ bool init(void) return false; } - cvars = hashmap_new(); + cvars = hashmap_create(); config_vars_init(cvars); if(!platform_init()) return false;