New job assignment proc by Rolan7.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2281 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
baloh.matevz
2011-09-28 19:23:25 +00:00
parent 4768bab71c
commit 116ffe156a
8 changed files with 135 additions and 163 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ var/global/datum/controller/gameticker/ticker
/datum/controller/gameticker/proc/pregame()
do
pregame_timeleft = 60
pregame_timeleft = 90
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
while(current_state == GAME_STATE_PREGAME)
+45 -21
View File
@@ -3,7 +3,7 @@
var/list/candidates = list()
for (var/mob/new_player/player in unassigned)
if (player.preferences.occupation[level] == job)
if (player.preferences.occupation[job] == level)
if (jobban_isbanned(player, job))
continue
// if (player.jobs_restricted_by_gamemode && (job in player.jobs_restricted_by_gamemode))
@@ -20,6 +20,15 @@
player.mind.special_role = null
return
/proc/FillHeadPosition(list/unassigned, job)
for (var/level = 1 to 3)
var/list/candidates = FindOccupationCandidates(unassigned, job, 4-level)
if (candidates.len)
var/mob/new_player/candidate = pick(candidates)
unassigned -= candidate
candidate.mind.assigned_role = job
return
/** Proc DivideOccupations
* fills var "assigned_role" for all ready players.
* This proc must not have any side effects besides of modifying "assigned_role".
@@ -31,33 +40,28 @@
for (var/mob/new_player/player in world)
if (player.client && player.ready && !player.mind.assigned_role)
unassigned += player
for (var/level = 1 to 3)
if (jobban_isbanned(player, player.preferences.occupation[level]))
player.preferences.occupation[level] = "Assistant"
// for (var/level = 1 to 3)
// if (jobban_isbanned(player, player.preferences.occupation[4-level]))
// player.preferences.occupation[level] = "Assistant"
// If someone picked AI before it was disabled, or has a saved profile with it
// on a game that now lacks it, this will make sure they don't become the AI,
// by changing that choice to Captain.
if (!config.allow_ai)
for (var/level = 1 to 3)
if (player.preferences.occupation[level] == "AI")
player.preferences.occupation[level] = "Captain"
// if (!config.allow_ai)
// for (var/level = 1 to 3)
// if (player.preferences.occupation[level] == "AI")
// player.preferences.occupation[level] = "Captain"
if (unassigned.len == 0)
return 0
//Check for a Captain first
for (var/level = 1 to 3)
var/list/candidates = FindOccupationCandidates(unassigned, "Captain", level)
if (candidates.len)
var/mob/new_player/candidate = pick(candidates)
unassigned -= candidate
candidate.mind.assigned_role = "Captain"
break
//Fill head positions, first Captain than heads from least to most popular
for(var/occ in head_positions)
FillHeadPosition(unassigned, occ)
//Then check for an AI
for (var/level = 1 to 3)//Malf is a bit special as it replaces a normal job
var/list/candidates = FindOccupationCandidates(unassigned, "AI", level)
var/list/candidates = FindOccupationCandidates(unassigned, "AI", 4-level)
if(ticker.mode.name == "AI malfunction")
for(var/mob/new_player/player in candidates)
if(!player.preferences.be_special & BE_MALF)
@@ -77,13 +81,33 @@
player.mind.assigned_role = "AI"
unassigned -= player
break
//Now we can go though the rest of the jobs and players who set prefs
// Now for most positions. Shuffle the list of unassigned players and go through it, giving them
// what they want. Easy for "best", more complicated for "okay" and "good" because we have to
// select randomly from their list of okay or good jobs.
for (var/level = 1 to 3) // Wish this could be from 3 to 1, but whatever. "Good" to "okay".
unassigned = shuffle(unassigned) // Maybe unnecessary to shuffle each time, but it's cheap.
for(var/mob/new_player/player in unassigned)
var/list/wantedJobs = list()
for(var/job in player.preferences.occupation)
if(player.preferences.occupation[job] == 4-level)
if(!(job in head_positions) && job != "AI" && occupation_eligible[job] != 0 && !jobban_isbanned(player,job))
wantedJobs += job
if(length(wantedJobs) > 0)
player.mind.assigned_role = pick(wantedJobs)
occupation_eligible[player.mind.assigned_role]--
unassigned -= player
else
player.mind.assigned_role = "Assistant"
/* //Now we can go though the rest of the jobs and players who set prefs
for (var/level = 1 to 3)
//Assistants are checked first
for (var/occupation in assistant_occupations)
if (unassigned.len == 0)
break
var/list/candidates = FindOccupationCandidates(unassigned, occupation, level)
var/list/candidates = FindOccupationCandidates(unassigned, occupation, 4-level)
while(candidates.len && assistant_occupations[occupation])
assistant_occupations[occupation]--
var/mob/new_player/candidate = pick_n_take(candidates)
@@ -95,7 +119,7 @@
break
if (occupation_eligible[occupation] == 0)
continue
var/list/candidates = FindOccupationCandidates(unassigned, occupation, level)
var/list/candidates = FindOccupationCandidates(unassigned, occupation, 4-level)
while (candidates.len && occupation_eligible[occupation])
occupation_eligible[occupation]--
var/mob/new_player/candidate = pick_n_take(candidates)
@@ -126,7 +150,7 @@
player.mind.assigned_role = pick(occupationsPossible)
assistant_occupations[player.mind.assigned_role]--
// player.mind.assigned_role = pick(assistant_occupations)
*/
return 1
/mob/living/carbon/human/proc/Equip_Rank(rank, joined_late)
+13 -7
View File
@@ -293,16 +293,20 @@ proc/assignment_algorithm(var/list/mob/new_player/players)
var/list/occupations = list(
"Captain" = 1,
//Civilian jobs
"Head of Personnel" = 1,
//soul
"Clown" = 1,
"Mime" = 1,
"Chaplain" = 1,
"Librarian" = 1,
//body
"Bartender" = 1,
"Chef" = 1,
"Botanist" = 2,
"Janitor" = 1,
"Quartermaster" = 1,
"Cargo Technician" = 3,
@@ -318,22 +322,24 @@ var/list/occupations = list(
"Warden" = 1,
"Detective" = 1,
"Security Officer" = 5,
"Lawyer" = 2,
//medbay
"Chief Medical Officer" = 1,
"Medical Doctor" = 5,
"Geneticist" = 2,
"Chemist" = 2,
//science dept
"Research Director" = 1,
"Geneticist" = 2,
"Scientist" = 3,
"Botanist" = 2,
"Virologist" = 1,
//I afraid I can't do that, Dave
// "AI" = 1,now picked like the captain
"Cyborg" = 1
"AI" = 1,
"Cyborg" = 1,
"Assistant" = -1
)
@@ -351,11 +357,11 @@ var/list/assistant_occupations = list(
var/list/head_positions = list(
"Captain",
"Head of Personnel",
"Head of Security",
"Chief Medical Officer",
"Chief Engineer",
"Head of Personnel",
"Research Director",
"Chief Medical Officer"
"Head of Security"
)
var/list/nonhuman_positions = list(
@@ -187,6 +187,8 @@ CLIPBOARDS
n_name = copytext(n_name, 1, 32)
if ((src.loc == usr && usr.stat == 0))
src.name = text("paper[]", (n_name ? text("- '[n_name]'") : null))
if(src.icon_state == "paper_blank" && n_name != "")
src.icon_state = "paper"
src.add_fingerprint(usr)
return
@@ -235,6 +237,8 @@ CLIPBOARDS
*/
t = text("<font face=calligrapher>[]</font>", t)
if(src.icon_state == "paper_blank")
src.icon_state = "paper"
src.info += t
else
@@ -359,6 +363,7 @@ CLIPBOARDS
src.amount--
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper
P.loc = usr.loc
P.icon_state = "paper_blank"
if(ishuman(usr))
if(!usr.get_active_hand())
usr.put_in_hand(P)