aboutsummaryrefslogtreecommitdiff
path: root/src/upgrade_pickup.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/upgrade_pickup.odin')
-rw-r--r--src/upgrade_pickup.odin76
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
+}