I think there are two major workarounds (that I know of) for the problem you're describing:
1. Use arrays to store your objects (e.g. a Ship-Array in the above case containing
all instances of your Ship-type). This way you can sort of create a
call by reference scenario by passing the array index to the function.
2. Use a global "return instance" for your types. This would be an example:
global rShip as Ship
...
function UpdateShip(s as Ship)
rem Do stuff
rem ...
rem ...
inc s.ShieldTick
rem In the end copy to global placeholder
rShip = s
endfunction
So when calling the function, you\'d do this:
...
UpdateShip(myShip) : myShip = rShip
...
..sort of like that. I personally prefer the first solution though.
I hope that kind of answers your question.