Batch, 322 310310 308 bytes
@echo off
set/pi=
set/aa=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,j=8,k=9,l=10,m=11,n=12,o=13,p=14,q=15,r=16,s=17,t=18,x=%i:~1%-1,y=%i:~0~,1%,z=y+1
for /l %%r in (18,-1,0)do call:l %%r
exit/b
:l
set s=...*.....*.....*...
call set t=%%s:~%1,1%%
if %x%==%1 call set s=%%s:~0~,%y%%%o%%s:~%z%%%
call echo %%s:.*=.%t%%%
Explanation: Starts by prompting for the stone on stdin. Then, sets variables for each possible column, so that it can evaluate the first character of the stone as a variable to get the y
coordinate. Subtracts 1 from the x
coordinate because it's 1-indexed and we want 0-indexed and also computes z=y+1
as it will need that later. Then, loops r
from 18 down to 0 for each row. Takes the string ...*.....*.....*...
and extracts the character at the r
th position for later. On the x
th row, the y
th character is replaced with an o
. Finally, the .*
s are replaced with a .
plus the previously extracted character; this is a no-op on rows 4, 10 and 16 but this is the shortest way to achieve that. (I have to use .*
because replacing *
is apparently illegal in Batch.)