The rotation center should actually default to the center of the sprite canvas & not the upper left corner, but you may still have to manually change it due to where you positioned the actual image inside of the image canvas or due to the shape of the image in question.
Everything else Esmeralda said sounds about right, but easing is optional.
& we already know what your next question will be... how do I check if all bricks are aligned, correct?
Anyway, first things first. If you aren't bothered about animating the brick rotation & would prefer to do the puzzle without scripting then you could use values instead & multiple objects. You would need to create each brick for as many rotation positions you want to be able to rotate by, in this case you said 90º, so that would be 4 rotation positions (n, s, e, w), which means 4 scenes objects per brick, 1 value per each brick which should each query a different number between 1 to 4 (they will be used to check if each of the values equal a specific number to check for puzzle solved). Rinse & repeat for the rest of the bricks.
Everytime you rotate the bricks you should call a called by other action part that checks if each of the values = x value & if they all return true then the puzzle is solved - easier to do that bit with Lua script though.
As for checking puzzle solved with the animated rotation method, that's a little more complicated as you will need to know which degree value is the correct position for each brick, which is probably best done by creating an array/table & storing the rotation values inside of them so you can iterate through the table to check the rotation values of each of the objects against the table & if one doesn't match then you break (stop the iteration loop from finishing because you know it's not solved).
local t_brick_rv = {90, 90, 45, 90, 180, 270, 90, 90} - rotation values (need to be in order)
function checkBrickSolved()
for i = 1, #t_brick_rv do
if math.deg(Objects["brick_" .. i].Rotation) ~= t_brick_rv[i] then return false end
if i == #t_brick_rv and math.deg(Objects["brick_" .. i].Rotation) == t_brick_rv[i] then Conditions["brick_solved"].Value = true end
end
end
I don't know if the function above is correct as I wrote it out off the top of my head & haven't tested it.