When you pass the ID of the target (idTarget) to the FireTorpFromPointWithVector function, it expects that it is a valid ID (meaning the ID of a ship that exists).
And quoting your code:
pShipID = App.NULL_ID
idTarget = pShipIDSo yeah, it'll never work like that lol. You gotta pass a valid ID (like pTargetShip.GetObjID(), assuming pTargetShip to be a ShipClass obj).
The same applies to the parameter pShipID you're passing, tho if I remember correctly it might not be as necessary as the target ID.
Also, why are you doing this:
pPlayer = MissionLib.GetPlayer()
# ...
pShip = App.Game_GetCurrentPlayer()???
pPlayer and pShip will be the same object: the player ship.
About the pcTorpScriptName parameter (which in your code is "Blood Photon"), it should be the torpedo script (module) string, like "Tactical.Projectiles.<script name>".
EDIT: lol just now saw your edits

Anyway... How do you mean they're not interacting with the hulls/shields? You want your torp to "hit" the shields to show the shield effect?
If that's the case, try these 2 things: make that the ship isn't the torp's parent but the target, also try to make it without attaching the torpedo to the ship (i've tried that before and the torpedo never detonated).