4.01? you mean 4.1? If it's 4.1, then it should rotate from the center.
pos = obj.ObjectSprite.SpriteSprite:getPosition()
size = obj.ObjectSprite.SpriteSprite:getSize()
obj.RotationCenter = { x = pos.x + (size.x / 2), y = pos.y + (size.y / 2) }
... these lines I wrote get the size & position of the sprite belonging to the specified object. These were then used to automatically calculate the center position of each sprite.
It won't rotate again because it's setting the absolute rotation value, it doesn't add or subtract the value.
The script got complicated because I was basing the correct image on the returned rotation values of each ring.
You could simplify this & just use conditions & multiple images instead of actually rotating the image.
P.S: Sorry for not annotating the code, but it got late & I was getting tired of writing the script. Also the rotation field is confusing because it is based on a radian value, i.e: p * 2 = 180º, instead of just typing 180, hence we needed to convert our degree value into radian & then to check the degree value in the check puzzle function we needed to convert the radian value into degrees & round off the value by removing any decimal values from it. As I said, it got complicated pretty fast & this was only a simple puzzle.