diff options
Diffstat (limited to 'src/upgrade_pickup.odin')
| -rw-r--r-- | src/upgrade_pickup.odin | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/upgrade_pickup.odin b/src/upgrade_pickup.odin new file mode 100644 index 0000000..e51190c --- /dev/null +++ b/src/upgrade_pickup.odin @@ -0,0 +1,76 @@ +package demonchime + +import "core:math/linalg" +import "core:log" + +import "phys" + +Upgrade_Type :: enum { + DASH = 0, + DOUBLE_JUMP, +} + +upgrade: struct { + active: bool, + image_id: Image_Id, + flag: ^bool, + pos: Vec2, +} + +update_upgrade :: proc(_: f32) { + player_pos := phys.get_position(player.body) + if linalg.length2(player_pos - upgrade.pos) > 16*16 { + return + } + + upgrade.flag^ = true + upgrade.active = false +} + +draw_upgrade :: proc() { + if !upgrade.active { + return + } + + draw_texture(get_image(upgrade.image_id), upgrade.pos) +} + +object_spawner_upgrade :: proc(obj: Object_Resource) { + type_name_int, has_type_name := obj.properties["type"].(i32) + + if has_type_name { + type_name := cast(Upgrade_Type)type_name_int + switch type_name { + case .DASH: + upgrade.flag = &player.owns_dash + case .DOUBLE_JUMP: + upgrade.flag = &player.owns_double_jump + case: + log.warnf("property 'type' is an invalid enum (%v) %v", type_name_int, type_name) + return + } + } else { + log.warnf("property 'type' must be a string") + return + } + + if upgrade.flag^ { + return + } + + upgrade.pos = obj.pos + + image_path, has_image_path := obj.properties["image"].(string) + if !has_image_path { + log.warnf("property 'image' must be a path or string") + return + } + image_id, has_image_id := path_to_resource_id[image_path].(Image_Id) + if !has_image_id { + log.warnf("property 'image' must point to an image resource") + return + } + upgrade.image_id = image_id + + upgrade.active = true +} |
