Did I just get lucky that my opponent played some bad moves at the end, or were my sacrifices justified?
No. 12...O-O-O would have been fine for Black.
Going back a little, 10.Nf6+ giving up a pawn to be able to threaten Qh5+ is clearly wrong. 10.exf6 Nxf6 11.Ng3 was much simpler, giving you chances to occupy h5 and/or open the f file with f2-f4.
Going back a little more, 8.e5 seems like a good move, but any time you advance a center pawn you are giving up center squares as well as getting them. Why not play 8.f4 instead trying to immediately profit from the weak black f file? Keep the e and d pawns next to each other until you can REALLY profit from advancing one of them.
Thank you very much for your analysis, but I don't understand what you mean in your second paragraph since 10. exf6 is not a legal move.
Actually it is; there is a rule called En Passant which comes into play when the opponent moves a pawn forward two squares *through* a square on which we could have made a pawn capture. For the next move (and the next move only) we can capture the opponent's pawn as though it had only moved 1 square.
Sorry, I failed to realize there was an en passant opportunity because I didn't bother looking back from the position. If my first pawn sacrifice was not sound, then where did my opponent mess up in response that allowed me to win anyway?
I might comment more on the game after I come to some more definite conclusions with my own analysis (which can be pretty bad at times), but for now I'll just comment on the parts of the game I'm quite sure of:1...b6 is the Owen's Defense. It's played with the intention of an early queen's bishop fianchetto by black.3.Bd3 - This is actually the book move for white, so this is fine. The reply 3...Nf6 can be answered by 4.Qe2.
4.c3 - Nf3 is probably better, but this isn't really a terrible move either.
5...h6 - Probably played with the intention of not allowing white to reply Bg5 after black plays ...Nf6. Unfortunately, this move wastes time for black and creates an early commitment to his king side pawn structure. ...Nf6 (Bg5,Be7;e5,Ng8), Ng7 (with the idea of g6 and Bg7) are what I'd consider if I was black here.
12...f4? - O-O-O would have given black the better game; pawn up, and with a ready made king attack against white.
14.Nf5+ - Knight offer looks completely sound, although after 14...Kd8; Re1, I don't see how white continues.
14...exf5 - I tend to think ...Kd8 was the better choice for black, although I don't see any immediate winning continuation for white after this move either.
16...g4? - This loses immediately. ...Nd8 instead would have at least kept black in the game a bit longer: ...Nd8; Bxf4+,gxf4; Qxf4+, Kc6. White has at least perpetual check here, however.
Wow, excellent analysis Zed!