-*.code-workspace
\ No newline at end of file
+*.code-workspace
+*.sublime-project
+*.sublime-workspace
\ No newline at end of file
-onyx run -V -I ../src build
+onyx run -V -I ../src build $@
}
Entity_Flags :: enum #flags {
- Interactable;
- Solid;
- Carryable;
+ // These have defined values for stable serialization.
+
+ Interactable :: 0x01;
+ Solid :: 0x02;
+ Carryable :: 0x04;
}
IsEntity :: interface (e: $E) {
entity_manager_register :: (use this: ^Entity_Manager, $entity_type: type_expr) where IsEntity(^entity_type) {
if !entity_types->has(entity_type) {
+
+ { // Validate that the entity_type does not have any pointers.
+ use type_info;
+
+ info := cast (^Type_Info_Struct) get_type_info(entity_type);
+ for info.members {
+ member_info := get_type_info(it.type);
+ is_pointer := member_info.kind == .Pointer;
+ if member_info.kind == .Basic {
+ if (cast(^Type_Info_Basic) member_info).basic_kind == .Rawptr {
+ is_pointer = is_pointer;
+ }
+ }
+
+ message_buf: [1024] u8;
+ message := conv.format(message_buf, "Cannot have a pointer member on an Entity! '{}' is a pointer!", it.name);
+ assert(!is_pointer, message);
+ }
+ }
+
+
handles := Entity_Handles.{};
@CompilerFeatures // Maybe there should be data stored in the Type_Info_Struct about
ents: [..] ^Entity;
for entities {
- if type != void && it.type != type do continue;
+ if it.type != type do continue;
get_rect := entity_types[it.type].get_rect;
if get_rect == null_proc do continue;
if is_key_just_up(controls.pick_up) {
if holding != Entity_Nothing {
holding_object := entity_manager->get(holding);
+ holding_object.flags |= .Carryable;
vtable := ^entity_manager.entity_types[holding_object.type];
if vtable.get_rect != null_proc {
r := vtable.get_rect(holding_object);
if objects[i] == this do continue;
target_object := objects[i];
+ target_object.flags ^= .Carryable; // This only works because we assume that it is Carryable, otherwise this would make it carryable.
this.holding = target_object.id;
break;
}
vtable := ^entity_manager.entity_types[holding_object.type];
if vtable.get_rect != null_proc {
r := vtable.get_rect(holding_object);
- holding_object.pos = pos - .{0, Size + r.h};
+ holding_object.pos = pos - .{0, Size + r.h / 2};
}
}
}
+ // This should be made generic and work for all kinds of entities
try_move :: (use this: ^Player, delta: Vector2, obsticles: [] ^Entity) {
pos += delta;
ent_rect := get_rect(this);
flags |= .Solid;
}
- get_rect :: (use this: ^Wall) => Rect.{ pos.x, pos.y, size.x, size.y };
+ get_rect :: (use this: ^Wall) => Rect.{ pos.x - size.x / 2, pos.y - size.y / 2, size.x, size.y };
draw :: (use this: ^Wall) {
immediate_set_color(.{1,1,1});
- immediate_rectangle(pos.x, pos.y, size.x, size.y);
+
+ r := Wall.get_rect(this);
+ immediate_rectangle(r.x, r.y, r.w, r.h);
}
}
this.flags |= .Carryable;
}
- get_rect :: (use this: ^Door) => Rect.{ pos.x, pos.y, size.x * (1 - openness), size.y };
+ get_rect :: (use this: ^Door) => {
+ size_x := size.x * (1 - openness);
+ return Rect.{ pos.x - size_x / 2, pos.y - size.y / 2, size_x, size.y };
+ }
update :: (use this: ^Door, dt: f32) {
if openness != target_openness {
--- /dev/null
+
+use package core
+use package opengles
+
+
+Canvas :: struct {
+ framebuffer: GLint;
+ depth_stencil_buffer: GLint;
+ color_texture: GLint;
+}
+
+canvas_make :: () -> Canvas {
+ canvas: Canvas;
+}
+
+canvas_use :: (use canvas: ^Canvas) {
+ if canvas == null {
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ } else {
+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+ }
+}
+
+
entity_manager->make(Door, .{ .{400, 400}, .{50, 50} });
entity_manager->make(Door, .{ .{150, 400}, .{50, 50} });
- entity_manager->make(Item, .{ pos=.{ 250, 250 } });
+ entity_manager->make(Item, .{ pos=.{ 250, 250 }, color=.{1,0,0} });
+ entity_manager->make(Item, .{ pos=.{ 275, 250 }, color=.{0,1,0} });
+ entity_manager->make(Item, .{ pos=.{ 300, 250 }, color=.{0,0,1} });
+
+
+ #if DEBUG {
+ println("Registered Entity types:");
+ for entity_manager.entity_types.entries {
+ info := cast(^type_info.Type_Info_Struct) type_info.get_type_info(it.key);
+ printf(" {}\n", info.name);
+ }
+ }
}
update :: (dt: f32) {