aboutsummaryrefslogtreecommitdiff
path: root/src/prop.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/prop.odin')
-rw-r--r--src/prop.odin160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/prop.odin b/src/prop.odin
new file mode 100644
index 0000000..d46f181
--- /dev/null
+++ b/src/prop.odin
@@ -0,0 +1,160 @@
+package demonchime
+
+import "core:math/linalg"
+import "core:log"
+
+import rl "vendor:raylib"
+
+import "phys"
+
+Prop :: struct {
+ handle: Entity_Handle,
+ image_id: Image_Id,
+ pos: Vec2,
+ scale: Vec2,
+}
+
+make_prop :: proc(prop: Prop) -> (Entity_Handle, ^Prop) {
+ return make_entity(&state.prop_list, prop)
+}
+
+draw_props :: proc() {
+ iter := iter_entity_list(state.prop_list)
+ for p in entity_list_iter(&iter) {
+ image := get_image(p.image_id)
+ draw_texture(
+ image,
+ p.pos,
+ scale = p.scale,
+ )
+ }
+}
+
+Wiggle_Prop :: struct {
+ handle: Entity_Handle,
+ image_id: Image_Id,
+ pos: Vec2,
+ scale: Vec2,
+ offset: Vec2,
+ rotation: f32,
+ rotation_factor: f32,
+}
+
+make_wiggle_prop :: proc(prop: Wiggle_Prop) -> (Entity_Handle, ^Wiggle_Prop) {
+ return make_entity(&state.wiggle_prop_list, prop)
+}
+
+update_wiggle_props :: proc(dt: f32) {
+ iter := iter_entity_list(state.wiggle_prop_list)
+ for p in entity_list_iter(&iter) {
+ player_vel := phys.get_velocity(player.body)
+ player_pos := phys.get_position(player.body)
+
+ image := get_image(p.image_id)
+ dist := linalg.length(p.pos - player_pos)
+ dist = f32(max(image.width, image.height)) - dist
+ if dist < 0 {
+ dist = 0
+ }
+ p.rotation = player_vel.x / PLAYER_SPEED * dist * p.rotation_factor
+ }
+}
+
+draw_wiggle_props :: proc() {
+ iter := iter_entity_list(state.wiggle_prop_list)
+ for p in entity_list_iter(&iter) {
+ draw_texture_full(
+ get_image(p.image_id),
+ p.pos,
+ p.offset,
+ p.rotation,
+ p.scale,
+ )
+ }
+}
+
+clear_props :: proc() {
+ p_iter := iter_entity_list(state.prop_list)
+ for p in entity_list_iter(&p_iter) {
+ delete_entity(&state.prop_list, p.handle)
+ }
+
+ wp_iter := iter_entity_list(state.wiggle_prop_list)
+ for p in entity_list_iter(&wp_iter) {
+ delete_entity(&state.wiggle_prop_list, p.handle)
+ }
+}
+
+object_spawner_prop :: proc(obj: Object_Resource) {
+ tile_id, has_tile_id := obj.tile_id.(u32)
+ if !has_tile_id || tile_id == 0 {
+ log.warn("Prop does not have a tile id!")
+ return
+ }
+
+
+ tile := tiles[tile_id]
+ img := get_image(tile.image)
+
+ pos := obj.pos - Vec2{0, f32(img.height)}
+ scale := Vec2{1, 1}
+ if obj.size.x < 0 {
+ scale.x = -1
+ // pos.x -= f32(img.width)
+ }
+ if obj.size.y < 0 {
+ scale.y = -1
+ // pos.y -= f32(img.height)
+ }
+
+ #partial switch tile.image {
+ case .Carrabasset_Vines_0, .Carrabasset_Vines_1, .Carrabasset_Vines_2:
+ offset := linalg.round(Vec2{
+ f32(img.width) * 0.5,
+ 0,
+ })
+
+ rotation_factor: f32 = 1
+ #partial switch tile.image {
+ case .Carrabasset_Vines_0:
+ rotation_factor = 0.25
+ }
+
+ make_wiggle_prop(Wiggle_Prop{
+ image_id = tile.image,
+ pos = pos,
+ scale = scale,
+ offset = offset,
+ rotation_factor = -rotation_factor,
+ })
+ case .Carrabassett_Small_Bush_0, .Carrabassett_Big_Bush_0:
+ offset := linalg.round(Vec2{
+ f32(img.width) * 0.5,
+ f32(img.height),
+ })
+
+ rotation_factor: f32 = 1
+ #partial switch tile.image {
+ case .Carrabassett_Big_Bush_0:
+ rotation_factor = 0.25
+ }
+
+ make_wiggle_prop(Wiggle_Prop{
+ image_id = tile.image,
+ pos = pos + Vec2{0, f32(img.height)},
+ scale = scale,
+ offset = offset,
+ rotation_factor = rotation_factor,
+ })
+ case:
+ make_prop(Prop{
+ image_id = tile.image,
+ pos = pos,
+ scale = scale,
+ })
+ }
+}
+
+on_room_open_props :: proc(room_id: Room_Id) {
+ clear_props()
+}