diff --git a/assets/scenes/scene_1.symtres b/assets/scenes/scene_1.symtres index 6408617..53fe8a3 100755 --- a/assets/scenes/scene_1.symtres +++ b/assets/scenes/scene_1.symtres @@ -20,6 +20,7 @@ Player active : true position : -20.255 2.167 -50.978 player_health : 100 + player_key_mask : 0 name : Player bounding_box_min : -1.500 -1.500 -1.000 camera_clear_color : 0.310 0.412 0.529 1.000 diff --git a/src/common/version.h b/src/common/version.h index 4328ac3..dcab449 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 341 +#define SYMMETRY_VERSION_REVISION 342 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/door.c b/src/game/door.c index 7a6425a..60cf5de 100644 --- a/src/game/door.c +++ b/src/game/door.c @@ -66,14 +66,19 @@ void door_write(struct Door* door, struct Hashmap* entity_data) void door_update(struct Door* door, struct Scene* scene, float dt) { struct Game_State* game_state = game_state_get(); + struct Player* player = &game_state->scene->player; + switch(door->state) { case DOOR_CLOSED: if(door->trigger->triggered) { - door->state = DOOR_OPENING; - sound_source_buffer_set(game_state->sound, door->sound, "sounds/door_open.wav", ST_WAV); - sound_source_play(game_state->sound, door->sound); + if((door->mask & player->key_mask) == door->mask) + { + door->state = DOOR_OPENING; + sound_source_buffer_set(game_state->sound, door->sound, "sounds/door_open.wav", ST_WAV); + sound_source_play(game_state->sound, door->sound); + } } break; case DOOR_OPEN: diff --git a/src/game/editor.c b/src/game/editor.c index 5523c4e..346c9de 100755 --- a/src/game/editor.c +++ b/src/game/editor.c @@ -2424,29 +2424,47 @@ void editor_window_property_inspector(struct nk_context* context, struct Editor* nk_property_float(context, "Open Pos", -FLT_MAX, &door->open_position, FLT_MAX, 0.1f, 0.1f); nk_property_float(context, "Close Pos", -FLT_MAX, &door->close_position, FLT_MAX, 0.1f, 0.1f); - if(nk_button_label(context, "Select Sound Source")) - { - editor_entity_select(editor, door->sound); - nk_tree_pop(context); - nk_end(context); - return; - } + if(nk_button_label(context, "Select Sound Source")) editor_entity_select(editor, door->sound); + if(nk_button_label(context, "Select Trigger")) editor_entity_select(editor, door->trigger); + if(nk_button_label(context, "Select Static Mesh")) editor_entity_select(editor, door->mesh); - if(nk_button_label(context, "Select Trigger")) - { - editor_entity_select(editor, door->trigger); - nk_tree_pop(context); - nk_end(context); - return; - } + nk_tree_pop(context); + } + } + + /* Player */ + if(entity->type == ET_PLAYER) + { + struct Player* player = (struct Player*)entity; + if(nk_tree_push(context, NK_TREE_TAB, "Player", NK_MAXIMIZED)) + { + nk_layout_row_dynamic(context, row_height, 1); + nk_property_int(context, "Health", 0, &player->health, 100, 1, 1); + nk_property_float(context, "Move Speed", 0.f, &player->move_speed, FLT_MAX, 0.5f, 0.5f); + nk_property_float(context, "Move Speed Mul", 0.f, &player->move_speed_multiplier, 10, 0.5f, 0.5f); + nk_property_float(context, "Turn Speed", 0.f, &player->turn_speed, FLT_MAX, 0.5f, 0.5f); + nk_property_float(context, "Jump Speed", 0.f, &player->jump_speed, FLT_MAX, 0.5f, 0.5f); + nk_property_float(context, "Gravity", -FLT_MAX, &player->gravity, FLT_MAX, 0.1f, 0.1f); + nk_property_float(context, "Min Ray Down Dis", 0, &player->min_downward_distance, FLT_MAX, 0.1f, 0.1f); + nk_property_float(context, "Min Ray Fwd Dis", 0, &player->min_forward_distance, FLT_MAX, 0.1f, 0.1f); + + nk_layout_row_dynamic(context, row_height, 2); + nk_label(context, "Grounded", LABEL_FLAGS_ALIGN_LEFT); + nk_label(context, player->grounded ? "True" : "False", LABEL_FLAGS_ALIGN_LEFT); + + nk_layout_row_dynamic(context, row_height, 1); + nk_label(context, "Key Flags", NK_TEXT_ALIGN_MIDDLE | NK_TEXT_ALIGN_CENTERED); + nk_layout_row_dynamic(context, row_height, 3); + nk_checkbox_flags_label(context, "Red", &player->key_mask, DOOR_KEY_MASK_RED); + nk_checkbox_flags_label(context, "Green", &player->key_mask, DOOR_KEY_MASK_GREEN); + nk_checkbox_flags_label(context, "Blue", &player->key_mask, DOOR_KEY_MASK_BLUE); + + nk_layout_row_dynamic(context, row_height, 1); + if(nk_button_label(context, "Select Camera")) editor_entity_select(editor, player->camera); + if(nk_button_label(context, "Select Weapon Sound")) editor_entity_select(editor, player->weapon_sound); + if(nk_button_label(context, "Select Footstep Sound")) editor_entity_select(editor, player->footstep_sound); + if(nk_button_label(context, "Select Mesh")) editor_entity_select(editor, player->mesh); - if(nk_button_label(context, "Select Static Mesh")) - { - editor_entity_select(editor, door->mesh); - nk_tree_pop(context); - nk_end(context); - return; - } nk_tree_pop(context); } } diff --git a/src/game/entity.h b/src/game/entity.h index 94fa5e9..06e8da9 100755 --- a/src/game/entity.h +++ b/src/game/entity.h @@ -197,7 +197,9 @@ struct Player struct Static_Mesh* mesh; struct Camera* camera; struct Sound_Source* weapon_sound; + struct Sound_Source* footstep_sound; int health; + int key_mask; float move_speed; float move_speed_multiplier; float turn_speed; diff --git a/src/game/player.c b/src/game/player.c index e8b1eef..ad6f607 100755 --- a/src/game/player.c +++ b/src/game/player.c @@ -41,6 +41,7 @@ void player_init(struct Player* player, struct Scene* scene) player->min_forward_distance = hashmap_float_get(config, "player_min_forward_distance"); player->grounded = true; player->health = 100; + player->key_mask = 0; player->mesh = scene_static_mesh_create(scene, "Player_Mesh", player, "sphere.symbres", MAT_BLINN); @@ -59,10 +60,17 @@ void player_init(struct Player* player, struct Scene* scene) else log_error("player:init", "Could not add weapon entity to player"); + struct Sound_Source* footstep_sound = scene_sound_source_create(scene, "Player_Footstep_Sound_Source", player, "sounds/player_walk.wav", ST_WAV, true, false); + if(footstep_sound) + player->footstep_sound = footstep_sound; + else + log_error("player:init", "Could not add footstep entity to player"); + // Mark player camera and mesh as transient for now. We don't need to save them to file since we recreate them here anyway player->camera->base.flags |= EF_TRANSIENT; player->mesh->base.flags |= EF_TRANSIENT; player->weapon_sound->base.flags |= EF_TRANSIENT; + player->footstep_sound->base.flags |= EF_TRANSIENT; transform_parent_set(player_camera, player, true); diff --git a/src/game/scene.c b/src/game/scene.c index 838198e..9492b75 100755 --- a/src/game/scene.c +++ b/src/game/scene.c @@ -210,7 +210,8 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type) transform_update_transmat(player); if(hashmap_value_exists(player_data, "camera_clear_color")) player->camera->clear_color = hashmap_vec4_get(player_data, "camera_clear_color"); - if(hashmap_value_exists(player_data, "player_health")) player->health = hashmap_int_get(player_data, "player_health"); + if(hashmap_value_exists(player_data, "player_health")) player->health = hashmap_int_get(player_data, "player_health"); + if(hashmap_value_exists(player_data, "player_key_mask")) player->key_mask = hashmap_int_get(player_data, "player_key_mask"); num_objects_loaded++; } break; @@ -270,6 +271,7 @@ bool scene_save(struct Scene* scene, const char* filename, int directory_type) entity_write(&scene->player, player_object, true); hashmap_vec4_set(player_object->data, "camera_clear_color", &scene->player.camera->clear_color); hashmap_int_set(player_object->data, "player_health", &scene->player.health); + hashmap_int_set(player_object->data, "player_key_mask", &scene->player.key_mask); scene_write_entity_list(scene, ET_DEFAULT, parser); scene_write_entity_list(scene, ET_LIGHT, parser); diff --git a/todo.txt b/todo.txt index 2e4741f..72fa549 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,4 @@ Todo: - - Doors that open using the red/green/blue keys only as a way of progressing the level or cordoing off certain sections - RGB keys to progress to next level - Player/enemies getting hit by bullets - Win/fail States @@ -11,9 +10,7 @@ Todo: - Cube mapping for sky dome etc - Add event sender along with events - Implement flag for ignoring collisions with certain entities - - Implement separate property window for player related variables that can be shown in the editor similar to renderer settings etc - Implement game gui either with a separate nuklear context or as part of existing context - - Property inspector in editor should only show/apply local transformation values and world transformation values should be shown as non-editabale values - Fix rotate gizmo's origin not being set to the selected entity - Player shooting - Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded @@ -419,4 +416,5 @@ Done: * Pause sound when game is in pause mode * Composite door entity made up of static mesh, sound entity and trigger. Door might require 0-3 keys in order to be opened. * Add door properties to property inspector in editor - * Switched transformation in property inspector to show/modify local transform values by default and show absolute transform values as read-only. \ No newline at end of file + * Switched transformation in property inspector to show/modify local transform values by default and show absolute transform values as read-only. + * Doors that open using the red/green/blue keys only as a way of progressing the level or cordoing off certain sections \ No newline at end of file