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, .Small_Lamp, .Windchimes_0, .Windchimes_1: 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 + offset, 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() }