added money tracker; things need money now
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 6 Mar 2022 23:06:25 +0000 (17:06 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 6 Mar 2022 23:06:25 +0000 (17:06 -0600)
run_tree/assets/images/spritesheet.png
run_tree/scenes/default.items
run_tree/scenes/level1.scene
src/entity/components/dispenser.onyx
src/entity/components/money.onyx [new file with mode: 0644]
src/entity/components/patron.onyx
src/entity/items.onyx
src/entity/scene.onyx
src/game.onyx

index 1fe0a94a1ce42f65fd226e83eb9912a359a731a4..5e02096d001d11fbe621dec2cf4c3ea1dbf43471 100644 (file)
Binary files a/run_tree/assets/images/spritesheet.png and b/run_tree/assets/images/spritesheet.png differ
index 12c9b3c9afc79be5d1d3f5e444ef59aaebb50281..21ab5ad182a1d52161769cdce000028eee6e56ee 100644 (file)
@@ -1,5 +1,7 @@
 :beer
 name="Beer"
+production_cost=3
+sell_value=7
 sprite.sheet="./assets/images/spritesheet.png"
 sprite.pos = 0 0
 sprite.size = 16 16
@@ -10,6 +12,8 @@ sprite.color.a = 1
 
 :burger
 name="Burger"
+production_cost=5
+sell_value=10
 sprite.sheet="./assets/images/spritesheet.png"
 sprite.pos = 16 0
 sprite.size = 16 16
index 10e5322a0363f42bfbdb7fb5c407eef573dcf75d..8405292747026b988aedc72765c2bd882e889f50 100644 (file)
@@ -273,7 +273,7 @@ size.x = 16.0000
 size.y = 32.0000
 :FurnitureComponent
 furniture_type = 0
-taken = true
+taken = false
 :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 = true
+taken = false
 :SpriteRenderComponent
 sprite.sheet = "./assets/images/spritesheet.png"
 sprite.pos.x = 48.0000
@@ -539,6 +539,7 @@ controls.pick_up = 46
 facing = 1
 velocity.x = 0.0000
 velocity.y = 0.0000
+speed = 800.0000
 :PlayerComponent
 holding = 155
 :RenderComponent
@@ -565,6 +566,7 @@ controls.pick_up = 71
 facing = 4
 velocity.x = 0.0000
 velocity.y = 0.0000
+speed = 800.0000
 :PlayerComponent
 holding = 150
 :RenderComponent
@@ -609,8 +611,8 @@ item = "beer"
 [Entryway]
 id = 156
 flags = 0
-pos.x = 399.0000
-pos.y = 584.0000
+pos.x = 400.0000
+pos.y = 592.0000
 size.x = 64.0000
 size.y = 32.0000
 :SpriteRenderComponent
@@ -638,3 +640,28 @@ spawn_timeout_min = 5.0000
 spawn_timeout_max = 10.0000
 spawn_timeout = 5.5170
 
+[Custom]
+id = 163
+flags = 0
+pos.x = 0.0000
+pos.y = 0.0000
+size.x = 16.0000
+size.y = 16.0000
+:MoneyComponent
+money = 100
+money_sprite.sheet = "./assets/images/spritesheet.png"
+money_sprite.pos.x = 0.0000
+money_sprite.pos.y = 240.0000
+money_sprite.size.x = 16.0000
+money_sprite.size.y = 16.0000
+money_sprite.color.r = 1.0000
+money_sprite.color.g = 1.0000
+money_sprite.color.b = 1.0000
+money_sprite.color.a = 1.0000
+:RenderComponent
+layer = 100000
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
+
index 2a96d4837bdca688f81698569ddfa6126f8c79c2..add16f5b81bdfefa9e0bb935a5ffe3fea2553b55 100644 (file)
@@ -41,6 +41,10 @@ DispenserComponent :: struct {
             dispenser_comp := this->get(DispenserComponent);
             if dispenser_comp.timeout != 0 do return;
 
+            item_info  := item_store->get_item(dispenser_comp.item);
+            money_comp := scene->first_component(MoneyComponent);
+            if !money_comp->withdraw(item_info.production_cost) do return;
+
             item := scene->create_from_schematic("Item_Entity");
             if item == null {
                 debug_log(.Error, "Bad schematic type.");
diff --git a/src/entity/components/money.onyx b/src/entity/components/money.onyx
new file mode 100644 (file)
index 0000000..d4e0c81
--- /dev/null
@@ -0,0 +1,79 @@
+
+use package core
+
+#local Transaction :: struct {
+    amount: i32;
+    time: f32;
+}
+
+MoneyComponent :: struct {
+    use component: Component;
+
+    money: i32 = 100;
+    money_sprite: Sprite;
+
+    #tag Editor_Hidden, Entity_Store.Skip
+    transactions: [..] Transaction;
+
+    added :: (use this: ^MoneyComponent, entity: ^Entity) {
+        scene->modify_component(entity, RenderComponent) {
+            comp.layer = 100000;
+            comp.func = MoneyComponent.render;
+            comp.color = .{1, 1, 1};
+        }
+
+        money_sprite = .{
+            sheet = "./assets/images/spritesheet.png",
+            pos = .{ 0, 240 },
+            size = .{ 16, 16 },
+            color = .{ 1, 1, 1 }
+        };
+    }
+
+    withdraw :: (use this: ^MoneyComponent, amount: i32) -> bool {
+        if money >= amount {
+            money -= amount;
+            transactions << .{ -amount, game_time };
+            return true;
+        }
+
+        return false;
+    }
+
+    deposit :: (use this: ^MoneyComponent, amount: i32) {
+        money += amount;
+        transactions << .{ amount, game_time };
+    }
+
+    render :: (entity: ^Entity) {
+        money_comp := entity->get(MoneyComponent);
+
+        immediate_set_color(.{0, 0, 0, 0.5});
+        immediate_rectangle(0, 0, 100, 48);
+        money_comp.money_sprite->render(.{ 16, 16, 16, 16 });
+
+        font := font_lookup(.{"./assets/fonts/calibri.ttf", 24});
+
+        font_set_color(.{0, 1, 0});
+        font_print(font, 32, 32, "{}", money_comp.money);
+
+        for^ money_comp.transactions {
+            delta := (game_time - it.time) * 2;
+            color := (Color.{0, 1, 0}) if it.amount > 0 else Color.{1, 0, 0};
+            color.a = 1 - delta;
+
+            font_set_color(color);
+
+            format_str := "+{}";
+            if it.amount < 0 do format_str = "-{}";
+
+            font_print(font, 32, 32 + delta * 50 * ~~ -math.sign(it.amount), format_str, math.abs(it.amount));
+        }
+
+        while true {
+            if money_comp.transactions.count == 0 do break;
+            if money_comp.transactions[0].time + 1 > game_time do break;
+            array.delete(^money_comp.transactions, 0);
+        }
+    }
+}
index 7bffc8ed3f508a9a436fbd3041724a11e9541d17..2bc4255de03b04dd68e9c57bc34a51b1376c6356 100644 (file)
@@ -76,15 +76,21 @@ PatronComponent :: struct {
         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;
 
+                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);
+
                 target_entity := scene->get(target);
                 furniture_comp := target_entity->get(FurnitureComponent);
                 furniture_comp.taken = false;
 
+                state = .Leaving;
                 this->find_exit();
             }
         }
index b72adc2a5ae7a2f697a16d0971821444ef201023..de76aafa157115135b5288f762a164ef3b0147fc 100644 (file)
@@ -6,6 +6,8 @@ Item :: struct {
     name: str;
 
     sprite : Sprite;
+    production_cost: i32;
+    sell_value: i32;
 }
 
 Item_Store :: struct {
@@ -118,6 +120,10 @@ ItemComponent :: struct {
 
     #tag Editor_Custom_Field.{render_item_picker}
     item: str;
+
+    get_info :: (use this: ^ItemComponent) -> ^Item {
+        return item_store->get_item(item);
+    }
 }
 
 
index c3aa0027c34aff6948f9d5edb158a7d94407bf92..81053635ec6d1cfb65bdd8ae03a317a718e599ad 100644 (file)
@@ -161,6 +161,8 @@ Scene :: struct {
 
     next_entity_id: Entity_ID;
 
+    width, height: f32;
+
     add            :: scene_add;
     make           :: scene_make;
     update         :: scene_update;
@@ -175,6 +177,7 @@ Scene :: struct {
     query_by_component :: scene_query_by_component;
     create_component :: scene_create_component;
     modify_component :: scene_modify_component;
+    first_component  :: scene_first_component;
 
     create_from_schematic :: scene_create_from_schematic;
 
@@ -182,9 +185,11 @@ Scene :: struct {
     save_to_file   :: scene_save_to_file;
 }
 
-scene_create :: () -> Scene {
+scene_create :: (width, height: f32) -> Scene {
     em: Scene;
     em.entity_allocator = context.allocator; @TODO // Replace the allocator here.
+    em.width = width;
+    em.height = height;
 
     array.init(^em.entities, 4);
 
@@ -273,7 +278,7 @@ scene_create_component :: (use this: ^Scene, component_type: type_expr) -> ^Comp
         component_vtables[comp.type] = vtable;
     }
 
-    comp.vtable = component_vtables->get(comp.type);
+    comp.vtable = component_vtables[comp.type];
     if comp.init != null_proc {
         comp->init();
     }
@@ -425,7 +430,13 @@ scene_query_by_flags :: (use this: ^Scene, area: Rect, flags: Entity_Flags) -> [
     return ents;
 }
 
+scene_first_component :: (use this: ^Scene, $component_type: type_expr) -> ^component_type {
+    for entities {
+        if it->has(component_type) do return it->get(component_type);
+    }
 
+    return null;
+}
 
 
 
index fa98394ba649d09cb4a1bb8501589addb685d9f5..24a9a368208db0b9fd8ff85dc312bca5678f54b5 100644 (file)
@@ -15,10 +15,12 @@ scene_canvas: Canvas;
 
 Spritesheet: Texture;
 
+game_time: f32;
+
 game_init :: () {
     Audio_Manager.init();
 
-    scene_canvas = canvas_make(800, 600);
+    scene_canvas = canvas_make(800, 608);
 
     // This process of queueing the asset bucket should
     // be made automatic somehow...
@@ -26,7 +28,7 @@ game_init :: () {
 
     load_assets();
 
-    scene = scene_create();
+    scene = scene_create(~~ scene_canvas.width, ~~ scene_canvas.height);
     // scene->load_from_file(quick_save_file);
 
     item_store = item_store_make();
@@ -40,6 +42,7 @@ game_deinit :: () {
 #local quick_save_file := "scenes/quick_save_new.scene";
 
 game_update :: (dt: f32) {
+    game_time += dt;
     Audio_Manager.tick();
 
     if is_key_just_up(GLFW_KEY_F8) {