Internally there's two karma values: Base Karma and Live Karma. The first is shown on the scoreboard and is what determines your damage penalty at the start of a round. It does not change during a round. Live Karma is not shown anywhere, and increases/decreases during a round.
When you hurt someone who is on your side (ie. innocent->innocent), the formula is as follows:
penalty = victim_live_karma * (0.001 * damage)
This penalty value is subtracted from your own Live Karma at the same time as you damage the other player.
So let's say a player with 1000 karma attacks another player with 1000 karma, doing 30 damage. If we plug that into the formula we get a penalty of 30, immediately reducing the attacker's (live) karma to 970. Because the penalty for hurting someone is based on their karma, it is now slightly "cheaper" to hurt him back.
The difference isn't huge yet because his karma is still high. The karma system is meant to work across a few rounds. It will not necessarily lead to the ultimate "fair" result in any encounter, but in the slightly longer term it should sort the wheat from the chaff, as players who end up hurting people in every round find their karma sinking and never increasing. And as their karma goes down, their ability to cause damage also decreases.
Some fun karma facts to finish up:
- The additional penalty for killing a player is handled as if you dealt an additional bit of damage over what you already did to kill him.
- There are karma rewards for hurting/killing a traitor, computed similarly to given formula but with different numbers.
- If you play a round without hurting a fellow innocent, that's a Clean Round. That means your karma "heals" by 25 at the end of the round. Else, it only heals by 5 points.