:beer
name="Beer"
+production_cost=3
+sell_value=7
sprite.sheet="./assets/images/spritesheet.png"
sprite.pos = 0 0
sprite.size = 16 16
:burger
name="Burger"
+production_cost=5
+sell_value=10
sprite.sheet="./assets/images/spritesheet.png"
sprite.pos = 16 0
sprite.size = 16 16
size.y = 32.0000
:FurnitureComponent
furniture_type = 0
-taken = true
+taken = false
:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 32.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
facing = 1
velocity.x = 0.0000
velocity.y = 0.0000
+speed = 800.0000
:PlayerComponent
holding = 155
:RenderComponent
facing = 4
velocity.x = 0.0000
velocity.y = 0.0000
+speed = 800.0000
:PlayerComponent
holding = 150
:RenderComponent
[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
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
+
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.");
--- /dev/null
+
+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);
+ }
+ }
+}
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();
}
}
name: str;
sprite : Sprite;
+ production_cost: i32;
+ sell_value: i32;
}
Item_Store :: struct {
#tag Editor_Custom_Field.{render_item_picker}
item: str;
+
+ get_info :: (use this: ^ItemComponent) -> ^Item {
+ return item_store->get_item(item);
+ }
}
next_entity_id: Entity_ID;
+ width, height: f32;
+
add :: scene_add;
make :: scene_make;
update :: scene_update;
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;
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);
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();
}
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;
+}
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...
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();
#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) {