This code is bigger than the data for a sprite anyway and would be required to be duplicated for each sprite since the adresses are hard coded. Perhaps you meant to use something like lda (source_zp),y instead? I have to agree with others here, that you seem to underestimate how slow the C64 really is, assuming that you are supposed to do this stuff at the same time as a lot of other game logic and graphics stuff is running.
well, if he has the enemys coming not totally randomly he ofcourse can gain a lot with realtime spritemirroring with generating the phases for the upcoming attacks. another possibility to save vic bank memory is to have only 1-2 buffer sprites for the main character, and copy its animation frames there from another place for each frame.
I don't want to dublicate one sprite, but almost all enemy sprites. And you could use self-modifying code to modify the arguement of lda $xxxx,X to simulate indirect adressing.
As for sprite graphics - i think the best way would be to repaint them for c64 with c64 restrictions in mind. Any other method would make them look bad.
If there is 8 sprites and a hero using 2 sprites, and it happens that you need to flip them all at once, it would take 9*10 = 90 raster lines, that not counting code to modyfy flipping routine. You need a few interupts going, doing sorting, sprite multiplexing, playing music and running game logic. Are you sure there will be enough cycles left to do that all?