jimstorch / DGGen

DDGen creates pre-generated characters (PDF) for the pen & paper RPG Delta Green
Apache License 2.0
32 stars 7 forks source link

Feature request - Veterans #16

Closed brunns closed 8 months ago

brunns commented 3 years ago

@jimstorch:

One feature I was kicking around came from listening to Role Playing Public Radio who were using the pregens for some of their DG sessions. The players were failing a lot of rolls as their skills were based on freshly-minted characters, but a one-shot may call for more veteran agents, so have an option to have age affect the character; skill_bonus = randint( (0, (character_age - 21 ) * 4)) # Add to a learned skill (assuming four skill-ups per year) age_penalty = randint(0, (character_age - 21)) # Deduct from physical skills The numbers would be re-rolled for each application. Something like that. It would need tweaking.

brunns commented 2 years ago

So, are we saying here that for every non-zero skill, we'd add randint((0, (character_age - 21 ) * 4)), and for each physical skill, we'd also subtract randint(0, (character_age - 21))?

I'm assuming a flag to turn this behavior on?

jimstorch commented 2 years ago

Yes, but the age effect really needs to be much less linear than my one-liner. Twenty-one to 30 is not comparable with 61 to 70. I went looking for something in the standard library for a hockey-stick shaped distribution but no luck yet. Maybe start at 41 with some kind of multiplier to ramp it up.

IMHO, as DGGEN is a tool for one-shots the behavior could always be in effect.

brunns commented 2 years ago

I may at least allow an option to turn it off - some people might prefer RAW characters.

brunns commented 2 years ago

Perhaps random.weibullvariate() looks promising? (See Weibull distribution).

brunns commented 2 years ago

I've been playing with something simpler - halving the skill bonus each decade or so:

def max_skill_earned_at_age(age, earned_at_start=4, start_age=25, halve_rate=10):
    return earned_at_start * (1 / 2 ** ((age - start_age) / halve_rate))

print("age  max this year  cumulative max  average boost")
for age in range(25, 76):
    at_age = max_skill_earned_at_age(age)
    max = sum(max_skill_earned_at_age(y) for y in range(25, age + 1))
    print (f"{age}      {at_age:5.2f}          {max:5.2f}            {max/2:5.2f}")

We can play with the parameters of course. What do you think, @jimstorch?

brunns commented 2 years ago

I've tried this out in #26 - feels a little OP to me as it is.

brunns commented 2 years ago

Changed so that rather than just picking a random skill boost between zero and the max, instead we grant that many skill improvement checks as per the Agent's Handbook pages 29-30. That means higher skills are less likely to improve, and we are unlikely to end up with many skills boosted to 100% or over.

This feels better in terms of the size of the skill boost, but it does feel like boosting every non-zero skill is a bit much. Maybe we should boost only some skills - say, 75% of professional skills, 25% of bonus skills and 25% of default skills? That would avoid every veteran ending up with a high Ride skills, for example.

Then, I need to think of the down side. Is it the physical skills which should decrease, or is it the physical stats? Feels like the latter to me, but by how much and starting at what age I don't know.

And if these are intended to be veteran DG agents, there ought to be other changes - one or two of the Damaged Veteran options from the Agent's Handbook page 38 would be good.

(At work, I'm used to pair-programming, with lots of discussion. Does it show? 😉)

brunns commented 2 years ago

CoC 7th edition has some rules for losing stats for age - I'll adapt those.

brunns commented 2 years ago

OK, done. Let me know if you approve of the changes, @jimstorch.

brunns commented 8 months ago

Always happy to revisit and improve, but closing for now.