mirror of
https://github.com/goonstation/goonstation-2020.git
synced 2026-07-16 17:42:19 +01:00
856 lines
32 KiB
Plaintext
856 lines
32 KiB
Plaintext
var/datum/job_controller/job_controls
|
|
|
|
/datum/job_controller/
|
|
var/list/staple_jobs = list()
|
|
var/list/special_jobs = list()
|
|
var/allow_special_jobs = 1 // hopefully this doesn't break anything!!
|
|
var/datum/job/job_creator = null
|
|
|
|
var/loaded_save = 0
|
|
var/last_client = null
|
|
var/load_another_ckey = null
|
|
|
|
New()
|
|
..()
|
|
if (derelict_mode)
|
|
src.staple_jobs = list(new /datum/job/command/captain/derelict {limit = 1;name = "NT-SO Commander";} (),
|
|
new /datum/job/command/head_of_security/derelict {limit = 1; name = "NT-SO Special Operative";} (),
|
|
new /datum/job/command/chief_engineer/derelict {limit = 1; name = "Salvage Chief";} (),
|
|
new /datum/job/security/security_officer/derelict {limit = 6; name = "NT-SO Officer";} (),
|
|
new /datum/job/research/medical_doctor/derelict {limit = 6; name = "Salvage Medic";} (),
|
|
new /datum/job/engineering/engineer/derelict {limit = 6; name = "Salvage Engineer";} (),
|
|
new /datum/job/civilian/staff_assistant (),
|
|
new /datum/job/civilian/chef (),
|
|
new /datum/job/civilian/barman (),
|
|
new /datum/job/civilian/chaplain ())
|
|
|
|
else
|
|
for (var/A in typesof(/datum/job/command)) src.staple_jobs += new A(src)
|
|
for (var/A in typesof(/datum/job/security)) src.staple_jobs += new A(src)
|
|
for (var/A in typesof(/datum/job/research)) src.staple_jobs += new A(src)
|
|
for (var/A in typesof(/datum/job/engineering)) src.staple_jobs += new A(src)
|
|
for (var/A in typesof(/datum/job/civilian)) src.staple_jobs += new A(src)
|
|
for (var/A in typesof(/datum/job/special)) src.special_jobs += new A(src)
|
|
job_creator = new /datum/job/created(src)
|
|
//Add special daily variety job
|
|
var/variety_job_path = text2path("/datum/job/daily/[lowertext(time2text(world.realtime,"Day"))]")
|
|
if (variety_job_path)
|
|
src.staple_jobs += new variety_job_path(src)
|
|
|
|
for (var/datum/job/J in src.staple_jobs)
|
|
// Cull any of those nasty null jobs from the category heads
|
|
if (!J.name)
|
|
src.staple_jobs -= J
|
|
for (var/datum/job/J in src.special_jobs)
|
|
if (!J.name)
|
|
src.special_jobs -= J
|
|
|
|
proc/job_config()
|
|
var/dat = "<html><body><title>Job Controller</title>"
|
|
dat += "<b><u>Job Controls</u></b><HR>"
|
|
dat += "<b>Command & Security Jobs</b><BR>"
|
|
for(var/datum/job/command/JOB in src.staple_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A><BR>"
|
|
for(var/datum/job/security/JOB in src.staple_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A><BR>"
|
|
dat += "<BR>"
|
|
dat += "<b>Research Jobs</b><BR>"
|
|
for(var/datum/job/research/JOB in src.staple_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A><BR>"
|
|
dat += "<BR>"
|
|
dat += "<b>Engineering Jobs</b><BR>"
|
|
for(var/datum/job/engineering/JOB in src.staple_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A><BR>"
|
|
dat += "<BR>"
|
|
dat += "<b>Civilian Jobs</b><BR>"
|
|
for(var/datum/job/civilian/JOB in src.staple_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A><BR>"
|
|
dat += "<BR>"
|
|
dat += "<b>Special Jobs</b><BR>"
|
|
for(var/datum/job/special/JOB in src.special_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A><BR>"
|
|
for(var/datum/job/created/JOB in src.special_jobs)
|
|
dat += "<a href='byond://?src=\ref[src];AlterCap=\ref[JOB]'>[JOB.name]: [countJob("[JOB.name]")]/[JOB.limit]</A>"
|
|
dat += " <a href='byond://?src=\ref[src];RemoveJob=\ref[JOB]'>(Remove)</A><BR>"
|
|
dat += "<BR>"
|
|
if (src.allow_special_jobs)
|
|
dat += "<A href='?src=\ref[src];SpecialToggle=1'>Special Jobs Enabled</A><BR>"
|
|
else
|
|
dat += "<A href='?src=\ref[src];SpecialToggle=1'>Special Jobs Disabled</A><BR>"
|
|
dat += "<A href='?src=\ref[src];JobCreator=1'>Create New Job</A>"
|
|
dat += "</body></html>"
|
|
|
|
usr.Browse(dat,"window=jobconfig;size=300x600")
|
|
|
|
proc/check_user_changed()//Since this is a 'public' window that everyone can get to, make sure we keep the user contained to their own savefile
|
|
if (last_client != usr.client)
|
|
src.savefile_unlock(usr)
|
|
src.last_client = usr.client
|
|
src.loaded_save = 0
|
|
src.load_another_ckey = null
|
|
return 1
|
|
return 0
|
|
|
|
proc/job_creator()
|
|
src.check_user_changed()
|
|
var/dat = "<html><body><title>Job Creation</title>"
|
|
dat += "<b><u>Job Creator</u></b><HR>"
|
|
|
|
dat += "<A href='?src=\ref[src];EditName=1'>Job Name:</A> [src.job_creator.name]<br>"
|
|
dat += "<A href='?src=\ref[src];EditWages=1'>Wages Per Payday:</A> [src.job_creator.wages]<br>"
|
|
dat += "<A href='?src=\ref[src];EditLimit=1'>Job Limit:</A> [src.job_creator.limit]<br>"
|
|
dat += "<A href='?src=\ref[src];ChangeName=1'>Can Change Name on Spawn:</A> [src.job_creator.change_name_on_spawn ? "Yes":"No"]<br>"
|
|
dat += "<A href='?src=\ref[src];SetSpawnLoc=1'>Spawn Location:</A> [src.job_creator.special_spawn_location ? locate(src.job_creator.spawn_x,src.job_creator.spawn_y,src.job_creator.spawn_z) : "Default"]<br>"
|
|
dat += "<A href='?src=\ref[src];EditObjective=1'>Custom Objective:</A> [src.job_creator.objective][src.job_creator.objective ? (src.job_creator.spawn_miscreant ? " (Miscreant)" : " (Crew Objective)") : ""]<br>"
|
|
dat += "<A href='?src=\ref[src];EditMob=1'>Mob Type:</A> [src.job_creator.mob_type]<br>"
|
|
dat += "<BR>"
|
|
if (ispath(src.job_creator.mob_type, /mob/living/carbon/human))
|
|
dat += "<A href='?src=\ref[src];EditHeadgear=1'>Starting Headgear:</A> [src.job_creator.slot_head]<br>"
|
|
dat += "<A href='?src=\ref[src];EditMask=1'>Starting Mask:</A> [src.job_creator.slot_mask]<br>"
|
|
dat += "<A href='?src=\ref[src];EditHeadset=1'>Starting Headset:</A> [src.job_creator.slot_ears]<br>"
|
|
dat += "<A href='?src=\ref[src];EditGlasses=1'>Starting Glasses:</A> [src.job_creator.slot_eyes]<br>"
|
|
dat += "<A href='?src=\ref[src];EditOvercoat=1'>Starting Overcoat:</A> [src.job_creator.slot_suit]<br>"
|
|
dat += "<A href='?src=\ref[src];EditJumpsuit=1'>Starting Jumpsuit:</A> [src.job_creator.slot_jump]<br>"
|
|
dat += "<A href='?src=\ref[src];EditIDCard=1'>Starting ID Card:</A> [src.job_creator.slot_card]<br>"
|
|
dat += "<A href='?src=\ref[src];EditGloves=1'>Starting Gloves:</A> [src.job_creator.slot_glov]<br>"
|
|
dat += "<A href='?src=\ref[src];EditShoes=1'>Starting Shoes:</A> [src.job_creator.slot_foot]<br>"
|
|
dat += "<A href='?src=\ref[src];EditBack=1'>Starting Back Item:</A> [src.job_creator.slot_back]<br>"
|
|
dat += "<A href='?src=\ref[src];EditBelt=1'>Starting Belt Item:</A> [src.job_creator.slot_belt]<br>"
|
|
dat += "<A href='?src=\ref[src];EditPock1=1'>Starting 1st Pocket Item:</A> [src.job_creator.slot_poc1]<br>"
|
|
dat += "<A href='?src=\ref[src];EditPock2=1'>Starting 2nd Pocket Item:</A> [src.job_creator.slot_poc2]<br>"
|
|
dat += "<A href='?src=\ref[src];EditLhand=1'>Starting Left Hand Item:</A> [src.job_creator.slot_lhan]<br>"
|
|
dat += "<A href='?src=\ref[src];EditRhand=1'>Starting Right Hand Item:</A> [src.job_creator.slot_rhan]<br>"
|
|
dat += "<A href='?src=\ref[src];GetAccess=1'>Set Access Permissions </A>"
|
|
if (src.job_creator.access.len > 1)
|
|
dat += " "
|
|
dat += "<A href='?src=\ref[src];AddAccess=1'>(Add More):</A>"
|
|
dat += ":<BR>"
|
|
for(var/X in src.job_creator.access)
|
|
dat += "[X], "
|
|
dat += "<BR>"
|
|
dat += "<A href='?src=\ref[src];BioEffects=1'>Bio Effects:</A> [src.job_creator.bio_effects]<br>"
|
|
else if (ispath(src.job_creator.mob_type, /mob/living/critter))
|
|
dat += "<A href='?src=\ref[src];GetAccess=1'>Set Implanted Access Permissions</A>"
|
|
if (src.job_creator.access.len > 1)
|
|
dat += " "
|
|
dat += "<A href='?src=\ref[src];AddAccess=1'>(Add More):</A>"
|
|
|
|
dat += "<BR>"
|
|
dat += "<A href='?src=\ref[src];CreateJob=1'><b>Create Job</b></A>"
|
|
dat += "<BR><BR>"
|
|
|
|
if (loaded_save)
|
|
dat += "<b>Saved Jobs:</b>"
|
|
if (src.load_another_ckey)
|
|
dat += "<b> (Showing [src.load_another_ckey]'s jobs)</b>"
|
|
dat += "<br><small>"
|
|
for (var/i=1, i <= CUSTOMJOB_SAVEFILE_PROFILES_MAX, i++)
|
|
dat += " <a href='?src=\ref[src];Load=[i]'>[src.savefile_get_job_name(usr,i) || i]</a>"
|
|
dat += " "
|
|
if (!src.load_another_ckey)
|
|
dat += " <a href='?src=\ref[src];Save=[i]'>(Save here)</a>"
|
|
dat += "<br>"
|
|
dat += "</small><br>"
|
|
if (src.load_another_ckey)
|
|
dat += "<A href='?src=\ref[src];SaveLoad=1'><b>Load your own jobs</b></A>"
|
|
else
|
|
dat += "<A href='?src=\ref[src];LoadDifKey=1'><b>Load another admin's jobs</b></A>"
|
|
else
|
|
dat += "<A href='?src=\ref[src];SaveLoad=1'>Save/Load</A>"
|
|
|
|
dat += "</body></html>"
|
|
|
|
usr.Browse(dat,"window=jobcreator;size=500x650")
|
|
|
|
Topic(href, href_list[])
|
|
// JOB CONFIG COMMANDS
|
|
usr_admin_only
|
|
if(href_list["AlterCap"])
|
|
var/list/alljobs = src.staple_jobs | src.special_jobs
|
|
var/datum/job/JOB = locate(href_list["AlterCap"]) in alljobs
|
|
var/newcap = input("Choose the new cap.","Job Cap Config", JOB.limit) as null|num
|
|
if (isnull(newcap))
|
|
return
|
|
JOB.limit = newcap
|
|
message_admins("Admin [key_name(usr)] altered [JOB.name] job cap to [newcap]")
|
|
logTheThing("admin", usr, null, "altered [JOB.name] job cap to [newcap]")
|
|
logTheThing("diary", usr, null, "altered [JOB.name] job cap to [newcap]", "admin")
|
|
src.job_config()
|
|
|
|
if(href_list["RemoveJob"])
|
|
var/list/alljobs = src.staple_jobs | src.special_jobs
|
|
var/datum/job/JOB = locate(href_list["RemoveJob"]) in alljobs
|
|
if (!istype(JOB,/datum/job/created/))
|
|
boutput(usr, "<span style=\"color:red\"><b>Removing integral jobs is not allowed. Bad for business, y'know.</b></span>")
|
|
return
|
|
message_admins("Admin [key_name(usr)] removed special job [JOB.name]")
|
|
logTheThing("admin", usr, null, "removed special job [JOB.name]")
|
|
logTheThing("diary", usr, null, "removed special job [JOB.name]", "admin")
|
|
src.special_jobs -= JOB
|
|
src.job_config()
|
|
|
|
if(href_list["SpecialToggle"])
|
|
src.allow_special_jobs = !src.allow_special_jobs
|
|
message_admins("Admin [key_name(usr)] toggled Special Jobs [src.allow_special_jobs ? "On" : "Off"]")
|
|
logTheThing("admin", usr, null, "toggled Special Jobs [src.allow_special_jobs ? "On" : "Off"]")
|
|
logTheThing("diary", usr, null, "toggled Special Jobs [src.allow_special_jobs ? "On" : "Off"]", "admin")
|
|
src.job_config()
|
|
|
|
if(href_list["JobCreator"])
|
|
src.job_creator()
|
|
|
|
// JOB CREATOR COMMANDS
|
|
|
|
// I tweaked this section a little so you can actual search for certain items.
|
|
// Scrolling through a list of ~2600 items wasn't exactly great (Convair880).
|
|
|
|
if(href_list["EditName"])
|
|
var/picker = input("What is this job's name?","Job Creator")
|
|
src.job_creator.name = picker
|
|
src.job_creator()
|
|
|
|
if(href_list["EditWages"])
|
|
var/picker = input("How much does this job get paid each payday?","Job Creator") as num
|
|
src.job_creator.wages = picker
|
|
src.job_creator()
|
|
|
|
if(href_list["EditLimit"])
|
|
var/picker = input("How many of this job can there be on the station?","Job Creator") as num
|
|
src.job_creator.limit = picker
|
|
src.job_creator()
|
|
|
|
if(href_list["EditMob"])
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for mob (or leave blank for complete list)", "Select mob") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/mob))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/mob)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select mob:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No mob matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.mob_type = picker
|
|
src.job_creator()
|
|
|
|
if(href_list["EditHeadgear"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_head = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for headgear (or leave blank for complete list)", "Select headgear") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/head))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/head)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select headgear:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No headgear matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_head = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditMask"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_mask = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for mask (or leave blank for complete list)", "Select mask") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/mask))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/mask)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select mask:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No mask matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_mask = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditHeadset"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_ears = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for headset (or leave blank for complete list)", "Select headset") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/device/radio/headset))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/device/radio/headset)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select headset:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No headset matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_ears = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditGlasses"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_eyes = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for glasses (or leave blank for complete list)", "Select glasses") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/glasses))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/glasses)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select glasses:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No glasses matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_eyes = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditOvercoat"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_suit = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for exosuit (or leave blank for complete list)", "Select exosuit") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/suit))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/suit)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select exosuit:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No exosuit matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_suit = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditJumpsuit"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_jump = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for jumpsuit (or leave blank for complete list)", "Select jumpsuit") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/under))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/under)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select jumpsuit:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No jumpsuit matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_jump = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditIDCard"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_card = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for ID card (or leave blank for complete list)", "Select ID card") as null|text
|
|
if (search_for)
|
|
for (var/R in (typesof(/obj/item/card) - list(/obj/item/card/emag, /obj/item/card/emag/fake, /obj/item/card/id/gauntlet)))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
// These cards can't be worn on the ID slot and they're not compatible with the
|
|
// job controller because they don't support access lists (Convair880).
|
|
L = (typesof(/obj/item/card) - list(/obj/item/card/emag, /obj/item/card/emag/fake, /obj/item/card/id/gauntlet))
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select ID card:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No ID card matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_card = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditGloves"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_glov = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for gloves (or leave blank for complete list)", "Select gloves") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/gloves))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/gloves)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select gloves:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No gloves matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_glov = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditShoes"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_foot = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for shoes (or leave blank for complete list)", "Select shoes") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/clothing/shoes))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/clothing/shoes)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select shoes:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No shoes matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_foot = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditBack"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_back = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for backslot item (or leave blank for complete list)", "Select backslot item") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select backslot item:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No backslot item matching that name", "red")
|
|
return
|
|
|
|
// I wish there would be a better way to filter this stuff, typesof() just doesn't cut it.
|
|
// I suppose this is still slightly more elegant than the fixed (and outdated) list that
|
|
// used to be here. Anway, the job controller will not spawn unsuitable items (Convair880).
|
|
if (picker)
|
|
var/obj/item/check = new picker
|
|
if (!(check.flags & ONBACK))
|
|
usr.show_text("This item cannot be worn on the back slot.", "red")
|
|
qdel(check)
|
|
return
|
|
qdel(check)
|
|
|
|
src.job_creator.slot_back = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditBelt"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_belt = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for beltslot item (or leave blank for complete list)", "Select beltslot item") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select beltslot item:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No beltslot item matching that name", "red")
|
|
return
|
|
|
|
// Ditto (Convair880).
|
|
if (picker)
|
|
var/obj/item/check = new picker
|
|
if (!(check.flags & ONBELT))
|
|
usr.show_text("This item cannot be worn on the belt slot.", "red")
|
|
qdel(check)
|
|
return
|
|
qdel(check)
|
|
|
|
src.job_creator.slot_belt = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditPock1"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_poc1 = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for item (or leave blank for complete list)", "Select pocket #1") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select item:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No item matching that name", "red")
|
|
return
|
|
|
|
// Ditto (Convair880).
|
|
if (picker)
|
|
var/obj/item/check = new picker
|
|
if (check.w_class > 2)
|
|
usr.show_text("This item is too large to fit in a jumpsuit pocket.", "red")
|
|
qdel(check)
|
|
return
|
|
qdel(check)
|
|
|
|
src.job_creator.slot_poc1 = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditPock2"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_poc2 = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for item (or leave blank for complete list)", "Select pocket #2") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select item:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No item matching that name", "red")
|
|
return
|
|
|
|
// Ditto (Convair880).
|
|
if (picker)
|
|
var/obj/item/check = new picker
|
|
if (check.w_class > 2)
|
|
usr.show_text("This item is too large to fit in a jumpsuit pocket.", "red")
|
|
qdel(check)
|
|
return
|
|
qdel(check)
|
|
|
|
src.job_creator.slot_poc2 = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditLhand"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_lhan = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for item (or leave blank for complete list)", "Select left hand") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select item:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No item matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_lhan = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["EditRhand"])
|
|
switch(alert("Clear or reselect slotted item?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.slot_rhan = null
|
|
|
|
if("Reselect")
|
|
var/list/L = list()
|
|
var/search_for = input(usr, "Search for item (or leave blank for complete list)", "Select right hand") as null|text
|
|
if (search_for)
|
|
for (var/R in typesof(/obj/item/))
|
|
if (findtext("[R]", search_for)) L += R
|
|
else
|
|
L = typesof(/obj/item/)
|
|
|
|
var/picker = null
|
|
if (L.len == 1)
|
|
picker = L[1]
|
|
else if (L.len > 1)
|
|
picker = input(usr,"Select item:","Job Creator",null) as null|anything in L
|
|
else
|
|
usr.show_text("No item matching that name", "red")
|
|
return
|
|
|
|
src.job_creator.slot_rhan = picker
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["GetAccess"])
|
|
var/picker = input("Make this job's access comparable to which job?","Job Creator") in list("Captain","Head of Security",
|
|
"Head of Personnel","Chief Engineer","Research Director","Security Officer","Detective","Geneticist","Roboticist","Scientist",
|
|
"Medical Doctor","Quartermaster","Miner","Mechanic","Engineer","Chef","Barman","Botanist","Janitor","Chaplain","Staff Assistant","No Access")
|
|
src.job_creator.access = get_access(picker)
|
|
src.job_creator()
|
|
|
|
if(href_list["AddAccess"])
|
|
var/picker = input("Make this job's access comparable to which job?","Job Creator") in list("Captain","Head of Security",
|
|
"Head of Personnel","Chief Engineer","Research Director","Security Officer","Detective","Geneticist","Roboticist","Scientist",
|
|
"Medical Doctor","Quartermaster","Miner","Mechanic","Engineer","Chef","Barman","Botanist","Janitor","Chaplain","Staff Assistant","No Access")
|
|
src.job_creator.access |= get_access(picker)
|
|
src.job_creator()
|
|
|
|
if(href_list["BioEffects"])
|
|
switch(alert("Clear or reselect bioeffects?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.bio_effects = null
|
|
if("Reselect")
|
|
var/pick = input("Which effect(s)? Enter IDs - seperate using semicolons.","["Give"] Bioeffects") as null|text
|
|
if (!pick)
|
|
src.job_creator.bio_effects = null
|
|
else
|
|
src.job_creator.bio_effects = pick
|
|
src.job_creator()
|
|
|
|
if(href_list["EditObjective"])
|
|
switch(alert("Clear or redefine objective?","Job Creator","Clear","Redefine"))
|
|
if("Clear")
|
|
src.job_creator.objective = null
|
|
if("Redefine")
|
|
var/input = input("Enter a custom objective.","Enter Objective") as null|text
|
|
src.job_creator.objective = input
|
|
switch(alert("Objective type?","Job Creator","Miscreant Objective","Crew Objective"))
|
|
if("Miscreant Objective")
|
|
src.job_creator.spawn_miscreant = 1
|
|
if("Crew Objective")
|
|
src.job_creator.spawn_miscreant = 0
|
|
src.job_creator()
|
|
|
|
if(href_list["ChangeName"])
|
|
if (src.job_creator.change_name_on_spawn == 0)
|
|
src.job_creator.change_name_on_spawn = 1
|
|
else
|
|
src.job_creator.change_name_on_spawn = 0
|
|
src.job_creator()
|
|
|
|
if(href_list["SetSpawnLoc"])
|
|
switch(alert("Clear or reselect spawn location?","Job Creator","Clear","Reselect"))
|
|
if("Clear")
|
|
src.job_creator.special_spawn_location = null
|
|
if("Reselect")
|
|
alert("Please move to the target location and then press OK.")
|
|
var/atom/trg = get_turf(usr)
|
|
if(trg)
|
|
src.job_creator.special_spawn_location = 1
|
|
src.job_creator.spawn_x = trg.x
|
|
src.job_creator.spawn_y = trg.y
|
|
src.job_creator.spawn_z = trg.z
|
|
src.job_creator()
|
|
|
|
if(href_list["CreateJob"])
|
|
var/datum/job/match_check = find_job_in_controller_by_string(src.job_creator.name)
|
|
if (match_check)
|
|
boutput(usr, "<span style=\"color:red\"><b>A job with this name already exists. It cannot be created.</b></span>")
|
|
return
|
|
else
|
|
var/datum/job/created/JOB = new /datum/job/created(src)
|
|
src.special_jobs += JOB
|
|
wagesystem.jobs[JOB.name] = src.job_creator.wages
|
|
|
|
JOB.name = src.job_creator.name
|
|
JOB.wages = src.job_creator.wages
|
|
JOB.limit = src.job_creator.limit
|
|
JOB.mob_type = src.job_creator.mob_type
|
|
JOB.slot_head = src.job_creator.slot_head
|
|
JOB.slot_mask = src.job_creator.slot_mask
|
|
JOB.slot_ears = src.job_creator.slot_ears
|
|
JOB.slot_eyes = src.job_creator.slot_eyes
|
|
JOB.slot_glov = src.job_creator.slot_glov
|
|
JOB.slot_foot = src.job_creator.slot_foot
|
|
JOB.slot_card = src.job_creator.slot_card
|
|
JOB.slot_jump = src.job_creator.slot_jump
|
|
JOB.slot_suit = src.job_creator.slot_suit
|
|
JOB.slot_back = src.job_creator.slot_back
|
|
JOB.slot_belt = src.job_creator.slot_belt
|
|
JOB.slot_poc1 = src.job_creator.slot_poc1
|
|
JOB.slot_poc2 = src.job_creator.slot_poc2
|
|
JOB.slot_lhan = src.job_creator.slot_lhan
|
|
JOB.slot_rhan = src.job_creator.slot_rhan
|
|
JOB.access = JOB.access | src.job_creator.access
|
|
JOB.change_name_on_spawn = src.job_creator.change_name_on_spawn
|
|
JOB.special_spawn_location = src.job_creator.special_spawn_location
|
|
JOB.spawn_x = src.job_creator.spawn_x
|
|
JOB.spawn_y = src.job_creator.spawn_y
|
|
JOB.spawn_z = src.job_creator.spawn_z
|
|
JOB.bio_effects = src.job_creator.bio_effects
|
|
JOB.objective = src.job_creator.objective
|
|
JOB.spawn_miscreant = src.job_creator.spawn_miscreant
|
|
message_admins("Admin [key_name(usr)] created special job [JOB.name]")
|
|
logTheThing("admin", usr, null, "created special job [JOB.name]")
|
|
logTheThing("diary", usr, null, "created special job [JOB.name]", "admin")
|
|
|
|
src.job_creator()
|
|
|
|
if(href_list["Save"])
|
|
if (!src.check_user_changed())
|
|
src.savefile_save(usr, (isnum(text2num(href_list["Save"])) ? text2num(href_list["Save"]) : 1))
|
|
boutput(usr, "<span style=\"color:blue\"><b>Job saved to Slot [text2num(href_list["Save"])].</b></span>")
|
|
src.job_creator()
|
|
|
|
if(href_list["Load"])
|
|
if (!src.check_user_changed())
|
|
if (!src.savefile_load(usr, (isnum(text2num(href_list["Load"])) ? text2num(href_list["Load"]) : 1)))
|
|
alert(usr, "You do not have a job saved in this slot.")
|
|
else
|
|
boutput(usr, "<span style=\"color:blue\"><b>Job loaded from Slot [text2num(href_list["Load"])].</b></span>")
|
|
src.job_creator()
|
|
|
|
if(href_list["SaveLoad"])
|
|
src.loaded_save = 1
|
|
src.load_another_ckey = null
|
|
src.job_creator()
|
|
|
|
if (href_list["LoadDifKey"])
|
|
var/key = input("Which admin's jobs? (Enter ckey)","Job Creator")
|
|
src.load_another_ckey = key
|
|
if (!src.savefile_path_exists(usr))
|
|
src.load_another_ckey = null
|
|
alert(usr, "Could not find a savefile with that ckey!.")
|
|
src.job_creator()
|
|
|
|
/proc/find_job_in_controller_by_string(var/string,var/staple_only = 0)
|
|
if (!string || !istext(string))
|
|
logTheThing("debug", null, null, "<b>Job Controller:</b> Attempt to find job with bad string in controller detected")
|
|
return null
|
|
var/list/excluded_strings = list("Special Respawn","Custom Names","Everything Except Assistant",
|
|
"Engineering Department","Security Department","Heads of Staff")
|
|
if (string in excluded_strings)
|
|
return null
|
|
for (var/datum/job/J in job_controls.staple_jobs)
|
|
if (J.name == string)
|
|
return J
|
|
if (!staple_only)
|
|
for (var/datum/job/J in job_controls.special_jobs)
|
|
if (J.name == string)
|
|
return J
|
|
logTheThing("debug", null, null, "<b>Job Controller:</b> Attempt to find job by string \"[string]\" in controller failed")
|
|
return null
|
|
|
|
/proc/find_job_in_controller_by_path(var/path)
|
|
if (!path || !ispath(path) || !istype(path,/datum/job/))
|
|
logTheThing("debug", null, null, "<b>Job Controller:</b> Attempt to find job with bad path in controller detected")
|
|
return null
|
|
for (var/datum/job/J in job_controls.staple_jobs)
|
|
if (J.type == path)
|
|
return J
|
|
for (var/datum/job/J in job_controls.special_jobs)
|
|
if (J.type == path)
|
|
return J
|
|
logTheThing("debug", null, null, "<b>Job Controller:</b> Attempt to find job by path \"[path]\" in controller failed")
|
|
return null
|
|
|
|
/client/proc/cmd_job_controls()
|
|
set category = "Debug"
|
|
set name = "Job Controls"
|
|
|
|
if (job_controls == null) boutput(src, "UH OH! Shit's broken as fuck!")
|
|
else src.debug_variables(job_controls) |