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)
+51 -128
View File
@@ -43,7 +43,7 @@ datum/preferences
var/underwear = 1
var/bubbles = 0 // 0 if the player doesn't want bubbles to appear
var/occupation[] = list("No Preference", "No Preference", "No Preference")
var/occupation[length(occupations)]
var/datum/jobs/wanted_jobs = list()
var/h_style = "Short Hair"
@@ -68,6 +68,8 @@ datum/preferences
New()
randomize_name()
for(var/n in occupation)
n=1
..()
//The mob should have a gender you want before running this proc.
@@ -379,7 +381,7 @@ datum/preferences
update_preview_icon()
user << browse_rsc(preview_icon, "previewicon.png")
var/list/destructive = list("Assistant") //only the actual assistants should terminate the list
// var/list/destructive = list("Assistant") //only the actual assistants should terminate the list
var/dat = "<html><body>"
dat += "<b>Name:</b> "
dat += "<a href=\"byond://?src=\ref[user];preferences=1;real_name=input\"><b>[real_name]</b></a> "
@@ -403,30 +405,8 @@ datum/preferences
dat += "<a href='byond://?src=\ref[user];preferences=1;ooccolor=input'>Change colour</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font>"
dat += "<hr><b>Occupation Choices</b><br>"
if (destructive.Find(occupation[1]))
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>[occupation[1]]</b></a><br>"
else
if (jobban_isbanned(user, occupation[1]))
occupation[1] = "Assistant"
if (jobban_isbanned(user, occupation[2]))
occupation[2] = "Assistant"
if (jobban_isbanned(user, occupation[3]))
occupation[3] = "Assistant"
if (occupation[1] != "No Preference")
dat += "\tFirst Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>[occupation[1]]</b></a><br>"
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>Set Preferences</b></a><br>"
if (destructive.Find(occupation[2]))
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\"><b>[occupation[2]]</b></a><BR>"
else
if (occupation[2] != "No Preference")
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\"><b>[occupation[2]]</b></a><BR>"
dat += "\tLast Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=3\"><b>[occupation[3]]</b></a><BR>"
else
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\">No Preference</a><br>"
else
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\">No Preference</a><br>"
dat += "<hr><table><tr><td><b>Body</b> "
dat += "(<a href=\"byond://?src=\ref[user];preferences=1;s_tone=random;underwear=random;age=random;b_type=random;hair=random;h_style=random;facial=random;f_style=random;eyes=random\">&reg;</A>)" // Random look
@@ -486,118 +466,62 @@ datum/preferences
user << browse(dat, "window=preferences;size=300x710")
proc/SetChoices(mob/user, occ=1)
proc/SetChoices(mob/user, changedjob)
var/HTML = "<body>"
HTML += "<tt><center>"
switch(occ)
if(1.0)
HTML += "<b>Which occupation would you like most?</b><br><br>"
if(2.0)
HTML += "<b>Which occupation would you like if you couldn't have your first?</b><br><br>"
if(3.0)
HTML += "<b>Which occupation would you like if you couldn't have the others?</b><br><br>"
else
for(var/job in uniquelist(occupations + assistant_occupations) )
if ((job!="AI" || config.allow_ai) && !jobban_isbanned(user, job))
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=[occ];job=[job]\">[job]</a><br>"
HTML += "<b>Choose occupations</b><br>Unavailable occupations are in red.<br>"
for(var/job in occupations )
if ((job!="AI" || config.allow_ai))
if(jobban_isbanned(user, job))
HTML += "<font color=red>"
if(job in head_positions || job=="AI")
HTML += "<b>[job]<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[job]\"></b>"
else
HTML += "[job]<a href=\"byond://?src=\ref[user];preferences=1;occ=1;job=[job]\">"
if(jobban_isbanned(user, job))
HTML += "</font>"
if (!occupation[job])
occupation[job]=0
switch(occupation[job])
if(0)
if(job=="Assistant")
HTML += "<font color=red>\[PleaseNo]</font>"
else
HTML += "<font color=red>\[NEVER]</font>"
if(1)
HTML += "<font color=orange>\[Okay]</font>"
if(2)
HTML += "<font color=green>\[Good]</font>"
if(3)
HTML += "<font color=blue>\[Best!]</font>"
else HTML += "*"+occupation[job]+"*"
HTML += "</a><br>"
if(!jobban_isbanned(user, "AI"))
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=[occ];job=AI\">AI</a><br>"
if(!jobban_isbanned(user, "Captain"))
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=[occ];job=Captain\">Captain</a><br>"
HTML += "<br>"
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=[occ];job=No Preference\">\[No Preference\]</a><br>"
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=[occ];cancel\">\[Cancel\]</a>"
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;occ=0;job=cancel\">\[Done\]</a>"
HTML += "</center></tt>"
user << browse(null, "window=preferences")
user << browse(HTML, "window=mob_occupation;size=320x600")
return
proc/SetJob(mob/user, occ=1, job="Captain")
if ((!( occupations.Find(job) ) && !( assistant_occupations.Find(job) ) && (job != "Captain" && job != "AI" && job != "No Preference")))
return
if (job=="AI" && (!config.allow_ai))
return
if (jobban_isbanned(user, job))
proc/SetJob(mob/user, job="Captain")
if ((!( occupations.Find(job) ) && !( assistant_occupations.Find(job) ) && (job != "No Preference")))
user << browse(null, "window=mob_occupation")
ShowChoices(user)
return
switch(occ)
if(1.0)
if (job == occupation[1])
user << browse(null, "window=mob_occupation")
return
else
if (job == "No Preference")
occupation[1] = "No Preference"
else
if (job == occupation[2])
job = occupation[1]
occupation[1] = occupation[2]
occupation[2] = job
else
if (job == occupation[3])
job = occupation[1]
occupation[1] = occupation[3]
occupation[3] = job
else
occupation[1] = job
if(2.0)
if (job == occupation[2])
user << browse(null, "window=mob_occupation")
return
else
if (job == "No Preference")
if (occupation[3] != "No Preference")
occupation[2] = occupation[3]
occupation[3] = "No Preference"
else
occupation[2] = "No Preference"
else
if (job == occupation[1])
if (occupation[2] == "No Preference")
user << browse(null, "window=mob_occupation")
return
job = occupation[2]
occupation[2] = occupation[1]
occupation[1] = job
else
if (job == occupation[3])
job = occupation[2]
occupation[2] = occupation[3]
occupation[3] = job
else
occupation[2] = job
if(3.0)
if (job == occupation[3])
user << browse(null, "window=mob_occupation")
return
else
if (job == "No Preference")
occupation[3] = "No Preference"
else
if (job == occupation[1])
if (occupation[3] == "No Preference")
user << browse(null, "window=mob_occupation")
return
job = occupation[3]
occupation[3] = occupation[1]
occupation[1] = job
else
if (job == occupation[2])
if (occupation[3] == "No Preference")
user << browse(null, "window=mob_occupation")
return
job = occupation[3]
occupation[3] = occupation[2]
occupation[2] = job
else
occupation[3] = job
if(occupation[job] == 2) // If it's going from good to best
for(var/j in occupation)
if(occupation[j] == 3)
occupation[j] = 2
user << browse(null, "window=mob_occupation")
ShowChoices(user)
occupation[job] = (occupation[job]+1)%4
return 1
SetChoices(user)
return
proc/process_link(mob/user, list/link_tags)
@@ -606,9 +530,9 @@ datum/preferences
user << browse(null, "window=\ref[user]occupation")
return
else if(link_tags["job"])
SetJob(user, text2num(link_tags["occ"]), link_tags["job"])
SetJob(user, link_tags["job"])
else
SetChoices(user, text2num(link_tags["occ"]))
SetChoices(user)
return 1
@@ -835,9 +759,8 @@ datum/preferences
randomize_name()
age = 30
occupation[1] = "No Preference"
occupation[2] = "No Preference"
occupation[3] = "No Preference"
for(var/o in occupation)
occupation[o] = 1
underwear = 1
//be_syndicate = 0
be_special = 0
+11 -6
View File
@@ -22,9 +22,12 @@ datum/preferences/proc/savefile_save(mob/user)
F["real_name"] << src.real_name
F["gender"] << src.gender
F["age"] << src.age
F["occupation_1"] << src.occupation[1]
F["occupation_2"] << src.occupation[2]
F["occupation_3"] << src.occupation[3]
for(var/job in uniquelist(occupations + assistant_occupations))
//world << src.occupation[job]
F["occupation_"+job] << src.occupation[job]
//F["occupation_1"] << src.occupation[1]
//F["occupation_2"] << src.occupation[2]
//F["occupation_3"] << src.occupation[3]
F["hair_red"] << src.r_hair
F["hair_green"] << src.g_hair
F["hair_blue"] << src.b_hair
@@ -83,9 +86,11 @@ datum/preferences/proc/savefile_load(mob/user, var/silent = 1)
F["real_name"] >> src.real_name
F["gender"] >> src.gender
F["age"] >> src.age
F["occupation_1"] >> src.occupation[1]
F["occupation_2"] >> src.occupation[2]
F["occupation_3"] >> src.occupation[3]
for(var/job in uniquelist(occupations + assistant_occupations))
F["occupation_"+job] >> src.occupation[job]
//F["occupation_1"] >> src.occupation[1]
//F["occupation_2"] >> src.occupation[2]
//F["occupation_3"] >> src.occupation[3]
F["hair_red"] >> src.r_hair
F["hair_green"] >> src.g_hair
F["hair_blue"] >> src.b_hair
+9
View File
@@ -54,6 +54,15 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit tho. Thanks. -->
<b><font color='blue'>28 September 2011:</font><b>
<ul>
<li><b>Rolan7 updated:</b>
<ul>
<li>New method for job assignment. Remember to review your preferences. Sned all your hate and bug reports to me.</li>
</ul>
</li>
</ul>
<b><font color='blue'>22 September 2011, OneWebDay:</font><b>
<ul>
<li><b>Errorage updated:</b>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB