bow = entity() function bow:transition_state() end bow :b_type(Entities.Bow) :b_position(vec2(0, 0)) :b_sprite_position(vec2(0, 0)) :b_line_of_sight(vec2(1, 0)) :b_render_order(1) :b_collidable() :b_add_state(States.Equipped, { animation={ pos_y = { sequence = { 96 }, dt = 1, reflect = vec2(false, true) }, neg_y = { sequence = { 96 }, dt = 1 }, pos_x = { sequence = { 80 }, dt = 1 }, neg_x = { sequence = { 80 }, dt = 1, reflect = vec2(true, false) } } }) :b_add_state(States.Drawn, { animation={ pos_y = { sequence = { 81 }, dt = 1, reflect = vec2(false, true) }, neg_y = { sequence = { 81 }, dt = 1 }, pos_x = { sequence = { 81 }, dt = 1 }, neg_x = { sequence = { 81 }, dt = 1, reflect = vec2(true, false) } } }) :b_add_state(States.Drawing, { animation = bow.states[States.Equipped] }) :b_state(States.Equipped) :build() sword = entity() _slashing_timer_ms = 500 function sword:transition_state() if(btn(5)) then self:transition_to(States.Slashing) elseif self.state == States.Slashing and self.state_stopwatch > _slashing_timer_ms then self:transition_to(States.Equipped) end end sword :b_type(Entities.Sword) :b_line_of_sight(vec2(1, 0)) :b_position(vec2(0, 0)) :b_sprite_position(vec2(0, 0)) :b_render_order(1) :b_collidable() :b_add_state(States.Equipped, { animation={ pos_y = { sequence = { 82 }, dt = 1, reflect = vec2(false, true) }, neg_y = { sequence = { 82 }, dt = 1, reflect = vec2(true, false)}, pos_x = { sequence = { 82 }, dt = 1 }, neg_x = { sequence = { 82 }, dt = 1, reflect = vec2(true, false) } } }) :b_add_state(States.Slashing, { animation={ pos_y = { sequence = { 82, 82+16 }, dt = 1, reflect = vec2(false, true) }, neg_y = { sequence = { 82, 82+16 }, dt = 1, reflect = vec2(true, false)}, pos_x = { sequence = { 82, 82+16 }, dt = 1 }, neg_x = { sequence = { 82, 82+16 }, dt = 1, reflect = vec2(true, false) } } }) :b_state(States.Equipped) :build() player = entity() function player:transition_state() if (self.velocity.x == 0 and self.velocity.y == 0) then self:transition_to(States.Idle) else self:transition_to(States.Walk) end end player:b_type(Entities.Player) :b_line_of_sight(vec2(1, 0)) :b_render_order(0) :b_collidable() :b_position(vec2(30,30)) :b_sprite_position(vec2(30,30)) :b_add_state(States.Idle, { animation = { pos_y = { sequence = { 3, 19 }, dt = 1 }, neg_y = { sequence = { 6, 22 }, dt = 1 }, pos_x = { sequence = { 0, 1 }, dt = 1 }, neg_x = { sequence = { 0, 1 }, dt = 1, reflect = vec2(true, false) } } }) :b_add_state(States.Walk, { animation = { pos_x = { sequence = { 2, 0 }, dt = 0.20 }, neg_x = { sequence = { 2, 0 }, dt = 0.20, reflect = vec2(true, false) }, pos_y = { sequence = { 4, 5 }, dt = 0.20 }, neg_y = { sequence = { 7, 8 }, dt = 0.20 } } }) :b_state("idle") :b_equipped({ sword }) :build() _walk_speed = 35 -- powerup increase? function handle_input() dpos = vec2(0, 0) if btn(0) then dpos.x -= 1 end if btn(1) then dpos.x += 1 end if btn(3) then dpos.y += 1 end if btn(2) then dpos.y -= 1 end player.velocity = dpos:normal() * _walk_speed end function _init() end step_t = time() function _update60() cls(0) -- clear here in case we want to print to screen outside of _draw old_step = step_t step_t = time() step_dt = step_t - old_step handle_input() qsort(World, function(a, b) return a.equipped != nil end) foreach(World, function (e) e:update(step_dt) end) run_collisions() end function _draw() foreach(qsort(World, function(a, b) return a.render_order < b.render_order end), function (e) e:render() end) end