warp={ max_warps=50, warp_list={}, update=update_all, } function warp.init(tiles_sf) local curr_source = surf.source() local curr_target = surf.target() warp_sf=surf.new(32,32) surf.source(tiles_sf) surf.target(warp_sf) local sprite_x = 11*16 local sprite_y = 15*16 draw.surfrot(sprite_x, sprite_y, 16, 16, 0, 0, 0) draw.surfrot(sprite_x, sprite_y, 16, 16, 15, 0, 90) draw.surfrot(sprite_x, sprite_y, 16, 16, 15, 15, 180) draw.surfrot(sprite_x, sprite_y, 16, 16, 0, 15, 270) surf.source(curr_source) surf.target(curr_target) end function warp.close() surf.free(warp_sf) end function warp.new(_actor) -- local world_x, world_y = coords.room_to_world(_hab,_x,_y) return {name="warp", hab=_hab, x=_actor.x, y=_actor.y, w=arcade_config.sprite_size.w, h=arcade_config.sprite_size.h, frame=0, wait=0, step=0, angle=0, d_angle=5, update=warp.update, draw=warp.draw, alive=true, actor=_actor} end function warp:draw() if not self.alive then return end local scr_x, scr_y = viewp:screen_coords( self.x, self.y ) local curr_sf=surf.source() local target_sf=surf.target() surf.source(warp_sf) surf.target(0) draw.surfrot(0,0,32,32,scr_x,scr_y,self.angle) surf.source(curr_sf) surf.target(target_sf) end function warp:update() if not self.actor.warping then self.alive=false end if not self.alive then return end self.wait=self.wait+1 self.angle=self.angle+self.d_angle if self.wait==10 then self.d_angle=self.d_angle+1 self.wait = 0 end if self.d_angle==20 then self.d_angle=5 self.alive = false end if self.angle>=360 then self.angle=self.angle % 360 end end function warp.open(actor) for _, w in ipairs(warp.warp_list) do if not w.alive then w.alive = true w.x = actor.x w.y = actor.y w.actor = actor w.frame = 0 w.wait = 0 w.step = 0 w.angle = 0 w.d_angle = 5 return e; -- reutilitzar end end table.insert(warp.warp_list, warp.new(actor) ) end function warp.update_all() for _, w in ipairs(warp.warp_list) do if w.alive then w:update() end end end