aboutsummaryrefslogtreecommitdiff
path: root/src/upgrade_pickup.odin
blob: 4cc5240aaef13862f6e07578bf45cb4493c92eca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
  }

  tex := get_image(upgrade.image_id)

  draw_texture(
    tex,
    upgrade.pos,
    offset = linalg.round(Vec2{f32(tex.width), f32(tex.height)} * 0.5)
  )
}

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_id, has_image_id := convert_path_to_resource(obj, "image").(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
}