_slashing_timer_sec = 0.12 function spawn_slashing_particle(e) slash_animation = entity() _slash_animation_distance = 3 function slash_animation:transition_state() -- TODO: Find a better place to put this lol. This has nothing to do with state -- transitions slash_animation:equipped_from(e, _slash_animation_distance) end return slash_animation:b_type(Entities.Enemy) :b_line_of_sight(e.line_of_sight) :b_position(vec2(e.position)) :b_sprite_position(vec2(position)) :b_render_order(-1) :b_live_for(_slashing_timer_sec) :b_add_state( States.Active, { animation = { pos_y = { sequence = { 115, 116, 117 }, dt = _slashing_timer_sec / 3, reflect = vec2(true, true) }, neg_y = { sequence = { 115, 116, 117 }, dt = _slashing_timer_sec / 3 }, pos_x = { sequence = { 112, 113, 114 }, dt = _slashing_timer_sec / 3 }, neg_x = { sequence = { 112, 113, 114 }, dt = _slashing_timer_sec / 3, reflect = vec2(true, false) } } } ) :b_state(States.Active) :build() end enemy = entity() function enemy:transition_state() end enemy:b_type(Entities.Enemy) :b_position(vec2(30, 40)) :b_sprite_position(vec2(30, 30)) :b_line_of_sight(vec2(1, 0)) :b_render_order(1) :b_collidable() :b_add_state( States.Idle, { animation = { pos_y = { sequence = { 32, 33 }, dt = 1 }, neg_y = { sequence = { 32, 33 }, dt = 1 }, pos_x = { sequence = { 32, 33 }, dt = 1 }, neg_x = { sequence = { 32, 33 }, dt = 1, reflect = vec2(true, false) } } } ) :b_add_state( States.Walk, { animation = { pos_x = { sequence = { 32, 34 }, dt = 0.20 }, neg_x = { sequence = { 32, 34 }, dt = 0.20, reflect = vec2(true, false) }, pos_y = { sequence = { 32, 34 }, dt = 0.20 }, neg_y = { sequence = { 32, 34 }, dt = 0.20 } } } ) :b_state(States.Walk) :b_equipped({ sword }) :build() 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() function sword:transition_state() if button_just_pressed(5) and self.state == States.Equipped then self:transition_to(States.Slashing) spawn_slashing_particle(self) elseif self.state == States.Slashing and self.state_stopwatch > _slashing_timer_sec 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(0) :b_collidable() :b_add_state( States.Equipped, { animation = { pos_y = { sequence = { 99 }, dt = 1, reflect = vec2(false, true) }, neg_y = { sequence = { 99 }, dt = 1, reflect = vec2(true, false) }, pos_x = { sequence = { 98 }, dt = 1 }, neg_x = { sequence = { 98 }, dt = 1, reflect = vec2(true, false) } } } ) :b_add_state( States.Slashing, { animation = { pos_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, true) }, neg_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) }, pos_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, false)}, neg_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, 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(2) :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(States.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 _update() -- clear here in case we want to print to screen outside of _draw cls(0) old_step = _step_t _step_t = time() step_dt = _step_t - old_step foreach(update_hooks, function(f) f(step_dt) end) handle_input() World.foreach(function(e) if (not e.equipped) then e:update(step_dt) end end) World.foreach(function(e) if (e.equipped) then e:update(step_dt) end end) run_collisions() World.cull_the_dead() end function _draw() qsort(World, function(a, b) return b.render_order < a.render_order end) World.foreach(function(e) e:render() end) end