[Background]
id = 100
flags = 0
-pos.x = 0
-pos.y = 0
+pos.x = 0.0000
+pos.y = 0.0000
+size.x = 0.0000
+size.y = 0.0000
:RenderComponent
-layer = -1
-color.r = 1
-color.g = 1
-color.b = 1
-color.a = 1
+layer = 0
+color.r = 1.0000
+color.g = 1.0000
+color.b = 1.0000
+color.a = 1.0000
[Wall]
id = 10
color.b = 1.0000
color.a = 1.0000
-[Player]
-id = 12
-flags = 2
-pos.x = 312.5422
-pos.y = 271.0389
-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.4420
-velocity.y = 0.4767
-:PlayerComponent
-holding = 0
-:RenderComponent
-layer = 10
-color.r = 0.0000
-color.g = 1.0000
-color.b = 0.0000
-color.a = 1.0000
-
[Door]
id = 13
flags = 3
pos.y = 336.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 32.0000
sprite.pos.y = 32.0000
pos.y = 336.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 336.0000
size.x = 32.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 1
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 256.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 32.0000
sprite.pos.y = 32.0000
pos.y = 256.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 256.0000
size.x = 32.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 1
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 256.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 32.0000
sprite.pos.y = 32.0000
pos.y = 256.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 256.0000
size.x = 32.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 1
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 336.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 32.0000
sprite.pos.y = 32.0000
pos.y = 336.0000
size.x = 16.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 0
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.0000
pos.y = 336.0000
size.x = 32.0000
size.y = 32.0000
-:RenderComponent
-layer = 0
-color.r = 1.0000
-color.g = 1.0000
-color.b = 1.0000
-color.a = 1.0000
:FurnitureComponent
furniture_type = 1
taken = false
+:SpriteRenderComponent
sprite.sheet = "./assets/images/spritesheet.png"
sprite.pos.x = 48.0000
sprite.pos.y = 32.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 = 1
+layer = 0
color.r = 1.0000
color.g = 1.0000
color.b = 1.0000
item = "beer"
max_timeout = 2.0000
+[Player]
+id = 12
+flags = 2
+pos.x = 312.4881
+pos.y = 271.0974
+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 = 0
+:RenderComponent
+layer = 10
+color.r = 0.0000
+color.g = 1.0000
+color.b = 0.0000
+color.a = 1.0000
+
debug_log(.Error, "DispenserComponent expected entity to not have an InteractableComponent");
}
- scene->create_and_add(entity, InteractableComponent) {
+ scene->modify_component(entity, InteractableComponent) {
comp.interact = interact;
}
}
furniture_type: Furniture_Type;
taken := false;
- sprite: Sprite;
-
- init :: (use this: ^FurnitureComponent) {
- sprite.pos = .{0, 32};
- sprite.size = .{32, 32};
- sprite.color = .{1, 1, 1};
- }
try_take :: (use this: ^FurnitureComponent) -> bool {
if taken do return false;
added :: (use this: ^PatronComponent, entity: ^Entity) {
entity.flags |= .Interactable;
- scene->create_and_add(entity, InteractableComponent) {
+ scene->modify_component(entity, InteractableComponent) {
comp.interact = interact;
}
}
this.size = size;
this.flags |= .Solid;
- scene->create_and_add(this, RenderComponent) {
+ scene->modify_component(this, RenderComponent) {
comp.func = Wall.render;
}
this.flags |= .Interactable;
this.flags |= .Solid;
- scene->create_and_add(this, DoorComponent) {}
- scene->create_and_add(this, RenderComponent) { comp.func = Door.render; }
- scene->create_and_add(this, SizeComponent) { comp.func = Door.get_rect; }
- scene->create_and_add(this, InteractableComponent) { comp.interact = Door.interact; }
+ scene->modify_component(this, DoorComponent) {}
+ scene->modify_component(this, RenderComponent) { comp.func = Door.render; }
+ scene->modify_component(this, SizeComponent) { comp.func = Door.get_rect; }
+ scene->modify_component(this, InteractableComponent) { comp.interact = Door.interact; }
return this;
}
this.size = .{0, 0};
this.flags |= .Carryable;
- scene->create_and_add(this, RenderComponent) { comp.func = render; comp.layer = 10; }
- scene->create_and_add(this, ItemComponent) {}
+ scene->modify_component(this, RenderComponent) { comp.func = render; comp.layer = 10; }
+ scene->modify_component(this, ItemComponent) {}
return this;
}
color := Color.{1, 1, 1};
}
+SpriteRenderComponent :: struct {
+ use base: Component;
+ sprite: Sprite;
+
+ added :: (use comp: ^SpriteRenderComponent, entity: ^Entity) {
+ scene->modify_component(entity, RenderComponent) {
+ comp.func = SpriteRenderComponent.render;
+ }
+ }
+
+ render :: (entity: ^Entity) {
+ sprite := entity->get(SpriteRenderComponent);
+ sprite.sprite->render(entity->get_rect());
+ }
+}
+
SizeComponent :: struct {
use base: Component;
func : (e: ^Entity) -> Rect;
query_by_component :: scene_query_by_component;
create_component :: scene_create_component;
- create_and_add :: scene_create_and_add;
+ modify_component :: scene_modify_component;
create_from_schematic :: scene_create_from_schematic;
return comp;
}
-scene_create_and_add :: macro (this: ^Scene, entity: ^Entity, $component_type: type_expr, init_block: Code) where IsComponent(^component_type) {
+scene_modify_component :: macro (this: ^Scene, entity: ^Entity, $component_type: type_expr, init_block: Code) where IsComponent(^component_type) {
use package core.intrinsics.onyx {__initialize}
- comp := cast(^component_type) this->create_component(component_type);
+ comp: ^component_type;
+ if !entity->has(component_type) {
+ comp = cast(^component_type) this->create_component(component_type);
- // The 'create_component' function does not initailize the component, as it is not
- // a compile time known parameter and therefore cannot know how to initialize it.
- // This 'create_and_add' function is more often used by the programmer, so initializing
- // the component here before returning is a good idea.
- __initialize(comp);
+ // The 'create_component' function does not initailize the component, as it is not
+ // a compile time known parameter and therefore cannot know how to initialize it.
+ // This 'modify_component' function is more often used by the programmer, so initializing
+ // the component here before returning is a good idea.
+ __initialize(comp);
+ }
#insert init_block;
entity->add(comp);
this.pos = .{0, 0};
this.size = .{0, 0};
- scene->create_and_add(this, RenderComponent) {
+ scene->modify_component(this, RenderComponent) {
comp.func = Background.render;
}
this.size = .{16, 16};
this.flags |= .Solid;
- scene->create_and_add(this, RenderComponent) {
- comp.func = render;
- }
+ scene->modify_component(this, FurnitureComponent) {}
- scene->create_and_add(this, FurnitureComponent) {}
+ scene->modify_component(this, SpriteRenderComponent) {
+ comp.sprite.sheet = "./assets/images/spritesheet.png";
+ comp.sprite.pos = .{0, 32};
+ comp.sprite.size = .{32, 32};
+ comp.sprite.color = .{1, 1, 1};
+ }
return this;
}
-
- render :: (entity: ^Entity) {
- furniture := entity->get(FurnitureComponent);
- furniture.sprite->render(entity->get_rect());
- }
}
\ No newline at end of file
this.size = .{32, 32};
this.flags |= .Solid;
- scene->create_and_add(this, RenderComponent) {
+ scene->modify_component(this, RenderComponent) {
comp.func = render;
comp.layer = 5;
comp.color = .{1, 0, 0};
}
- scene->create_and_add(this, PatronComponent) {}
+ scene->modify_component(this, PatronComponent) {}
return this;
}
this.size = .{32, 32};
this.flags |= .Solid;
- scene->create_and_add(this, SizeComponent) {
+ scene->modify_component(this, SizeComponent) {
comp.func = (use this: ^Entity) => Rect.{pos.x - size.x / 2, pos.y, size.x, size.y / 2};
}
- scene->create_and_add(this, MovementComponent) {
+ scene->modify_component(this, MovementComponent) {
comp.controls = controls;
}
- scene->create_and_add(this, PlayerComponent) {
+ scene->modify_component(this, PlayerComponent) {
comp.holding = Entity_Nothing;
}
- scene->create_and_add(this, RenderComponent) {
+ scene->modify_component(this, RenderComponent) {
comp.func = PlayerComponent.render;
comp.color = .{1,1,1};
}
this.flags |= .Solid;
this.flags |= .Interactable;
- scene->create_and_add(this, RenderComponent) {
- comp.func = render;
+ scene->modify_component(this, SpriteRenderComponent) {
+ comp.sprite.sheet = "./assets/images/spritesheet.png";
+ comp.sprite.pos = .{ 0, 32 };
+ comp.sprite.size = .{ 32, 32 };
+ comp.sprite.color = .{ 1, 1, 1 };
}
- scene->create_and_add(this, DispenserComponent) {
+ scene->modify_component(this, DispenserComponent) {
comp.item = "beer";
}
return this;
}
-
- render :: (use this: ^Entity) {
- rect := this->get_rect();
-
- immediate_subimage(^Spritesheet, rect.x, rect.y, rect.w, rect.h, 0*16, 2*16, 32, 32);
- }
}