`updateWorld` of @Changaco can still be improved. I'll show it gradually so you can see what's going on.

Firstly, we can eliminate duplication in `case` statement and use lens composition to eliminate second `over`:

    quantity Polymorph = quantityPolymorph
    quantity TeamPlayer = quantityTeamPlayer
    quantity LoneWolf = quantityLoneWolf
    
    updateWorld :: Fighter -> World -> World
    updateWorld fighter w = increment (quantity fighter) w where
            increment field = over (quantities . field) (+1)

Then we can go pointfree. Pointfree is all about readability so don't do it whenever you feel readability is harmed. With coding experience more and more code will become readable for you.

    updateWorld = increment . quantity where
        increment field = over (quantities . field) (+1)

Then we replace `over` with a more specialized version of it from `Control.Lens.Setter`:

    updateWorld = increment . quantity where
        increment field = (quantities . field) +~ 1

Now it seems beneficial to inline `increment`. I'll do in 2 steps. First, I make the actual parameter of `increment` explicit:

    updateWorld field = increment $ quantity field where
        increment field = (quantities . field) +~ 1

Then I inline:

    updateWorld :: Fighter -> World -> World
    updateWorld field = (quantities . quantity field) +~ 1