bug fixing and entity duplicating
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 7 Mar 2022 14:22:40 +0000 (08:22 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 7 Mar 2022 14:22:40 +0000 (08:22 -0600)
.vscode/tasks.json
run_tree/assets/sounds/interact-1.wav [new file with mode: 0644]
run_tree/scenes/level1.scene
src/build.onyx
src/entity/components/patron.onyx
src/entity/components/player.onyx
src/entity/editor.onyx
src/entity/scene.onyx
src/gfx/ui.onyx
src/sfx/audio_manager.onyx

index 1b4ee0bd1db4e1e11e109403b73ca0c2f769a90d..a000fc20647a0c3f3244cdf3aa0affa1a6d6c06b 100644 (file)
@@ -35,6 +35,7 @@
             "command": "./run.sh",
             "args": ["run"],
             "dependsOn": "Build game",
+            "dependsOrder": "sequence"
         }
     ]
 }
\ No newline at end of file
diff --git a/run_tree/assets/sounds/interact-1.wav b/run_tree/assets/sounds/interact-1.wav
new file mode 100644 (file)
index 0000000..55acb5a
Binary files /dev/null and b/run_tree/assets/sounds/interact-1.wav differ
index 8405292747026b988aedc72765c2bd882e889f50..0808b4a78084e16d851c2e6fd2b9052d9233333b 100644 (file)
@@ -1,7 +1,7 @@
 [Background]
 id = 100
 flags = 0
-pos.x = 406.5000
+pos.x = 422.5000
 pos.y = 311.5000
 size.x = 941.0000
 size.y = 751.0000
@@ -495,6 +495,330 @@ color.a = 1.0000
 item = "beer"
 max_timeout = 2.0000
 
+[Furniture]
+id = 164
+flags = 2
+pos.x = 536.0000
+pos.y = 176.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 32.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 165
+flags = 2
+pos.x = 536.0000
+pos.y = 96.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 32.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 167
+flags = 2
+pos.x = 136.0000
+pos.y = 416.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 32.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 168
+flags = 2
+pos.x = 536.0000
+pos.y = 416.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 32.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 169
+flags = 2
+pos.x = 560.0000
+pos.y = 96.0000
+size.x = 32.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 1
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 32.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 170
+flags = 2
+pos.x = 560.0000
+pos.y = 176.0000
+size.x = 32.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 1
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 32.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 171
+flags = 2
+pos.x = 560.0000
+pos.y = 416.0000
+size.x = 32.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 1
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 32.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 172
+flags = 2
+pos.x = 160.0000
+pos.y = 416.0000
+size.x = 32.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 1
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = 32.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 173
+flags = 2
+pos.x = 584.0000
+pos.y = 416.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = -16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 174
+flags = 2
+pos.x = 584.0000
+pos.y = 176.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = -16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 175
+flags = 2
+pos.x = 584.0000
+pos.y = 96.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = -16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
+[Furniture]
+id = 176
+flags = 2
+pos.x = 184.0000
+pos.y = 416.0000
+size.x = 16.0000
+size.y = 32.0000
+:FurnitureComponent
+furniture_type = 0
+taken = false
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 48.0000
+sprite.pos.y = 32.0000
+sprite.size.x = -16.0000
+sprite.size.y = 32.0000
+sprite.color.r = 1.0000
+sprite.color.g = 1.0000
+sprite.color.b = 1.0000
+sprite.color.a = 1.0000
+:RenderComponent
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
 [Custom]
 id = 157
 flags = 3
index 8906ca407c21c0d660a400a8af708b316baf4332..429f03f0b985e9b7070f76bad99790f37645440b 100644 (file)
@@ -4,7 +4,7 @@ package runtime.vars
 MAJOR_VERSION :: 0
 MINOR_VERSION :: 1
 
-DEBUG :: true
+// DEBUG :: true
 
 
 #load_path ONYX_PATH
index 2bc4255de03b04dd68e9c57bc34a51b1376c6356..45655af213762922ee6f0384ed069af32b23df54 100644 (file)
@@ -18,6 +18,7 @@ PatronComponent :: struct {
     order_show_animation: f32;
     holding: Entity_ID;
     consume_timeout: f32;
+    annoy_timeout: f32;
 
     init :: (use this: ^PatronComponent) {
         order_item = random.choice(item_store.items.entries).key;
@@ -61,6 +62,12 @@ PatronComponent :: struct {
         target = random.choice(exits).id;
     }
 
+    release_seat :: (use this: ^PatronComponent) {
+        target_entity := scene->get(target);
+        furniture_comp := target_entity->get(FurnitureComponent);
+        furniture_comp.taken = false;
+    }
+
     update :: (use this: ^PatronComponent, entity: ^Entity, dt: f32) {
         if state == .Walking_To_Seat {
             if target == Entity_Nothing {
@@ -77,18 +84,18 @@ PatronComponent :: struct {
             consume_timeout -= dt;
             if consume_timeout < 0 {
                 holding_object := scene->get(holding);
-                holding_object.flags |= .Dead;
-                holding = Entity_Nothing;
+                if holding_object != null {
+                    holding_object.flags |= .Dead;
+                    holding = Entity_Nothing;
 
-                item_comp := holding_object->get(ItemComponent);
-                item_info := item_comp->get_info();
+                    item_comp := holding_object->get(ItemComponent);
+                    item_info := item_comp->get_info();
 
-                money_comp := scene->first_component(MoneyComponent);
-                money_comp->deposit(item_info.sell_value);
+                    money_comp := scene->first_component(MoneyComponent);
+                    money_comp->deposit(item_info.sell_value);
+                }
 
-                target_entity := scene->get(target);
-                furniture_comp := target_entity->get(FurnitureComponent);
-                furniture_comp.taken = false;
+                this->release_seat();
 
                 state = .Leaving;
                 this->find_exit();
@@ -99,6 +106,17 @@ PatronComponent :: struct {
             if order_show_animation > 0 {
                 order_show_animation *= 0.75;
             }
+
+            if annoy_timeout > 0 {
+                annoy_timeout -= dt;
+
+                if annoy_timeout < 0 {
+                    // Angry walkout
+                    this->release_seat();
+                    state = .Leaving;
+                    this->find_exit();
+                }
+            }
         }
 
         if target != Entity_Nothing {
@@ -131,6 +149,7 @@ PatronComponent :: struct {
                 if interactor->has(PlayerComponent) {
                     patron.state = .Waiting_For_Order;
                     patron.order_show_animation = 1.0f;
+                    patron.annoy_timeout = random.float(15, 20); @Hardcoded
 
                     Audio_Manager.play_sound("./assets/sounds/prompt-1.wav");
                 }
@@ -175,6 +194,14 @@ PatronComponent :: struct {
             immediate_set_color(.{0.9, 0.9, 0.9});
             immediate_rectangle(r.x, r.y, r.w, r.h);
 
+            if annoy_timeout < 10 { @Hardcoded
+                immediate_set_color(.{1, 0, 0});
+                ar := r;
+                ar.h *= 1 - annoy_timeout / 10;
+                ar.y = r.y + r.h - ar.h;
+                immediate_rectangle(ar.x, ar.y, ar.w, ar.h);
+            }
+
             r.x += 2;
             r.y += 2;
             r.w -= 4;
index 0501ba1f302eba6dc35183fb24b8f110d6a90c47..dbf2a803d4954e70b151d189b83fe2dbbcf7c089 100644 (file)
@@ -54,6 +54,7 @@ PlayerComponent :: struct {
             it := scene->get(player.nearby_interact);
             interact_comp := it->get(InteractableComponent);
             interact_comp.interact(it, this);
+            Audio_Manager.play_sound("./assets/sounds/interact-1.wav");
         }
 
         //
index 0ed082a58704a99c84e0ee804e7c2cff123be995..7d123b3318d7bbdf8e33675ce19160014e88567a 100644 (file)
@@ -85,7 +85,8 @@ editor_update :: (dt: f32) {
     mouse_pos := mouse_raw - scene_render_offset;
 
     if mouse_raw.x < ~~window_width - sidebar_width && mouse_pos.x >= 0 {
-        if is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) || is_button_just_down(GLFW_MOUSE_BUTTON_RIGHT) {
+        if !dragging && !resizing &&
+            (is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) || is_button_just_up(GLFW_MOUSE_BUTTON_RIGHT)) {
             if active_tab == .Edit do active_index = -1;
             selected_entity_id = Entity_Nothing;
 
@@ -96,8 +97,8 @@ editor_update :: (dt: f32) {
                 }
             }
 
-            dragging = is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) && selected_entity_id != Entity_Nothing;
-            resizing = is_button_just_down(GLFW_MOUSE_BUTTON_RIGHT) && selected_entity_id != Entity_Nothing;
+            dragging = false;
+            resizing = false;
         }
     }
 
@@ -112,6 +113,13 @@ editor_update :: (dt: f32) {
     if selected_entity_id != Entity_Nothing && active_tab == .Edit {
         selected_entity := scene->get(selected_entity_id);
 
+        {
+            mouse_pos := mouse_get_position_vector() - scene_render_offset;
+            contains  := Rect.contains(selected_entity->get_rect(), mouse_pos);
+            dragging = dragging || (is_button_just_down(GLFW_MOUSE_BUTTON_LEFT) && contains);
+            resizing = resizing || (is_button_just_down(GLFW_MOUSE_BUTTON_RIGHT) && contains);
+        }
+
         if dragging {
             if editor_grid_shown {
                 new_top_left := mouse_get_position_vector() - scene_render_offset;
@@ -361,11 +369,17 @@ editor_draw :: () {
         }
 
     } else {
-        if draw_button(.{ x + w - 150, y, 150, 24 }, "Delete") {
+        if draw_button(.{ x + w - 100, y, 100, 24 }, "Delete") {
             scene->delete(entity);
             selected_entity_id = Entity_Nothing;
             return;
         }
+        if draw_button(.{ x + w - 204, y, 100, 24 }, "Duplicate") {
+            new_entity := scene->duplicate(entity);
+            new_entity.pos = entity.pos + .{16, 16};
+            selected_entity_id = new_entity.id;
+            return;
+        }
 
         if active_index >= 0 do sidebar_width += w;
 
@@ -501,16 +515,16 @@ editor_draw :: () {
     switch info.kind {
         case .Enum {
             enum_info := cast(^type_info.Type_Info_Enum) info;
-            value: u64;
-            switch enum_info.backing_type {
-                case i8,  u8  do value = cast(u64) *(cast(^u8) v.data);
-                case i16, u16 do value = cast(u64) *(cast(^u16) v.data);
-                case i32, u32 do value = cast(u64) *(cast(^u32) v.data);
-                case i64, u64 do value = cast(u64) *(cast(^u64) v.data);
-                case #default do assert(false, "Bad enum backing type");
-            }
-
             if enum_info.is_flags {
+                value: u64;
+                switch enum_info.backing_type {
+                    case i8,  u8  do value = cast(u64) *(cast(^u8) v.data);
+                    case i16, u16 do value = cast(u64) *(cast(^u16) v.data);
+                    case i32, u32 do value = cast(u64) *(cast(^u32) v.data);
+                    case i64, u64 do value = cast(u64) *(cast(^u64) v.data);
+                    case #default do assert(false, "Bad enum backing type");
+                }
+
                 for^ enum_info.members {
                     y += 20;
                     checkbox_value := (value & it.value) != 0;
@@ -529,7 +543,10 @@ editor_draw :: () {
                     }
                 }
             } else {
-                @TODO // Add radio buttons for enum type.
+                for^ enum_info.members {
+                    y += 20;
+                    draw_radio(.{x, y, w, 20}, cast(^i32) v.data, ~~it.value, it.name, increment=~~y);
+                }
             }
         }
 
index 81053635ec6d1cfb65bdd8ae03a317a718e599ad..b8f87ae6ab799827980d2e584ffd04a0e224b430 100644 (file)
@@ -180,6 +180,7 @@ Scene :: struct {
     first_component  :: scene_first_component;
 
     create_from_schematic :: scene_create_from_schematic;
+    duplicate :: scene_duplicate;
 
     load_from_file :: scene_load_from_file;
     save_to_file   :: scene_save_to_file;
@@ -268,6 +269,23 @@ scene_create_from_schematic :: (use this: ^Scene, schematic_name: str) -> ^Entit
     return entity;
 }
 
+scene_duplicate :: (use this: ^Scene, entity: ^Entity) -> ^Entity {
+    new_entity := this->make();
+    new_entity.flags = entity.flags;
+    new_entity.schematic = entity.schematic;
+    new_entity.pos = entity.pos;
+    new_entity.size = entity.size;
+
+    for^ entity.components.entries {
+        comp := this->create_component(it.key);
+        memory.copy(comp, it.value, type_info.size_of(it.key));
+        new_entity->add(comp);
+    }
+
+    this->add(new_entity);
+    return new_entity;
+}
+
 scene_create_component :: (use this: ^Scene, component_type: type_expr) -> ^Component {
     comp := cast(^Component) new(component_type, allocator=entity_allocator);
     comp.type = component_type;
index 8765ac4bd22117d9bf5a35c34237b3f2c6853c76..d9e81b46404f97b390d4be809b563396b80792e2 100644 (file)
@@ -503,6 +503,98 @@ draw_checkbox :: (use r: Rect, value: ^bool, text: str, theme := ^default_checkb
 }
 
 
+//
+// Radio buttons
+//
+Radio_Theme :: struct {
+    use text_theme := Text_Theme.{};
+    use animation_theme := Animation_Theme.{};
+
+    box_color        := Color.{ 0.2, 0.2, 0.2 };
+    box_border_width := 4.0f;    @InPixels
+    box_size         := 20.0f;   @InPixels
+
+    checked_color       := Color.{ 0, 0, 1 };
+    checked_hover_color := Color.{ 0.6, 0.6, 1 };
+
+    background_color := Color.{ 0.05, 0.05, 0.05 };  // Background of the checkbox button.
+    hover_color      := Color.{ 0.3, 0.3, 0.3 };
+    click_color      := Color.{ 0.5, 0.5, 0.7 };
+}
+
+#local default_radio_theme := Radio_Theme.{};
+
+draw_radio :: (use r: Rect, value: ^$T, set_to: T, text: str, theme := ^default_radio_theme, site := #callsite, increment := 0) -> bool {
+    result := false;
+
+    hash := get_site_hash(site, increment);
+    animation_state := get_animation(hash);
+    mx, my := mouse_get_position();
+
+    contains := Rect.contains(r, .{~~mx, ~~my});
+
+    if is_active_item(hash) {
+        renew_active_item(hash);
+        if is_button_just_up(GLFW_MOUSE_BUTTON_LEFT) {
+            if is_hot_item(hash) && contains {
+                result = true;
+                *value = set_to;
+                animation_state.click_time = 1.0f;
+            }
+
+            set_active_item(0);
+        }
+    } elseif is_hot_item(hash) {
+        if is_button_down(GLFW_MOUSE_BUTTON_LEFT) {
+            set_active_item(hash);
+        }
+    }
+
+    if contains {
+        set_hot_item(hash);
+    }
+
+    if is_hot_item(hash) {
+        move_towards(^animation_state.hover_time, 1.0f, theme.hover_speed);
+    } else {
+        move_towards(^animation_state.hover_time, 0.0f, theme.hover_speed);
+    }
+
+    box_border_width := theme.box_border_width;
+    box_size         := theme.box_size;
+
+    immediate_set_color(theme.box_color);
+    immediate_rectangle(x + 4, y + (h - box_size) / 2, box_size, box_size);
+
+    surface_color : Color;
+    if *value == set_to {
+        surface_color = theme.checked_color;
+        surface_color = color_lerp(animation_state.hover_time, surface_color, theme.checked_hover_color);
+
+    } else {
+        surface_color = theme.background_color;
+        surface_color = color_lerp(animation_state.hover_time, surface_color, theme.hover_color);
+    }
+
+    surface_color = color_lerp(animation_state.click_time, surface_color, theme.click_color);
+
+    immediate_set_color(surface_color);
+    immediate_rectangle(x + 4 + box_border_width, y + (h - box_size) / 2 + box_border_width, box_size - box_border_width * 2, box_size - box_border_width * 2);
+
+    font := font_lookup(.{theme.font_name, theme.font_size});
+    text_width  := font_get_width(font, text);
+    text_height := font_get_height(font, text);
+
+    font_set_color(theme.text_color);
+    font_draw(font, x + box_size + 4 * 2, y + font.em + (h - text_height) / 2, text);
+
+    move_towards(^animation_state.click_time, 0.0f, theme.click_decay_speed);
+
+    return result;
+}
+
+
+
 
 scrolling_region_start :: (r: Rect, max_y_scroll := 10000.0f, site := #callsite, increment := 0) {
     hash := get_site_hash(site, increment);
index 7e7bdd0ad8fc34d33dccf70db88ef68ae33e99b3..99708d2cb5384e7d14e0a42e16ab6ad63a4c6b97 100644 (file)
@@ -53,7 +53,7 @@ Audio_Manager :: struct {
         alBufferData(buffer, al_format, wav_file.data.data, wav_file.data.count, wav_file.sample_rate);
         memory.free_slice(^wav_file.loaded_file_data);
 
-        map.put(^loaded_sounds, path, .{ buffer });
+        loaded_sounds[path] = .{ buffer };
         return .{ buffer };
     }