-
-
Notifications
You must be signed in to change notification settings - Fork 381
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CrewContracts - onUpdateBB #5596
base: master
Are you sure you want to change the base?
Conversation
I'm not suggesting any changes to the PR (haven't looked at the code, yet), but if you want to see how number of available ships in the market place was done, I wrote a post on that in #3243, assuming you're facing something similar here, with number of crew contracts, and how these are updated / churn |
Those plots are mesmerizing... |
table.insert(nonPersistentCharactersForCrew[station],newCrew()) | ||
print("Reseeding crew candidates") | ||
else | ||
-- 1 in 30 to be removed and then maybe someone new inserted |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you mean 1 in 101? or I do not understand correctly?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, old comment, numbers have changed.
if #nonPersistentCharactersForCrew[station] < 1 and Engine.rand:Integer(0, 10) == 0 then -- Not much crew around | ||
table.insert(nonPersistentCharactersForCrew[station],newCrew()) | ||
print("Reseeding crew candidates") | ||
else |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
10 times out of 11 this branch will fire, even if the array is empty, although now it will not cause an effect, it looks suspicious.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If there are no applicants, array is empty AND a random number equates to 0.
That's one in 11, not 10 times out of 11. The function reseeds the table when it goes to zero and let's it stay at zero for a randomly determined time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was talking about the "else" branch, yes, I said incorrectly, if the array is empty, the else branch will fire 10 times out of 11.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, I go it. Yes, that looks a bit wonky.
end | ||
end | ||
for k,v in pairs(nonPersistentCharactersForCrew[station]) do | ||
if #nonPersistentCharactersForCrew[station] < math.ceil(Game.system.population) * 2 + 1 then |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it would be nice to see an explanation of this criterion, looks like something empirical?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's from this equation a bit higher up on the page.
pioneer/data/modules/CrewContracts/CrewContracts.lua
Lines 394 to 395 in 0f417f2
-- Number is based on population, nicked from Assassinations.lua and tweaked | |
for i = 1, Engine.rand:Integer(0, math.ceil(Game.system.population) * 2 + 1) do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, maybe then we should put it in a small separate function, with a descriptive name?
@Gliese852 Thanks for the review! I'm currently looking into the algorithm @impaktor linked to above. May need to rewrite this. I like this one though. |
Number of applicants over about two and a half months game time. There is no affinity to any mean number but just a free running capitalistic hell. System Administration Resting has max applicants of 11 and Cydonia 39. In these scenarios I have modified the chance of reseeding after hitting zero from one in ten to one in a hundred. That's maybe a bit too long of a wait but I think it should be pretty high. Sometimes things just go bad. :) |
@impaktor OK, trying your way. I haven't tweaked the values to fit the human market yet. |
Graph redone for 2.5 months of human galactic migration. This is with the same variables as for the ship market. Please note that the population base is different between master and this PR. Crew Ad used Game.system.population and the one from the ship market uses station.path:GetSystemBody().parent.population. There is more drama in the earlier code. |
05dd512
to
29a9830
Compare
Rebased. When you have the 'Crew for hire" add open, the add isn't refreshed when the available crew changes. |
-- CrewContracts.lua local CrewContracts = {} -- We'll store the applicant data in a local table: -- Configuration -- Called once at game start or module init function CrewContracts.SeedApplicants() function CrewContracts.GenerateApplicant() -- This function runs periodically (e.g., every 60 in-game seconds). -- 1) Possibly remove or add an applicant based on some conditions: if #applicantPool > 0 then
else -- Additional logic to handle population-based speeds, if desired. end -- Called when the player initiates or ends a chat function CrewContracts.onChatEnd(candidateId, hired) -- Optional: a function to ensure we don't remove or re-roll an active candidate -- etc... return CrewContracts |
onUpdateBB() is a periodic update function (e.g., called from Pioneer’s UpdateBB() or your own tick/event hook) that manages the rotating pool of crew applicants: We’ll design the solution so that if a character is mid-interview (onChat with a player), the changes in the applicant list don’t invalidate that interview or accidentally remove the interviewee. The frequency at which new crew members appear or old ones leave can be tied to population or remain uniform if you want simpler balancing: If the applicant pool hits zero, we queue a re-seed timer so after X in-game hours or upon a certain event, a new batch of random applicants appears.
Notes on This Approach
Seeding Logic
CrewContracts.SeedApplicants() populates the list with a random number of new candidates between MIN_APPLICANTS and MAX_APPLICANTS. If the list ever drops to zero, we wait until the RESEED_DELAY passes and then repopulate.
Timing & Frequencies
You can tune the frequency of calling onUpdateBB and how quickly applicants come or go based on gameplay preference.
Non-Interference with Interviews
We mark any candidate in an active chat as busy. Your removal logic checks candidate.busy (or candidate.id ~= activeCandidateID) to avoid removing an active interviewee.
Population-Based Variation (Optional)
To mimic a big station vs. a tiny outpost, you could pass a “population factor” to onUpdateBB or store it in the station data. Then, when deciding whether to remove/add an applicant, you weigh the probability by that factor.
3. Addressing Your Specific Points
Character Deletion During Interview
|
Introduce onUpdateBB to the CrewContracts module.
Some points:
Fixes #5510