The Ultimate Wizard Aging and Twilight Simulation

On thing that's always been a curiosity to me when reading AM supplements is ages given to the various magi who are described, and how these ages are interpreted. Magi are described as being old by their nineties, and we see very few that are older than their early to mid-hundreds, and the one magus we see that's close to 200 is described as feeble and near death, but there never is a formal breakdown of how the developers expect the age of a maga to progress.

Since I have a reasonably strong statistical and programming background my first instinct of course is to estimate it with a simulation. I realise this has been done before, as there was a similarly motivated simulation done on durenmar.de before it went down — ergo the thread title and all — but it doesn't seem to have been preserved. But, I vaguely recall that the conclusions there were that many magi lived into their second century and mostly were done in by going into Final Twilight.

My preliminary results have been... very different to say the least, which brings me to my question. Does anyone have a preserved copy of the results of the Durenmar aging simulation, or know where I can find one? Or better still, a discussion of the methodology and assumptions that went into the model. I haven't been able to find a one during my searches.

2 Likes

I am curious about your preliminary results, as well as your assumptions.

The only lead i have is that Project redcap is trying to archive the durenmar.de website

redcap.org/page/Durenmar_(website

Also my husband has been trying these simulations for about a year, so I'll see if I can get access to his results

bob

Unfortunately it seems that what has been recovered from durenmar.de on Project Redcap does not include the simulation, at least not so that I've been able to find it. I've poked around a bit, but so far no luck. :frowning: Although if there has been an unpublished simulation, I would absolutely love to get access to the results or the thoughts that went into it. A lot of what I've discovered so far is that age is really sensitive to the parameters you feed into the model.

As for my own, I'm still tuning the model and reworking how I handle some elements — Twilight is in particular something of a thorny issue to tangle with, as are assumptions about how fast one's longevity ritual can improve. But I can give a basic rundown.

So, the first thing I did was basically just purely code up the aging and crisis tables and see how mundanes fared, just to get a handle on whether aging rolls were producing wildly unrealistic results. And I'm actually fairly pleased with how reasonable it turned out. I ran 10 000 mundane people with randomised stamina between -3 and 3, and living conditions that varied from -2 to 2, in both cases approximately normally around 0. To simplify things I assumed that all of these people had already made it to 35, so infant mortality wasn't a factor in manipulating the averages, and that the only thing that could kill them was decrepitude and crises — violence, accidents, and so on weren't a factor.

I got back:

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  36.00   51.00   58.00   59.76   67.00  115.00 

The upper tail is a bit long, but only 0.25% of people managed to hit 100, and that number would be even lower if I factored in, well, infant mortality, people dying young, accidents, and so on. The model isn't perfectly in line with human life expectancies, but it's close enough that I'm satisfied with it as a game estimate. Although having good medical care would skew this upwards, but I didn't bother coding that here.

Magi are tougher, partly because they have ways of screwing with this system, and partly because I wanted to extend it to multiple causes of death. There were four things tracked (so far): death by aging crisis, by decrepitude hitting 5, by violence or accident, and by going into Final Twilight. The assumptions are pretty much connected to those, although I won't go into full details yet, as some of them are still being tinkered with.

But the important ones are how fast do skills and arts advance, what sort of access to a longevity ritual does a maga of a given age have, how deadly is just living and adventuring, and how frequently does a maga need to avoid Twilight.

Basically how I addressed the first two was actually work out what percentage of expected XP is going to be going into CrCo and Magic Theory, and derived an estimate for what their current lab total should be, and then checked every decade to improve their longevity ritual to keep in step with their advancing skill. Save those who are rich or specialists in CrCo, which basically just got a faster advancement to their effective LR lab total. This is where I think my discrepancies from my memory of the earlier simulation come into play, but I'll explain why in a moment.

Avoiding Twilight mainly comes up when you work out how many botches a year a maga is going to be having. I've played around with it, and I'm not really satisfied with my numbers. Typically I've been nudging it between 4-8, for one or two a season, modified by a few other things, but this is one thing that's getting expanded and tweaked as I go on.

Oddly, death by accident's pretty easy. I just did some research and I'm estimating yearly chance of death based on historical data about violent death. This in many ways involves some iffy assumptions just given the nature of historical data given the poor records we have of cause of death, and mixing them with things like uncertain population sizes, but it's not too bad, I don't think, and it's never dominated the wizardly death rate, so it's not something I'm too concerned about.

As for my actual preliminary results, again I won't do a full breakdown, since it'd only get all revised in, oh, half an hour when I run the next simulation, but broadly speaking a maga can expect to live to about 172 (median 180), and the longest I can recall spotting off the top of my head was about 250. Furthermore she's overwhelmingly likely to die by having her decrepitude hit 5, which accounts for 70% of all deaths. The rest are more or less evenly split between aging crises and accident or violence, with virtually none due to entering Final Twilight.

Which is why I was really interested in trying to find the old study again, seeing as they had about 80 extra years of life expectancy, and most deaths due to Final Twilight. Given that my magi are racking up large decrepitude scores, I suspect the primary issue is in how I'm calculating longevity rituals, and possibly to a lesser extent how I'm checking for incidents of Twilight, but naturally I can't be sure.

1 Like

I would absolutely love to see your code :slight_smile:

I think you are looking for:
web.archive.org/web/201011211547 ... evity.html
and
web.archive.org/web/201001112208 ... arian.html

hth, fury

Actually, I think you found another simulation, although now I'm convinced I'm muddling together the two in my memory. (The one on durenmar factored in botches per year, is why I'm guessing this.) But the limits of aging are probably at least in part what I'm remembering, and it is a very valuable resource (and also means that I'm no less than the fourth to attempt this, yeek). Thank you very much!

And I'd also be happy to share my code. The full wizard version is currently unrunable as I'm in the midst of tearing apart a bit, but you can have the supporting functions I had to define, and the code for the simple mundane case. I code this in R, since it's what I'm most familiar with and because the output will be a data frame I can then manipulate.

It's also ugly as hell in many parts as I'm doing this in my free time and don't have the energy to figure out how to work up slick solutions to avoid bad looping. (The entire thing is a while loop nested in a for loop, I swear to god.) Also, only the magi part is commented, save for the couples notes I just literally right now added so it's not as obscure. Be afraid.

Anyhow, here ya go:

# I call this a fate die, since it's in the spirit of the 4dF fudge dice used in FATE. I use it for generating stat distributions.

fate = function(d = 4){
	x = sum(sample(c(-1,0,1), d, replace = T))
	return(x)
}

d10 = function(){
	x = sample(seq(1,10),1)
	return(x)
} 

# It's my stress die! It takes s, the total modifier to the die, b to indicate if it's botch or no botch, and bd the number of botch dice, and defaulting to botch with on botch die.

sd = function(s = 0, b = 1, bd = 1){
	k = 0 
	m = 0 
	while(k == 0){ # flag for the overall loop
		if(m == 0){ # indicator for exploding dice
			x = sample(seq(0,9),1)
			if(x == 1){
				m = m + 1
			} else if(x == 0 && b == 1){ 
				botch = sample(seq(0,9), size = bd, replace = T)
				bcount = sum(botch == 0)
				if(bcount == 0){
					x = s
				} else{
					x = -bcount
					# This last is a bit of a kludge - botches should return a value of 0, but having a negative number can easily be equivalent in the code, and this is an easy way to indicate how bad the botch was while still returning a scalar from the function. 
				}
				k = 1
			} else {
				x = x + s
				k = 1
			}
		} else {
			x = sample(seq(1,10),1)
			if(x == 1){
				m = m +1
				} else {
					x = x * 2^m + s
					k = 1
					# Unless I've done my arithmetic wrong, m gives you the right factor for the geometric expansion of exploding dice.
				}
		}
	}
	return(x)
}

mundane = function(lc, sta){ # living conditions and stamina as arguments
	dead = 0
	age = 35 # We start only when aging rolls start, which is why there's an assumption of someone surviving till 35
	dec.xp = 0
	dec.score = 0
	sta.ap = 0 
	# I'm only keeping track of aging to stamina because it's the only one that has a direct bearing on future rolls, the rest all go purely into decrepitude
	while(dead == 0){ 
		crisis = 0
		age.frac = ceiling(age/10)
		age.total = sd(b=0) + age.frac - lc 
		# The aging roll is so pretty next to the ugliness that is having to exhaustively checking the table it comes with.
		if(age.total %in% 10:12 || age.total == 14 || age.total %in% 16:17){
			dec.xp = dec.xp + 1
		} else if(age.total == 15){
			dec.xp = dec.xp + 1
			sta.ap = sta.ap + 1
		} else if(age.total %in% 19:21){
			dec.xp = dec.xp + 2
		} else if(age.total == 18){
			dec.xp = dec.xp + 2
			sta.ap = sta.ap + 1
		} else if(age.total == 13 || age.total > 21){
			dec.score = dec.score + 1
			dec.xp = 0
			crisis = 1
		}
		# Checking for adjustment to stamina, the only stat I'm actually tracking here.
		if(sta.ap >= abs(sta)){
			sta = sta - 1
			sta.ap = 0
		}
		# I'm not proud of this particular loop to determine decrepitude, but I can't think of a better way to do it given how it sometimes has "give enough XP to advance decrepitude". The code for determining art and skill is far cleaner.
		if(dec.xp >= (dec.score + 1)*5){ 
			dec.score = dec.score + 1
			dec.xp = 0
		}
		if(dec.score > 4){dead = 1}
		# Crises, like the aging roll, also have a lovely exhaustive list. *shakes fist at the Atlas devs*
		if(crisis == 1){
			crisis.total = d10() + age.frac + dec.score
			if(crisis.total %in% 15:18){
				sta.roll = d10() + sta
				if(sta.roll >= (crisis.total - 14)*3){
					crisis = 0
				} else {
					dead = 1
				}
			} else if(crisis.total > 18){
				dead = 1
			} else{
				crisis = 0
			}
		}
		if(dead != 0){ 
			break # This makes sure the function returns your age at death, not your 'age' the year after you die
		} 
		age = age + 1 
	}
	return(age)
}

No, this is the original simulation. I pulled the link out of the archived durenmar.de-pages. It's in "conclave.html" under "How old can they get?"

:bulb: Concerning your code: you probably should put that on github. There's quite a few coders in the ArsMagica-community and they're more likely to jump in if you make it easy for them.

1 Like

Yep, github sounds like a good choice.

1 Like

Are you ignoring that a magus can go to a specialist for LR? It might be easier to pick a range of LR rituals and estimate how many would buy vs make and what levels they woulds be.

Also someone with a high enough CrCo score can develop spells to raise characteristics, though the mental ones require CrMe. Raising all of ones stats whenever they succumb to decrepitude would effectively hold the effects of aging at bay, especially in terms of their appearing old and infirm.

That'll be me then.

Yes, I concur completely.

As a small challenge I coded up an Ars Magica simulator last year that attempted to simulate the entirety of history from the foundation of the Order through to 1220. A rather OCD exercise down to a season-by-season activity decision by every Magus over 5 centuries. The main purpose was to get an idea of what an actual covenant library might look like in 1220 (to which the answer is a lot of Tractatus).
However one of the side-effects was an idea of when Magi finally snuffed it. And it was virtually always, as you say, through Decrepitude hitting 5, with Final Twilight very rare indeed.

The key thing I did not simulate in this regard was any benefits from a familiar bond, although there was an active trade in Longevity Rituals between Magi. I'll see if I can dig out some of the relevant results and post them here.

1 Like

I've read a few of the studies that show that human memory is frequently in error. So while I realize I could be mistaken, I do have a memory of a study which had some nice figures showing how many magi lived to a certain age with some variable altered. Those figures aren't in this link. I also think that there was another ageing simulation.

1 Like

I have the same memory, Erik. My thinking is that it was done by Andrew Smith and was hosted on durenmar.de, which is now unfortunately defunct, and I can't find anything to confirm my recollection. But it was for Fifth Edition, and had nice charts.

1 Like

You are right. Andy coded a complete ageing simulator, and it was hosted on durenmar.de. It was written during our playtesting of ArM5, and revised when the book was published. Unfortunately, I don't have any of that site's files, and have lost touch with Andy. If it is not in the Wayback machine, it may be gone.

Mark (co-founder of durenmar.de)

1 Like

Thank you all, nice to know I'm not going crazy. I also recall it covering things like riskiness factors for each simulated magus, and having a detailed discussion of magical botch assumptions. All cool stuff I wish I still had access to, but c'est la vie. As far as I can tell there isn't still a preserved copy anywhere, since it got hit with robots.txt.

There are no words for how impressed I am by that. I've put quite a lot of effort into my project, and I merely have intend to simulate in a very broad sense the life cycle of magi. Actually tracking them all sounds mindboggling in scale, and I would be fascinated by any of that you'd care to share. For instance, what does the library look like, and how common are published works and magical items? The actual resources of the Order sound like a topic about as fitting to my interests as my speculations on the vis economy.

And it is of course nice to have some confirmation too. I feel a lot more confident in my numbers if I'm not the only one to have derived them.

Incidentally, I've been ironing out some details and I'm not at all certain at this point, but after some speculation my SO and I think that the reason the Ultimate simulation has many people going into Final Twilight is that it failed to auto-kill people at Decrepitude 5. This is so far speculation on our part right now, but I'm in the process of setting up and dissecting a model to see if the ages match up if I let it increase without a cap.

And would there really be community interest in sticking this on github? I didn't expect there to be all that many R programmers to begin with — I honestly haven't met any outside a professional or academic context — let alone any with the time and interest. It's going pretty slow already, what with all my real work taking up most of my programming time.

1 Like

I'd love to see the code, though I'm afraid only as a tourist, being it's written in R and that I don't have any experience with R. The code your posted seems to indicate I could understand the logic though, even if I couldn't help with the coding.

1 Like

There are more of us than you might think! I write models in R as part of my day job, but also for ArsM: my last article in SubRosa was the results of a population dynamics model of the Order coded in R. I've also written an algorithm to determine which of our grogs in the (large) turb are capable of forming a trained group, a simulation of breakthroughs to work out how long one can expect to take (that was posted on this site), as well as a handful of other programs. Years back I did an 'InstaGrog' program, which was eventually rolled out as the Training Packages in Grogs.

So by all means post your code if you are willing to share -- I'm sure you'll get people interested!

Mark

1 Like

I fondly remember that article! It was incredibly interesting, and I had a real blast reading through it! :smiley:

1 Like

Heh... I still have a copies of instagrog on a couple of my machines. I keep meaning to update it for ArM5 and port it to Perl so that I can integrate it with the rest of my gaming database(s), but that never seems to happen.

When I got Grogs and saw the training packages system, I noted the similarity to instagrog, but it didn't occur to me that it might have been a direct ancestor.