From: Brendan Hansen Date: Sun, 6 Mar 2022 23:06:25 +0000 (-0600) Subject: added money tracker; things need money now X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=695a22a2b1276c30a42269b73d8b0ff0d49a331c;p=bar-game.git added money tracker; things need money now --- diff --git a/run_tree/assets/images/spritesheet.png b/run_tree/assets/images/spritesheet.png index 1fe0a94..5e02096 100644 Binary files a/run_tree/assets/images/spritesheet.png and b/run_tree/assets/images/spritesheet.png differ diff --git a/run_tree/scenes/default.items b/run_tree/scenes/default.items index 12c9b3c..21ab5ad 100644 --- a/run_tree/scenes/default.items +++ b/run_tree/scenes/default.items @@ -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 diff --git a/run_tree/scenes/level1.scene b/run_tree/scenes/level1.scene index 10e5322..8405292 100644 --- a/run_tree/scenes/level1.scene +++ b/run_tree/scenes/level1.scene @@ -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 + diff --git a/src/entity/components/dispenser.onyx b/src/entity/components/dispenser.onyx index 2a96d48..add16f5 100644 --- a/src/entity/components/dispenser.onyx +++ b/src/entity/components/dispenser.onyx @@ -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 index 0000000..d4e0c81 --- /dev/null +++ b/src/entity/components/money.onyx @@ -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); + } + } +} diff --git a/src/entity/components/patron.onyx b/src/entity/components/patron.onyx index 7bffc8e..2bc4255 100644 --- a/src/entity/components/patron.onyx +++ b/src/entity/components/patron.onyx @@ -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(); } } diff --git a/src/entity/items.onyx b/src/entity/items.onyx index b72adc2..de76aaf 100644 --- a/src/entity/items.onyx +++ b/src/entity/items.onyx @@ -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); + } } diff --git a/src/entity/scene.onyx b/src/entity/scene.onyx index c3aa002..8105363 100644 --- a/src/entity/scene.onyx +++ b/src/entity/scene.onyx @@ -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; +} diff --git a/src/game.onyx b/src/game.onyx index fa98394..24a9a36 100644 --- a/src/game.onyx +++ b/src/game.onyx @@ -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) {