--SNIP--
That's what I've been building off of for my engine too, but I don't think I've got the messaging part down... Namely, I find it hard to make relatively simple systems work, like having armour components reduce incoming damage (e.g. what happens when there's no armour component?) unless you can change the contents of messages, and that makes it much harder to work in MP in the future.
Disclaimer:
What I'm gonna say was my solution before I tossed the strict messaging system, because it made doing simple things very tedious. My current system is to basically use the Entity as the messaging system - every entity has zero or more components, every component has one entity (the entity with that component assigned to it). Then I just go through the entity to get to any other component. Also, I use Python w/ pygame.
First things first:
The way my messaging format worked was as follows:
Every component contained a dictionary named "vars".
The initial message is a tuple of the following form: (recipient/sender component, contents).
The "recipient/sender component" was the name of the recipient component, if it's a message being sent, or the sender component, if the message is being received.
The contents is a tuple of the following form: (instruction, variableName, newValue)
"instruction" was an integer - the most common instruction was to update a variable, but there were also instructions to update a variable outside vars (in very specific circumstances where using the vars dict wasn't possible), to request a message, or to indicate that this is a response to a requested message.
When received, the update variable instruction just did
self.vars[variableName] = newValue
.
Then every function in a component just checked self.vars for any value it needed, so that any other component could update it as needed.
Unfortunately, the way it was implemented meant that messages could only be sent inter-entity, and instead of redesigning, I scrapped it for the system in the disclaimer.
My (never implemented and untested) solution to your incoming damage/armor problem was to have component that handles attacks send a message containing a tuple to the defending component of the form (hitChance, damage). From there, the defending component would use the hitChance to determine if the attack hit, and if so, calculate the damage from its own damage reduction and the damage in the message.
-----------
I think that was just a very long-winded way to say "In my design, it's impossible for something not to have a necessary component such as armor, and the message can be changed." Sorry, hopefully you found something useful in there...