Jump to content

Championship on the Line

#1 Baylor and #3 Tennesseee face off this Saturday for the National Championship Game

We're Talkin' Playoffs?

The Titans and the Browns face each other in the Wildcard Round this week

Join Here

Need a team?

Firstly... welcome to the SimFBA! If you are new to the site, and need a team, make sure you head over to the new users section and view the available teams list. You will also be able to fill out your job application there! See you on the field, Coach!

Read more

Basketball Season is Upon Us

Sign up by September 2nd for our 4th Season of College Basketball and NBA!

Join Here

#128 | SimBBA | Attribute Value & Progression System Analysis


Recommended Posts

Posted

Hi everyone,

 

Today's dev diary is an explanation of how SimBBA's attribute and progression system work and why it is the way that it is.
 

I think there's a disconnect between what people are expecting from progression based on our football sims and how it actually works in our basketball sims. This dev diary should hopefully bridge that gap and provide an explanation on how the progression system works in better detail.

 

Below is a link to the previous dev diary that went over how progressions worked in the first place. It is provided here to be used as a reference:

 

What are the attributes in SimBBA?

Here is each attribute that is used in the basketball sim:

  • Finishing - How well your player shoots in the paint.
  • Shooting 2 - How well your player shoots outside the paint but before the 3pt line
  • Shooting 3 - How well your player shoots at the 3pt line and outside of it.
  • Free Throw - How well your player can free throw
  • Ballwork - How well your player handles the ball. This involves stealing the ball, holding onto the ball, and the ability for the player to assist.
  • Rebounding - How well your player can rebound the ball after a shot
  • Interior Defense - How well your player can defend the paint
  • Perimeter Defense - How well your player can defend outside the paint
  • Injury Rating - How severe an injury will get, in the event a player gets injured. Does not impact how likely a player will be injured, only when they are.
  • Discipline - The likelihood the player will foul another player.

How is overall calculated?

Overall = (int((Shooting2 + Shooting3 + FreeThrow) / 3)) + Finishing + Ballwork + Rebounding + int((InteriorDefense+PerimeterDefense)/2)

The above formula is from the initial version of the SimBBA simulation leagues and is a cumulative sum of every attribute within their respective categories. When we added free throwing, we added that as part of the offensive shooting ability equation; when we split defense into interior and perimeter defense, we kept the defensive calculation the same, just had to average out the defensive attribute values.

 

What is the numerical range of each attribute?

When SimBBA (SimCBB and SimNBA) began years ago, the range of each attribute was between 1-20. When we migrated SimBBA over to the interface, we initially ran the progressions of these players based on the algorithm that was used for our football sims. The problem that occurred with doing this was that the progression algorithm for football is designed for an attribute system with a range between 1-100, not 1-20. So, players had attributes that jumped beyond the 20 range.

Due to this data issue, the team behind SimBBA decided to do two things:

  1. Increase the range of attributes from 1-40. More on that in a moment.
    • By increasing the bounds from 20-40, we gave a reason on why attributes went beyond 20, rather than having several players set at 20 attributes for each. There can be players that can specialize in attributes that go beyond 20, which can make them a specialty player in that specific attribute category. The new outer bound of 40 is the ceiling, but it's a ceiling that was designed to only be reached in the given circumstances of a very good player. Players such as Ray Allen and his 3pt shooting ability in games is an example, or perhaps even Michael Jordan and Lebron James would have attributes between the 30-40 range.
  2. Create a new progression algorithm that fits the scale of attributes in SimBBA.
    • We had no access to a progression algorithm from the initial version of the SimBBA simulations, so we had to build something new from the ground up.
    • Because of the initial 1-20 range, we had to come up with a way to give players a chance to grow in attributes, but not too much because of how significant each point would be in an attribute.
      • We also wanted players to grow uniquely regardless of their position, meaning that while Point Guards are likely to be good at ball-handling at the very least, we also recognize that there are other PGs in the current NBA that specialize outside of that. To reflect how unique players can be in the NBA and globally, we came up with the Attribute Specialization system.

 

What is the Attribute Specialization System?

Attribute Specializations (Specs) can be best described as the specific attributes that a player is talented in. Not every player by position will have the same specs, but this will allow players the potential to progress further in certain attributes at a greater rate.

When players are generated via crooting and the youth development system, they have dice rolls determined on which of their attributes are specialties of theirs.  The only time position is taken into account for a player's attributes is in attribute specialization.

Specs were generated using the following method:

- For each attribute (Shooting 2, Shooting 3, Free Throw, Finishing, Ballwork, Rebound, Interior Defense, Perimeter Defense), the computer does a dice roll between 1 through 20. If the dice roll is higher than 14, the spec is added to player. For each specific attribute, the position is checked to add a small modifier of 2, giving a boost to the player to attain certain specs that would be normal for their position.

Below is the following code on how specialties are decided upon:

func GetSpecialties(pos string) []string {
	chance := GenerateIntFromRange(0, 9)
	if chance < 1 {
		return []string{}
	}

	list := []string{}
	mod := 0
	diceRoll := 0

	// S2
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "SG" || pos == "SF" || pos == "PG" {
		mod = 2
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecShooting2")
	}

	// S3
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "PG" || pos == "SG" {
		mod = 2
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecShooting3")
	}
	// FT
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "SG" || pos == "SF" || pos == "PF" {
		mod = 2
	} else {
		mod = -1
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecFreeThrow")
	}

	// FN
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "SF" || pos == "C" || pos == "SG" {
		mod = 2
	}
	if diceRoll > 13 {
		list = append(list, "SpecFinishing")
	}

	// BW
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "PG" || pos == "SG" {
		mod = 2
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecBallwork")
	}

	// RB
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "C" || pos == "PF" {
		mod = 2
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecRebounding")
	}

	// ID
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "C" || pos == "PF" {
		mod = 2
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecInteriorDefense")
	}

	// PD
	diceRoll = GenerateIntFromRange(1, 20)
	if pos == "SG" || pos == "SF" {
		mod = 2
	}
	if diceRoll+mod > 13 {
		list = append(list, "SpecPerimeterDefense")
	}
	return list
}

 

There are players that can specialize in a couple of attributes, all of them, and even none. Specs are used in the progression algorithm to help determine which attributes are more likely to grow. It also guarantees that the attribute that is specialized will at least have a chance to grow or regress.

 

What is Prime Age? Why is it important?

Prime age is the age which the player has theoretically reached their peak. Meaning, their highest chance of growth has been met at that age. For every year past the prime age, the likelihood that the player will regress increases.

The range of prime age can be anywhere from 22 to 34. The likelihood of a player getting a number from either minimum or maximum range is very low.

As far as why prime age is different between each player, it's because every player is different. Some can play well and phase out of their career early; some can be in the league for over a decade.

Here is the algorithm:

func GeneratePrimeAge() int {
	chance := GenerateIntFromRange(1, 100)

	if chance < 5 {
		return 22
	} else if chance < 10 {
		return 23
	} else if chance < 15 {
		return 24
	} else if chance < 35 {
		return 25
	} else if chance < 50 {
		return 26
	} else if chance < 55 {
		return 27
	} else if chance < 65 {
		return 28
	} else if chance < 75 {
		return 29
	} else if chance < 80 {
		return 30
	} else if chance < 85 {
		return 31
	} else if chance < 90 {
		return 32
	} else if chance < 95 {
		return 33
	}
	return 34
}

 

What is Potential in SimBBA, and what makes it different from the football sims?

Taken from Merriam-Webster's dictionary, potential is the (adj) capability of development into actuality. It is also (Noun) something that can develop or become actual. For SimBBA, we're leaning into the "capability" and "can" in both term definitions. Meaning, Potential is seen as the ceiling for how high a player can grow in any given progression.

In SimFBA, potential is guaranteed growth, with potential being emphasized on how talented the player can get during the course of their collegiate and professional careers. In SimBBA, potential is the possibility of growth in a player and how likely they will grow. Where growth is guaranteed in football, in the basketball sim, it is more nuanced.

Both of these are very different.

As far as why potential in SimBBA is different, please consider the following:

  • The range of attributes is smaller in the basketball sim than it is in the football sim. Growing by even one point in an attribute in basketball has more significance than it does in the football sims because the range is smaller.
  • Because the range is smaller, the progression system has to be designed in a way to allow the chance of growth. If growth was always guaranteed, it would either be too small or insignificant, or eventually every single player would be hitting the 30 and 40 range. Because basketball careers are also arguably longer with certain players than it is for a football player's career, the long-term progression has to be balanced out as well. In addition, we have to allow roster building by bringing in younger players; so the system has to be designed in a way to promote growth, allow balance, and also reward drafting younger players.

 

Can we now talk about how the progression algorithm works?

Yes. If you’ve read dev diary #89 already, I'm going to explain it below again because only minimal changes were made since then.

  1. An empty list is generated. This list will consist of all the attributes which will be checked for progression.
  2. If a player has a spec for a specific attribute, that attribute will be added to the list.
  3. Once all specs are checked, a dice roll is then conducted for each attribute again. If the dice roll for the attribute + potential modifier (Potential / 20, so within a range of 1-5) is higher than or equal to 14, the attribute is added to the list.
  4. Once step 3 is ran, the list will now consist of attributes that will be progressed, with some attributes appearing more frequently than others. This list is then shuffled randomly to ensure that the order of which attributes were added to the list does not impact which attributes are progressed first.
  5. A point limit dependent on the player's potential is created. This point limit is the player's potential / 10, giving a range between 1-10, with any decimal rounding upwards. There's also a small coin flip, particularly for lower potential players, where the range of their point limit increases by 1. This is unaffected by the player's progression and is designed to allow players at a low rating (D, F) the chance to progress in at least more than one attribute.
  6. With the point limit set, the algorithm then loops through the list of attributes. On each attribute in the list, until the point limit is reached, a progression between the range of 0-2 is determined for that iterated attribute. With this design, attributes will at least progress by 1, while attributes that appear more than once in the list can still progress by 3 or 4.
    • There is one small caveat in this particular stage: Depending on the player's age and minutes played, a regression can occur.
    • Regarding the age of the player, depending on how old the player is compared to their prime age, the odds of regression increase. When the player has reached their peak, the chance of growth gets smaller until it becomes a regression. Based on my own experience with testing this, players that are even a year or two past their prime can still grow. Once we get to 3+ years above, it is more likely that the player will actually regress.
    • Regarding minutes, the regression is dependent on their expected minutes of play through the season, given the league the player is playing in (College vs Professional). Additionally, depending on the difference between minutes played and minutes expected (10 minutes or higher), there can be a bad regression.
      • In college basketball with the transfer portal system, the chance of regression is near null. If a player doesn't get their minutes and they weren't redshirting, they just won't grow.
      • In SimNBA, if a player doesn't get their minutes expected, they will regress.
  7. Once the point limit is met, the new progressions are added on top of the player's current attributes.

This progression algorithm is designed to meet the current attribute range for both SimCBB and SimNBA, while preventing players from only progressing in certain attributes based on position. Specs I believe add a layer of strategy in player progression and can be utilized in both gameplanning and roster management in this regard.

 

Why is regression allowed in the progression algorithm?

Several reasons, but mainly here are some things to consider:

  • The roster generation of several college teams was initially too high, increasing the bar on what it meant to have a starting caliber player. It also impacted both last year's and this year's drafts. This was all based on the previously used progression algorithm. The number of players that are entering the draft is very high. There are only so many roster spots that are available both in the SimNBA and with each team's respective G-League team. It is also partially one of the reasons why we introduced the international super league (ISL).
  • Minutes expectations is set high at the moment. I will likely made adjustments to this next offseason but for now I think it increases the significance of how minutes are used when strategizing for games in the season. Not every player will have their minutes met. With how talented players are, this should help add some additional balance to the league.
  • In my previous dev diary covering changes to recruiting I announced some changes to how players were now generated via recruiting and the ISL Youth Development system. We should now be seeing high school recruits that are both very talented and fit the proper description of a "one-and-done" while also being talented enough to be considered giving starter minutes. Additionally, I think it introduces a strategy possibility with drafting younger players simply due to the fact that teams will get more out of younger players because they will each have a longer career before their peak is even reached.

 

So why did some of my players regress in the previous progression?

There was a bug where season stats weren't being properly retrieved, meaning that players with minutes throughout the season possibly regressed instead of progressed. This caused smaller growth, no growth, and recessions. A thread was setup last week to bring awareness to this and to allow users to point out which players did regress so that I can fix the issue. I even ran a second one last night while users missed the deadline, despite there being days to post in the thread. The bug is fixed, and the likelihood that a player that has their minutes met and regresses won't happen unless they are past their prime.

 

This is a very different system than what we have with SimFBA; and while it's not perfect, I believe it's a solution that makes the most sense given the current system and the current ecosystem of players.

We are open to suggestions and feedback on the current progression system and recommend posting them here:

NCAA College Basketball Suggestions - SFA - Simulation Football Association (simfba.com)

 

 

Can we change the attribute ranges to have more visible growth?

This is a larger ask than I think some users will realize because this would be changing every player across the board, rewritting how progression currently works, and rewriting the engine to reflect the larger attribute range changes. That is something I want to avoid doing.

 

I hope y'all are well and have a good day.

 

~Tuscan

  • Like 3
Posted

The text has been updated to keep the information concise and straightforward to those who are reading it and want to be informed on how SimBBA works.

 

It’s been a rough past couple of days, and how I handled the matter regarding the progression system yesterday and this morning was unprofessional. I don’t want to go into details with what’s going but I am exhausted, and I shouldn’t take it out on the community. This doesn’t excuse my behavior, I just want to apologize to everyone and be transparent that I will be working on how poorly I handled things.

Posted

Very cool!

Thought just some context/food for thought for folks: 

As far as what the odds below mean - there are around 450 players 'active' in the NBA level of the sim, with what must be probably 100-200 players moving from college to some kind of pro league each season. So there are going to be at least 10 or so players who have peaked before playing an ounce of professional ball, and a 35% chance of a player peaking pretty early in their career after just 2 seasons of playing.

What does this mean? I don't really know, except it sounds like it might create a real volatile drafting and prospect accrual process where sometimes your best laid plans are foiled because that A+ potential rookie just kinda Tyreke Evans'd over the offseason and now you've got to figure out whether you want to wait it out another season or try and move on.

I think it's gonna be neat.
 

Here is the algorithm:

func GeneratePrimeAge() int {
	chance := GenerateIntFromRange(1, 100)

	if chance < 5 {
		return 22
	} else if chance < 10 {
		return 23
	} else if chance < 15 {
		return 24
	} else if chance < 35 {
		return 25
	} else if chance < 50 {
		return 26
	} else if chance < 55 {
		return 27
	} else if chance < 65 {
		return 28
	} else if chance < 75 {
		return 29
	} else if chance < 80 {
		return 30
	} else if chance < 85 {
		return 31
	} else if chance < 90 {
		return 32
	} else if chance < 95 {
		return 33
	}
	return 34
}

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...