A good puzzle always has the same way of finishing that puzzle, but dozens of ways to achieve that finish. Just make sure your player does not lose immersion when doing that puzzle. Also, never outsmart the player, make the puzzles as understandable as possible and doable by the player at their current state. Example - Door A cannot be opened and is required for the player to push through with the story. The player can either a) look for the key, b) use "hurl boulder" to break the door down or c) find an alternative route to get past it.
There are much, much more things I can tell you, like the types of puzzles, but I would just bore you to death
Tip for your antagonist - the best ones are the ones who think what they're doing is good, and not bad. Try to add as much moral choices as you can.