item picker and code cleanup
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 6 Mar 2022 00:38:00 +0000 (18:38 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 6 Mar 2022 00:38:00 +0000 (18:38 -0600)
docs/project.vim [new file with mode: 0644]
run_tree/assets/images/spritesheet.png
run_tree/scenes/level1.scene
run_tree/scenes/quick_save_new.scene
src/entity/components/dispenser.onyx
src/entity/components/entryway.onyx [new file with mode: 0644]
src/entity/components/patron.onyx
src/entity/editor.onyx
src/entity/items.onyx
src/entity/schematics/entryway.onyx [new file with mode: 0644]
src/game.onyx

diff --git a/docs/project.vim b/docs/project.vim
new file mode 100644 (file)
index 0000000..275965a
--- /dev/null
@@ -0,0 +1,3 @@
+
+set makeprg=cd\ ./run_tree\ &&\ ./run.sh
+set errorformat=%E\(%f\:%l\\,%c\)\ \%m,%C%.%#
index 59a315520caabd435f17fc26a11c88c50cf48897..1fe0a94a1ce42f65fd226e83eb9912a359a731a4 100644 (file)
Binary files a/run_tree/assets/images/spritesheet.png and b/run_tree/assets/images/spritesheet.png differ
index d7050a5ad42b605bd9247ae2831704ef23542847..e2282a6bdf153eb6616e31b0608323656b4f7c44 100644 (file)
@@ -1,8 +1,8 @@
 [Background]
 id = 100
 flags = 0
-pos.x = 404.0000
-pos.y = 310.5000
+pos.x = 406.5000
+pos.y = 311.5000
 size.x = 941.0000
 size.y = 751.0000
 :BackgroundComponent
@@ -23,9 +23,9 @@ size.x = 352.0000
 size.y = 16.0000
 :RenderComponent
 layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
+color.r = 0.2549
+color.g = 0.1721
+color.b = 0.0474
 color.a = 1.0000
 
 [Wall]
@@ -273,7 +273,7 @@ size.x = 16.0000
 size.y = 32.0000
 :FurnitureComponent
 furniture_type = 0
-taken = false
+taken = true
 :SpriteRenderComponent
 sprite.sheet = "./assets/images/spritesheet.png"
 sprite.pos.x = 32.0000
@@ -381,7 +381,7 @@ size.x = 16.0000
 size.y = 32.0000
 :FurnitureComponent
 furniture_type = 0
-taken = false
+taken = true
 :SpriteRenderComponent
 sprite.sheet = "./assets/images/spritesheet.png"
 sprite.pos.x = 48.0000
@@ -524,8 +524,8 @@ color.a = 1.0000
 [Player]
 id = 12
 flags = 2
-pos.x = 334.4179
-pos.y = 246.6519
+pos.x = 374.4024
+pos.y = 300.0931
 size.x = 16.0000
 size.y = 32.0000
 :MovementComponent
@@ -535,7 +535,7 @@ controls.left = 65
 controls.right = 68
 controls.interact = 70
 controls.pick_up = 71
-facing = 3
+facing = 4
 velocity.x = 0.0000
 velocity.y = 0.0000
 :PlayerComponent
@@ -549,9 +549,9 @@ color.a = 1.0000
 
 [Item_Entity]
 id = 150
-flags = 6
-pos.x = 334.4179
-pos.y = 222.6519
+flags = 2
+pos.x = 374.4024
+pos.y = 276.0931
 size.x = 16.0000
 size.y = 16.0000
 :RenderComponent
@@ -566,7 +566,7 @@ item = "burger"
 [Item_Entity]
 id = 155
 flags = 0
-pos.x = 276.7525
+pos.x = 277.7524
 pos.y = 205.4651
 size.x = 16.0000
 size.y = 16.0000
@@ -579,3 +579,35 @@ color.a = 1.0000
 :ItemComponent
 item = "beer"
 
+[Entryway]
+id = 156
+flags = 0
+pos.x = 399.0000
+pos.y = 584.0000
+size.x = 64.0000
+size.y = 32.0000
+:SpriteRenderComponent
+sprite.sheet = "./assets/images/spritesheet.png"
+sprite.pos.x = 80.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 = 100
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+:EntrywayComponent
+schematic = "Patron"
+spawned_size.x = 16.0000
+spawned_size.y = 32.0000
+enabled = true
+spawn_timeout_min = 5.0000
+spawn_timeout_max = 10.0000
+spawn_timeout = 5.5170
+
index c2d9a19317a125afe347639b644ad22756f90e9c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,581 +0,0 @@
-[Background]
-id = 100
-flags = 0
-pos.x = 404.0000
-pos.y = 310.5000
-size.x = 941.0000
-size.y = 751.0000
-:BackgroundComponent
-texture_path = "./assets/images/background.png"
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 10
-flags = 2
-pos.x = 192.0000
-pos.y = 104.0000
-size.x = 352.0000
-size.y = 16.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 11
-flags = 3
-pos.x = 456.0000
-pos.y = 64.0000
-size.x = 16.0000
-size.y = 96.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Door]
-id = 13
-flags = 3
-pos.x = 368.0000
-pos.y = 104.0000
-size.x = 160.0000
-size.y = 16.0000
-:DoorComponent
-max_openness = 0.8000
-target_openness = 0.8000
-openness = 0.8000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 25
-flags = 2
-pos.x = 408.0000
-pos.y = 8.0000
-size.x = 816.0000
-size.y = 16.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 27
-flags = 2
-pos.x = 8.0000
-pos.y = 312.0000
-size.x = 16.0000
-size.y = 592.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 28
-flags = 2
-pos.x = 792.0000
-pos.y = 312.0000
-size.x = 16.0000
-size.y = 592.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Furniture]
-id = 30
-flags = 2
-pos.x = 136.0000
-pos.y = 336.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 = 31
-flags = 2
-pos.x = 184.0000
-pos.y = 336.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 = 32
-flags = 2
-pos.x = 160.0000
-pos.y = 336.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 = 40
-flags = 2
-pos.x = 136.0000
-pos.y = 256.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 = 41
-flags = 2
-pos.x = 184.0000
-pos.y = 256.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 = 42
-flags = 2
-pos.x = 160.0000
-pos.y = 256.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 = 55
-flags = 2
-pos.x = 536.0000
-pos.y = 256.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 = 54
-flags = 2
-pos.x = 584.0000
-pos.y = 256.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 = 53
-flags = 2
-pos.x = 560.0000
-pos.y = 256.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 = 52
-flags = 2
-pos.x = 536.0000
-pos.y = 336.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 = 51
-flags = 2
-pos.x = 584.0000
-pos.y = 336.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 = 50
-flags = 2
-pos.x = 560.0000
-pos.y = 336.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
-
-[Wall]
-id = 35
-flags = 2
-pos.x = 192.0000
-pos.y = 592.0000
-size.x = 352.0000
-size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 36
-flags = 2
-pos.x = 608.0000
-pos.y = 592.0000
-size.x = 352.0000
-size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Wall]
-id = 37
-flags = 2
-pos.x = 140.0000
-pos.y = -142.0000
-size.x = 16.0000
-size.y = 16.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Tap]
-id = 14
-flags = 3
-pos.x = 240.0000
-pos.y = 32.0000
-size.x = 32.0000
-size.y = 32.0000
-:SpriteRenderComponent
-sprite.sheet = "./assets/images/spritesheet.png"
-sprite.pos.x = 0.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
-:DispenserComponent
-item = "beer"
-max_timeout = 2.0000
-
-[Player]
-id = 152
-flags = 2
-pos.x = 276.7525
-pos.y = 229.4651
-size.x = 16.0000
-size.y = 32.0000
-:MovementComponent
-controls.up = 265
-controls.down = 264
-controls.left = 263
-controls.right = 262
-controls.interact = 44
-controls.pick_up = 46
-facing = 1
-velocity.x = 0.0000
-velocity.y = 0.0000
-:PlayerComponent
-holding = 155
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 0.0000
-color.b = 1.0000
-color.a = 1.0000
-
-[Player]
-id = 12
-flags = 2
-pos.x = 334.4179
-pos.y = 246.6519
-size.x = 16.0000
-size.y = 32.0000
-:MovementComponent
-controls.up = 87
-controls.down = 83
-controls.left = 65
-controls.right = 68
-controls.interact = 70
-controls.pick_up = 71
-facing = 3
-velocity.x = 0.0000
-velocity.y = 0.0000
-:PlayerComponent
-holding = 150
-:RenderComponent
-layer = 10
-color.r = 0.0000
-color.g = 1.0000
-color.b = 0.0000
-color.a = 1.0000
-
-[Item_Entity]
-id = 150
-flags = 6
-pos.x = 334.4179
-pos.y = 222.6519
-size.x = 16.0000
-size.y = 16.0000
-:RenderComponent
-layer = 10
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-:ItemComponent
-item = "burger"
-
-[Item_Entity]
-id = 155
-flags = 0
-pos.x = 276.7525
-pos.y = 205.4651
-size.x = 16.0000
-size.y = 16.0000
-:RenderComponent
-layer = 10
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
-:ItemComponent
-item = "beer"
-
index eb73ec1e0fecc46b63b71d937559a7b3c01f2370..2a96d4837bdca688f81698569ddfa6126f8c79c2 100644 (file)
@@ -9,6 +9,7 @@ use package core
 DispenserComponent :: struct {
     use base: Component;
 
+    #tag Editor_Custom_Field.{render_item_picker}
     item: str;
     max_timeout := 2.0f;
 
diff --git a/src/entity/components/entryway.onyx b/src/entity/components/entryway.onyx
new file mode 100644 (file)
index 0000000..2b1c651
--- /dev/null
@@ -0,0 +1,32 @@
+
+use package core
+
+EntrywayComponent :: struct {
+    use component: Component;
+
+    schematic: str;
+    spawned_size: Vector2;
+
+    enabled := true;
+    spawn_timeout_min := 5.0f;
+    spawn_timeout_max := 10.0f;
+    spawn_timeout := 0.0f;
+
+    update :: (use this: ^EntrywayComponent, entity: ^Entity, dt: f32) {
+        if !enabled do return;
+
+        spawn_timeout -= dt;
+        if spawn_timeout < 0 {
+            this->spawn(entity);
+            spawn_timeout = random.float(spawn_timeout_min, spawn_timeout_max);
+        }
+    }
+
+    spawn :: (use this: ^EntrywayComponent, entity: ^Entity) {
+        new_ent := scene->create_from_schematic(schematic);
+        new_ent.pos = entity.pos;
+        new_ent.size = spawned_size;
+
+        scene->add(new_ent);
+    }
+}
index 87f0312a3927baad48cf16d0a576ded3f5a426b1..ecae8feb210a9a7b989b9a60bcb820fdb89bf170 100644 (file)
@@ -13,7 +13,7 @@ PatronComponent :: struct {
     use component: Component;
 
     state: Patron_State;
-    seat: Entity_ID;
+    target: Entity_ID;
     order_item: str;
     order_show_animation: f32;
     holding: Entity_ID;
@@ -38,40 +38,38 @@ PatronComponent :: struct {
 
         attempts := seats.count;
 
-        while seat == Entity_Nothing && attempts > 0 {
+        while target == Entity_Nothing && attempts > 0 {
             it := random.choice(seats);
             furniture := it->get(FurnitureComponent);
             if furniture.furniture_type != .Seat do continue;
             if furniture->try_take() {
-                seat = it.id;
+                target = it.id;
                 break;
             }
 
             attempts -= 1;
         }
 
-        return seat != Entity_Nothing;
+        return target != Entity_Nothing;
+    }
+
+    find_exit :: (use this: ^PatronComponent) {
+        exits := scene->query_by_component(.{0, 0, 10000, 10000 }, EntrywayComponent);
+        defer memory.free_slice(^exits);
+        if exits.count == 0 do return;
+
+        target = random.choice(exits).id;
     }
 
     update :: (use this: ^PatronComponent, entity: ^Entity, dt: f32) {
         if state == .Walking_To_Seat {
-            if seat == Entity_Nothing {
+            if target == Entity_Nothing {
                 found_seat := this->find_available_seat();
                 if !found_seat {
                     state = .Leaving;
                     return;
                 }
             }
-
-            seat_entity := scene->get(seat);
-            seat_location := seat_entity.pos;
-            if Vector2.square_mag(seat_location - entity.pos) < 16 {
-                entity.pos = seat_location;
-                state = .Waiting_To_Place_Order;
-            } else {
-                delta := Vector2.norm(seat_location - entity.pos) * 100;
-                entity.pos += delta * dt;
-            }
         }
 
         if consume_timeout > 0 && state == .Consuming_Order {
@@ -81,6 +79,8 @@ PatronComponent :: struct {
                 holding_object := scene->get(holding);
                 holding_object.flags |= .Dead;
                 holding = Entity_Nothing;
+
+                this->find_exit();
             }
         }
 
@@ -90,6 +90,20 @@ PatronComponent :: struct {
             }
         }
 
+        if target != Entity_Nothing {
+            target_entity := scene->get(target);
+            target_location := target_entity.pos;
+            if Vector2.square_mag(target_location - entity.pos) < 16 {
+                entity.pos = target_location;
+
+                if state == .Walking_To_Seat do state = .Waiting_To_Place_Order;
+                if state == .Leaving do entity.flags |= .Dead;
+            } else {
+                delta := Vector2.norm(target_location - entity.pos) * 100;
+                entity.pos += delta * dt;
+            }
+        }
+
         if holding != Entity_Nothing {
             holding_object := scene->get(holding);
             r := Entity.get_rect(holding_object);
@@ -159,4 +173,4 @@ PatronComponent :: struct {
             item_data.sprite->render(r);
         }
     }
-}
\ No newline at end of file
+}
index e8e49b4da363b430c4d715228ebf0b1f4ff21431..25fbc087f43a00a15b4553193eb4c0a5d01ccf59 100644 (file)
@@ -237,10 +237,11 @@ editor_draw :: () {
                 entry: os.DirectoryEntry;
                 y += 80;
                 while os.dir_read(dir, ^entry) {
-                    if string.ends_with(entry->name(), ".scene") {
-                        if draw_button(.{ x, y, w, 40 }, entry->name(), increment=entry.identifier) {
+                    name := entry->name();
+                    if string.ends_with(name, ".scene") {
+                        if draw_button(.{ x, y, w, 40 }, name, increment=hash.to_u32(name)) {
                             buf: [1024] u8;
-                            path := conv.format(buf, "./scenes/{}", entry->name());
+                            path := conv.format(buf, "./scenes/{}", name);
                             scene->load_from_file(path);
                         }
                         y += 40;
index d75fa4692ae6c0b851bf785a147c88ddc0471c70..b72adc2a5ae7a2f697a16d0971821444ef201023 100644 (file)
@@ -121,8 +121,31 @@ ItemComponent :: struct {
 }
 
 
-#local {
-    render_item_picker :: (v: any, x, y, w, h: f32, field_name: str) {
-        
+render_item_picker :: (v: any, x, y, w, h: f32, field_name: str) {
+    immediate_set_color(.{.3, .3, .3});
+    immediate_rectangle(x, y, w, h);
+
+    item_name := cast(^str) v.data;
+
+    ix, iy := x, y;
+
+    for^ entry: item_store.items.entries {
+        item := entry.value;
+
+        if draw_button(.{ix, iy, 40, 40}, "", increment=~~entry) {
+            *item_name = entry.key;
+        }
+
+        item.sprite->render(.{ix + 4, iy + 4, 32, 32 });
+        if *item_name == entry.key {
+            immediate_set_color(.{1, 1, 0, .3});
+            immediate_rectangle(ix + 4, iy + 4, 32, 32);
+        }
+
+        ix += 40;
+        if ix-x >= w {
+            ix = x;
+            iy += 40;
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/src/entity/schematics/entryway.onyx b/src/entity/schematics/entryway.onyx
new file mode 100644 (file)
index 0000000..825762c
--- /dev/null
@@ -0,0 +1,25 @@
+
+use package core
+
+Entryway :: struct {
+    #struct_tag Entity_Schematic.{
+        (scene) => {
+            this := scene->make();
+            this.size = .{16, 16};
+
+            scene->modify_component(this, SpriteRenderComponent) {
+                comp.sprite.sheet = "./assets/images/spritesheet.png";
+                comp.sprite.pos = .{0, 0};
+                comp.sprite.size = .{16, 16};
+                comp.sprite.color = .{1, 1, 1};
+            }
+
+            scene->modify_component(this, EntrywayComponent) {
+                comp.schematic = "Patron";
+                comp.spawned_size = .{16, 32};
+            }
+
+            return this;
+        }
+    }
+}
index a56acb981072bcace2c84e843833e744a8d25e71..fa98394ba649d09cb4a1bb8501589addb685d9f5 100644 (file)
@@ -15,8 +15,6 @@ scene_canvas: Canvas;
 
 Spritesheet: Texture;
 
-patron_spawn_timeout := 5.0f;
-
 game_init :: () {
     Audio_Manager.init();
 
@@ -60,15 +58,6 @@ game_update :: (dt: f32) {
     }
 
     scene->update(dt);
-    patron_spawn_timeout -= dt;
-    if patron_spawn_timeout < 0 {
-        patron_spawn_timeout = random.float(5, 10);
-
-        patron := scene->create_from_schematic("Patron");
-        patron.pos = .{ 420, 600 };
-        patron.size = .{ 16, 32 };
-        scene->add(patron);
-    }
 }
 
 game_draw :: () {