Implemented checking for key mask when door is triggered and added player properties to property inspector

dev
Shariq Shah 6 years ago
parent 7e769eb64f
commit d635bab4ec
  1. 1
      assets/scenes/scene_1.symtres
  2. 2
      src/common/version.h
  3. 11
      src/game/door.c
  4. 60
      src/game/editor.c
  5. 2
      src/game/entity.h
  6. 8
      src/game/player.c
  7. 4
      src/game/scene.c
  8. 6
      todo.txt

@ -20,6 +20,7 @@ Player
active : true active : true
position : -20.255 2.167 -50.978 position : -20.255 2.167 -50.978
player_health : 100 player_health : 100
player_key_mask : 0
name : Player name : Player
bounding_box_min : -1.500 -1.500 -1.000 bounding_box_min : -1.500 -1.500 -1.000
camera_clear_color : 0.310 0.412 0.529 1.000 camera_clear_color : 0.310 0.412 0.529 1.000

@ -4,7 +4,7 @@
/* Auto generated version file. DO NOT MODIFY */ /* Auto generated version file. DO NOT MODIFY */
#define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MAJOR 0
#define SYMMETRY_VERSION_MINOR 1 #define SYMMETRY_VERSION_MINOR 1
#define SYMMETRY_VERSION_REVISION 341 #define SYMMETRY_VERSION_REVISION 342
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -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) void door_update(struct Door* door, struct Scene* scene, float dt)
{ {
struct Game_State* game_state = game_state_get(); struct Game_State* game_state = game_state_get();
struct Player* player = &game_state->scene->player;
switch(door->state) switch(door->state)
{ {
case DOOR_CLOSED: case DOOR_CLOSED:
if(door->trigger->triggered) if(door->trigger->triggered)
{ {
door->state = DOOR_OPENING; if((door->mask & player->key_mask) == door->mask)
sound_source_buffer_set(game_state->sound, door->sound, "sounds/door_open.wav", ST_WAV); {
sound_source_play(game_state->sound, door->sound); 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; break;
case DOOR_OPEN: case DOOR_OPEN:

@ -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, "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); 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")) 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);
editor_entity_select(editor, door->sound); if(nk_button_label(context, "Select Static Mesh")) editor_entity_select(editor, door->mesh);
nk_tree_pop(context);
nk_end(context);
return;
}
if(nk_button_label(context, "Select Trigger")) nk_tree_pop(context);
{ }
editor_entity_select(editor, door->trigger); }
nk_tree_pop(context);
nk_end(context); /* Player */
return; 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); nk_tree_pop(context);
} }
} }

@ -197,7 +197,9 @@ struct Player
struct Static_Mesh* mesh; struct Static_Mesh* mesh;
struct Camera* camera; struct Camera* camera;
struct Sound_Source* weapon_sound; struct Sound_Source* weapon_sound;
struct Sound_Source* footstep_sound;
int health; int health;
int key_mask;
float move_speed; float move_speed;
float move_speed_multiplier; float move_speed_multiplier;
float turn_speed; float turn_speed;

@ -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->min_forward_distance = hashmap_float_get(config, "player_min_forward_distance");
player->grounded = true; player->grounded = true;
player->health = 100; player->health = 100;
player->key_mask = 0;
player->mesh = scene_static_mesh_create(scene, "Player_Mesh", player, "sphere.symbres", MAT_BLINN); 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 else
log_error("player:init", "Could not add weapon entity to player"); 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 // 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->camera->base.flags |= EF_TRANSIENT;
player->mesh->base.flags |= EF_TRANSIENT; player->mesh->base.flags |= EF_TRANSIENT;
player->weapon_sound->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); transform_parent_set(player_camera, player, true);

@ -210,7 +210,8 @@ bool scene_load(struct Scene* scene, const char* filename, int directory_type)
transform_update_transmat(player); 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, "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++; num_objects_loaded++;
} }
break; break;
@ -270,6 +271,7 @@ bool scene_save(struct Scene* scene, const char* filename, int directory_type)
entity_write(&scene->player, player_object, true); entity_write(&scene->player, player_object, true);
hashmap_vec4_set(player_object->data, "camera_clear_color", &scene->player.camera->clear_color); 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_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_DEFAULT, parser);
scene_write_entity_list(scene, ET_LIGHT, parser); scene_write_entity_list(scene, ET_LIGHT, parser);

@ -1,5 +1,4 @@
Todo: 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 - RGB keys to progress to next level
- Player/enemies getting hit by bullets - Player/enemies getting hit by bullets
- Win/fail States - Win/fail States
@ -11,9 +10,7 @@ Todo:
- Cube mapping for sky dome etc - Cube mapping for sky dome etc
- Add event sender along with events - Add event sender along with events
- Implement flag for ignoring collisions with certain entities - 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 - 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 - Fix rotate gizmo's origin not being set to the selected entity
- Player shooting - Player shooting
- Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded - 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 * 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. * 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 * 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. * 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
Loading…
Cancel
Save