--- /dev/null
+
+use package core
+
+#local Patreon_State :: enum {
+ Waiting_To_Place_Order;
+ Waiting_For_Order;
+ Consuming_Order;
+ Leaving;
+}
+
+PatreonComponent :: struct {
+ use component: Component;
+
+ state := Patreon_State.Waiting_To_Place_Order;
+ order_item: str;
+ holding: Entity_ID;
+ consume_timeout: f32;
+
+ init :: (use this: ^PatreonComponent) {
+ order_item = "beer";
+ }
+
+ added :: (use this: ^PatreonComponent, entity: ^Entity) {
+ entity.flags |= .Interactable;
+
+ scene->create_and_add(entity, InteractableComponent) {
+ comp.interact = interact;
+ }
+ }
+
+ update :: (use this: ^PatreonComponent, entity: ^Entity, dt: f32) {
+ if consume_timeout > 0 && state == .Consuming_Order {
+ consume_timeout -= dt;
+ if consume_timeout < 0 {
+ state = .Leaving;
+ holding_object := scene->get(holding);
+ holding_object.flags |= .Dead;
+ holding = Entity_Nothing;
+ }
+ }
+
+ if holding != Entity_Nothing {
+ holding_object := scene->get(holding);
+ r := Entity.get_rect(holding_object);
+ holding_object.pos = entity.pos + .{-10, 0};
+ }
+ }
+
+ interact :: (entity: ^Entity, interactor: ^Entity) {
+ patreon := entity->get(PatreonComponent);
+
+ switch patreon.state {
+ case .Waiting_To_Place_Order {
+ if interactor->has(PlayerComponent) {
+ patreon.state = .Waiting_For_Order;
+ }
+ }
+
+ case .Waiting_For_Order {
+ player_comp := interactor->get(PlayerComponent);
+ if player_comp == null do return;
+ if player_comp.holding == Entity_Nothing do return;
+ if item := scene->get(player_comp.holding); item->has(ItemComponent) {
+ item_comp := item->get(ItemComponent);
+ if item_comp.item == patreon.order_item {
+ patreon.state = .Consuming_Order;
+ patreon.consume_timeout = 10;
+ patreon.holding = player_comp.holding;
+ player_comp.holding = Entity_Nothing;
+ }
+ }
+ }
+ }
+ }
+
+ post_render :: (use this: ^PatreonComponent, entity: ^Entity) {
+ if state == .Waiting_For_Order {
+ r := entity->get_rect();
+
+ r = Rect.{ r.x + (r.w - 24) / 2, r.y - r.h / 2 - 16, 24, 24 };
+ immediate_set_color(.{0, 0, 0});
+ immediate_rectangle(r.x, r.y, r.w, r.h);
+
+ r.x += 2;
+ r.y += 2;
+ r.w -= 4;
+ r.h -= 4;
+ immediate_set_color(.{1, 1, 1});
+ immediate_rectangle(r.x, r.y, r.w, r.h);
+
+ r.x += 2;
+ r.y += 2;
+ r.w -= 4;
+ r.h -= 4;
+
+ item_data := item_store->get_item(order_item);
+ texture, loaded := texture_lookup(item_data.texture_path);
+
+ immediate_set_color(item_data.color);
+ if !loaded {
+ immediate_rectangle(r.x, r.y, 16, 16);
+ } else {
+ tp := item_data.texture_pos;
+ ts := item_data.texture_size;
+ immediate_subimage(^texture, r.x, r.y, r.w, r.h,
+ tp.x, tp.y, ts.x, ts.y);
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+
+use package core
+
+Patreon :: struct {
+ #struct_tag Entity_Schematic.{
+ (scene) => Patreon.create(scene, .{0,0})
+ }
+
+ create :: (scene: ^Entity_Manager, pos: Vector2) -> ^Entity {
+ this := scene->make();
+ this.pos = pos;
+ this.size = .{32, 32};
+
+ scene->create_and_add(this, RenderComponent) {
+ comp.func = render;
+ comp.color = .{1, 0, 0};
+ }
+
+ scene->create_and_add(this, PatreonComponent) {}
+
+ return this;
+ }
+
+ render :: (use this: ^Entity) {
+ r := this->get_rect();
+ immediate_image(^Player.assets.texture, r.x, r.y, r.w, r.h);
+ }
+}
+
immediate_flush();
canvas_use(null);
- immediate_clear(.{1, 1, 1});
+ immediate_clear(.{0.04, 0.04, 0.06});
immediate_set_color(.{1, 1, 1});
texture := canvas_to_texture(^scene_canvas);
view_rect.y = ~~ ((window_height - scene_canvas.height) / 2);
view_rect.w = ~~ scene_canvas.width;
view_rect.h = ~~ scene_canvas.height;
- // view_rect := Rect.{0, 0, ~~window_width, ~~window_height};
+ if !editor_shown() {
+ view_rect = Rect.{0, 0, ~~window_width, ~~window_height};
+ }
scene_render_offset = Rect.top_left(view_rect);
glDisable(GL_CULL_FACE);