Mabaet
Yours is a very salient insight; I hadn't heard of WET/DRY before, but I understand the concept perfectly.
IMO, the tendency of most C2 users is to adopt a WET approach by merely copy/pasting events to replicate logic in different contexts. It's a lot faster than modularizing into a function, and it's acceptable for a prototype, but breaks down for projects exceeding a few hundred events.
However, you can often fend off this kind of design with a good use of families and functions. My rule is this: never copy/paste logic if you are using it it more than one place; it will always come back and bite you later on. Turns out this has been codified into a rule of thumb as well:
http://en.wikipedia.org/wiki/Rule_of_th ... ramming%29
One of the places where I still run into trouble, though, is in cases where I want to pick objects of different types in one go. For example: we can't go "pick all objects where X > foo" if some of those objects are sprites, some are spritefonts, some are TiledBG, etc. Even if we just want to pick all sprites where X > foo, we still have to add every sprite in the game to a family, then refer to that.
It would be great to be able to have a pick function that could cross object type lines and pick thru every object that shared the same kind of parameter (X, Y, Opacity, etc).
BTW, that example you link to: what, exactly, is the advantage of such an approach to multiple objects added to a family? The problem I see, in a real world scenario, is that every animation frame for every troop would be loaded with that object, which would take up a lot of unnecessary memory on layouts where you would only be spawning certain types. And...what if you had multiple animations for a given troop?
Here's a version implemented with families; if anything, I think this approach is more elegant, as adding new enemy types only requires adding a couple new actions, and all stats can be set in one go thru the enemies family:
https://www.dropbox.com/s/jychw2ppib7en ... .capx?dl=0