With a nod towards Eddie's observation that boots of speed are too common, I took a look at the code. (As it happens i agree. Finding 3 pairs of speed or elvenkind in a vault is over the top.)
Unfortunately there is now way to generate a distribution of ego items by level in the wizard files. I will do that next.

In 3.0, rarity is proportional to 1/p, so boots of speed, with rarity 24, are 3x more rare than boots of free action, with rarity 8. Really common ego items have rarity 1; nearly all such are shallow items like single resist armor.

In 4.0, boots of speed are rarity 3, while boots of free action are rarity 10. So it looks like rarity should actually just be an unnormalized probability. But the original code p = 100 / rarity still stands. What's the deal here?

Further complicating the issue is that shallow weak stuff in 3.0 is has a max depth in 3.5, which means the distribution is more heavily renormalized in favor of powerful stuff as you go deeper. This means there needs to be roughly proportional less stuff at depth compared to shallow. I don't know how that works.

Edit: From what I understand, every single pair of ego boots in a greater vault deeper than 4000' will be boots of speed or elvenkind, since all other boot ego items top out by dl 100. That explains a LOT.

With a nod towards Eddie's observation that boots of speed are too common, I took a look at the code. (As it happens i agree. Finding 3 pairs of speed or elvenkind in a vault is over the top.)
Unfortunately there is now way to generate a distribution of ego items by level in the wizard files. I will do that next.

In 3.0, rarity is proportional to 1/p, so boots of speed, with rarity 24, are 3x more rare than boots of free action, with rarity 8. Really common ego items have rarity 1; nearly all such are shallow items like single resist armor.

In 4.0, boots of speed are rarity 3, while boots of free action are rarity 10. So it looks like rarity should actually just be an unnormalized probability. But the original code p = 100 / rarity still stands. What's the deal here?

I'm a bit confused with this too - ego items have a 'commonness', min&max depth set in the edit file on the 'alloc' line, but also rarity and depth on the 'info' line. As far as I can tell, both the ego item 'alloc' line depths and the 'info' line depths affect generation, just in different ways (confusing!) But the commonness specified on the 'alloc' line is unused; rarity on the 'info' line determines probability. This needs a bit of sorting out.

There is indeed probably some dead code here with regard to rarity and allocation. It's been a long time since I looked at this.

I had thought that stability and free action were also possible at deep depth, but maybe not, or perhaps that's been changed. Either way it's an easy switch to put them back in, then speed boots will drop proportionally by a lot.

One of the other changes to speed boots was that the bonus was given as an mvalue rather than a flat up 1d10 random value. This means speed boots on earlier levels will have on average a lower bonus than the ones on higher levels. This is another thing that can be tweaked. We can change the mbonus so that speed boots are still the most common drop at dlevel 90, but they average at about +5 rather than +7 to +8 as they do now.

Really though, what I would like more than anything is to change speed so it only affects move actions rather than all actions. The fact that speed boots are so powerful and completely outclass any other kind of boots is itself a problem.

OK, that makes sense, in a perverse kind of way. Then the root cause for excessive high-end egos like Boots of Speed is the max_level for weaker ego items
Let:
P(E) = the probability of a given ego type
P(T) = the probability of a given object class (Boots, armor, etc)
X = the probability that an object is promoted to excellent. Then for a given ego type,

P(E) = X * P(E|T) * P(E)

That is, the ego probability can be decomposed to the relative probabilities of different ego types within a given object class. Once the weaker items go out of scope, the odds for a particular ego type are renormalized within that class, NOT compared to all other ego types. So by the time you hit a vault (any vault) at level 91, essentially all ego boots will be generated at dept 101+, so all ego boots will be either speed or elvenkind. This is why ego boots are so ridiculously common in Vanilla now. Obviously the same holds for weapons, too, so for excellent items:
* All slings will be Buckland
* All crossbows will be Haradrim (No heavy crossbows at all)
* All bows will be Lothlorien
* All melee weapons will be one of the Big 3. (Gondolin is ideal for Mages in melee to save mana and ammo for major targets.)

I used to think a nice MoD Acid brand was a big find. Now those are essentially impossible, and I end up meleeing Morgoth with a big 3 +2 Attacks or HA almost every game.

The way to solve this, but still get rid of junk, is to make allocation probability proportional to the probability of the base probability for objects of that class multiplied by the chance for a particular ego type. That way, ALL boots will be rare by DL 90, but those that are ego will be very very good.

So all types will still have the same fraction ego, but boots will simply be rarer relative to other object types. The result is more consumables relative to objects as you get deeper, but those objects you do find will still have a high probability of being good.

The way to solve this, but still get rid of junk, is to make allocation probability proportional to the probability of the base probability for objects of that class multiplied by the chance for a particular ego type. That way, ALL boots will be rare by DL 90, but those that are ego will be very very good.

If I remember correctly, something like this was very hard to do giving the codebase at the time. But this is probably something we should look at again very soon.

Otherwise, the easy thing to do is just ignore max_level. That will dilute the good stuff. Just set ignore on the ego type and it goes away on walk-over. With rune based ID, the whole problem of too much junk is very much ameliorated.

Otherwise, the easy thing to do is just ignore max_level. That will dilute the good stuff. Just set ignore on the ego type and it goes away on walk-over. With rune based ID, the whole problem of too much junk is very much ameliorated.

Yeah, I think I agree with this. With rune-ID and squelch-by-rune, the ego distribution changes that I put in for 3.4 are obsolete.

I need to check to see if generating stats in the current version is still very slow. That has hampered my ability to do comparisons in the most recent versions.