diff options
Diffstat (limited to 'src/prop.odin')
| -rw-r--r-- | src/prop.odin | 160 |
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() +} |
