--- /dev/null
+
+set makeprg=cd\ ./run_tree\ &&\ ./run.sh
+set errorformat=%E\(%f\:%l\\,%c\)\ \%m,%C%.%#
[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
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]
size.y = 32.0000
:FurnitureComponent
furniture_type = 0
-taken = false
+taken = true
:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 32.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
[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
controls.right = 68
controls.interact = 70
controls.pick_up = 71
-facing = 3
+facing = 4
velocity.x = 0.0000
velocity.y = 0.0000
:PlayerComponent
[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
[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
: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
+
-[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"
-
DispenserComponent :: struct {
use base: Component;
+ #tag Editor_Custom_Field.{render_item_picker}
item: str;
max_timeout := 2.0f;
--- /dev/null
+
+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);
+ }
+}
use component: Component;
state: Patron_State;
- seat: Entity_ID;
+ target: Entity_ID;
order_item: str;
order_show_animation: f32;
holding: Entity_ID;
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 {
holding_object := scene->get(holding);
holding_object.flags |= .Dead;
holding = Entity_Nothing;
+
+ this->find_exit();
}
}
}
}
+ 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);
item_data.sprite->render(r);
}
}
-}
\ No newline at end of file
+}
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;
}
-#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
+}
--- /dev/null
+
+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;
+ }
+ }
+}
Spritesheet: Texture;
-patron_spawn_timeout := 5.0f;
-
game_init :: () {
Audio_Manager.init();
}
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 :: () {