summaryrefslogtreecommitdiffhomepage
path: root/src/levels.rb
blob: b655ed90d8cb7c4d2ef1047dfcedb76d01f2afac (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
78
79
80
81
82
83
84
85
86
87
FECS::Cmp.new('CurrentLevel', level: -1)

CurrentLevel = FECS::Cmp::CurrentLevel.new

Levels = []

# First level
level0 = {
  player_spawn: Rl::Vector2.new(120,300),
  scissor_size: Path.new(
    lambda do |time|
      [300,
       300]
    end
  ),
  scissor_path: Path.new(
    lambda do |time|
      [Math.bezier([200, 200, 1183, 200],time)-150,
       Math.bezier([200, 1183, 200, 200],time)-150]
    end
  ),
  end_goal: Rl::Rectangle.new(40,40,10,10),
  walls: [
    [250,250, 250,150], 
    [350,200, 050,350], 
    [070,470, 200,200], 
    [470,470, 200,020],
  ],
  damage_areas: [
    [10, 0,0, 100,100],
  ],
  damage_walls: [
    [10, 350,200, 050,350], 
  ]
}

Levels.push(level0)

FECS::Sys.new('ConstructLevel') do
  FECS::Sys::DestroyLevel.call
  level = Levels[CurrentLevel.level]

  level[:walls].each do |wall|
    FECS::Cmp::Hitbox.new(
      rec: Rl::Rectangle.new(*wall),
      offset_x: 0,
      offset_y: 0
    )
  end
  level[:damage_areas].each do |dmg|
    FECS::Cmp::DamageHitbox.new(
      rec: Rl::Rectangle.new(*dmg[1..]),
      damage: dmg[0],
    )
  end
  level[:damage_walls].each do |dmg|
    FECS::Cmp::DamageHitbox.new(
      rec: Rl::Rectangle.new(dmg[1]-1, dmg[2]-1, dmg[3]+2, dmg[4]+2),
      damage: dmg[0],
    )
    FECS::Cmp::Hitbox.new(
      rec: Rl::Rectangle.new(*dmg[1..]),
    )
  end

  player_pos = @player.component[FECS::Cmp::Position]
  player_vel = @player.component[FECS::Cmp::Velocity]

  player_pos.x = level[:player_spawn].x
  player_pos.y = level[:player_spawn].y
  player_vel.x = 0
  player_vel.y = 0
  # use current_level component to know which level from levels array to load
  # create entities e.g. walls
  # set properties for scissor box
  # set properties for end goal zone
  # move player to start
end

FECS::Sys.new('DestroyLevel') do
  # delete all level specific entities and their components
  # dont delete entities that carry over to next level
end

# changing the level will destroy the current level and set up the next one
FECS::Sys::ConstructLevel.trigger_when_is_changed(CurrentLevel, :level)
#FECS::Sys::DestroyLevel.trigger_when_is_changed(CurrentLevel, :level)