goto has this side-effect where the player’s update function is called after moving, so you want to check if its only called once after moving. Here’s how I would’ve done it.
on update do
if rotateOnce==0 then
call "rotateMove"
end
end
on rotateMove do
rotateOnce = 1
rX = event.px
rY = event.py
if event.dy==-1 then // player just moved up, but is moving left
rX -= 1
rY += 1
elseif event.dy==1 then // player just moved down, but is moving right
rX += 1
rY -= 1
elseif event.dx==1 then // player just moved right, but is moving up
rX -= 1
rY -= 1
elseif event.dx==-1 then // player just moved left, but is moving down
rX += 1
rY += 1
end
rSolid = solid rX,rY
if rSolid==1 then // stay still if tile is solid
rX = event.px
rY = event.py
rX -= event.dx
rY -= event.dy
end
goto rX,rY
rotateOnce = 0
end
I also tried to fix your problem of checking solid tiles, though it’s not perfect, as the player can move diagonally after hitting a solid tile. You might also need to make your own interact function to make it work with the rotated controls.