From 762a3e3c0201b419f0810e6bc476bac7470243e0 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 16 Jun 2019 18:45:26 -0500 Subject: [PATCH 01/97] Ports revised job backend from TG --- code/__DEFINES/jobs.dm | 38 ++ code/__DEFINES/preferences.dm | 7 +- code/__HELPERS/cmp.dm | 3 + code/controllers/subsystem/job.dm | 174 ++++--- code/datums/outfit.dm | 8 + code/game/gamemodes/game_mode.dm | 2 +- code/modules/client/preferences.dm | 195 ++------ code/modules/client/preferences_savefile.dm | 90 ++-- code/modules/jobs/job_exp.dm | 2 + .../jobs/job_types/{job.dm => _job.dm} | 456 +++++++++--------- .../jobs/job_types/{silicon.dm => ai.dm} | 159 +++--- code/modules/jobs/job_types/assistant.dm | 2 +- .../jobs/job_types/atmospheric_technician.dm | 44 ++ code/modules/jobs/job_types/bartender.dm | 30 ++ code/modules/jobs/job_types/botanist.dm | 32 ++ code/modules/jobs/job_types/captain.dm | 60 +-- code/modules/jobs/job_types/cargo_service.dm | 290 ----------- .../jobs/job_types/cargo_technician.dm | 27 ++ .../{civilian_chaplain.dm => chaplain.dm} | 215 +++++---- code/modules/jobs/job_types/chemist.dm | 36 ++ code/modules/jobs/job_types/chief_engineer.dm | 63 +++ .../jobs/job_types/chief_medical_officer.dm | 58 +++ code/modules/jobs/job_types/civilian.dm | 202 -------- code/modules/jobs/job_types/clown.dm | 57 +++ code/modules/jobs/job_types/cook.dm | 52 ++ code/modules/jobs/job_types/curator.dm | 42 ++ code/modules/jobs/job_types/cyborg.dm | 27 ++ code/modules/jobs/job_types/detective.dm | 56 +++ code/modules/jobs/job_types/engineering.dm | 167 ------- code/modules/jobs/job_types/geneticist.dm | 35 ++ .../jobs/job_types/head_of_personnel.dm | 49 ++ .../jobs/job_types/head_of_security.dm | 67 +++ code/modules/jobs/job_types/janitor.dm | 27 ++ code/modules/jobs/job_types/lawyer.dm | 47 ++ code/modules/jobs/job_types/medical.dm | 204 -------- code/modules/jobs/job_types/medical_doctor.dm | 35 ++ code/modules/jobs/job_types/mime.dm | 49 ++ code/modules/jobs/job_types/quartermaster.dm | 32 ++ .../jobs/job_types/research_director.dm | 60 +++ code/modules/jobs/job_types/roboticist.dm | 34 ++ code/modules/jobs/job_types/science.dm | 131 ----- code/modules/jobs/job_types/scientist.dm | 33 ++ code/modules/jobs/job_types/security.dm | 334 ------------- .../jobs/job_types/security_officer.dm | 158 ++++++ code/modules/jobs/job_types/shaft_miner.dm | 70 +++ .../jobs/job_types/station_engineer.dm | 54 +++ code/modules/jobs/job_types/virologist.dm | 35 ++ code/modules/jobs/job_types/warden.dm | 55 +++ .../modules/mob/dead/new_player/new_player.dm | 137 +++--- .../mob/dead/new_player/preferences_setup.dm | 55 +-- tgstation.dme | 40 +- 51 files changed, 2201 insertions(+), 2134 deletions(-) rename code/modules/jobs/job_types/{job.dm => _job.dm} (85%) rename code/modules/jobs/job_types/{silicon.dm => ai.dm} (71%) create mode 100644 code/modules/jobs/job_types/atmospheric_technician.dm create mode 100644 code/modules/jobs/job_types/bartender.dm create mode 100644 code/modules/jobs/job_types/botanist.dm delete mode 100644 code/modules/jobs/job_types/cargo_service.dm create mode 100644 code/modules/jobs/job_types/cargo_technician.dm rename code/modules/jobs/job_types/{civilian_chaplain.dm => chaplain.dm} (67%) create mode 100644 code/modules/jobs/job_types/chemist.dm create mode 100644 code/modules/jobs/job_types/chief_engineer.dm create mode 100644 code/modules/jobs/job_types/chief_medical_officer.dm delete mode 100644 code/modules/jobs/job_types/civilian.dm create mode 100644 code/modules/jobs/job_types/clown.dm create mode 100644 code/modules/jobs/job_types/cook.dm create mode 100644 code/modules/jobs/job_types/curator.dm create mode 100644 code/modules/jobs/job_types/cyborg.dm create mode 100644 code/modules/jobs/job_types/detective.dm delete mode 100644 code/modules/jobs/job_types/engineering.dm create mode 100644 code/modules/jobs/job_types/geneticist.dm create mode 100644 code/modules/jobs/job_types/head_of_personnel.dm create mode 100644 code/modules/jobs/job_types/head_of_security.dm create mode 100644 code/modules/jobs/job_types/janitor.dm create mode 100644 code/modules/jobs/job_types/lawyer.dm delete mode 100644 code/modules/jobs/job_types/medical.dm create mode 100644 code/modules/jobs/job_types/medical_doctor.dm create mode 100644 code/modules/jobs/job_types/mime.dm create mode 100644 code/modules/jobs/job_types/quartermaster.dm create mode 100644 code/modules/jobs/job_types/research_director.dm create mode 100644 code/modules/jobs/job_types/roboticist.dm delete mode 100644 code/modules/jobs/job_types/science.dm create mode 100644 code/modules/jobs/job_types/scientist.dm delete mode 100644 code/modules/jobs/job_types/security.dm create mode 100644 code/modules/jobs/job_types/security_officer.dm create mode 100644 code/modules/jobs/job_types/shaft_miner.dm create mode 100644 code/modules/jobs/job_types/station_engineer.dm create mode 100644 code/modules/jobs/job_types/virologist.dm create mode 100644 code/modules/jobs/job_types/warden.dm diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index dc4080a789..e6b1d77f8a 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -48,3 +48,41 @@ #define JOB_UNAVAILABLE_PLAYTIME 3 #define JOB_UNAVAILABLE_ACCOUNTAGE 4 #define JOB_UNAVAILABLE_SLOTFULL 5 + +#define DEFAULT_RELIGION "Christianity" +#define DEFAULT_DEITY "Space Jesus" + +#define JOB_DISPLAY_ORDER_DEFAULT 0 + +#define JOB_DISPLAY_ORDER_ASSISTANT 1 +#define JOB_DISPLAY_ORDER_CAPTAIN 2 +#define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 3 +#define JOB_DISPLAY_ORDER_QUARTERMASTER 4 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 5 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 6 +#define JOB_DISPLAY_ORDER_BARTENDER 7 +#define JOB_DISPLAY_ORDER_COOK 8 +#define JOB_DISPLAY_ORDER_BOTANIST 9 +#define JOB_DISPLAY_ORDER_JANITOR 10 +#define JOB_DISPLAY_ORDER_CLOWN 11 +#define JOB_DISPLAY_ORDER_MIME 12 +#define JOB_DISPLAY_ORDER_CURATOR 13 +#define JOB_DISPLAY_ORDER_LAWYER 14 +#define JOB_DISPLAY_ORDER_CHAPLAIN 15 +#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 16 +#define JOB_DISPLAY_ORDER_STATION_ENGINEER 17 +#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 18 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 19 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 20 +#define JOB_DISPLAY_ORDER_CHEMIST 21 +#define JOB_DISPLAY_ORDER_GENETICIST 22 +#define JOB_DISPLAY_ORDER_VIROLOGIST 23 +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 24 +#define JOB_DISPLAY_ORDER_SCIENTIST 25 +#define JOB_DISPLAY_ORDER_ROBOTICIST 26 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 27 +#define JOB_DISPLAY_ORDER_WARDEN 28 +#define JOB_DISPLAY_ORDER_DETECTIVE 29 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 30 +#define JOB_DISPLAY_ORDER_AI 31 +#define JOB_DISPLAY_ORDER_CYBORG 32 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 02f151dcd9..0992b2e586 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -69,4 +69,9 @@ //Flags in the players table in the db #define DB_FLAG_EXEMPT 1 -#define DEFAULT_CYBORG_NAME "Default Cyborg Name" \ No newline at end of file +#define DEFAULT_CYBORG_NAME "Default Cyborg Name" + +//Job preferences levels +#define JP_LOW 1 +#define JP_MEDIUM 2 +#define JP_HIGH 3 diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index e09ebcb10c..37f36a7e0d 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -81,3 +81,6 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B) return A.totalResistance() - B.totalResistance() + +/proc/cmp_job_display_asc(datum/job/A, datum/job/B) + return A.display_order - B.display_order diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 5e960e0f96..5983fa3ae5 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -116,7 +116,7 @@ SUBSYSTEM_DEF(job) if(player.mind && job.title in player.mind.restricted_roles) JobDebug("FOC incompatible with antagonist role, Player: [player]") continue - if(player.client.prefs.GetJobDepartment(job, level) & job.flag) + if(player.client.prefs.job_preferences[job.title] == level) JobDebug("FOC pass, Player: [player], Level:[level]") candidates += player return candidates @@ -228,7 +228,7 @@ SUBSYSTEM_DEF(job) * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ -/datum/controller/subsystem/job/proc/DivideOccupations() +/datum/controller/subsystem/job/proc/DivideOccupations(list/required_jobs) //Setup new player list and get the jobs list JobDebug("Running DO") @@ -241,14 +241,14 @@ SUBSYSTEM_DEF(job) //Get the players who are ready for(var/mob/dead/new_player/player in GLOB.player_list) - if(player.ready == PLAYER_READY_TO_PLAY && player.mind && !player.mind.assigned_role) + if(player.ready == PLAYER_READY_TO_PLAY && player.check_preferences() && player.mind && !player.mind.assigned_role) unassigned += player initial_players_to_assign = unassigned.len JobDebug("DO, Len: [unassigned.len]") if(unassigned.len == 0) - return 0 + return validate_required_jobs(required_jobs) //Scale number of open security officer slots to population setup_officer_positions() @@ -269,7 +269,7 @@ SUBSYSTEM_DEF(job) //People who wants to be the overflow role, sure, go on. JobDebug("DO, Running Overflow Check 1") var/datum/job/overflow = GetJob(SSjob.overflow_role) - var/list/overflow_candidates = FindOccupationCandidates(overflow, 3) + var/list/overflow_candidates = FindOccupationCandidates(overflow, JP_LOW) JobDebug("AC1, Candidates: [overflow_candidates.len]") for(var/mob/dead/new_player/player in overflow_candidates) JobDebug("AC1 pass, Player: [player]") @@ -297,7 +297,8 @@ SUBSYSTEM_DEF(job) // Loop through all levels from high to low var/list/shuffledoccupations = shuffle(occupations) - for(var/level = 1 to 3) + var/list/levels = list(JP_HIGH,JP_MEDIUM,JP_LOW) + for(var/level in levels) //Check the head jobs first each level CheckHeadPositions(level) @@ -332,7 +333,7 @@ SUBSYSTEM_DEF(job) continue // If the player wants that job on this level, then try give it to him. - if(player.client.prefs.GetJobDepartment(job, level) & job.flag) + if(player.client.prefs.job_preferences[job.title] == level) // If the job isn't filled if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]") @@ -351,9 +352,28 @@ SUBSYSTEM_DEF(job) //Mop up people who can't leave. for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) if(!GiveRandomJob(player)) - AssignRole(player, SSjob.overflow_role) //If everything is already filled, make them an assistant + if(!AssignRole(player, SSjob.overflow_role)) //If everything is already filled, make them an assistant + return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll - return 1 + return validate_required_jobs(required_jobs) + +/datum/controller/subsystem/job/proc/validate_required_jobs(list/required_jobs) + if(!required_jobs.len) + return TRUE + for(var/required_group in required_jobs) + var/group_ok = TRUE + for(var/rank in required_group) + var/datum/job/J = GetJob(rank) + if(!J) + SSticker.mode.setup_error = "Invalid job [rank] in gamemode required jobs." + return FALSE + if(J.current_positions < required_group[rank]) + group_ok = FALSE + break + if(group_ok) + return TRUE + SSticker.mode.setup_error = "Required jobs not present." + return FALSE //We couldn't find a job from prefs for this guy. /datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) @@ -406,7 +426,7 @@ SUBSYSTEM_DEF(job) if(length(GLOB.jobspawn_overrides[rank])) S = pick(GLOB.jobspawn_overrides[rank]) if(S) - SendToAtom(H, S, buckle = FALSE) + S.JoinPlayerHere(H, FALSE) if(!S) //if there isn't a spawnpoint send them to latejoin, if there's no latejoin go yell at your mapper log_world("Couldn't find a round start spawn point for [rank]") SendToLateJoin(H) @@ -418,7 +438,7 @@ SUBSYSTEM_DEF(job) if(job) if(!job.dresscodecompliant)// CIT CHANGE - dress code compliance equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items - var/new_mob = job.equip(H, null, null, joined_late) + var/new_mob = job.equip(H, null, null, joined_late , null, M.client) if(ismob(new_mob)) H = new_mob if(!joined_late) @@ -428,16 +448,22 @@ SUBSYSTEM_DEF(job) SSpersistence.antag_rep_change[M.client.ckey] += job.GetAntagRep() +/* if(M.client.holder) + if(CONFIG_GET(flag/auto_deadmin_players) || (M.client.prefs?.toggles & DEADMIN_ALWAYS)) + M.client.holder.auto_deadmin() + else + handle_auto_deadmin_roles(M.client, rank) */ + to_chat(M, "You are the [rank].") if(job) to_chat(M, "As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this.") - to_chat(M, "To speak on your departments radio, use the :h button. To see others, look closely at your headset.") + job.radio_help_message(M) if(job.req_admin_notify) - to_chat(M, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.") + to_chat(M, "You are playing a job that is important for Game Progression. If you have to disconnect immediately, please notify the admins via adminhelp. Otherwise put your locker gear back into the locker and cryo out.") if(job.custom_spawn_text) to_chat(M, "[job.custom_spawn_text]") if(CONFIG_GET(number/minimal_access_threshold)) - to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") + to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") if(job && H) if(job.dresscodecompliant)// CIT CHANGE - dress code compliance @@ -446,12 +472,24 @@ SUBSYSTEM_DEF(job) equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works return H - +/* +/datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) + if(!C?.holder) + return TRUE + var/datum/job/job = GetJob(rank) + if(!job) + return + if((job.auto_deadmin_role_flags & DEADMIN_POSITION_HEAD) && (CONFIG_GET(flag/auto_deadmin_heads) || (C.prefs?.toggles & DEADMIN_POSITION_HEAD))) + return C.holder.auto_deadmin() + else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SECURITY) && (CONFIG_GET(flag/auto_deadmin_security) || (C.prefs?.toggles & DEADMIN_POSITION_SECURITY))) + return C.holder.auto_deadmin() + else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SILICON) && (CONFIG_GET(flag/auto_deadmin_silicons) || (C.prefs?.toggles & DEADMIN_POSITION_SILICON))) //in the event there's ever psuedo-silicon roles added, ie synths. + return C.holder.auto_deadmin()*/ /datum/controller/subsystem/job/proc/setup_officer_positions() var/datum/job/J = SSjob.GetJob("Security Officer") if(!J) - throw EXCEPTION("setup_officer_positions(): Security officer job is missing") + CRASH("setup_officer_positions(): Security officer job is missing") var/ssc = CONFIG_GET(number/security_scaling_coeff) if(ssc > 0) @@ -502,13 +540,15 @@ SUBSYSTEM_DEF(job) if(job.required_playtime_remaining(player.client)) young++ continue - if(player.client.prefs.GetJobDepartment(job, 1) & job.flag) - high++ - else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag) - medium++ - else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag) - low++ - else never++ //not selected + switch(player.client.prefs.job_preferences[job.title]) + if(JP_HIGH) + high++ + if(JP_MEDIUM) + medium++ + if(JP_LOW) + low++ + else + never++ SSblackbox.record_feedback("nested tally", "job_preferences", high, list("[job.title]", "high")) SSblackbox.record_feedback("nested tally", "job_preferences", medium, list("[job.title]", "medium")) SSblackbox.record_feedback("nested tally", "job_preferences", low, list("[job.title]", "low")) @@ -551,51 +591,61 @@ SUBSYSTEM_DEF(job) newjob.spawn_positions = J.spawn_positions newjob.current_positions = J.current_positions -/datum/controller/subsystem/job/proc/SendToAtom(mob/M, atom/A, buckle) - if(buckle && isliving(M) && istype(A, /obj/structure/chair)) - var/obj/structure/chair/C = A - if(C.buckle_mob(M, FALSE, FALSE)) - return - M.forceMove(get_turf(A)) +/atom/proc/JoinPlayerHere(mob/M, buckle) + // By default, just place the mob on the same turf as the marker or whatever. + M.forceMove(get_turf(src)) + +/obj/structure/chair/JoinPlayerHere(mob/M, buckle) + // Placing a mob in a chair will attempt to buckle it, or else fall back to default. + if (buckle && isliving(M) && buckle_mob(M, FALSE, FALSE)) + return + ..() /datum/controller/subsystem/job/proc/SendToLateJoin(mob/M, buckle = TRUE) + var/atom/destination if(M.mind && M.mind.assigned_role && length(GLOB.jobspawn_overrides[M.mind.assigned_role])) //We're doing something special today. - SendToAtom(M,pick(GLOB.jobspawn_overrides[M.mind.assigned_role]),FALSE) + destination = pick(GLOB.jobspawn_overrides[M.mind.assigned_role]) + destination.JoinPlayerHere(M, FALSE) return if(latejoin_trackers.len) - SendToAtom(M, pick(latejoin_trackers), buckle) - else - //bad mojo - var/area/shuttle/arrival/A = GLOB.areas_by_type[/area/shuttle/arrival] - if(A) - //first check if we can find a chair - var/obj/structure/chair/C = locate() in A - if(C) - SendToAtom(M, C, buckle) - return - else //last hurrah - var/list/avail = list() - for(var/turf/T in A) - if(!is_blocked_turf(T, TRUE)) - avail += T - if(avail.len) - SendToAtom(M, pick(avail), FALSE) - return + destination = pick(latejoin_trackers) + destination.JoinPlayerHere(M, buckle) + return - //pick an open spot on arrivals and dump em - var/list/arrivals_turfs = shuffle(get_area_turfs(/area/shuttle/arrival)) - if(arrivals_turfs.len) - for(var/turf/T in arrivals_turfs) - if(!is_blocked_turf(T, TRUE)) - SendToAtom(M, T, FALSE) - return - //last chance, pick ANY spot on arrivals and dump em - SendToAtom(M, arrivals_turfs[1], FALSE) - else - var/msg = "Unable to send mob [M] to late join!" - message_admins(msg) - CRASH(msg) + //bad mojo + var/area/shuttle/arrival/A = GLOB.areas_by_type[/area/shuttle/arrival] + if(A) + //first check if we can find a chair + var/obj/structure/chair/C = locate() in A + if(C) + C.JoinPlayerHere(M, buckle) + return + + //last hurrah + var/list/avail = list() + for(var/turf/T in A) + if(!is_blocked_turf(T, TRUE)) + avail += T + if(avail.len) + destination = pick(avail) + destination.JoinPlayerHere(M, FALSE) + return + + //pick an open spot on arrivals and dump em + var/list/arrivals_turfs = shuffle(get_area_turfs(/area/shuttle/arrival)) + if(arrivals_turfs.len) + for(var/turf/T in arrivals_turfs) + if(!is_blocked_turf(T, TRUE)) + T.JoinPlayerHere(M, FALSE) + return + //last chance, pick ANY spot on arrivals and dump em + destination = arrivals_turfs[1] + destination.JoinPlayerHere(M, FALSE) + else + var/msg = "Unable to send mob [M] to late join!" + message_admins(msg) + CRASH(msg) /////////////////////////////////// @@ -637,4 +687,4 @@ SUBSYSTEM_DEF(job) . |= player.mind /datum/controller/subsystem/job/proc/JobDebug(message) - log_job_debug(message) \ No newline at end of file + log_job_debug(message) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 1f5c28d3c2..68165af956 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -21,6 +21,7 @@ var/l_hand = null var/internals_slot = null //ID of slot containing a gas tank var/list/backpack_contents = null // In the list(path=count,otherpath=count) format + var/box // Internals box. Will be inserted at the start of backpack_contents var/list/implants = null var/accessory = null @@ -83,6 +84,13 @@ H.equip_to_slot_or_del(new l_pocket(H),SLOT_L_STORE) if(r_pocket) H.equip_to_slot_or_del(new r_pocket(H),SLOT_R_STORE) + + if(box) + if(!backpack_contents) + backpack_contents = list() + backpack_contents.Insert(1, box) + backpack_contents[box] = 1 + if(backpack_contents) for(var/path in backpack_contents) var/number = backpack_contents[path] diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index d16cbebb2a..28a0e21061 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -355,7 +355,7 @@ // Ultimate randomizing code right here for(var/mob/dead/new_player/player in GLOB.player_list) - if(player.client && player.ready == PLAYER_READY_TO_PLAY) + if(player.client && player.ready == PLAYER_READY_TO_PLAY && player.check_preferences()) players += player // Shuffling, the players list is now ping-independent!!! diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a0eea344a3..0984523ace 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -165,18 +165,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/all_quirks = list() var/list/character_quirks = list() - //Jobs, uses bitflags - var/job_civilian_high = 0 - var/job_civilian_med = 0 - var/job_civilian_low = 0 - - var/job_medsci_high = 0 - var/job_medsci_med = 0 - var/job_medsci_low = 0 - - var/job_engsec_high = 0 - var/job_engsec_med = 0 - var/job_engsec_low = 0 + //Job preferences 2.0 - indexed by job title , no key or value implies never + var/list/job_preferences = list() // Want randomjob if preferences already filled - Donkie var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants @@ -975,9 +965,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. var/datum/job/lastJob - var/datum/job/overflow = SSjob.GetJob(SSjob.overflow_role) - - for(var/datum/job/job in SSjob.occupations) + for(var/datum/job/job in sortList(SSjob.occupations, /proc/cmp_job_display_asc)) index += 1 if((index >= limit) || (job.title in splitJobs)) @@ -994,7 +982,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/rank = job.title lastJob = job if(jobban_isbanned(user, rank)) - HTML += "[rank] BANNED" + HTML += "[rank] BANNED" continue var/required_playtime_remaining = job.required_playtime_remaining(user.client) if(required_playtime_remaining) @@ -1004,7 +992,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/available_in_days = job.available_in_days(user.client) HTML += "[rank] \[IN [(available_in_days)] DAYS\]" continue - if((job_civilian_low & overflow.flag) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role)) + if((job_preferences[SSjob.overflow_role] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role)) HTML += "[rank]" continue if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs @@ -1019,32 +1007,32 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/prefUpperLevel = -1 // level to assign on left click var/prefLowerLevel = -1 // level to assign on right click - if(GetJobDepartment(job, 1) & job.flag) - prefLevelLabel = "High" - prefLevelColor = "slateblue" - prefUpperLevel = 4 - prefLowerLevel = 2 - else if(GetJobDepartment(job, 2) & job.flag) - prefLevelLabel = "Medium" - prefLevelColor = "green" - prefUpperLevel = 1 - prefLowerLevel = 3 - else if(GetJobDepartment(job, 3) & job.flag) - prefLevelLabel = "Low" - prefLevelColor = "orange" - prefUpperLevel = 2 - prefLowerLevel = 4 - else - prefLevelLabel = "NEVER" - prefLevelColor = "red" - prefUpperLevel = 3 - prefLowerLevel = 1 - + switch(job_preferences[job.title]) + if(JP_HIGH) + prefLevelLabel = "High" + prefLevelColor = "slateblue" + prefUpperLevel = 4 + prefLowerLevel = 2 + if(JP_MEDIUM) + prefLevelLabel = "Medium" + prefLevelColor = "green" + prefUpperLevel = 1 + prefLowerLevel = 3 + if(JP_LOW) + prefLevelLabel = "Low" + prefLevelColor = "orange" + prefUpperLevel = 2 + prefLowerLevel = 4 + else + prefLevelLabel = "NEVER" + prefLevelColor = "red" + prefUpperLevel = 3 + prefLowerLevel = 1 HTML += "" if(rank == SSjob.overflow_role)//Overflow is special - if(job_civilian_low & overflow.flag) + if(job_preferences[SSjob.overflow_role] == JP_LOW) HTML += "Yes" else HTML += "No" @@ -1075,61 +1063,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/proc/SetJobPreferenceLevel(datum/job/job, level) if (!job) - return 0 + return FALSE - if (level == 1) // to high - // remove any other job(s) set to high - job_civilian_med |= job_civilian_high - job_engsec_med |= job_engsec_high - job_medsci_med |= job_medsci_high - job_civilian_high = 0 - job_engsec_high = 0 - job_medsci_high = 0 + if (level == JP_HIGH) // to high + //Set all other high to medium + for(var/j in job_preferences) + if(job_preferences[j] == JP_HIGH) + job_preferences[j] = JP_MEDIUM + //technically break here - if (job.department_flag == CIVILIAN) - job_civilian_low &= ~job.flag - job_civilian_med &= ~job.flag - job_civilian_high &= ~job.flag - - switch(level) - if (1) - job_civilian_high |= job.flag - if (2) - job_civilian_med |= job.flag - if (3) - job_civilian_low |= job.flag - - return 1 - else if (job.department_flag == ENGSEC) - job_engsec_low &= ~job.flag - job_engsec_med &= ~job.flag - job_engsec_high &= ~job.flag - - switch(level) - if (1) - job_engsec_high |= job.flag - if (2) - job_engsec_med |= job.flag - if (3) - job_engsec_low |= job.flag - - return 1 - else if (job.department_flag == MEDSCI) - job_medsci_low &= ~job.flag - job_medsci_med &= ~job.flag - job_medsci_high &= ~job.flag - - switch(level) - if (1) - job_medsci_high |= job.flag - if (2) - job_medsci_med |= job.flag - if (3) - job_medsci_low |= job.flag - - return 1 - - return 0 + job_preferences[job.title] = level + return TRUE /datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl) if(!SSjob || SSjob.occupations.len <= 0) @@ -1146,64 +1090,29 @@ GLOBAL_LIST_EMPTY(preferences_datums) ShowChoices(user) return - if(role == SSjob.overflow_role) - if(job_civilian_low & job.flag) - job_civilian_low &= ~job.flag - else - job_civilian_low |= job.flag - SetChoices(user) - return 1 + var/jpval = null + switch(desiredLvl) + if(3) + jpval = JP_LOW + if(2) + jpval = JP_MEDIUM + if(1) + jpval = JP_HIGH - SetJobPreferenceLevel(job, desiredLvl) + if(role == SSjob.overflow_role) + if(job_preferences[job.title] == JP_LOW) + jpval = null + else + jpval = JP_LOW + + SetJobPreferenceLevel(job, jpval) SetChoices(user) return 1 /datum/preferences/proc/ResetJobs() - - job_civilian_high = 0 - job_civilian_med = 0 - job_civilian_low = 0 - - job_medsci_high = 0 - job_medsci_med = 0 - job_medsci_low = 0 - - job_engsec_high = 0 - job_engsec_med = 0 - job_engsec_low = 0 - - -/datum/preferences/proc/GetJobDepartment(datum/job/job, level) - if(!job || !level) - return 0 - switch(job.department_flag) - if(CIVILIAN) - switch(level) - if(1) - return job_civilian_high - if(2) - return job_civilian_med - if(3) - return job_civilian_low - if(MEDSCI) - switch(level) - if(1) - return job_medsci_high - if(2) - return job_medsci_med - if(3) - return job_medsci_low - if(ENGSEC) - switch(level) - if(1) - return job_engsec_high - if(2) - return job_engsec_med - if(3) - return job_engsec_low - return 0 + job_preferences = list() /datum/preferences/proc/SetQuirks(mob/user) if(!SSquirks) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7401a54efc..d7ec8eaea6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 20 +#define SAVEFILE_VERSION_MAX 21 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -49,6 +49,59 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_style = "mono" if(current_version < 20) pda_color = "#808000" + if(current_version < 21) + job_preferences = list() //It loaded null from nonexistant savefile field. + var/job_civilian_high = 0 + var/job_civilian_med = 0 + var/job_civilian_low = 0 + + var/job_medsci_high = 0 + var/job_medsci_med = 0 + var/job_medsci_low = 0 + + var/job_engsec_high = 0 + var/job_engsec_med = 0 + var/job_engsec_low = 0 + + S["job_civilian_high"] >> job_civilian_high + S["job_civilian_med"] >> job_civilian_med + S["job_civilian_low"] >> job_civilian_low + S["job_medsci_high"] >> job_medsci_high + S["job_medsci_med"] >> job_medsci_med + S["job_medsci_low"] >> job_medsci_low + S["job_engsec_high"] >> job_engsec_high + S["job_engsec_med"] >> job_engsec_med + S["job_engsec_low"] >> job_engsec_low + + //Can't use SSjob here since this happens right away on login + for(var/job in subtypesof(/datum/job)) + var/datum/job/J = job + var/new_value + var/fval = initial(J.flag) + switch(initial(J.department_flag)) + if(CIVILIAN) + if(job_civilian_high & fval) + new_value = JP_HIGH + else if(job_civilian_med & fval) + new_value = JP_MEDIUM + else if(job_civilian_low & fval) + new_value = JP_LOW + if(MEDSCI) + if(job_medsci_high & fval) + new_value = JP_HIGH + else if(job_medsci_med & fval) + new_value = JP_MEDIUM + else if(job_medsci_low & fval) + new_value = JP_LOW + if(ENGSEC) + if(job_engsec_high & fval) + new_value = JP_HIGH + else if(job_engsec_med & fval) + new_value = JP_MEDIUM + else if(job_engsec_low & fval) + new_value = JP_LOW + if(new_value) + job_preferences[initial(J.title)] = new_value /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) @@ -289,15 +342,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Jobs S["joblessrole"] >> joblessrole - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low + //Load prefs + S["job_preferences"] >> job_preferences //Quirks S["all_quirks"] >> all_quirks @@ -413,15 +459,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) + //Validate job prefs + for(var/j in job_preferences) + if(job_preferences[j] != JP_LOW && job_preferences[j] != JP_MEDIUM && job_preferences[j] != JP_LOW) + job_preferences -= j all_quirks = SANITIZE_LIST(all_quirks) positive_quirks = SANITIZE_LIST(positive_quirks) @@ -489,15 +530,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Jobs WRITE_FILE(S["joblessrole"] , joblessrole) - WRITE_FILE(S["job_civilian_high"] , job_civilian_high) - WRITE_FILE(S["job_civilian_med"] , job_civilian_med) - WRITE_FILE(S["job_civilian_low"] , job_civilian_low) - WRITE_FILE(S["job_medsci_high"] , job_medsci_high) - WRITE_FILE(S["job_medsci_med"] , job_medsci_med) - WRITE_FILE(S["job_medsci_low"] , job_medsci_low) - WRITE_FILE(S["job_engsec_high"] , job_engsec_high) - WRITE_FILE(S["job_engsec_med"] , job_engsec_med) - WRITE_FILE(S["job_engsec_low"] , job_engsec_low) + //Write prefs + WRITE_FILE(S["job_preferences"] , job_preferences) //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 4b7b175240..f99bf65071 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -8,6 +8,8 @@ GLOBAL_PROTECT(exp_to_update) return 0 if(!CONFIG_GET(flag/use_exp_tracking)) return 0 + if(!SSdbcore.Connect()) + return 0 if(!exp_requirements || !exp_type) return 0 if(!job_is_xp_locked(src.title)) diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/_job.dm similarity index 85% rename from code/modules/jobs/job_types/job.dm rename to code/modules/jobs/job_types/_job.dm index e441b3e889..59af18b76d 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -1,223 +1,233 @@ -/datum/job - //The name of the job - var/title = "NOPE" - - //Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access - var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population) - var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!) - - //Determines who can demote this position - var/department_head = list() - - //Tells the given channels that the given mob is the new department head. See communications.dm for valid channels. - var/list/head_announce = null - - //Bitflags for the job - var/flag = 0 - var/department_flag = 0 - - //Players will be allowed to spawn in as jobs that are set to "Station" - var/faction = "None" - - //How many players can be this job - var/total_positions = 0 - - //How many players can spawn in as this job - var/spawn_positions = 0 - - //How many players have this job - var/current_positions = 0 - - //Supervisors, who this person answers to directly - var/supervisors = "" - - //Sellection screen color - var/selection_color = "#ffffff" - - - //If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect. - var/req_admin_notify - - var/custom_spawn_text - - //If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) - var/minimal_player_age = 0 - - var/outfit = null - - var/exp_requirements = 0 - - var/exp_type = "" - var/exp_type_department = "" - - //The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round - //can be overridden by antag_rep.txt config - var/antag_rep = 10 - -//Only override this proc -//H is usually a human unless an /equip override transformed it -/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) - //do actions on H but send messages to M as the key may not have been transferred_yet - -/datum/job/proc/announce(mob/living/carbon/human/H) - if(head_announce) - announce_head(H, head_announce) - -/datum/job/proc/override_latejoin_spawn(mob/living/carbon/human/H) //Return TRUE to force latejoining to not automatically place the person in latejoin shuttle/whatever. - return FALSE - -//Used for a special check of whether to allow a client to latejoin as this job. -/datum/job/proc/special_check_latejoin(client/C) - return TRUE - -/datum/job/proc/GetAntagRep() - . = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)] - if(. == null) - return antag_rep - -//Don't override this unless the job transforms into a non-human (Silicons do this for example) -/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null) - if(!H) - return FALSE - - if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions)) - if(H.dna.species.id != "human") - H.set_species(/datum/species/human) - H.apply_pref_name("human", H.client) - - //Equip the rest of the gear - H.dna.species.before_equip_job(src, H, visualsOnly) - - if(outfit_override || outfit) - H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly) - - H.dna.species.after_equip_job(src, H, visualsOnly) - - if(!visualsOnly && announce) - announce(H) - -/datum/job/proc/get_access() - if(!config) //Needed for robots. - return src.minimal_access.Copy() - - . = list() - - if(CONFIG_GET(flag/jobs_have_minimal_access)) - . = src.minimal_access.Copy() - else - . = src.access.Copy() - - if(CONFIG_GET(flag/everyone_has_maint_access)) //Config has global maint access set - . |= list(ACCESS_MAINT_TUNNELS) - -/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. - if(H && GLOB.announcement_systems.len) - //timer because these should come after the captain announcement - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1)) - -//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 -/datum/job/proc/player_old_enough(client/C) - if(available_in_days(C) == 0) - return TRUE //Available in 0 days = available right now = player is old enough to play. - return FALSE - - -/datum/job/proc/available_in_days(client/C) - if(!C) - return 0 - if(!CONFIG_GET(flag/use_age_restriction_for_jobs)) - return 0 - if(C.prefs.db_flags & DB_FLAG_EXEMPT) - return 0 - if(!isnum(C.player_age)) - return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced - if(!isnum(minimal_player_age)) - return 0 - - return max(0, minimal_player_age - C.player_age) - -/datum/job/proc/config_check() - return TRUE - -/datum/job/proc/map_check() - return TRUE - - -/datum/outfit/job - name = "Standard Gear" - - var/jobtype = null - - uniform = /obj/item/clothing/under/color/grey - id = /obj/item/card/id - ears = /obj/item/radio/headset - belt = /obj/item/pda - back = /obj/item/storage/backpack - shoes = /obj/item/clothing/shoes/sneakers/black - - var/backpack = /obj/item/storage/backpack - var/satchel = /obj/item/storage/backpack/satchel - var/duffelbag = /obj/item/storage/backpack/duffelbag - var/box = /obj/item/storage/box/survival - - var/pda_slot = SLOT_BELT - -/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - switch(H.backbag) - if(GBACKPACK) - back = /obj/item/storage/backpack //Grey backpack - if(GSATCHEL) - back = /obj/item/storage/backpack/satchel //Grey satchel - if(GDUFFELBAG) - back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag - if(LSATCHEL) - back = /obj/item/storage/backpack/satchel/leather //Leather Satchel - if(DSATCHEL) - back = satchel //Department satchel - if(DDUFFELBAG) - back = duffelbag //Department duffel bag - else - back = backpack //Department backpack - - if(box) - if(!backpack_contents) - backpack_contents = list() - backpack_contents.Insert(1, box) // Box always takes a first slot in backpack - backpack_contents[box] = 1 - -/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - - var/datum/job/J = SSjob.GetJobType(jobtype) - if(!J) - J = SSjob.GetJob(H.job) - - if(H.nameless && J.dresscodecompliant) - if(J.title in GLOB.command_positions) - H.real_name = J.title - else - H.real_name = "[J.title] #[rand(10000, 99999)]" - - var/obj/item/card/id/C = H.wear_id - if(istype(C)) - C.access = J.get_access() - shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable - C.registered_name = H.real_name - C.assignment = J.title - C.update_label() - H.sec_hud_set_ID() - - var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot) - if(istype(PDA)) - PDA.owner = H.real_name - PDA.ownjob = J.title - PDA.update_label() - -/datum/outfit/job/get_chameleon_disguise_info() - var/list/types = ..() - types -= /obj/item/storage/backpack //otherwise this will override the actual backpacks - types += backpack - types += satchel - types += duffelbag - return types +/datum/job + //The name of the job , used for preferences, bans and more. Make sure you know what you're doing before changing this. + var/title = "NOPE" + + //Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access + var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population) + var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!) + + //Determines who can demote this position + var/department_head = list() + + //Tells the given channels that the given mob is the new department head. See communications.dm for valid channels. + var/list/head_announce = null + + //Bitflags for the job + var/flag = NONE //Deprecated + var/department_flag = NONE //Deprecated +// var/auto_deadmin_role_flags = NONE + + //Players will be allowed to spawn in as jobs that are set to "Station" + var/faction = "None" + + //How many players can be this job + var/total_positions = 0 + + //How many players can spawn in as this job + var/spawn_positions = 0 + + //How many players have this job + var/current_positions = 0 + + //Supervisors, who this person answers to directly + var/supervisors = "" + + //Sellection screen color + var/selection_color = "#ffffff" + + + //If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect. + var/req_admin_notify + + // This is for Citadel specific tweaks to job notices. + var/custom_spawn_text + + //If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) + var/minimal_player_age = 0 + + var/outfit = null + + var/exp_requirements = 0 + + var/exp_type = "" + var/exp_type_department = "" + + //The amount of good boy points playing this role will earn you towards a higher chance to roll antagonist next round + //can be overridden by antag_rep.txt config + var/antag_rep = 10 + + var/list/mind_traits // Traits added to the mind of the mob assigned this job + + var/display_order = JOB_DISPLAY_ORDER_DEFAULT + +//Only override this proc +//H is usually a human unless an /equip override transformed it +/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) + //do actions on H but send messages to M as the key may not have been transferred_yet +/* if(mind_traits) + for(var/t in mind_traits) + ADD_TRAIT(H.mind, t, JOB_TRAIT)*/ + +/datum/job/proc/announce(mob/living/carbon/human/H) + if(head_announce) + announce_head(H, head_announce) + +/datum/job/proc/override_latejoin_spawn(mob/living/carbon/human/H) //Return TRUE to force latejoining to not automatically place the person in latejoin shuttle/whatever. + return FALSE + +//Used for a special check of whether to allow a client to latejoin as this job. +/datum/job/proc/special_check_latejoin(client/C) + return TRUE + +/datum/job/proc/GetAntagRep() + . = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)] + if(. == null) + return antag_rep + +//Don't override this unless the job transforms into a non-human (Silicons do this for example) +/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source) + if(!H) + return FALSE + + if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions)) + if(H.dna.species.id != "human") + H.set_species(/datum/species/human) + H.apply_pref_name("human", preference_source) + + //Equip the rest of the gear + H.dna.species.before_equip_job(src, H, visualsOnly) + + if(outfit_override || outfit) + H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly) + + H.dna.species.after_equip_job(src, H, visualsOnly) + + if(!visualsOnly && announce) + announce(H) + +/datum/job/proc/get_access() + if(!config) //Needed for robots. + return src.minimal_access.Copy() + + . = list() + + if(CONFIG_GET(flag/jobs_have_minimal_access)) + . = src.minimal_access.Copy() + else + . = src.access.Copy() + + if(CONFIG_GET(flag/everyone_has_maint_access)) //Config has global maint access set + . |= list(ACCESS_MAINT_TUNNELS) + +/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. + if(H && GLOB.announcement_systems.len) + //timer because these should come after the captain announcement + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1)) + +//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 +/datum/job/proc/player_old_enough(client/C) + if(available_in_days(C) == 0) + return TRUE //Available in 0 days = available right now = player is old enough to play. + return FALSE + + +/datum/job/proc/available_in_days(client/C) + if(!C) + return 0 + if(!CONFIG_GET(flag/use_age_restriction_for_jobs)) + return 0 + if(!SSdbcore.Connect()) + return 0 //Without a database connection we can't get a player's age so we'll assume they're old enough for all jobs + if(!isnum(minimal_player_age)) + return 0 + + return max(0, minimal_player_age - C.player_age) + +/datum/job/proc/config_check() + return TRUE + +/datum/job/proc/map_check() + return TRUE + +/datum/job/proc/radio_help_message(mob/M) + to_chat(M, "Prefix your message with :h to speak on your department's radio. To see other prefixes, look closely at your headset.") + +/datum/outfit/job + name = "Standard Gear" + + var/jobtype = null + + uniform = /obj/item/clothing/under/color/grey + id = /obj/item/card/id + ears = /obj/item/radio/headset + belt = /obj/item/pda + back = /obj/item/storage/backpack + shoes = /obj/item/clothing/shoes/sneakers/black + box = /obj/item/storage/box/survival + + var/backpack = /obj/item/storage/backpack + var/satchel = /obj/item/storage/backpack/satchel + var/duffelbag = /obj/item/storage/backpack/duffelbag + + var/pda_slot = SLOT_BELT + +/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + switch(H.backbag) + if(GBACKPACK) + back = /obj/item/storage/backpack //Grey backpack + if(GSATCHEL) + back = /obj/item/storage/backpack/satchel //Grey satchel + if(GDUFFELBAG) + back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag + if(LSATCHEL) + back = /obj/item/storage/backpack/satchel/leather //Leather Satchel + if(DSATCHEL) + back = satchel //Department satchel + if(DDUFFELBAG) + back = duffelbag //Department duffel bag + else + back = backpack //Department backpack + +/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + + var/datum/job/J = SSjob.GetJobType(jobtype) + if(!J) + J = SSjob.GetJob(H.job) + + if(H.nameless && J.dresscodecompliant) + if(J.title in GLOB.command_positions) + H.real_name = J.title + else + H.real_name = "[J.title] #[rand(10000, 99999)]" + + var/obj/item/card/id/C = H.wear_id + if(istype(C)) + C.access = J.get_access() + shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable + C.registered_name = H.real_name + C.assignment = J.title + C.update_label() + H.sec_hud_set_ID() + + var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot) + if(istype(PDA)) + PDA.owner = H.real_name + PDA.ownjob = J.title + PDA.update_label() + +/datum/outfit/job/get_chameleon_disguise_info() + var/list/types = ..() + types -= /obj/item/storage/backpack //otherwise this will override the actual backpacks + types += backpack + types += satchel + types += duffelbag + return types + +//Warden and regular officers add this result to their get_access() +/datum/job/proc/check_config_for_sec_maint() + if(CONFIG_GET(flag/security_has_maint_access)) + return list(ACCESS_MAINT_TUNNELS) + return list() + diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/ai.dm similarity index 71% rename from code/modules/jobs/job_types/silicon.dm rename to code/modules/jobs/job_types/ai.dm index ab963eb8f3..4bcfab5836 100644 --- a/code/modules/jobs/job_types/silicon.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -1,90 +1,69 @@ -/* -AI -*/ -/datum/job/ai - title = "AI" - flag = AI_JF - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - selection_color = "#ccffcc" - supervisors = "your laws" - req_admin_notify = TRUE - minimal_player_age = 30 - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_SILICON - var/do_special_check = TRUE - -/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, outfit_override) - . = H.AIize(latejoin) - -/datum/job/ai/after_spawn(mob/H, mob/M, latejoin) - . = ..() - if(latejoin) - var/obj/structure/AIcore/latejoin_inactive/lateJoinCore - for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores) - if(P.is_available()) - lateJoinCore = P - GLOB.latejoin_ai_cores -= P - break - if(lateJoinCore) - lateJoinCore.available = FALSE - H.forceMove(lateJoinCore.loc) - qdel(lateJoinCore) - var/mob/living/silicon/ai/AI = H - AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked. - AI.set_core_display_icon(null, M.client) - - //we may have been created after our borg - if(SSticker.current_state == GAME_STATE_SETTING_UP) - for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs) - if(!R.connected_ai) - R.TryConnectToAI() - - if(latejoin) - announce(AI) - -/datum/job/ai/override_latejoin_spawn() - return TRUE - -/datum/job/ai/special_check_latejoin(client/C) - if(!do_special_check) - return TRUE - for(var/i in GLOB.latejoin_ai_cores) - var/obj/structure/AIcore/latejoin_inactive/LAI = i - if(istype(LAI)) - if(LAI.is_available()) - return TRUE - return FALSE - -/datum/job/ai/announce(mob/living/silicon/ai/AI) - . = ..() - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "[AI] has been downloaded to an empty bluespace-networked AI core at [AREACOORD(AI)].")) - -/datum/job/ai/config_check() - return CONFIG_GET(flag/allow_ai) - -/* -Cyborg -*/ -/datum/job/cyborg - title = "Cyborg" - flag = CYBORG - department_flag = ENGSEC - faction = "Station" - total_positions = 0 - spawn_positions = 1 - supervisors = "your laws and the AI" //Nodrak - selection_color = "#ddffdd" - minimal_player_age = 21 - exp_requirements = 120 - exp_type = EXP_TYPE_CREW - -/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, outfit_override = null) - return H.Robotize(FALSE, latejoin) - -/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) - R.updatename(M.client) - R.gender = NEUTER +/datum/job/ai + title = "AI" + flag = AI_JF +// auto_deadmin_role_flags = DEADMIN_POSITION_SILICON + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + selection_color = "#ccffcc" + supervisors = "your laws" + req_admin_notify = TRUE + minimal_player_age = 30 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_SILICON + display_order = JOB_DISPLAY_ORDER_AI + var/do_special_check = TRUE + +/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source = null) + if(visualsOnly) + CRASH("dynamic preview is unsupported") + . = H.AIize(latejoin,preference_source) + +/datum/job/ai/after_spawn(mob/H, mob/M, latejoin) + . = ..() + if(latejoin) + var/obj/structure/AIcore/latejoin_inactive/lateJoinCore + for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores) + if(P.is_available()) + lateJoinCore = P + GLOB.latejoin_ai_cores -= P + break + if(lateJoinCore) + lateJoinCore.available = FALSE + H.forceMove(lateJoinCore.loc) + qdel(lateJoinCore) + var/mob/living/silicon/ai/AI = H + AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked. + AI.set_core_display_icon(null, M.client) + + //we may have been created after our borg + if(SSticker.current_state == GAME_STATE_SETTING_UP) + for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs) + if(!R.connected_ai) + R.TryConnectToAI() + + if(latejoin) + announce(AI) + +/datum/job/ai/override_latejoin_spawn() + return TRUE + +/datum/job/ai/special_check_latejoin(client/C) + if(!do_special_check) + return TRUE + for(var/i in GLOB.latejoin_ai_cores) + var/obj/structure/AIcore/latejoin_inactive/LAI = i + if(istype(LAI)) + if(LAI.is_available()) + return TRUE + return FALSE + +/datum/job/ai/announce(mob/living/silicon/ai/AI) + . = ..() + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "[AI] has been downloaded to an empty bluespace-networked AI core at [AREACOORD(AI)].")) + +/datum/job/ai/config_check() + return CONFIG_GET(flag/allow_ai) + diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 65805f73fd..726d099ec6 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -14,7 +14,7 @@ Assistant minimal_access = list() //See /datum/job/assistant/get_access() outfit = /datum/outfit/job/assistant antag_rep = 7 - + display_order = JOB_DISPLAY_ORDER_ASSISTANT /datum/job/assistant/get_access() if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm new file mode 100644 index 0000000000..31d66eced2 --- /dev/null +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -0,0 +1,44 @@ +/datum/job/atmos + title = "Atmospheric Technician" + flag = ATMOSTECH + department_head = list("Chief Engineer") + department_flag = ENGSEC + faction = "Station" + total_positions = 3 + spawn_positions = 2 + supervisors = "the chief engineer" + selection_color = "#fff5cc" + exp_requirements = 60 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/atmos + + access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) + display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN + +/datum/outfit/job/atmos + name = "Atmospheric Technician" + jobtype = /datum/job/atmos + + belt = /obj/item/storage/belt/utility/atmostech + l_pocket = /obj/item/pda/atmos + ears = /obj/item/radio/headset/headset_eng + uniform = /obj/item/clothing/under/rank/atmospheric_technician + r_pocket = /obj/item/analyzer + + backpack = /obj/item/storage/backpack/industrial + satchel = /obj/item/storage/backpack/satchel/eng + duffelbag = /obj/item/storage/backpack/duffelbag/engineering + box = /obj/item/storage/box/engineer + pda_slot = SLOT_L_STORE + backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) + +/datum/outfit/job/atmos/rig + name = "Atmospheric Technician (Hardsuit)" + + mask = /obj/item/clothing/mask/gas + suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos + suit_store = /obj/item/tank/internals/oxygen + internals_slot = SLOT_S_STORE diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm new file mode 100644 index 0000000000..5d13720da2 --- /dev/null +++ b/code/modules/jobs/job_types/bartender.dm @@ -0,0 +1,30 @@ +/datum/job/bartender + title = "Bartender" + flag = BARTENDER + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#bbe291" + exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly + + outfit = /datum/outfit/job/bartender + + access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM) + display_order = JOB_DISPLAY_ORDER_BARTENDER + +/datum/outfit/job/bartender + name = "Bartender" + jobtype = /datum/job/bartender + + glasses = /obj/item/clothing/glasses/sunglasses/reagent + belt = /obj/item/pda/bar + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/bartender + suit = /obj/item/clothing/suit/armor/vest + backpack_contents = list(/obj/item/storage/box/beanbag=1) + shoes = /obj/item/clothing/shoes/laceup + diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm new file mode 100644 index 0000000000..e6338d9b0a --- /dev/null +++ b/code/modules/jobs/job_types/botanist.dm @@ -0,0 +1,32 @@ +/datum/job/hydro + title = "Botanist" + flag = BOTANIST + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 3 + spawn_positions = 2 + supervisors = "the head of personnel" + selection_color = "#bbe291" + + outfit = /datum/outfit/job/botanist + + access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + display_order = JOB_DISPLAY_ORDER_BOTANIST + +/datum/outfit/job/botanist + name = "Botanist" + jobtype = /datum/job/hydro + + belt = /obj/item/pda/botanist + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/hydroponics + suit = /obj/item/clothing/suit/apron + gloves =/obj/item/clothing/gloves/botanic_leather + suit_store = /obj/item/plant_analyzer + + backpack = /obj/item/storage/backpack/botany + satchel = /obj/item/storage/backpack/satchel/hyd + + diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index cd9c914e7a..e80840f8aa 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -1,9 +1,7 @@ -/* -Captain -*/ /datum/job/captain title = "Captain" flag = CAPTAIN +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY //:eyes: department_head = list("CentCom") department_flag = ENGSEC faction = "Station" @@ -15,12 +13,17 @@ Captain minimal_player_age = 14 exp_requirements = 180 exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_COMMAND outfit = /datum/outfit/job/captain access = list() //See get_access() minimal_access = list() //See get_access() +// mind_traits = list(TRAIT_DISK_VERIFIER) + + display_order = JOB_DISPLAY_ORDER_CAPTAIN + /datum/job/captain/get_access() return get_all_accesses() @@ -58,54 +61,3 @@ Captain mask = /obj/item/clothing/mask/gas/sechailer suit = /obj/item/clothing/suit/space/hardsuit/captain suit_store = /obj/item/tank/internals/oxygen - -/* -Head of Personnel -*/ -/datum/job/hop - title = "Head of Personnel" - flag = HOP - department_head = list("Captain") - department_flag = CIVILIAN - head_announce = list("Supply", "Service") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ddddff" - req_admin_notify = 1 - minimal_player_age = 10 - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_SUPPLY - - outfit = /datum/outfit/job/hop - - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, - ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, - ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) - - -/datum/outfit/job/hop - name = "Head of Personnel" - jobtype = /datum/job/hop - - id = /obj/item/card/id/silver - belt = /obj/item/pda/heads/hop - ears = /obj/item/radio/headset/heads/hop - uniform = /obj/item/clothing/under/rank/head_of_personnel - shoes = /obj/item/clothing/shoes/sneakers/brown - head = /obj/item/clothing/head/hopcap - backpack_contents = list(/obj/item/storage/box/ids=1,\ - /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) - - chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/hop) diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm deleted file mode 100644 index 22ef2a9211..0000000000 --- a/code/modules/jobs/job_types/cargo_service.dm +++ /dev/null @@ -1,290 +0,0 @@ -/* -Quartermaster -*/ -/datum/job/qm - title = "Quartermaster" - flag = QUARTERMASTER - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#d7b088" - - outfit = /datum/outfit/job/quartermaster - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) - -/datum/outfit/job/quartermaster - name = "Quartermaster" - jobtype = /datum/job/qm - - belt = /obj/item/pda/quartermaster - ears = /obj/item/radio/headset/headset_cargo - uniform = /obj/item/clothing/under/rank/cargo - shoes = /obj/item/clothing/shoes/sneakers/brown - glasses = /obj/item/clothing/glasses/sunglasses - l_hand = /obj/item/clipboard - - chameleon_extras = /obj/item/stamp/qm - -/* -Cargo Technician -*/ -/datum/job/cargo_tech - title = "Cargo Technician" - flag = CARGOTECH - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 3 - spawn_positions = 2 - supervisors = "the quartermaster and the head of personnel" - selection_color = "#dcba97" - - outfit = /datum/outfit/job/cargo_tech - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/cargo_tech - name = "Cargo Technician" - jobtype = /datum/job/cargo_tech - - belt = /obj/item/pda/cargo - ears = /obj/item/radio/headset/headset_cargo - uniform = /obj/item/clothing/under/rank/cargotech - l_hand = /obj/item/export_scanner - -/* -Shaft Miner -*/ -/datum/job/mining - title = "Shaft Miner" - flag = MINER - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 3 - spawn_positions = 3 - supervisors = "the quartermaster and the head of personnel" - selection_color = "#dcba97" - custom_spawn_text = "Remember, you are a miner, not a hunter. Hunting monsters is not a requirement of your job, the only requirement of your job is to provide materials for the station. Don't be afraid to run away if you're inexperienced with fighting the mining area's locals." - - outfit = /datum/outfit/job/miner - - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/miner - name = "Shaft Miner (Lavaland)" - jobtype = /datum/job/mining - - belt = /obj/item/pda/shaftminer - ears = /obj/item/radio/headset/headset_cargo/mining - shoes = /obj/item/clothing/shoes/workboots/mining - gloves = /obj/item/clothing/gloves/color/black - uniform = /obj/item/clothing/under/rank/miner/lavaland - l_pocket = /obj/item/reagent_containers/hypospray/medipen/survival - r_pocket = /obj/item/flashlight/seclite - backpack_contents = list( - /obj/item/storage/bag/ore=1,\ - /obj/item/kitchen/knife/combat/survival=1,\ - /obj/item/mining_voucher=1,\ - /obj/item/suit_voucher=1,\ - /obj/item/stack/marker_beacon/ten=1) - - backpack = /obj/item/storage/backpack/explorer - satchel = /obj/item/storage/backpack/satchel/explorer - duffelbag = /obj/item/storage/backpack/duffelbag - box = /obj/item/storage/box/survival_mining - - chameleon_extras = /obj/item/gun/energy/kinetic_accelerator - -/datum/outfit/job/miner/asteroid - name = "Shaft Miner (Asteroid)" - uniform = /obj/item/clothing/under/rank/miner - shoes = /obj/item/clothing/shoes/workboots - -/datum/outfit/job/miner/equipped - name = "Shaft Miner (Lavaland + Equipment)" - suit = /obj/item/clothing/suit/hooded/explorer/standard - mask = /obj/item/clothing/mask/gas/explorer - glasses = /obj/item/clothing/glasses/meson - suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE - backpack_contents = list( - /obj/item/storage/bag/ore=1, - /obj/item/kitchen/knife/combat/survival=1, - /obj/item/mining_voucher=1, - /obj/item/t_scanner/adv_mining_scanner/lesser=1, - /obj/item/gun/energy/kinetic_accelerator=1,\ - /obj/item/stack/marker_beacon/ten=1) - -/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - if(istype(H.wear_suit, /obj/item/clothing/suit/hooded)) - var/obj/item/clothing/suit/hooded/S = H.wear_suit - S.ToggleHood() - -/datum/outfit/job/miner/equipped/hardsuit - name = "Shaft Miner (Equipment + Hardsuit)" - suit = /obj/item/clothing/suit/space/hardsuit/mining - mask = /obj/item/clothing/mask/breath - - -/* -Bartender -*/ -/datum/job/bartender - title = "Bartender" - flag = BARTENDER - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#bbe291" - - outfit = /datum/outfit/job/bartender - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM) - - -/datum/outfit/job/bartender - name = "Bartender" - jobtype = /datum/job/bartender - - glasses = /obj/item/clothing/glasses/sunglasses/reagent - belt = /obj/item/pda/bar - ears = /obj/item/radio/headset/headset_srv - uniform = /obj/item/clothing/under/rank/bartender - suit = /obj/item/clothing/suit/armor/vest - backpack_contents = list(/obj/item/storage/box/beanbag=1,/obj/item/book/granter/action/drink_fling=1) - shoes = /obj/item/clothing/shoes/laceup - -/* -Cook -*/ -/datum/job/cook - title = "Cook" - flag = COOK - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 2 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#bbe291" - var/cooks = 0 //Counts cooks amount - - outfit = /datum/outfit/job/cook - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/cook - name = "Cook" - jobtype = /datum/job/cook - - belt = /obj/item/pda/cook - ears = /obj/item/radio/headset/headset_srv - uniform = /obj/item/clothing/under/rank/chef - suit = /obj/item/clothing/suit/toggle/chef - head = /obj/item/clothing/head/chefhat - mask = /obj/item/clothing/mask/fakemoustache/italian - backpack_contents = list(/obj/item/sharpener = 1) - -/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - var/datum/job/cook/J = SSjob.GetJobType(jobtype) - if(J) // Fix for runtime caused by invalid job being passed - if(J.cooks>0)//Cooks - suit = /obj/item/clothing/suit/apron/chef - head = /obj/item/clothing/head/soft/mime - if(!visualsOnly) - J.cooks++ - -/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients) - var/chosen_box = pick(possible_boxes) - var/obj/item/storage/box/I = new chosen_box(src) - H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK) - var/datum/martial_art/cqc/under_siege/justacook = new - justacook.teach(H) - -/* -Botanist -*/ -/datum/job/hydro - title = "Botanist" - flag = BOTANIST - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 3 - spawn_positions = 2 - supervisors = "the head of personnel" - selection_color = "#bbe291" - - outfit = /datum/outfit/job/botanist - - access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) - // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS - // Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT - // Given Morgue access because they have a viable means of cloning. - - -/datum/outfit/job/botanist - name = "Botanist" - jobtype = /datum/job/hydro - - belt = /obj/item/pda/botanist - ears = /obj/item/radio/headset/headset_srv - uniform = /obj/item/clothing/under/rank/hydroponics - suit = /obj/item/clothing/suit/apron - gloves =/obj/item/clothing/gloves/botanic_leather - suit_store = /obj/item/plant_analyzer - - backpack = /obj/item/storage/backpack/botany - satchel = /obj/item/storage/backpack/satchel/hyd - - -/* -Janitor -*/ -/datum/job/janitor - title = "Janitor" - flag = JANITOR - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 2 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#bbe291" - var/global/janitors = 0 - - outfit = /datum/outfit/job/janitor - - access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/janitor - name = "Janitor" - jobtype = /datum/job/janitor - - belt = /obj/item/pda/janitor - ears = /obj/item/radio/headset/headset_srv - uniform = /obj/item/clothing/under/rank/janitor - backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm new file mode 100644 index 0000000000..9699f12be5 --- /dev/null +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -0,0 +1,27 @@ +/datum/job/cargo_tech + title = "Cargo Technician" + flag = CARGOTECH + department_head = list("Quartermaster") + department_flag = CIVILIAN + faction = "Station" + total_positions = 3 + spawn_positions = 2 + supervisors = "the quartermaster" + selection_color = "#dcba97" + + outfit = /datum/outfit/job/cargo_tech + + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN + +/datum/outfit/job/cargo_tech + name = "Cargo Technician" + jobtype = /datum/job/cargo_tech + + belt = /obj/item/pda/cargo + ears = /obj/item/radio/headset/headset_cargo + uniform = /obj/item/clothing/under/rank/cargotech + l_hand = /obj/item/export_scanner + diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/chaplain.dm similarity index 67% rename from code/modules/jobs/job_types/civilian_chaplain.dm rename to code/modules/jobs/job_types/chaplain.dm index e44347a208..f2ced729a9 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -1,94 +1,121 @@ -//Due to how large this one is it gets its own file -/* -Chaplain -*/ -/datum/job/chaplain - title = "Chaplain" - flag = CHAPLAIN - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/chaplain - - access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) - minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) - -/datum/job/chaplain/after_spawn(mob/living/H, mob/M) - if(H.mind) - H.mind.isholy = TRUE - - var/obj/item/storage/book/bible/booze/B = new - - if(SSreligion.religion) - B.deity_name = SSreligion.deity - B.name = SSreligion.bible_name - B.icon_state = SSreligion.bible_icon_state - B.item_state = SSreligion.bible_item_state - to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [SSreligion.deity]. Defer to the Chaplain.") - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) - var/nrt = SSreligion.holy_weapon_type || /obj/item/nullrod - var/obj/item/nullrod/N = new nrt(H) - H.put_in_hands(N) - return - - var/new_religion = "Christianity" - if(M.client && M.client.prefs.custom_names["religion"]) - new_religion = M.client.prefs.custom_names["religion"] - - var/new_deity = "Space Jesus" - if(M.client && M.client.prefs.custom_names["deity"]) - new_deity = M.client.prefs.custom_names["deity"] - - B.deity_name = new_deity - - - switch(lowertext(new_religion)) - if("christianity") - B.name = pick("The Holy Bible","The Dead Sea Scrolls") - if("satanism") - B.name = "The Unholy Bible" - if("cthulhu") - B.name = "The Necronomicon" - if("islam") - B.name = "Quran" - if("scientology") - B.name = pick("The Biography of L. Ron Hubbard","Dianetics") - if("chaos") - B.name = "The Book of Lorgar" - if("imperium") - B.name = "Uplifting Primer" - if("toolboxia") - B.name = "Toolbox Manifesto" - if("homosexuality") - B.name = "Guys Gone Wild" - if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes") - B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition") - H.adjustBrainLoss(100) // starts off retarded as fuck - if("science") - B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") - else - B.name = "The Holy Book of [new_religion]" - - SSreligion.religion = new_religion - SSreligion.bible_name = B.name - SSreligion.deity = B.deity_name - - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) - - SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) - SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) - -/datum/outfit/job/chaplain - name = "Chaplain" - jobtype = /datum/job/chaplain - - belt = /obj/item/pda/chaplain - uniform = /obj/item/clothing/under/rank/chaplain - backpack_contents = list(/obj/item/camera/spooky = 1) - backpack = /obj/item/storage/backpack/cultpack - satchel = /obj/item/storage/backpack/cultpack +/datum/job/chaplain + title = "Chaplain" + flag = CHAPLAIN + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#dddddd" + + outfit = /datum/outfit/job/chaplain + + access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) + minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) + + display_order = JOB_DISPLAY_ORDER_CHAPLAIN + + +/datum/job/chaplain/after_spawn(mob/living/H, mob/M) + . = ..() + if(H.mind) + H.mind.isholy = TRUE + + var/obj/item/storage/book/bible/booze/B = new + + if(SSreligion.religion) + B.deity_name = SSreligion.deity + B.name = SSreligion.bible_name + B.icon_state = SSreligion.bible_icon_state + B.item_state = SSreligion.bible_item_state + to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [SSreligion.deity]. Defer to the Chaplain.") + H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + var/nrt = SSreligion.holy_weapon_type || /obj/item/nullrod + var/obj/item/nullrod/N = new nrt(H) + H.put_in_hands(N) + return + + var/new_religion = DEFAULT_RELIGION + if(M.client && M.client.prefs.custom_names["religion"]) + new_religion = M.client.prefs.custom_names["religion"] + + var/new_deity = DEFAULT_DEITY + if(M.client && M.client.prefs.custom_names["deity"]) + new_deity = M.client.prefs.custom_names["deity"] + + B.deity_name = new_deity + + + switch(lowertext(new_religion)) + if("christianity") // DEFAULT_RELIGION + B.name = pick("The Holy Bible","The Dead Sea Scrolls") + if("buddhism") + B.name = "The Sutras" + if("clownism","honkmother","honk","honkism","comedy") + B.name = pick("The Holy Joke Book", "Just a Prank", "Hymns to the Honkmother") + if("chaos") + B.name = "The Book of Lorgar" + if("cthulhu") + B.name = "The Necronomicon" + if("hinduism") + B.name = "The Vedas" + if("homosexuality") + B.name = pick("Guys Gone Wild","Coming Out of The Closet") + if("imperium") + B.name = "Uplifting Primer" + if("islam") + B.name = "Quran" + if("judaism") + B.name = "The Torah" + if("lampism") + B.name = "Fluorescent Incandescence" + if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes") + B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition","F.A.T.A.L. Rulebook") + H.adjustBrainLoss(100) // starts off retarded as fuck + if("monkeyism","apism","gorillism","primatism") + B.name = pick("Going Bananas", "Bananas Out For Harambe") + if("mormonism") + B.name = "The Book of Mormon" + if("pastafarianism") + B.name = "The Gospel of the Flying Spaghetti Monster" + if("rastafarianism","rasta") + B.name = "The Holy Piby" + if("satanism") + B.name = "The Unholy Bible" + if("science") + B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") + if("scientology") + B.name = pick("The Biography of L. Ron Hubbard","Dianetics") + if("servicianism", "partying") + B.name = "The Tenets of Servicia" + B.deity_name = pick("Servicia", "Space Bacchus", "Space Dionysus") + B.desc = "Happy, Full, Clean. Live it and give it." + if("subgenius") + B.name = "Book of the SubGenius" + if("toolboxia","greytide") + B.name = pick("Toolbox Manifesto","iGlove Assistants") + if("weeaboo","kawaii") + B.name = pick("Fanfiction Compendium","Japanese for Dummies","The Manganomicon","Establishing Your O.T.P") + else + B.name = "The Holy Book of [new_religion]" + + SSreligion.religion = new_religion + SSreligion.bible_name = B.name + SSreligion.deity = B.deity_name + + H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + + SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) + SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) + +/datum/outfit/job/chaplain + name = "Chaplain" + jobtype = /datum/job/chaplain + + belt = /obj/item/pda/chaplain + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/chaplain + backpack_contents = list(/obj/item/camera/spooky = 1) + backpack = /obj/item/storage/backpack/cultpack + satchel = /obj/item/storage/backpack/cultpack diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm new file mode 100644 index 0000000000..908209ef69 --- /dev/null +++ b/code/modules/jobs/job_types/chemist.dm @@ -0,0 +1,36 @@ +/datum/job/chemist + title = "Chemist" + flag = CHEMIST + department_head = list("Chief Medical Officer") + department_flag = MEDSCI + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "the chief medical officer" + selection_color = "#ffeef0" + exp_type = EXP_TYPE_CREW + exp_requirements = 60 + + outfit = /datum/outfit/job/chemist + + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_CHEMIST + +/datum/outfit/job/chemist + name = "Chemist" + jobtype = /datum/job/chemist + + glasses = /obj/item/clothing/glasses/science + belt = /obj/item/pda/chemist + ears = /obj/item/radio/headset/headset_med + uniform = /obj/item/clothing/under/rank/chemist + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/chemist + backpack = /obj/item/storage/backpack/chemistry + satchel = /obj/item/storage/backpack/satchel/chem + duffelbag = /obj/item/storage/backpack/duffelbag/med + + chameleon_extras = /obj/item/gun/syringe + diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm new file mode 100644 index 0000000000..dd89e925b5 --- /dev/null +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -0,0 +1,63 @@ +/datum/job/chief_engineer + title = "Chief Engineer" + flag = CHIEF +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + department_head = list("Captain") + department_flag = ENGSEC + head_announce = list("Engineering") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffeeaa" + req_admin_notify = 1 + minimal_player_age = 7 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_ENGINEERING + + outfit = /datum/outfit/job/ce + + access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, + ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, + ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER + +/datum/outfit/job/ce + name = "Chief Engineer" + jobtype = /datum/job/chief_engineer + + id = /obj/item/card/id/silver + belt = /obj/item/storage/belt/utility/chief/full + l_pocket = /obj/item/pda/heads/ce + ears = /obj/item/radio/headset/heads/ce + uniform = /obj/item/clothing/under/rank/chief_engineer + shoes = /obj/item/clothing/shoes/sneakers/brown + head = /obj/item/clothing/head/hardhat/white + gloves = /obj/item/clothing/gloves/color/black/ce + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1) + + backpack = /obj/item/storage/backpack/industrial + satchel = /obj/item/storage/backpack/satchel/eng + duffelbag = /obj/item/storage/backpack/duffelbag/engineering + box = /obj/item/storage/box/engineer + pda_slot = SLOT_L_STORE + chameleon_extras = /obj/item/stamp/ce + +/datum/outfit/job/ce/rig + name = "Chief Engineer (Hardsuit)" + + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/hardsuit/engine/elite + shoes = /obj/item/clothing/shoes/magboots/advance + suit_store = /obj/item/tank/internals/oxygen + glasses = /obj/item/clothing/glasses/meson/engine + gloves = /obj/item/clothing/gloves/color/yellow + head = null + internals_slot = SLOT_S_STORE diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm new file mode 100644 index 0000000000..54963b1bc1 --- /dev/null +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -0,0 +1,58 @@ +/datum/job/cmo + title = "Chief Medical Officer" + flag = CMO_JF + department_head = list("Captain") + department_flag = MEDSCI +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + head_announce = list("Medical") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffddf0" + req_admin_notify = 1 + minimal_player_age = 7 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_MEDICAL + + outfit = /datum/outfit/job/cmo + + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, + ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, + ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, + ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, + ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) + + display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER + +/datum/outfit/job/cmo + name = "Chief Medical Officer" + jobtype = /datum/job/cmo + + id = /obj/item/card/id/silver + belt = /obj/item/pda/heads/cmo + l_pocket = /obj/item/pinpointer/crew + ears = /obj/item/radio/headset/heads/cmo + uniform = /obj/item/clothing/under/rank/chief_medical_officer + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/toggle/labcoat/cmo + l_hand = /obj/item/storage/firstaid/regular + suit_store = /obj/item/flashlight/pen + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) + + backpack = /obj/item/storage/backpack/medic + satchel = /obj/item/storage/backpack/satchel/med + duffelbag = /obj/item/storage/backpack/duffelbag/med + + chameleon_extras = list(/obj/item/gun/syringe, /obj/item/stamp/cmo) + +/datum/outfit/job/cmo/hardsuit + name = "Chief Medical Officer (Hardsuit)" + + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/hardsuit/medical + suit_store = /obj/item/tank/internals/oxygen + r_pocket = /obj/item/flashlight/pen + diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm deleted file mode 100644 index 944499470a..0000000000 --- a/code/modules/jobs/job_types/civilian.dm +++ /dev/null @@ -1,202 +0,0 @@ -/* -Clown -*/ -/datum/job/clown - title = "Clown" - flag = CLOWN - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/clown - - access = list(ACCESS_THEATRE) - minimal_access = list(ACCESS_THEATRE) - -/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) - H.apply_pref_name("clown", M.client) - -/datum/outfit/job/clown - name = "Clown" - jobtype = /datum/job/clown - - belt = /obj/item/pda/clown - uniform = /obj/item/clothing/under/rank/clown - shoes = /obj/item/clothing/shoes/clown_shoes - mask = /obj/item/clothing/mask/gas/clown_hat - l_pocket = /obj/item/bikehorn - backpack_contents = list( - /obj/item/stamp/clown = 1, - /obj/item/reagent_containers/spray/waterflower = 1, - /obj/item/reagent_containers/food/snacks/grown/banana = 1, - /obj/item/instrument/bikehorn = 1, - ) - - implants = list(/obj/item/implant/sad_trombone) - - backpack = /obj/item/storage/backpack/clown - satchel = /obj/item/storage/backpack/clown - duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel - - box = /obj/item/storage/box/hug/survival - - chameleon_extras = /obj/item/stamp/clown - - -/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - - H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) - -/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - - H.dna.add_mutation(CLOWNMUT) - -/* -Mime -*/ -/datum/job/mime - title = "Mime" - flag = MIME - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/mime - - access = list(ACCESS_THEATRE) - minimal_access = list(ACCESS_THEATRE) - -/datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) - H.apply_pref_name("mime", M.client) - -/datum/outfit/job/mime - name = "Mime" - jobtype = /datum/job/mime - - belt = /obj/item/pda/mime - uniform = /obj/item/clothing/under/rank/mime - mask = /obj/item/clothing/mask/gas/mime - gloves = /obj/item/clothing/gloves/color/white - head = /obj/item/clothing/head/frenchberet - suit = /obj/item/clothing/suit/suspenders - backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1) - - accessory = /obj/item/clothing/accessory/pocketprotector/cosmetology - backpack = /obj/item/storage/backpack/mime - satchel = /obj/item/storage/backpack/mime - - -/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - - if(visualsOnly) - return - - if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) - H.mind.miming = 1 - -/* -Curator -*/ -/datum/job/curator - title = "Curator" - flag = CURATOR - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/curator - - access = list(ACCESS_LIBRARY) - minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION,ACCESS_MINING_STATION) - -/datum/outfit/job/curator - name = "Curator" - jobtype = /datum/job/curator - - belt = /obj/item/pda/curator - uniform = /obj/item/clothing/under/rank/curator - l_hand = /obj/item/storage/bag/books - r_pocket = /obj/item/key/displaycase - l_pocket = /obj/item/laser_pointer - accessory = /obj/item/clothing/accessory/pocketprotector/full - backpack_contents = list( - /obj/item/melee/curator_whip = 1, - /obj/item/soapstone = 1, - /obj/item/barcodescanner = 1 - ) - - -/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - - if(visualsOnly) - return - - H.grant_all_languages(omnitongue=TRUE) -/* -Lawyer -*/ -/datum/job/lawyer - title = "Lawyer" - flag = LAWYER - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the head of personnel" - selection_color = "#dddddd" - var/lawyers = 0 //Counts lawyer amount - - outfit = /datum/outfit/job/lawyer - - access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - -/datum/outfit/job/lawyer - name = "Lawyer" - jobtype = /datum/job/lawyer - - belt = /obj/item/pda/lawyer - ears = /obj/item/radio/headset/headset_sec - uniform = /obj/item/clothing/under/lawyer/bluesuit - suit = /obj/item/clothing/suit/toggle/lawyer - shoes = /obj/item/clothing/shoes/laceup - l_hand = /obj/item/storage/briefcase/lawyer - l_pocket = /obj/item/laser_pointer - r_pocket = /obj/item/clothing/accessory/lawyers_badge - - chameleon_extras = /obj/item/stamp/law - - -/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - - var/datum/job/lawyer/J = SSjob.GetJobType(jobtype) - J.lawyers++ - if(J.lawyers>1) - uniform = /obj/item/clothing/under/lawyer/purpsuit - suit = /obj/item/clothing/suit/toggle/lawyer/purple diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm new file mode 100644 index 0000000000..d73937a604 --- /dev/null +++ b/code/modules/jobs/job_types/clown.dm @@ -0,0 +1,57 @@ +/datum/job/clown + title = "Clown" + flag = CLOWN + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#dddddd" + + outfit = /datum/outfit/job/clown + + access = list(ACCESS_THEATRE) + minimal_access = list(ACCESS_THEATRE) + + display_order = JOB_DISPLAY_ORDER_CLOWN + + +/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) + . = ..() + H.apply_pref_name("clown", M.client) + +/datum/outfit/job/clown + name = "Clown" + jobtype = /datum/job/clown + + belt = /obj/item/pda/clown + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/clown + shoes = /obj/item/clothing/shoes/clown_shoes + mask = /obj/item/clothing/mask/gas/clown_hat + l_pocket = /obj/item/bikehorn + backpack_contents = list( + /obj/item/stamp/clown = 1, + /obj/item/reagent_containers/spray/waterflower = 1, + /obj/item/reagent_containers/food/snacks/grown/banana = 1, + /obj/item/instrument/bikehorn = 1, + ) + + implants = list(/obj/item/implant/sad_trombone) + + backpack = /obj/item/storage/backpack/clown + satchel = /obj/item/storage/backpack/clown + duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel + + box = /obj/item/storage/box/hug/survival + + chameleon_extras = /obj/item/stamp/clown + +/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + + H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly. + H.dna.add_mutation(CLOWNMUT) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm new file mode 100644 index 0000000000..c213d4dffc --- /dev/null +++ b/code/modules/jobs/job_types/cook.dm @@ -0,0 +1,52 @@ +/datum/job/cook + title = "Cook" + flag = COOK + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 2 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#bbe291" + var/cooks = 0 //Counts cooks amount + + outfit = /datum/outfit/job/cook + + access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_COOK + +/datum/outfit/job/cook + name = "Cook" + jobtype = /datum/job/cook + + belt = /obj/item/pda/cook + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/chef + suit = /obj/item/clothing/suit/toggle/chef + head = /obj/item/clothing/head/chefhat + mask = /obj/item/clothing/mask/fakemoustache/italian + backpack_contents = list(/obj/item/sharpener = 1) + +/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + var/datum/job/cook/J = SSjob.GetJobType(jobtype) + if(J) // Fix for runtime caused by invalid job being passed + if(J.cooks>0)//Cooks + suit = /obj/item/clothing/suit/apron/chef + head = /obj/item/clothing/head/soft/mime + if(!visualsOnly) + J.cooks++ + +/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients) + var/chosen_box = pick(possible_boxes) + var/obj/item/storage/box/I = new chosen_box(src) + H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK) + var/datum/martial_art/cqc/under_siege/justacook = new + justacook.teach(H) + diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm new file mode 100644 index 0000000000..6199d812df --- /dev/null +++ b/code/modules/jobs/job_types/curator.dm @@ -0,0 +1,42 @@ +/datum/job/curator + title = "Curator" + flag = CURATOR + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#dddddd" + + outfit = /datum/outfit/job/curator + + access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) + minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) + + display_order = JOB_DISPLAY_ORDER_CURATOR + +/datum/outfit/job/curator + name = "Curator" + jobtype = /datum/job/curator + + shoes = /obj/item/clothing/shoes/laceup + belt = /obj/item/pda/curator + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/curator + l_hand = /obj/item/storage/bag/books + r_pocket = /obj/item/key/displaycase + l_pocket = /obj/item/laser_pointer + accessory = /obj/item/clothing/accessory/pocketprotector/full + backpack_contents = list( + /obj/item/soapstone = 1, + /obj/item/barcodescanner = 1 + ) + +/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + + if(visualsOnly) + return + + H.grant_all_languages(omnitongue=TRUE) diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm new file mode 100644 index 0000000000..29c4c3d833 --- /dev/null +++ b/code/modules/jobs/job_types/cyborg.dm @@ -0,0 +1,27 @@ +/datum/job/cyborg + title = "Cyborg" + flag = CYBORG +// auto_deadmin_role_flags = DEADMIN_POSITION_SILICON + department_flag = ENGSEC + faction = "Station" + total_positions = 0 + spawn_positions = 1 + supervisors = "your laws and the AI" //Nodrak + selection_color = "#ddffdd" + minimal_player_age = 21 + exp_requirements = 120 + exp_type = EXP_TYPE_CREW + + display_order = JOB_DISPLAY_ORDER_CYBORG + +/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source = null) + if(visualsOnly) + CRASH("dynamic preview is unsupported") + return H.Robotize(FALSE, latejoin) + +/datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) + R.updatename(M.client) + R.gender = NEUTER + +/datum/job/cyborg/radio_help_message(mob/M) + to_chat(M, "Prefix your message with :b to speak with other cyborgs and AI.") diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm new file mode 100644 index 0000000000..cfd9d5fdab --- /dev/null +++ b/code/modules/jobs/job_types/detective.dm @@ -0,0 +1,56 @@ +/datum/job/detective + title = "Detective" + flag = DETECTIVE +// auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + department_head = list("Head of Security") + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of security" + selection_color = "#ffeeee" + minimal_player_age = 7 + exp_requirements = 300 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/detective + + access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) + +// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_DETECTIVE + +/datum/outfit/job/detective + name = "Detective" + jobtype = /datum/job/detective + + belt = /obj/item/pda/detective + ears = /obj/item/radio/headset/headset_sec/alt + uniform = /obj/item/clothing/under/rank/det + neck = /obj/item/clothing/neck/tie/black + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/det_suit + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/fedora/det_hat + l_pocket = /obj/item/toy/crayon/white + r_pocket = /obj/item/lighter + backpack_contents = list(/obj/item/storage/box/evidence=1,\ + /obj/item/detective_scanner=1,\ + /obj/item/melee/classic_baton=1) + mask = /obj/item/clothing/mask/cigarette + + implants = list(/obj/item/implant/mindshield) + + chameleon_extras = list(/obj/item/gun/ballistic/revolver/detective, /obj/item/clothing/glasses/sunglasses) + +/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + var/obj/item/clothing/mask/cigarette/cig = H.wear_mask + if(istype(cig)) //Some species specfic changes can mess this up (plasmamen) + cig.light("") + + if(visualsOnly) + return + diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm deleted file mode 100644 index f28e5f1afc..0000000000 --- a/code/modules/jobs/job_types/engineering.dm +++ /dev/null @@ -1,167 +0,0 @@ -/* -Chief Engineer -*/ -/datum/job/chief_engineer - title = "Chief Engineer" - flag = CHIEF - department_head = list("Captain") - department_flag = ENGSEC - head_announce = list("Engineering") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffeeaa" - req_admin_notify = 1 - minimal_player_age = 7 - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_ENGINEERING - - outfit = /datum/outfit/job/ce - - access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EMERGENCY_STORAGE, ACCESS_EVA, - ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, - ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EMERGENCY_STORAGE, ACCESS_EVA, - ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, - ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/ce - name = "Chief Engineer" - jobtype = /datum/job/chief_engineer - - id = /obj/item/card/id/silver - belt = /obj/item/storage/belt/utility/chief/full - l_pocket = /obj/item/pda/heads/ce - ears = /obj/item/radio/headset/heads/ce - uniform = /obj/item/clothing/under/rank/chief_engineer - shoes = /obj/item/clothing/shoes/sneakers/brown - head = /obj/item/clothing/head/hardhat/white - gloves = /obj/item/clothing/gloves/color/black/ce - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1) - - backpack = /obj/item/storage/backpack/industrial - satchel = /obj/item/storage/backpack/satchel/eng - duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer - pda_slot = SLOT_L_STORE - chameleon_extras = /obj/item/stamp/ce - -/datum/outfit/job/ce/rig - name = "Chief Engineer (Hardsuit)" - - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/engine/elite - shoes = /obj/item/clothing/shoes/magboots/advance - suit_store = /obj/item/tank/internals/oxygen - glasses = /obj/item/clothing/glasses/meson/engine - gloves = /obj/item/clothing/gloves/color/yellow - head = null - internals_slot = SLOT_S_STORE - - -/* -Station Engineer -*/ -/datum/job/engineer - title = "Station Engineer" - flag = ENGINEER - department_head = list("Chief Engineer") - department_flag = ENGSEC - faction = "Station" - total_positions = 5 - spawn_positions = 5 - supervisors = "the chief engineer" - selection_color = "#fff5cc" - exp_requirements = 60 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/engineer - - access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/engineer - name = "Station Engineer" - jobtype = /datum/job/engineer - - belt = /obj/item/storage/belt/utility/full/engi - l_pocket = /obj/item/pda/engineering - ears = /obj/item/radio/headset/headset_eng - uniform = /obj/item/clothing/under/rank/engineer - shoes = /obj/item/clothing/shoes/workboots - head = /obj/item/clothing/head/hardhat - r_pocket = /obj/item/t_scanner - - backpack = /obj/item/storage/backpack/industrial - satchel = /obj/item/storage/backpack/satchel/eng - duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer - pda_slot = SLOT_L_STORE - backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) - -/datum/outfit/job/engineer/gloved - name = "Station Engineer (Gloves)" - gloves = /obj/item/clothing/gloves/color/yellow - -/datum/outfit/job/engineer/gloved/rig - name = "Station Engineer (Hardsuit)" - - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/engine - suit_store = /obj/item/tank/internals/oxygen - head = null - internals_slot = SLOT_S_STORE - - -/* -Atmospheric Technician -*/ -/datum/job/atmos - title = "Atmospheric Technician" - flag = ATMOSTECH - department_head = list("Chief Engineer") - department_flag = ENGSEC - faction = "Station" - total_positions = 3 - spawn_positions = 2 - supervisors = "the chief engineer" - selection_color = "#fff5cc" - exp_requirements = 60 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/atmos - - access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/atmos - name = "Atmospheric Technician" - jobtype = /datum/job/atmos - - belt = /obj/item/storage/belt/utility/atmostech - l_pocket = /obj/item/pda/atmos - ears = /obj/item/radio/headset/headset_eng - uniform = /obj/item/clothing/under/rank/atmospheric_technician - r_pocket = /obj/item/analyzer - - backpack = /obj/item/storage/backpack/industrial - satchel = /obj/item/storage/backpack/satchel/eng - duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer - pda_slot = SLOT_L_STORE - backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) - -/datum/outfit/job/atmos/rig - name = "Atmospheric Technician (Hardsuit)" - - mask = /obj/item/clothing/mask/gas - suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos - suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm new file mode 100644 index 0000000000..6006ff1083 --- /dev/null +++ b/code/modules/jobs/job_types/geneticist.dm @@ -0,0 +1,35 @@ +/datum/job/geneticist + title = "Geneticist" + flag = GENETICIST + department_head = list("Chief Medical Officer", "Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "the chief medical officer and research director" + selection_color = "#ffeef0" + exp_type = EXP_TYPE_CREW + exp_requirements = 60 + + outfit = /datum/outfit/job/geneticist + + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_GENETICIST + +/datum/outfit/job/geneticist + name = "Geneticist" + jobtype = /datum/job/geneticist + + belt = /obj/item/pda/geneticist + ears = /obj/item/radio/headset/headset_medsci + uniform = /obj/item/clothing/under/rank/geneticist + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/genetics + suit_store = /obj/item/flashlight/pen + + backpack = /obj/item/storage/backpack/genetics + satchel = /obj/item/storage/backpack/satchel/gen + duffelbag = /obj/item/storage/backpack/duffelbag/med + diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm new file mode 100644 index 0000000000..a5d917e1c9 --- /dev/null +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -0,0 +1,49 @@ +/datum/job/hop + title = "Head of Personnel" + flag = HOP +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + department_head = list("Captain") + department_flag = CIVILIAN + head_announce = list("Supply", "Service") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ddddff" + req_admin_notify = 1 + minimal_player_age = 10 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_SUPPLY + + outfit = /datum/outfit/job/hop + + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, + ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, + ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, + ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, + ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, + ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, + ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, + ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, + ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL + +/datum/outfit/job/hop + name = "Head of Personnel" + jobtype = /datum/job/hop + + id = /obj/item/card/id/silver + belt = /obj/item/pda/heads/hop + ears = /obj/item/radio/headset/heads/hop + uniform = /obj/item/clothing/under/rank/head_of_personnel + shoes = /obj/item/clothing/shoes/sneakers/brown + head = /obj/item/clothing/head/hopcap + backpack_contents = list(/obj/item/storage/box/ids=1,\ + /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) + + chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/hop) diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm new file mode 100644 index 0000000000..9df087c834 --- /dev/null +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -0,0 +1,67 @@ +/datum/job/hos + title = "Head of Security" + flag = HOS +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY + department_head = list("Captain") + department_flag = ENGSEC + head_announce = list("Security") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffdddd" + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 300 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_SECURITY + + outfit = /datum/outfit/job/hos +// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, + ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, + ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, + ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, + ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY + +/datum/outfit/job/hos + name = "Head of Security" + jobtype = /datum/job/hos + + id = /obj/item/card/id/silver + belt = /obj/item/pda/heads/hos + ears = /obj/item/radio/headset/heads/hos/alt + uniform = /obj/item/clothing/under/rank/head_of_security + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/armor/hos/trenchcoat + gloves = /obj/item/clothing/gloves/color/black/hos + head = /obj/item/clothing/head/HoS/beret + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + suit_store = /obj/item/gun/energy/e_gun + r_pocket = /obj/item/assembly/flash/handheld + l_pocket = /obj/item/restraints/handcuffs + backpack_contents = list(/obj/item/melee/baton/loaded=1) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/sec + box = /obj/item/storage/box/security + + implants = list(/obj/item/implant/mindshield) + + chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos) + +/datum/outfit/job/hos/hardsuit + name = "Head of Security (Hardsuit)" + + mask = /obj/item/clothing/mask/gas/sechailer + suit = /obj/item/clothing/suit/space/hardsuit/security/hos + suit_store = /obj/item/tank/internals/oxygen + backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/gun/energy/e_gun=1) + diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm new file mode 100644 index 0000000000..d0a06ca0e0 --- /dev/null +++ b/code/modules/jobs/job_types/janitor.dm @@ -0,0 +1,27 @@ +/datum/job/janitor + title = "Janitor" + flag = JANITOR + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 2 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#bbe291" + var/global/janitors = 0 + + outfit = /datum/outfit/job/janitor + + access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_JANITOR + +/datum/outfit/job/janitor + name = "Janitor" + jobtype = /datum/job/janitor + + belt = /obj/item/pda/janitor + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/janitor + backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm new file mode 100644 index 0000000000..a04f5b665c --- /dev/null +++ b/code/modules/jobs/job_types/lawyer.dm @@ -0,0 +1,47 @@ +/datum/job/lawyer + title = "Lawyer" + flag = LAWYER + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "the head of personnel" + selection_color = "#dddddd" + var/lawyers = 0 //Counts lawyer amount + + outfit = /datum/outfit/job/lawyer + + access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) + minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) + +// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_LAWYER + +/datum/outfit/job/lawyer + name = "Lawyer" + jobtype = /datum/job/lawyer + + belt = /obj/item/pda/lawyer + ears = /obj/item/radio/headset/headset_sec + uniform = /obj/item/clothing/under/lawyer/bluesuit + suit = /obj/item/clothing/suit/toggle/lawyer + shoes = /obj/item/clothing/shoes/laceup + l_hand = /obj/item/storage/briefcase/lawyer + l_pocket = /obj/item/laser_pointer + r_pocket = /obj/item/clothing/accessory/lawyers_badge + + chameleon_extras = /obj/item/stamp/law + + +/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + + var/datum/job/lawyer/J = SSjob.GetJobType(jobtype) + J.lawyers++ + if(J.lawyers>1) + uniform = /obj/item/clothing/under/lawyer/purpsuit + suit = /obj/item/clothing/suit/toggle/lawyer/purple diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm deleted file mode 100644 index 5a926f490a..0000000000 --- a/code/modules/jobs/job_types/medical.dm +++ /dev/null @@ -1,204 +0,0 @@ -/* -Chief Medical Officer -*/ -/datum/job/cmo - title = "Chief Medical Officer" - flag = CMO_JF - department_head = list("Captain") - department_flag = MEDSCI - head_announce = list("Medical") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffddf0" - req_admin_notify = 1 - minimal_player_age = 7 - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_MEDICAL - - outfit = /datum/outfit/job/cmo - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, - ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, - ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, - ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, - ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) - -/datum/outfit/job/cmo - name = "Chief Medical Officer" - jobtype = /datum/job/cmo - - id = /obj/item/card/id/silver - belt = /obj/item/pda/heads/cmo - l_pocket = /obj/item/pinpointer/crew - ears = /obj/item/radio/headset/heads/cmo - uniform = /obj/item/clothing/under/rank/chief_medical_officer - shoes = /obj/item/clothing/shoes/sneakers/brown - suit = /obj/item/clothing/suit/toggle/labcoat/cmo - l_hand = /obj/item/storage/firstaid/regular - suit_store = /obj/item/flashlight/pen - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) - - backpack = /obj/item/storage/backpack/medic - satchel = /obj/item/storage/backpack/satchel/med - duffelbag = /obj/item/storage/backpack/duffelbag/med - - chameleon_extras = list(/obj/item/gun/syringe, /obj/item/stamp/cmo) - -/datum/outfit/job/cmo/hardsuit - name = "Chief Medical Officer (Hardsuit)" - - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/medical - suit_store = /obj/item/tank/internals/oxygen - r_pocket = /obj/item/flashlight/pen - -/* -Medical Doctor -*/ -/datum/job/doctor - title = "Medical Doctor" - flag = DOCTOR - department_head = list("Chief Medical Officer") - department_flag = MEDSCI - faction = "Station" - total_positions = 5 - spawn_positions = 3 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" - - outfit = /datum/outfit/job/doctor - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/doctor - name = "Medical Doctor" - jobtype = /datum/job/doctor - - belt = /obj/item/pda/medical - ears = /obj/item/radio/headset/headset_med - uniform = /obj/item/clothing/under/rank/medical - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat - l_hand = /obj/item/storage/firstaid/regular - suit_store = /obj/item/flashlight/pen - - backpack = /obj/item/storage/backpack/medic - satchel = /obj/item/storage/backpack/satchel/med - duffelbag = /obj/item/storage/backpack/duffelbag/med - - chameleon_extras = /obj/item/gun/syringe - -/* -Chemist -*/ -/datum/job/chemist - title = "Chemist" - flag = CHEMIST - department_head = list("Chief Medical Officer") - department_flag = MEDSCI - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" - exp_type = EXP_TYPE_CREW - exp_requirements = 60 - - outfit = /datum/outfit/job/chemist - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MEDICAL, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/chemist - name = "Chemist" - jobtype = /datum/job/chemist - - glasses = /obj/item/clothing/glasses/science - belt = /obj/item/pda/chemist - ears = /obj/item/radio/headset/headset_med - uniform = /obj/item/clothing/under/rank/chemist - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/chemist - backpack = /obj/item/storage/backpack/chemistry - satchel = /obj/item/storage/backpack/satchel/chem - duffelbag = /obj/item/storage/backpack/duffelbag/med - - chameleon_extras = /obj/item/gun/syringe - -/* -Geneticist -*/ -/datum/job/geneticist - title = "Geneticist" - flag = GENETICIST - department_head = list("Chief Medical Officer", "Research Director") - department_flag = MEDSCI - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the chief medical officer and research director" - selection_color = "#ffeef0" - exp_type = EXP_TYPE_CREW - exp_requirements = 60 - - outfit = /datum/outfit/job/geneticist - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/geneticist - name = "Geneticist" - jobtype = /datum/job/geneticist - - belt = /obj/item/pda/geneticist - ears = /obj/item/radio/headset/headset_medsci - uniform = /obj/item/clothing/under/rank/geneticist - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/genetics - suit_store = /obj/item/flashlight/pen - - backpack = /obj/item/storage/backpack/genetics - satchel = /obj/item/storage/backpack/satchel/gen - duffelbag = /obj/item/storage/backpack/duffelbag/med - -/* -Virologist -*/ -/datum/job/virologist - title = "Virologist" - flag = VIROLOGIST - department_head = list("Chief Medical Officer") - department_flag = MEDSCI - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" - exp_type = EXP_TYPE_CREW - exp_requirements = 60 - - outfit = /datum/outfit/job/virologist - - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/virologist - name = "Virologist" - jobtype = /datum/job/virologist - - belt = /obj/item/pda/viro - ears = /obj/item/radio/headset/headset_med - uniform = /obj/item/clothing/under/rank/virologist - mask = /obj/item/clothing/mask/surgical - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/virologist - suit_store = /obj/item/flashlight/pen - - backpack = /obj/item/storage/backpack/virology - satchel = /obj/item/storage/backpack/satchel/vir - duffelbag = /obj/item/storage/backpack/duffelbag/med diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm new file mode 100644 index 0000000000..e3379e4be1 --- /dev/null +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -0,0 +1,35 @@ +/datum/job/doctor + title = "Medical Doctor" + flag = DOCTOR + department_head = list("Chief Medical Officer") + department_flag = MEDSCI + faction = "Station" + total_positions = 5 + spawn_positions = 3 + supervisors = "the chief medical officer" + selection_color = "#ffeef0" + + outfit = /datum/outfit/job/doctor + + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR + +/datum/outfit/job/doctor + name = "Medical Doctor" + jobtype = /datum/job/doctor + + belt = /obj/item/pda/medical + ears = /obj/item/radio/headset/headset_med + uniform = /obj/item/clothing/under/rank/medical + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat + l_hand = /obj/item/storage/firstaid/regular + suit_store = /obj/item/flashlight/pen + + backpack = /obj/item/storage/backpack/medic + satchel = /obj/item/storage/backpack/satchel/med + duffelbag = /obj/item/storage/backpack/duffelbag/med + + chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm new file mode 100644 index 0000000000..1347da7125 --- /dev/null +++ b/code/modules/jobs/job_types/mime.dm @@ -0,0 +1,49 @@ +/datum/job/mime + title = "Mime" + flag = MIME + department_head = list("Head of Personnel") + department_flag = CIVILIAN + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of personnel" + selection_color = "#dddddd" + + outfit = /datum/outfit/job/mime + + access = list(ACCESS_THEATRE) + minimal_access = list(ACCESS_THEATRE) + + display_order = JOB_DISPLAY_ORDER_MIME + +/datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) + H.apply_pref_name("mime", M.client) + +/datum/outfit/job/mime + name = "Mime" + jobtype = /datum/job/mime + + belt = /obj/item/pda/mime + ears = /obj/item/radio/headset/headset_srv + uniform = /obj/item/clothing/under/rank/mime + mask = /obj/item/clothing/mask/gas/mime + gloves = /obj/item/clothing/gloves/color/white + head = /obj/item/clothing/head/frenchberet + suit = /obj/item/clothing/suit/suspenders + backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1) + + backpack = /obj/item/storage/backpack/mime + satchel = /obj/item/storage/backpack/mime + + +/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + + if(visualsOnly) + return + + if(H.mind) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) + H.mind.miming = 1 + diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm new file mode 100644 index 0000000000..3220dd9a09 --- /dev/null +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -0,0 +1,32 @@ +/datum/job/qm + title = "Quartermaster" + flag = QUARTERMASTER + department_head = list("Captain") + department_flag = CIVILIAN +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#d7b088" + + outfit = /datum/outfit/job/quartermaster + + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + + display_order = JOB_DISPLAY_ORDER_QUARTERMASTER + +/datum/outfit/job/quartermaster + name = "Quartermaster" + jobtype = /datum/job/qm + + belt = /obj/item/pda/quartermaster + ears = /obj/item/radio/headset/headset_cargo + uniform = /obj/item/clothing/under/rank/cargo + shoes = /obj/item/clothing/shoes/sneakers/brown + glasses = /obj/item/clothing/glasses/sunglasses + l_hand = /obj/item/clipboard + + chameleon_extras = /obj/item/stamp/qm + diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm new file mode 100644 index 0000000000..2df606bd20 --- /dev/null +++ b/code/modules/jobs/job_types/research_director.dm @@ -0,0 +1,60 @@ +/datum/job/rd + title = "Research Director" + flag = RD_JF +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + department_head = list("Captain") + department_flag = MEDSCI + head_announce = list("Science") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffddff" + req_admin_notify = 1 + minimal_player_age = 7 + exp_type_department = EXP_TYPE_SCIENCE + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/rd + + access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, + ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, + ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, + ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, + ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, + ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, + ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + + display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR + +/datum/outfit/job/rd + name = "Research Director" + jobtype = /datum/job/rd + + id = /obj/item/card/id/silver + belt = /obj/item/pda/heads/rd + ears = /obj/item/radio/headset/heads/rd + uniform = /obj/item/clothing/under/rank/research_director + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/toggle/labcoat + l_hand = /obj/item/clipboard + l_pocket = /obj/item/laser_pointer + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1) + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + + chameleon_extras = /obj/item/stamp/rd + +/datum/outfit/job/rd/rig + name = "Research Director (Hardsuit)" + + l_hand = null + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/hardsuit/rd + suit_store = /obj/item/tank/internals/oxygen + internals_slot = SLOT_S_STORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm new file mode 100644 index 0000000000..ef3c1277a1 --- /dev/null +++ b/code/modules/jobs/job_types/roboticist.dm @@ -0,0 +1,34 @@ +/datum/job/roboticist + title = "Roboticist" + flag = ROBOTICIST + department_head = list("Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "the research director" + selection_color = "#ffeeff" + exp_requirements = 60 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/roboticist + + access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) + minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_ROBOTICIST + +/datum/outfit/job/roboticist + name = "Roboticist" + jobtype = /datum/job/roboticist + + belt = /obj/item/storage/belt/utility/full + l_pocket = /obj/item/pda/roboticist + ears = /obj/item/radio/headset/headset_sci + uniform = /obj/item/clothing/under/rank/roboticist + suit = /obj/item/clothing/suit/toggle/labcoat + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + + pda_slot = SLOT_L_STORE diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm deleted file mode 100644 index 6a14f204a3..0000000000 --- a/code/modules/jobs/job_types/science.dm +++ /dev/null @@ -1,131 +0,0 @@ -/* -Research Director -*/ -/datum/job/rd - title = "Research Director" - flag = RD_JF - department_head = list("Captain") - department_flag = MEDSCI - head_announce = list("Science") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffddff" - req_admin_notify = 1 - minimal_player_age = 7 - exp_type_department = EXP_TYPE_SCIENCE - exp_requirements = 180 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/rd - - access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, - ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, - ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, - ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, - ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) - minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, - ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, - ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, - ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, - ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) - -/datum/outfit/job/rd - name = "Research Director" - jobtype = /datum/job/rd - - id = /obj/item/card/id/silver - belt = /obj/item/pda/heads/rd - ears = /obj/item/radio/headset/heads/rd - uniform = /obj/item/clothing/under/rank/research_director - shoes = /obj/item/clothing/shoes/sneakers/brown - suit = /obj/item/clothing/suit/toggle/labcoat - l_hand = /obj/item/clipboard - l_pocket = /obj/item/laser_pointer - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1) - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/tox - - chameleon_extras = /obj/item/stamp/rd - -/datum/outfit/job/rd/rig - name = "Research Director (Hardsuit)" - - l_hand = null - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/rd - suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE - -/* -Scientist -*/ -/datum/job/scientist - title = "Scientist" - flag = SCIENTIST - department_head = list("Research Director") - department_flag = MEDSCI - faction = "Station" - total_positions = 5 - spawn_positions = 3 - supervisors = "the research director" - selection_color = "#ffeeff" - exp_requirements = 60 - exp_type = EXP_TYPE_CREW - - - outfit = /datum/outfit/job/scientist - - access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS) - minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/scientist - name = "Scientist" - jobtype = /datum/job/scientist - - belt = /obj/item/pda/toxins - ears = /obj/item/radio/headset/headset_sci - uniform = /obj/item/clothing/under/rank/scientist - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/science - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/tox - -/* -Roboticist -*/ -/datum/job/roboticist - title = "Roboticist" - flag = ROBOTICIST - department_head = list("Research Director") - department_flag = MEDSCI - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the research director" - selection_color = "#ffeeff" - exp_requirements = 60 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/roboticist - - access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) - minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/roboticist - name = "Roboticist" - jobtype = /datum/job/roboticist - - belt = /obj/item/storage/belt/utility/full - l_pocket = /obj/item/pda/roboticist - ears = /obj/item/radio/headset/headset_sci - uniform = /obj/item/clothing/under/rank/roboticist - suit = /obj/item/clothing/suit/toggle/labcoat - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/tox - - pda_slot = SLOT_L_STORE diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm new file mode 100644 index 0000000000..e3f04f0b29 --- /dev/null +++ b/code/modules/jobs/job_types/scientist.dm @@ -0,0 +1,33 @@ +/datum/job/scientist + title = "Scientist" + flag = SCIENTIST + department_head = list("Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 5 + spawn_positions = 3 + supervisors = "the research director" + selection_color = "#ffeeff" + exp_requirements = 60 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/scientist + + access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS) + minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_SCIENTIST + +/datum/outfit/job/scientist + name = "Scientist" + jobtype = /datum/job/scientist + + belt = /obj/item/pda/toxins + ears = /obj/item/radio/headset/headset_sci + uniform = /obj/item/clothing/under/rank/scientist + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/science + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm deleted file mode 100644 index e7e0922f62..0000000000 --- a/code/modules/jobs/job_types/security.dm +++ /dev/null @@ -1,334 +0,0 @@ -//Warden and regular officers add this result to their get_access() -/datum/job/proc/check_config_for_sec_maint() - if(CONFIG_GET(flag/security_has_maint_access)) - return list(ACCESS_MAINT_TUNNELS) - return list() - -/* -Head of Security -*/ -/datum/job/hos - title = "Head of Security" - flag = HOS - department_head = list("Captain") - department_flag = ENGSEC - head_announce = list("Security") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffdddd" - req_admin_notify = 1 - minimal_player_age = 14 - exp_requirements = 300 - exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_SECURITY - - outfit = /datum/outfit/job/hos - - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, - ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, - ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, - ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, - ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/hos - name = "Head of Security" - jobtype = /datum/job/hos - - id = /obj/item/card/id/silver - belt = /obj/item/pda/heads/hos - ears = /obj/item/radio/headset/heads/hos/alt - uniform = /obj/item/clothing/under/rank/head_of_security - shoes = /obj/item/clothing/shoes/jackboots - suit = /obj/item/clothing/suit/armor/hos/trenchcoat - gloves = /obj/item/clothing/gloves/color/black/hos - head = /obj/item/clothing/head/HoS/beret - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - suit_store = /obj/item/gun/energy/e_gun - r_pocket = /obj/item/assembly/flash/handheld - l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) - - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel/sec - duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security - - implants = list(/obj/item/implant/mindshield) - - chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos) - -/datum/outfit/job/hos/hardsuit - name = "Head of Security (Hardsuit)" - - mask = /obj/item/clothing/mask/gas/sechailer - suit = /obj/item/clothing/suit/space/hardsuit/security/hos - suit_store = /obj/item/tank/internals/oxygen - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/gun/energy/e_gun=1) - -/* -Warden -*/ -/datum/job/warden - title = "Warden" - flag = WARDEN - department_head = list("Head of Security") - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of security" - selection_color = "#ffeeee" - minimal_player_age = 7 - exp_requirements = 300 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/warden - - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS() - -/datum/job/warden/get_access() - var/list/L = list() - L = ..() | check_config_for_sec_maint() - return L - -/datum/outfit/job/warden - name = "Warden" - jobtype = /datum/job/warden - - belt = /obj/item/pda/warden - ears = /obj/item/radio/headset/headset_sec/alt - uniform = /obj/item/clothing/under/rank/warden - shoes = /obj/item/clothing/shoes/jackboots - suit = /obj/item/clothing/suit/armor/vest/warden/alt - gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/warden - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - r_pocket = /obj/item/assembly/flash/handheld - l_pocket = /obj/item/restraints/handcuffs - suit_store = /obj/item/gun/energy/e_gun/advtaser - backpack_contents = list(/obj/item/melee/baton/loaded=1) - - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel/sec - duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security - - implants = list(/obj/item/implant/mindshield) - - chameleon_extras = /obj/item/gun/ballistic/shotgun/automatic/combat/compact - -/* -Detective -*/ -/datum/job/detective - title = "Detective" - flag = DETECTIVE - department_head = list("Head of Security") - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of security" - selection_color = "#ffeeee" - minimal_player_age = 7 - exp_requirements = 300 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/detective - - access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/detective - name = "Detective" - jobtype = /datum/job/detective - - belt = /obj/item/pda/detective - ears = /obj/item/radio/headset/headset_sec/alt - uniform = /obj/item/clothing/under/rank/det - shoes = /obj/item/clothing/shoes/sneakers/brown - suit = /obj/item/clothing/suit/det_suit - gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/fedora/det_hat - l_pocket = /obj/item/toy/crayon/white - r_pocket = /obj/item/lighter - backpack_contents = list(/obj/item/storage/box/evidence=1,\ - /obj/item/detective_scanner=1,\ - /obj/item/melee/classic_baton=1) - mask = /obj/item/clothing/mask/cigarette - - implants = list(/obj/item/implant/mindshield) - - chameleon_extras = list(/obj/item/gun/ballistic/revolver/detective, /obj/item/clothing/glasses/sunglasses) - -/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - var/obj/item/clothing/mask/cigarette/cig = H.wear_mask - if(istype(cig)) //Some species specfic changes can mess this up (plasmamen) - cig.light("") - - if(visualsOnly) - return - -/* -Security Officer -*/ -/datum/job/officer - title = "Security Officer" - flag = OFFICER - department_head = list("Head of Security") - department_flag = ENGSEC - faction = "Station" - total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() - spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() - supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#ffeeee" - minimal_player_age = 7 - exp_requirements = 300 - exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/security - - access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS() - - -/datum/job/officer/get_access() - var/list/L = list() - L |= ..() | check_config_for_sec_maint() - return L - -GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) - -/datum/job/officer/after_spawn(mob/living/carbon/human/H, mob/M) - // Assign department security - var/department - if(M && M.client && M.client.prefs) - department = M.client.prefs.prefered_security_department - if(!LAZYLEN(GLOB.available_depts) || department == "None") - return - else if(department in GLOB.available_depts) - LAZYREMOVE(GLOB.available_depts, department) - else - department = pick_n_take(GLOB.available_depts) - var/ears = null - var/accessory = null - var/list/dep_access = null - var/destination = null - var/spawn_point = null - switch(department) - if(SEC_DEPT_SUPPLY) - ears = /obj/item/radio/headset/headset_sec/alt/department/supply - dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION) - destination = /area/security/checkpoint/supply - spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/cargo - if(SEC_DEPT_ENGINEERING) - ears = /obj/item/radio/headset/headset_sec/alt/department/engi - dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE) - destination = /area/security/checkpoint/engineering - spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/engine - if(SEC_DEPT_MEDICAL) - ears = /obj/item/radio/headset/headset_sec/alt/department/med - dep_access = list(ACCESS_MEDICAL) - destination = /area/security/checkpoint/medical - spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/medblue - if(SEC_DEPT_SCIENCE) - ears = /obj/item/radio/headset/headset_sec/alt/department/sci - dep_access = list(ACCESS_RESEARCH) - destination = /area/security/checkpoint/science - spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns - accessory = /obj/item/clothing/accessory/armband/science - - if(accessory) - var/obj/item/clothing/under/U = H.w_uniform - U.attach_accessory(new accessory) - if(ears) - if(H.ears) - qdel(H.ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS) - - var/obj/item/card/id/W = H.wear_id - W.access |= dep_access - - var/teleport = 0 - if(!CONFIG_GET(flag/sec_start_brig)) - if(destination || spawn_point) - teleport = 1 - if(teleport) - var/turf/T - if(spawn_point) - T = get_turf(spawn_point) - H.Move(T) - else - var/safety = 0 - while(safety < 25) - T = safepick(get_area_turfs(destination)) - if(T && !H.Move(T)) - safety += 1 - continue - else - break - if(department) - to_chat(M, "You have been assigned to [department]!") - else - to_chat(M, "You have not been assigned to any department. Patrol the halls and help where needed.") - - - -/datum/outfit/job/security - name = "Security Officer" - jobtype = /datum/job/officer - - belt = /obj/item/pda/security - ears = /obj/item/radio/headset/headset_sec/alt - uniform = /obj/item/clothing/under/rank/security - gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/helmet/sec - suit = /obj/item/clothing/suit/armor/vest/alt - shoes = /obj/item/clothing/shoes/jackboots - l_pocket = /obj/item/restraints/handcuffs - r_pocket = /obj/item/assembly/flash/handheld - suit_store = /obj/item/gun/energy/e_gun/advtaser - backpack_contents = list(/obj/item/melee/baton/loaded=1) - - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel/sec - duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security - - implants = list(/obj/item/implant/mindshield) - - chameleon_extras = list(/obj/item/gun/energy/e_gun/advtaser, /obj/item/clothing/glasses/hud/security/sunglasses, /obj/item/clothing/head/helmet) - //The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state - - -/obj/item/radio/headset/headset_sec/alt/department/Initialize() - . = ..() - wires = new/datum/wires/radio(src) - secure_radio_connections = new - recalculateChannels() - -/obj/item/radio/headset/headset_sec/alt/department/engi - keyslot = new /obj/item/encryptionkey/headset_sec - keyslot2 = new /obj/item/encryptionkey/headset_eng - -/obj/item/radio/headset/headset_sec/alt/department/supply - keyslot = new /obj/item/encryptionkey/headset_sec - keyslot2 = new /obj/item/encryptionkey/headset_cargo - -/obj/item/radio/headset/headset_sec/alt/department/med - keyslot = new /obj/item/encryptionkey/headset_sec - keyslot2 = new /obj/item/encryptionkey/headset_med - -/obj/item/radio/headset/headset_sec/alt/department/sci - keyslot = new /obj/item/encryptionkey/headset_sec - keyslot2 = new /obj/item/encryptionkey/headset_sci diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm new file mode 100644 index 0000000000..98ec759db8 --- /dev/null +++ b/code/modules/jobs/job_types/security_officer.dm @@ -0,0 +1,158 @@ +/datum/job/officer + title = "Security Officer" + flag = OFFICER +// auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + department_head = list("Head of Security") + department_flag = ENGSEC + faction = "Station" + total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() + spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() + supervisors = "the head of security, and the head of your assigned department (if applicable)" + selection_color = "#ffeeee" + minimal_player_age = 7 + exp_requirements = 300 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/security + + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() + +// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER + +/datum/job/officer/get_access() + var/list/L = list() + L |= ..() | check_config_for_sec_maint() + return L + +GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) + +/datum/job/officer/after_spawn(mob/living/carbon/human/H, mob/M) + . = ..() + // Assign department security + var/department + if(M && M.client && M.client.prefs) + department = M.client.prefs.prefered_security_department + if(!LAZYLEN(GLOB.available_depts) || department == "None") + return + else if(department in GLOB.available_depts) + LAZYREMOVE(GLOB.available_depts, department) + else + department = pick_n_take(GLOB.available_depts) + var/ears = null + var/accessory = null + var/list/dep_access = null + var/destination = null + var/spawn_point = null + switch(department) + if(SEC_DEPT_SUPPLY) + ears = /obj/item/radio/headset/headset_sec/alt/department/supply + dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_CARGO) + destination = /area/security/checkpoint/supply + spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/cargo + if(SEC_DEPT_ENGINEERING) + ears = /obj/item/radio/headset/headset_sec/alt/department/engi + dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE, ACCESS_ATMOSPHERICS) + destination = /area/security/checkpoint/engineering + spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/engine + if(SEC_DEPT_MEDICAL) + ears = /obj/item/radio/headset/headset_sec/alt/department/med + dep_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING) + destination = /area/security/checkpoint/medical + spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/medblue + if(SEC_DEPT_SCIENCE) + ears = /obj/item/radio/headset/headset_sec/alt/department/sci + dep_access = list(ACCESS_RESEARCH, ACCESS_TOX) + destination = /area/security/checkpoint/science + spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns + accessory = /obj/item/clothing/accessory/armband/science + + if(accessory) + var/obj/item/clothing/under/U = H.w_uniform + U.attach_accessory(new accessory) + if(ears) + if(H.ears) + qdel(H.ears) + H.equip_to_slot_or_del(new ears(H),SLOT_EARS) + + var/obj/item/card/id/W = H.wear_id + W.access |= dep_access + + var/teleport = 0 + if(!CONFIG_GET(flag/sec_start_brig)) + if(destination || spawn_point) + teleport = 1 + if(teleport) + var/turf/T + if(spawn_point) + T = get_turf(spawn_point) + H.Move(T) + else + var/safety = 0 + while(safety < 25) + T = safepick(get_area_turfs(destination)) + if(T && !H.Move(T)) + safety += 1 + continue + else + break + if(department) + to_chat(M, "You have been assigned to [department]!") + else + to_chat(M, "You have not been assigned to any department. Patrol the halls and help where needed.") + + + +/datum/outfit/job/security + name = "Security Officer" + jobtype = /datum/job/officer + + belt = /obj/item/pda/security + ears = /obj/item/radio/headset/headset_sec/alt + uniform = /obj/item/clothing/under/rank/security + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/helmet/sec + suit = /obj/item/clothing/suit/armor/vest/alt + shoes = /obj/item/clothing/shoes/jackboots + l_pocket = /obj/item/restraints/handcuffs + r_pocket = /obj/item/assembly/flash/handheld + suit_store = /obj/item/gun/energy/disabler + backpack_contents = list(/obj/item/melee/baton/loaded=1) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/sec + box = /obj/item/storage/box/security + + implants = list(/obj/item/implant/mindshield) + + chameleon_extras = list(/obj/item/gun/energy/disabler, /obj/item/clothing/glasses/hud/security/sunglasses, /obj/item/clothing/head/helmet) + //The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state + + +/obj/item/radio/headset/headset_sec/alt/department/Initialize() + . = ..() + wires = new/datum/wires/radio(src) + secure_radio_connections = new + recalculateChannels() + +/obj/item/radio/headset/headset_sec/alt/department/engi + keyslot = new /obj/item/encryptionkey/headset_sec + keyslot2 = new /obj/item/encryptionkey/headset_eng + +/obj/item/radio/headset/headset_sec/alt/department/supply + keyslot = new /obj/item/encryptionkey/headset_sec + keyslot2 = new /obj/item/encryptionkey/headset_cargo + +/obj/item/radio/headset/headset_sec/alt/department/med + keyslot = new /obj/item/encryptionkey/headset_sec + keyslot2 = new /obj/item/encryptionkey/headset_med + +/obj/item/radio/headset/headset_sec/alt/department/sci + keyslot = new /obj/item/encryptionkey/headset_sec + keyslot2 = new /obj/item/encryptionkey/headset_sci diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm new file mode 100644 index 0000000000..59d29954fd --- /dev/null +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -0,0 +1,70 @@ +/datum/job/mining + title = "Shaft Miner" + flag = MINER + department_head = list("Quartermaster") + department_flag = CIVILIAN + faction = "Station" + total_positions = 3 + spawn_positions = 3 + supervisors = "the quartermaster" + selection_color = "#dcba97" + + outfit = /datum/outfit/job/miner + + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_SHAFT_MINER + +/datum/outfit/job/miner + name = "Shaft Miner" + jobtype = /datum/job/mining + + belt = /obj/item/pda/shaftminer + ears = /obj/item/radio/headset/headset_cargo/mining + shoes = /obj/item/clothing/shoes/workboots/mining + gloves = /obj/item/clothing/gloves/color/black + uniform = /obj/item/clothing/under/rank/miner/lavaland + l_pocket = /obj/item/reagent_containers/hypospray/medipen/survival + r_pocket = /obj/item/storage/bag/ore //causes issues if spawned in backpack + backpack_contents = list( + /obj/item/flashlight/seclite=1,\ + /obj/item/kitchen/knife/combat/survival=1,\ + /obj/item/mining_voucher=1,\ + /obj/item/stack/marker_beacon/ten=1) + + backpack = /obj/item/storage/backpack/explorer + satchel = /obj/item/storage/backpack/satchel/explorer + duffelbag = /obj/item/storage/backpack/duffelbag + box = /obj/item/storage/box/survival_mining + + chameleon_extras = /obj/item/gun/energy/kinetic_accelerator + +/datum/outfit/job/miner/equipped + name = "Shaft Miner (Equipment)" + suit = /obj/item/clothing/suit/hooded/explorer + mask = /obj/item/clothing/mask/gas/explorer + glasses = /obj/item/clothing/glasses/meson + suit_store = /obj/item/tank/internals/oxygen + internals_slot = SLOT_S_STORE + backpack_contents = list( + /obj/item/flashlight/seclite=1,\ + /obj/item/kitchen/knife/combat/survival=1, + /obj/item/mining_voucher=1, + /obj/item/t_scanner/adv_mining_scanner/lesser=1, + /obj/item/gun/energy/kinetic_accelerator=1,\ + /obj/item/stack/marker_beacon/ten=1) + +/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + if(istype(H.wear_suit, /obj/item/clothing/suit/hooded)) + var/obj/item/clothing/suit/hooded/S = H.wear_suit + S.ToggleHood() + +/datum/outfit/job/miner/equipped/hardsuit + name = "Shaft Miner (Equipment + Hardsuit)" + suit = /obj/item/clothing/suit/space/hardsuit/mining + mask = /obj/item/clothing/mask/breath + diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm new file mode 100644 index 0000000000..4a2a2c7fd2 --- /dev/null +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -0,0 +1,54 @@ +/datum/job/engineer + title = "Station Engineer" + flag = ENGINEER + department_head = list("Chief Engineer") + department_flag = ENGSEC + faction = "Station" + total_positions = 5 + spawn_positions = 5 + supervisors = "the chief engineer" + selection_color = "#fff5cc" + exp_requirements = 60 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/engineer + + access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER + +/datum/outfit/job/engineer + name = "Station Engineer" + jobtype = /datum/job/engineer + + belt = /obj/item/storage/belt/utility/full/engi + l_pocket = /obj/item/pda/engineering + ears = /obj/item/radio/headset/headset_eng + uniform = /obj/item/clothing/under/rank/engineer + shoes = /obj/item/clothing/shoes/workboots + head = /obj/item/clothing/head/hardhat + r_pocket = /obj/item/t_scanner + + backpack = /obj/item/storage/backpack/industrial + satchel = /obj/item/storage/backpack/satchel/eng + duffelbag = /obj/item/storage/backpack/duffelbag/engineering + box = /obj/item/storage/box/engineer + pda_slot = SLOT_L_STORE + backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) + +/datum/outfit/job/engineer/gloved + name = "Station Engineer (Gloves)" + gloves = /obj/item/clothing/gloves/color/yellow + +/datum/outfit/job/engineer/gloved/rig + name = "Station Engineer (Hardsuit)" + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/hardsuit/engine + suit_store = /obj/item/tank/internals/oxygen + head = null + internals_slot = SLOT_S_STORE + + diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm new file mode 100644 index 0000000000..26f38e594b --- /dev/null +++ b/code/modules/jobs/job_types/virologist.dm @@ -0,0 +1,35 @@ +/datum/job/virologist + title = "Virologist" + flag = VIROLOGIST + department_head = list("Chief Medical Officer") + department_flag = MEDSCI + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the chief medical officer" + selection_color = "#ffeef0" + exp_type = EXP_TYPE_CREW + exp_requirements = 60 + + outfit = /datum/outfit/job/virologist + + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) + + display_order = JOB_DISPLAY_ORDER_VIROLOGIST + +/datum/outfit/job/virologist + name = "Virologist" + jobtype = /datum/job/virologist + + belt = /obj/item/pda/viro + ears = /obj/item/radio/headset/headset_med + uniform = /obj/item/clothing/under/rank/virologist + mask = /obj/item/clothing/mask/surgical + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/virologist + suit_store = /obj/item/flashlight/pen + + backpack = /obj/item/storage/backpack/virology + satchel = /obj/item/storage/backpack/satchel/vir + duffelbag = /obj/item/storage/backpack/duffelbag/med diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm new file mode 100644 index 0000000000..b70281f099 --- /dev/null +++ b/code/modules/jobs/job_types/warden.dm @@ -0,0 +1,55 @@ +/datum/job/warden + title = "Warden" + flag = WARDEN +// auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + department_head = list("Head of Security") + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the head of security" + selection_color = "#ffeeee" + minimal_player_age = 7 + exp_requirements = 300 + exp_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/warden + + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access() + +// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_WARDEN + +/datum/job/warden/get_access() + var/list/L = list() + L = ..() | check_config_for_sec_maint() + return L + +/datum/outfit/job/warden + name = "Warden" + jobtype = /datum/job/warden + + belt = /obj/item/pda/warden + ears = /obj/item/radio/headset/headset_sec/alt + uniform = /obj/item/clothing/under/rank/warden + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/armor/vest/warden/alt + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/warden + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + r_pocket = /obj/item/assembly/flash/handheld + l_pocket = /obj/item/restraints/handcuffs + suit_store = /obj/item/gun/energy/disabler + backpack_contents = list(/obj/item/melee/baton/loaded=1) + + backpack = /obj/item/storage/backpack/security + satchel = /obj/item/storage/backpack/satchel/sec + duffelbag = /obj/item/storage/backpack/duffelbag/sec + box = /obj/item/storage/box/security + + implants = list(/obj/item/implant/mindshield) + + chameleon_extras = /obj/item/gun/ballistic/shotgun/automatic/combat/compact + diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 84be6438c0..9bd37cf171 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -13,8 +13,12 @@ canmove = FALSE anchored = TRUE // don't get pushed around + var/mob/living/new_character //for instant transfer once the round is set up + //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles + var/ineligible_for_roles = FALSE + /mob/dead/new_player/Initialize() if(client && SSticker.state == GAME_STATE_STARTUP) var/obj/screen/splash/S = new(client, TRUE, TRUE) @@ -33,8 +37,7 @@ return /mob/dead/new_player/proc/new_player_panel() - var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" - output += "

Setup Character

" + var/output = "

Setup Character

" if(SSticker.current_state <= GAME_STATE_PREGAME) switch(ready) @@ -75,7 +78,7 @@ var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 250, 265) popup.set_window_options("can_close=0") popup.set_content(output) - popup.open(0) + popup.open(FALSE) /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) @@ -429,8 +432,7 @@ /mob/dead/new_player/proc/LateChoices() - var/dat = "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" - + var/list/dat = list("
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
") if(SSshuttle.emergency) switch(SSshuttle.emergency.mode) if(SHUTTLE_ESCAPE) @@ -438,57 +440,49 @@ if(SHUTTLE_CALL) if(!SSshuttle.canRecall()) dat += "
The station is currently undergoing evacuation procedures.

" + for(var/datum/job/prioritized_job in SSjob.prioritized_jobs) + if(prioritized_job.current_positions >= prioritized_job.total_positions) + SSjob.prioritized_jobs -= prioritized_job + dat += "
" + var/column_counter = 0 + for(var/list/category in list(GLOB.command_positions) + list(GLOB.engineering_positions) + list(GLOB.supply_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) + var/cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color + dat += "
" + dat += "[SSjob.name_occupations[category[1]].exp_type_department]" + var/list/dept_dat = list() + for(var/job in category) + var/datum/job/job_datum = SSjob.name_occupations[job] + if(job_datum && IsJobUnavailable(job_datum.title, TRUE) == JOB_AVAILABLE) + var/command_bold = "" + if(job in GLOB.command_positions) + command_bold = " command" + if(job_datum in SSjob.prioritized_jobs) + dept_dat += "[job_datum.title] ([job_datum.current_positions])" + else + dept_dat += "[job_datum.title] ([job_datum.current_positions])" + if(!dept_dat.len) + dept_dat += "No positions open." + dat += jointext(dept_dat, "") + dat += "

" + column_counter++ + if(column_counter > 0 && (column_counter % 3 == 0)) + dat += "
" + dat += "
" + dat += "" - var/available_job_count = 0 - for(var/datum/job/job in SSjob.occupations) - if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE) - available_job_count++ + var/available_ghosts = 0 for(var/spawner in GLOB.mob_spawners) - available_job_count++ + available_ghosts++ break - if(!available_job_count) - dat += "
There are currently no open positions!
" - + if(!available_ghosts) + dat += "
There are currently no open ghost spawners.
" else - dat += "
Choose from the following open positions:

" - var/list/categorizedJobs = list( - "Command" = list(jobs = list(), titles = GLOB.command_positions, color = "#aac1ee"), - "Engineering" = list(jobs = list(), titles = GLOB.engineering_positions, color = "#ffd699"), - "Supply" = list(jobs = list(), titles = GLOB.supply_positions, color = "#ead4ae"), - "Miscellaneous" = list(jobs = list(), titles = list(), color = "#ffffff", colBreak = TRUE), - "Ghost Role" = list(jobs = list(), titles = GLOB.mob_spawners, color = "#ffffff"), - "Synthetic" = list(jobs = list(), titles = GLOB.nonhuman_positions, color = "#ccffcc"), - "Service" = list(jobs = list(), titles = GLOB.civilian_positions, color = "#cccccc"), - "Medical" = list(jobs = list(), titles = GLOB.medical_positions, color = "#99ffe6", colBreak = TRUE), - "Science" = list(jobs = list(), titles = GLOB.science_positions, color = "#e6b3e6"), - "Security" = list(jobs = list(), titles = GLOB.security_positions, color = "#ff9999"), - ) + dat += "
Currently open Ghost roles:

" + var/list/categorizedJobs = list("Ghost Role" = list(jobs = list(), titles = GLOB.mob_spawners, color = "#ffffff")) for(var/spawner in GLOB.mob_spawners) categorizedJobs["Ghost Role"]["jobs"] += spawner - for(var/datum/job/job in SSjob.occupations) - if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE) - var/categorized = FALSE - for(var/jobcat in categorizedJobs) - var/list/jobs = categorizedJobs[jobcat]["jobs"] - if(job.title in categorizedJobs[jobcat]["titles"]) - categorized = TRUE - if(jobcat == "Command") - - if(job.title == "Captain") // Put captain at top of command jobs - jobs.Insert(1, job) - else - jobs += job - else // Put heads at top of non-command jobs - if(job.title in GLOB.command_positions) - jobs.Insert(1, job) - else - jobs += job - if(!categorized) - categorizedJobs["Miscellaneous"]["jobs"] += job - - dat += "
" for(var/jobcat in categorizedJobs) if(categorizedJobs[jobcat]["colBreak"]) @@ -498,16 +492,6 @@ var/color = categorizedJobs[jobcat]["color"] dat += "
" dat += "[jobcat]" - for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - var/position_class = "otherPosition" - if(job.title in GLOB.command_positions) - position_class = "commandPosition" - if(job in SSjob.prioritized_jobs) - dat += "[job.title] ([job.current_positions])" - else - dat += "[job.title] ([job.current_positions])" - categorizedJobs[jobcat]["jobs"] -= job - for(var/spawner in categorizedJobs[jobcat]["jobs"]) dat += "[spawner]" @@ -515,16 +499,11 @@ dat += "
" dat += "" - // Removing the old window method but leaving it here for reference - //src << browse(dat, "window=latechoices;size=300x640;can_close=1") - - // Added the new browser window method var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 680, 580) popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') - popup.set_content(dat) + popup.set_content(jointext(dat, "")) popup.open(FALSE) // FALSE is passed to open so that it doesn't use the onclose() proc - /mob/dead/new_player/proc/create_character(transfer_after) spawning = 1 close_spawn_windows() @@ -533,7 +512,7 @@ var/frn = CONFIG_GET(flag/force_random_names) if(!frn) - frn = jobban_isbanned(src, "appearance") + frn = jobban_isbanned(src, "Appearance") if(QDELETED(src)) return if(frn) @@ -580,3 +559,31 @@ src << browse(null, "window=preferences") //closes job selection src << browse(null, "window=mob_occupation") src << browse(null, "window=latechoices") //closes late job selection + +/* Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. + A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled + Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" + Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role + This also does some admin notification and logging as well, as well as some extra logic to make sure things don't go wrong +*/ + +/mob/dead/new_player/proc/check_preferences() + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.joblessrole != RETURNTOLOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + var/has_antags = FALSE + if(client.prefs.be_special.len > 0) + has_antags = TRUE + if(client.prefs.job_preferences.len == 0) + if(!ineligible_for_roles) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + ineligible_for_roles = TRUE + ready = PLAYER_NOT_READY + if(has_antags) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 353df3aa66..e15ef482a4 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -21,50 +21,35 @@ age = rand(AGE_MIN,AGE_MAX) /datum/preferences/proc/update_preview_icon() - // Silicons only need a very basic preview since there is no customization for them. -// var/wide_icon = FALSE //CITDEL THINGS -// if(features["taur"] != "None") -// wide_icon = TRUE - if(job_engsec_high) - switch(job_engsec_high) - if(AI_JF) - parent.show_character_previews(image('icons/mob/ai.dmi', resolve_ai_icon(preferred_ai_core_display), dir = SOUTH)) - return - if(CYBORG) - parent.show_character_previews(image('icons/mob/robots.dmi', icon_state = "robot", dir = SOUTH)) - return + // Determine what job is marked as 'High' priority, and dress them up as such. + var/datum/job/previewJob + var/highest_pref = 0 + for(var/job in job_preferences) + if(job_preferences[job] > highest_pref) + previewJob = SSjob.GetJob(job) + highest_pref = job_preferences[job] + + if(previewJob) + // Silicons only need a very basic preview since there is no customization for them. + if(istype(previewJob,/datum/job/ai)) + parent.show_character_previews(image('icons/mob/ai.dmi', icon_state = resolve_ai_icon(preferred_ai_core_display), dir = SOUTH)) + return + if(istype(previewJob,/datum/job/cyborg)) + parent.show_character_previews(image('icons/mob/robots.dmi', icon_state = "robot", dir = SOUTH)) + return // Set up the dummy for its photoshoot var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) mannequin.cut_overlays() + // Apply the Dummy's preview background first so we properly layer everything else on top of it. mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER)) copy_to(mannequin) - // Determine what job is marked as 'High' priority, and dress them up as such. - var/datum/job/previewJob - var/highRankFlag = job_civilian_high | job_medsci_high | job_engsec_high - - if(job_civilian_low & ASSISTANT) - previewJob = SSjob.GetJob("Assistant") - else if(highRankFlag) - var/highDeptFlag - if(job_civilian_high) - highDeptFlag = CIVILIAN - else if(job_medsci_high) - highDeptFlag = MEDSCI - else if(job_engsec_high) - highDeptFlag = ENGSEC - - for(var/datum/job/job in SSjob.occupations) - if(job.flag == highRankFlag && job.department_flag == highDeptFlag) - previewJob = job - break - if(previewJob) - if(current_tab != 2) - mannequin.job = previewJob.title - previewJob.equip(mannequin, TRUE) + mannequin.job = previewJob.title + previewJob.equip(mannequin, TRUE, preference_source = parent) COMPILE_OVERLAYS(mannequin) parent.show_character_previews(new /mutable_appearance(mannequin)) unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) + diff --git a/tgstation.dme b/tgstation.dme index 0fbefaa7b8..341497cb5c 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1767,17 +1767,39 @@ #include "code\modules\jobs\access.dm" #include "code\modules\jobs\job_exp.dm" #include "code\modules\jobs\jobs.dm" +#include "code\modules\jobs\job_types\_job.dm" +#include "code\modules\jobs\job_types\ai.dm" #include "code\modules\jobs\job_types\assistant.dm" +#include "code\modules\jobs\job_types\atmospheric_technician.dm" +#include "code\modules\jobs\job_types\bartender.dm" +#include "code\modules\jobs\job_types\botanist.dm" #include "code\modules\jobs\job_types\captain.dm" -#include "code\modules\jobs\job_types\cargo_service.dm" -#include "code\modules\jobs\job_types\civilian.dm" -#include "code\modules\jobs\job_types\civilian_chaplain.dm" -#include "code\modules\jobs\job_types\engineering.dm" -#include "code\modules\jobs\job_types\job.dm" -#include "code\modules\jobs\job_types\medical.dm" -#include "code\modules\jobs\job_types\science.dm" -#include "code\modules\jobs\job_types\security.dm" -#include "code\modules\jobs\job_types\silicon.dm" +#include "code\modules\jobs\job_types\cargo_technician.dm" +#include "code\modules\jobs\job_types\chaplain.dm" +#include "code\modules\jobs\job_types\chemist.dm" +#include "code\modules\jobs\job_types\chief_engineer.dm" +#include "code\modules\jobs\job_types\chief_medical_officer.dm" +#include "code\modules\jobs\job_types\clown.dm" +#include "code\modules\jobs\job_types\cook.dm" +#include "code\modules\jobs\job_types\curator.dm" +#include "code\modules\jobs\job_types\cyborg.dm" +#include "code\modules\jobs\job_types\detective.dm" +#include "code\modules\jobs\job_types\geneticist.dm" +#include "code\modules\jobs\job_types\head_of_personnel.dm" +#include "code\modules\jobs\job_types\head_of_security.dm" +#include "code\modules\jobs\job_types\janitor.dm" +#include "code\modules\jobs\job_types\lawyer.dm" +#include "code\modules\jobs\job_types\medical_doctor.dm" +#include "code\modules\jobs\job_types\mime.dm" +#include "code\modules\jobs\job_types\quartermaster.dm" +#include "code\modules\jobs\job_types\research_director.dm" +#include "code\modules\jobs\job_types\roboticist.dm" +#include "code\modules\jobs\job_types\scientist.dm" +#include "code\modules\jobs\job_types\security_officer.dm" +#include "code\modules\jobs\job_types\shaft_miner.dm" +#include "code\modules\jobs\job_types\station_engineer.dm" +#include "code\modules\jobs\job_types\virologist.dm" +#include "code\modules\jobs\job_types\warden.dm" #include "code\modules\jobs\map_changes\map_changes.dm" #include "code\modules\keybindings\bindings_admin.dm" #include "code\modules\keybindings\bindings_atom.dm" From f19a3541a33c09fee796bffa1e2f61b2496728ff Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 16 Jun 2019 19:30:14 -0500 Subject: [PATCH 02/97] cleans up runtimes --- code/controllers/subsystem/ticker.dm | 2 +- code/game/gamemodes/game_mode.dm | 1 + code/game/gamemodes/revolution/revolution.dm | 1 + code/modules/mob/dead/new_player/new_player.dm | 7 ++++++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 4a3143da79..f5222642c0 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -244,7 +244,7 @@ SUBSYSTEM_DEF(ticker) var/can_continue = 0 can_continue = src.mode.pre_setup() //Choose antagonists CHECK_TICK - SSjob.DivideOccupations() //Distribute jobs + can_continue = can_continue && SSjob.DivideOccupations(mode.required_jobs) //Distribute jobs CHECK_TICK if(!GLOB.Debug2) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 28a0e21061..13f6db2422 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -24,6 +24,7 @@ var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist var/list/protected_jobs = list() // Jobs that can't be traitors because + var/list/required_jobs = list() // alternative required job groups eg list(list(cap=1),list(hos=1,sec=2)) translates to one captain OR one hos and two secmans var/required_players = 0 var/maximum_players = -1 // -1 is no maximum, positive numbers limit the selection of a mode on overstaffed stations var/required_enemies = 0 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 09047b05a9..38dd128505 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -13,6 +13,7 @@ antag_flag = ROLE_REV false_report_weight = 10 restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1)) //Any head present required_players = 30 required_enemies = 2 recommended_enemies = 3 diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 9bd37cf171..645b1b2203 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -446,7 +446,12 @@ dat += "
" var/column_counter = 0 for(var/list/category in list(GLOB.command_positions) + list(GLOB.engineering_positions) + list(GLOB.supply_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) - var/cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color + var/cat_color = "fff" //random default + if(SSjob.name_occupations && SSjob.name_occupations[category[1]]) + cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color + else + cat_color = SSjob.occupations[category[1]].selection_color + dat += "
" dat += "[SSjob.name_occupations[category[1]].exp_type_department]" var/list/dept_dat = list() From 43affcb83118d1a7e9def4b70b420e7fb1045d19 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 4 Jul 2019 00:52:48 -0500 Subject: [PATCH 03/97] properly fixes Quartermaster headrole, mind traits --- code/modules/jobs/job_types/captain.dm | 1 + code/modules/jobs/job_types/detective.dm | 2 +- code/modules/jobs/job_types/head_of_personnel.dm | 4 ++-- code/modules/jobs/job_types/head_of_security.dm | 2 +- code/modules/jobs/job_types/lawyer.dm | 2 +- code/modules/jobs/job_types/quartermaster.dm | 12 ++++++++++-- code/modules/jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/warden.dm | 2 +- 8 files changed, 18 insertions(+), 9 deletions(-) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index e80840f8aa..e6cf7d1c5c 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -20,6 +20,7 @@ access = list() //See get_access() minimal_access = list() //See get_access() + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) // mind_traits = list(TRAIT_DISK_VERIFIER) display_order = JOB_DISPLAY_ORDER_CAPTAIN diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index cfd9d5fdab..6c12c1db09 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -18,7 +18,7 @@ access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) -// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_DETECTIVE diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index a5d917e1c9..d658a49380 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -4,7 +4,7 @@ // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") department_flag = CIVILIAN - head_announce = list("Supply", "Service") + head_announce = list("Service") faction = "Station" total_positions = 1 spawn_positions = 1 @@ -14,7 +14,7 @@ minimal_player_age = 10 exp_requirements = 180 exp_type = EXP_TYPE_CREW - exp_type_department = EXP_TYPE_SUPPLY + exp_type_department = EXP_TYPE_SERVICE outfit = /datum/outfit/job/hop diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 9df087c834..0ca0e393ac 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -17,7 +17,7 @@ exp_type_department = EXP_TYPE_SECURITY outfit = /datum/outfit/job/hos -// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index a04f5b665c..0b8be52116 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -15,7 +15,7 @@ access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) -// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_LAWYER diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 3220dd9a09..b85a4ad404 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -3,17 +3,25 @@ flag = QUARTERMASTER department_head = list("Captain") department_flag = CIVILIAN + head_announce = list("Supply") // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD faction = "Station" total_positions = 1 spawn_positions = 1 supervisors = "the captain" selection_color = "#d7b088" + req_admin_notify = 1 + minimal_player_age = 7 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_SUPPLY outfit = /datum/outfit/job/quartermaster - access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) - minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, + ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) + minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, + ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) display_order = JOB_DISPLAY_ORDER_QUARTERMASTER diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 98ec759db8..05ba91aa4a 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -18,7 +18,7 @@ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() -// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index b70281f099..821ce352f7 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -18,7 +18,7 @@ access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access() -// mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_WARDEN From 899c5fed7e0e3b6ab61408354badbc3bb005bf2a Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 4 Jul 2019 00:56:17 -0500 Subject: [PATCH 04/97] Oh this should be uncommented too. --- code/modules/jobs/job_types/_job.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 59af18b76d..ebf417acdd 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -64,9 +64,9 @@ //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) //do actions on H but send messages to M as the key may not have been transferred_yet -/* if(mind_traits) + if(mind_traits) for(var/t in mind_traits) - ADD_TRAIT(H.mind, t, JOB_TRAIT)*/ + ADD_TRAIT(H.mind, t, JOB_TRAIT) /datum/job/proc/announce(mob/living/carbon/human/H) if(head_announce) From fe148a9f7b6dfa809412277f589e671758e3cf11 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Fri, 26 Jul 2019 17:37:46 -0500 Subject: [PATCH 05/97] Delete civilian.dm --- code/modules/jobs/job_types/civilian.dm | 206 ------------------------ 1 file changed, 206 deletions(-) delete mode 100644 code/modules/jobs/job_types/civilian.dm diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm deleted file mode 100644 index feca1a402d..0000000000 --- a/code/modules/jobs/job_types/civilian.dm +++ /dev/null @@ -1,206 +0,0 @@ -/* -Clown -*/ -/datum/job/clown - title = "Clown" - flag = CLOWN - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/clown - - access = list(ACCESS_THEATRE) - minimal_access = list(ACCESS_THEATRE) - -/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M) - . = ..() - H.apply_pref_name("clown", M.client) - -/datum/outfit/job/clown - name = "Clown" - jobtype = /datum/job/clown - - belt = /obj/item/pda/clown - uniform = /obj/item/clothing/under/rank/clown - shoes = /obj/item/clothing/shoes/clown_shoes - mask = /obj/item/clothing/mask/gas/clown_hat - l_pocket = /obj/item/bikehorn - backpack_contents = list( - /obj/item/stamp/clown = 1, - /obj/item/reagent_containers/spray/waterflower = 1, - /obj/item/reagent_containers/food/snacks/grown/banana = 1, - /obj/item/instrument/bikehorn = 1, - ) - - implants = list(/obj/item/implant/sad_trombone) - - backpack = /obj/item/storage/backpack/clown - satchel = /obj/item/storage/backpack/clown - duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel - - box = /obj/item/storage/box/hug/survival - - chameleon_extras = /obj/item/stamp/clown - - -/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - - H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) - -/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - - H.dna.add_mutation(CLOWNMUT) - H.dna.add_mutation(SMILE) - -/* -Mime -*/ -/datum/job/mime - title = "Mime" - flag = MIME - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/mime - - access = list(ACCESS_THEATRE) - minimal_access = list(ACCESS_THEATRE) - -/datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) - H.apply_pref_name("mime", M.client) - -/datum/outfit/job/mime - name = "Mime" - jobtype = /datum/job/mime - - belt = /obj/item/pda/mime - uniform = /obj/item/clothing/under/rank/mime - mask = /obj/item/clothing/mask/gas/mime - gloves = /obj/item/clothing/gloves/color/white - head = /obj/item/clothing/head/frenchberet - suit = /obj/item/clothing/suit/suspenders - backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1) - - accessory = /obj/item/clothing/accessory/pocketprotector/cosmetology - backpack = /obj/item/storage/backpack/mime - satchel = /obj/item/storage/backpack/mime - - -/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - - if(visualsOnly) - return - - if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) - H.mind.miming = 1 - -/* -Curator -*/ -/datum/job/curator - title = "Curator" - flag = CURATOR - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - selection_color = "#dddddd" - - outfit = /datum/outfit/job/curator - - access = list(ACCESS_LIBRARY) - minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION,ACCESS_MINING_STATION) - -/datum/outfit/job/curator - name = "Curator" - jobtype = /datum/job/curator - - belt = /obj/item/pda/curator - uniform = /obj/item/clothing/under/rank/curator - l_hand = /obj/item/storage/bag/books - r_pocket = /obj/item/key/displaycase - l_pocket = /obj/item/laser_pointer - accessory = /obj/item/clothing/accessory/pocketprotector/full - backpack_contents = list( - /obj/item/melee/curator_whip = 1, - /obj/item/soapstone = 1, - /obj/item/barcodescanner = 1 - ) - - -/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - - if(visualsOnly) - return - - H.grant_all_languages(omnitongue=TRUE) -/* -Lawyer -*/ -/datum/job/lawyer - title = "Lawyer" - flag = LAWYER - department_head = list("Head of Personnel") - department_flag = CIVILIAN - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the head of personnel" - selection_color = "#dddddd" - var/lawyers = 0 //Counts lawyer amount - - outfit = /datum/outfit/job/lawyer - - access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) - - mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - -/datum/outfit/job/lawyer - name = "Lawyer" - jobtype = /datum/job/lawyer - - belt = /obj/item/pda/lawyer - ears = /obj/item/radio/headset/headset_sec - uniform = /obj/item/clothing/under/lawyer/bluesuit - suit = /obj/item/clothing/suit/toggle/lawyer - shoes = /obj/item/clothing/shoes/laceup - l_hand = /obj/item/storage/briefcase/lawyer - l_pocket = /obj/item/laser_pointer - r_pocket = /obj/item/clothing/accessory/lawyers_badge - - chameleon_extras = /obj/item/stamp/law - - -/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - - var/datum/job/lawyer/J = SSjob.GetJobType(jobtype) - J.lawyers++ - if(J.lawyers>1) - uniform = /obj/item/clothing/under/lawyer/purpsuit - suit = /obj/item/clothing/suit/toggle/lawyer/purple From 58a27fa082b21ad64a08cb2c4fe72f49df0ddad2 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 31 Jul 2019 19:37:53 -0500 Subject: [PATCH 06/97] tabby boi --- code/modules/mob/dead/new_player/new_player.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index a74e11ea46..58de99945b 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -477,7 +477,7 @@ var/available_ghosts = 0 for(var/spawner in GLOB.mob_spawners) - if(!LAZYLEN(spawner)) + if(!LAZYLEN(spawner)) continue var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner]) if(!istype(S) || !S.can_latejoin()) From 1893a8f31994caeb18e43237229cb1a30082ef37 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Thu, 1 Aug 2019 11:14:50 -0500 Subject: [PATCH 07/97] correctly copy/pasta's the chaplain stuff --- code/game/gamemodes/revolution/revolution.dm | 4 +- code/modules/jobs/job_types/chaplain.dm | 67 ++++++++++++++------ 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 38dd128505..1f2aa8ad30 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -12,8 +12,8 @@ config_tag = "revolution" antag_flag = ROLE_REV false_report_weight = 10 - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") - required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1)) //Any head present + restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Quartermaster") + required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1),list("Quartermaster"=1)) //Any head present required_players = 30 required_enemies = 2 recommended_enemies = 3 diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 8de228db2a..f6648fdf86 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -1,6 +1,3 @@ -/* -Chaplain -*/ /datum/job/chaplain title = "Chaplain" flag = CHAPLAIN @@ -17,6 +14,9 @@ Chaplain access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) + display_order = JOB_DISPLAY_ORDER_CHAPLAIN + + /datum/job/chaplain/after_spawn(mob/living/H, mob/M) . = ..() if(H.mind) @@ -36,11 +36,11 @@ Chaplain H.put_in_hands(N) return - var/new_religion = "Christianity" + var/new_religion = DEFAULT_RELIGION if(M.client && M.client.prefs.custom_names["religion"]) new_religion = M.client.prefs.custom_names["religion"] - var/new_deity = "Space Jesus" + var/new_deity = DEFAULT_DEITY if(M.client && M.client.prefs.custom_names["deity"]) new_deity = M.client.prefs.custom_names["deity"] @@ -48,29 +48,55 @@ Chaplain switch(lowertext(new_religion)) - if("christianity") + if("christianity") // DEFAULT_RELIGION B.name = pick("The Holy Bible","The Dead Sea Scrolls") - if("satanism") - B.name = "The Unholy Bible" - if("cthulhu") - B.name = "The Necronomicon" - if("islam") - B.name = "Quran" - if("scientology") - B.name = pick("The Biography of L. Ron Hubbard","Dianetics") + if("buddhism") + B.name = "The Sutras" + if("clownism","honkmother","honk","honkism","comedy") + B.name = pick("The Holy Joke Book", "Just a Prank", "Hymns to the Honkmother") if("chaos") B.name = "The Book of Lorgar" + if("cthulhu") + B.name = "The Necronomicon" + if("hinduism") + B.name = "The Vedas" + if("homosexuality") + B.name = pick("Guys Gone Wild","Coming Out of The Closet") if("imperium") B.name = "Uplifting Primer" - if("toolboxia") - B.name = "Toolbox Manifesto" - if("homosexuality") - B.name = "Guys Gone Wild" + if("islam") + B.name = "Quran" + if("judaism") + B.name = "The Torah" + if("lampism") + B.name = "Fluorescent Incandescence" if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes") - B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition") + B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition","F.A.T.A.L. Rulebook") H.adjustBrainLoss(100) // starts off retarded as fuck + if("monkeyism","apism","gorillism","primatism") + B.name = pick("Going Bananas", "Bananas Out For Harambe") + if("mormonism") + B.name = "The Book of Mormon" + if("pastafarianism") + B.name = "The Gospel of the Flying Spaghetti Monster" + if("rastafarianism","rasta") + B.name = "The Holy Piby" + if("satanism") + B.name = "The Unholy Bible" if("science") B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") + if("scientology") + B.name = pick("The Biography of L. Ron Hubbard","Dianetics") + if("servicianism", "partying") + B.name = "The Tenets of Servicia" + B.deity_name = pick("Servicia", "Space Bacchus", "Space Dionysus") + B.desc = "Happy, Full, Clean. Live it and give it." + if("subgenius") + B.name = "Book of the SubGenius" + if("toolboxia","greytide") + B.name = pick("Toolbox Manifesto","iGlove Assistants") + if("weeaboo","kawaii") + B.name = pick("Fanfiction Compendium","Japanese for Dummies","The Manganomicon","Establishing Your O.T.P") else B.name = "The Holy Book of [new_religion]" @@ -88,7 +114,8 @@ Chaplain jobtype = /datum/job/chaplain belt = /obj/item/pda/chaplain + ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/chaplain backpack_contents = list(/obj/item/camera/spooky = 1) backpack = /obj/item/storage/backpack/cultpack - satchel = /obj/item/storage/backpack/cultpack + satchel = /obj/item/storage/backpack/cultpack \ No newline at end of file From 57835e2f81369b2a2cc7a845b62d557cf2d04b92 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 10 Aug 2019 19:20:05 -0500 Subject: [PATCH 08/97] head announce datums --- code/modules/jobs/job_types/chief_engineer.dm | 2 +- code/modules/jobs/job_types/chief_medical_officer.dm | 2 +- code/modules/jobs/job_types/head_of_personnel.dm | 2 +- code/modules/jobs/job_types/head_of_security.dm | 2 +- code/modules/jobs/job_types/quartermaster.dm | 2 +- code/modules/jobs/job_types/research_director.dm | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index dd89e925b5..3a91a89992 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -4,7 +4,7 @@ // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") department_flag = ENGSEC - head_announce = list("Engineering") + head_announce = list(RADIO_CHANNEL_ENGINEERING) faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 54963b1bc1..35af7b20ba 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -4,7 +4,7 @@ department_head = list("Captain") department_flag = MEDSCI // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - head_announce = list("Medical") + head_announce = list(RADIO_CHANNEL_MEDICAL) faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index d658a49380..0d0b0e7e2f 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -4,7 +4,7 @@ // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") department_flag = CIVILIAN - head_announce = list("Service") + head_announce = list(RADIO_CHANNEL_SERVICE) faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 0ca0e393ac..5c0d254769 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -4,7 +4,7 @@ // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY department_head = list("Captain") department_flag = ENGSEC - head_announce = list("Security") + head_announce = list(RADIO_CHANNEL_SECURITY) faction = "Station" total_positions = 1 spawn_positions = 1 diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index b85a4ad404..3ba6ca9e36 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -3,7 +3,7 @@ flag = QUARTERMASTER department_head = list("Captain") department_flag = CIVILIAN - head_announce = list("Supply") + head_announce = list(RADIO_CHANNEL_SUPPLY) // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD faction = "Station" total_positions = 1 diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 2df606bd20..d1be81df38 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -4,7 +4,7 @@ // auto_deadmin_role_flags = DEADMIN_POSITION_HEAD department_head = list("Captain") department_flag = MEDSCI - head_announce = list("Science") + head_announce = list(RADIO_CHANNEL_SCIENCE) faction = "Station" total_positions = 1 spawn_positions = 1 From a3cd143131c83329a259d1883f3517767048591f Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 10 Aug 2019 19:28:47 -0500 Subject: [PATCH 09/97] whaccky github hijinks --- code/modules/jobs/job_types/captain.dm | 64 ++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 code/modules/jobs/job_types/captain.dm diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm new file mode 100644 index 0000000000..79a31b89eb --- /dev/null +++ b/code/modules/jobs/job_types/captain.dm @@ -0,0 +1,64 @@ +/datum/job/captain + title = "Captain" + flag = CAPTAIN +// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY //:eyes: + department_head = list("CentCom") + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "Nanotrasen officials and Space law" + selection_color = "#ccccff" + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_COMMAND + + outfit = /datum/outfit/job/captain + + access = list() //See get_access() + minimal_access = list() //See get_access() + + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) +// mind_traits = list(TRAIT_DISK_VERIFIER) + + display_order = JOB_DISPLAY_ORDER_CAPTAIN + +/datum/job/captain/get_access() + return get_all_accesses() + +/datum/job/captain/announce(mob/living/carbon/human/H) + ..() + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "Captain [H.nameless ? "" : "[H.real_name] "]on deck!")) + +/datum/outfit/job/captain + name = "Captain" + jobtype = /datum/job/captain + + id = /obj/item/card/id/gold + belt = /obj/item/pda/captain + glasses = /obj/item/clothing/glasses/sunglasses + ears = /obj/item/radio/headset/heads/captain/alt + gloves = /obj/item/clothing/gloves/color/captain + uniform = /obj/item/clothing/under/rank/captain + suit = /obj/item/clothing/suit/armor/vest/capcarapace + shoes = /obj/item/clothing/shoes/sneakers/brown + head = /obj/item/clothing/head/caphat + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1) + + backpack = /obj/item/storage/backpack/captain + satchel = /obj/item/storage/backpack/satchel/cap + duffelbag = /obj/item/storage/backpack/duffelbag/captain + + implants = list(/obj/item/implant/mindshield) + accessory = /obj/item/clothing/accessory/medal/gold/captain + + chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain) + +/datum/outfit/job/captain/hardsuit + name = "Captain (Hardsuit)" + + mask = /obj/item/clothing/mask/gas/sechailer + suit = /obj/item/clothing/suit/space/hardsuit/captain + suit_store = /obj/item/tank/internals/oxygen From 821463f59c80c45a4f742120d6f7d7bf72f6dfe6 Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Sun, 11 Aug 2019 11:47:56 -0400 Subject: [PATCH 10/97] Nya --- .../food_and_drinks/recipes/drinks_recipes.dm | 8 +++++++- code/modules/hydroponics/grown/tea_coffee.dm | 19 +++++++++++++++++- .../chemistry/reagents/drink_reagents.dm | 17 ++++++++++++++++ .../chemistry/reagents/other_reagents.dm | 12 +++++++++++ icons/obj/hydroponics/growing_flowers.dmi | Bin 13230 -> 14070 bytes icons/obj/hydroponics/harvest.dmi | Bin 51063 -> 51397 bytes icons/obj/hydroponics/seeds.dmi | Bin 22003 -> 22135 bytes 7 files changed, 54 insertions(+), 2 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 7c44857b1d..364cf7ec65 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -794,4 +794,10 @@ name = "Red Queen" id = "red_queen" results = list("red_queen" = 10) - required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) \ No newline at end of file + required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) + +/datum/chemical_reaction/catnip_tea + name = "Catnip Tea" + id = "catnip_tea" + results = list("catnip_tea" = 3) + required_reagents = list("tea" = 5, "catnip" = 2) \ No newline at end of file diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index fc84617ed8..e7e3679a30 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -32,7 +32,7 @@ species = "teaastra" plantname = "Tea Astra Plant" product = /obj/item/reagent_containers/food/snacks/grown/tea/astra - mutatelist = list() + mutatelist = list(/obj/item/seeds/tea/catnip) reagents_add = list("synaptizine" = 0.1, "vitamin" = 0.04, "teapowder" = 0.1) rarity = 20 @@ -43,6 +43,23 @@ filling_color = "#4582B4" grind_results = list("teapowder" = 0, "salglu_solution" = 0) +// Kitty drugs +/obj/item/seeds/tea/catnip + name = "pack of catnip seeds" + icon_state = "seed-catnip" + desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it." + species = "catnip" + plantname = "Catnip Plant" + product = /obj/item/reagent_containers/food/snacks/grown/tea/catnip + reagents_add = list("catnip" = 0.1, "vitamin" = 0.06, "teapowder" = 0.3) + rarity = 50 + +/obj/item/reagent_containers/food/snacks/grown/tea/catnip + seed = /obj/item/seeds/tea/catnip + name = "Catnip buds" + icon_state = "catnip_leaves" + filling_color = "#4582B4" + grind_results = list("catnp" = 2, "water" = 1) // Coffee /obj/item/seeds/coffee diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 8aa555944a..2f4714bf2f 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -881,3 +881,20 @@ to_chat(M, "[pick("Diamond skies where white deer fly.","Sipping strawberry tea.","Silver raindrops drift through timeless, Neverending June.","Crystal ... pearls free, with love!","Beaming love into me.")]") ..() . = 1 + +/datum/reagent/consumable/catnip_tea + name = "Catnip Tea" + id = "catnip_tea" + description = "A sleepy and tasty catnip tea!" + color = "#101000" // rgb: 16, 16, 0 + nutriment_factor = 0 + taste_description = "sugar and catnip" + glass_icon_state = "teaglass" + glass_name = "glass of catnip tea" + glass_desc = "A purfect drink for a cat." + +/datum/reagent/consumable/catnip_tea/on_mob_life(mob/living/carbon/M) + M.emote("nya") + to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]") + M.adjustArousalLoss(5) + M.adjustStaminaLoss(3) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index db927411c0..5914183549 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1962,3 +1962,15 @@ /datum/reagent/changeling_string/Destroy() qdel(original_dna) return ..() + +/datum/reagent/pax/catnip + name = "catnip" + id = "catnip" + taste_description = "grass" + description = "A colorless liquid that makes people more peaceful and felines more happy." + metabolization_rate = 1.75 * REAGENTS_METABOLISM + +/datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M) + M.emote("nya") + to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]") + M.adjustArousalLoss(2) \ No newline at end of file diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi index 2752ad8dc502f25ae1a5bcb088a1798f511fc91e..2f541dfc9b5ff6331a0978036de299e618adca58 100644 GIT binary patch literal 14070 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%0A(EyekoocH+ZSs+rW$ET8!%3GCBWk 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 delta 16532 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 Nt*EI`BWD@@e*m?)=vM#$ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 30be27486b0e35af955d8cb0575b3eb2471168a0..b65f395598697a0f832209bcf774799e4b5adc3a 100644 GIT binary patch literal 22135 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 literal 22003 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 Date: Tue, 13 Aug 2019 11:46:52 -0400 Subject: [PATCH 11/97] ..() --- code/modules/reagents/chemistry/reagents/drink_reagents.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 2f4714bf2f..75e265d2fd 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -898,3 +898,4 @@ to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]") M.adjustArousalLoss(5) M.adjustStaminaLoss(3) + ..() From 0056e3eb61a22de7871bc315a14d055243a6e26c Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Tue, 13 Aug 2019 11:49:00 -0400 Subject: [PATCH 12/97] Update other_reagents.dm --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 5914183549..2e093a7459 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1973,4 +1973,5 @@ /datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M) M.emote("nya") to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]") - M.adjustArousalLoss(2) \ No newline at end of file + M.adjustArousalLoss(2) + ..() From 522566551696b252941263b8ffc503e3aceb6c47 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Fri, 16 Aug 2019 23:48:41 -0400 Subject: [PATCH 13/97] kev fix --- code/modules/reagents/chemistry/reagents/drink_reagents.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 75e265d2fd..7bc807aa14 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -892,10 +892,11 @@ glass_icon_state = "teaglass" glass_name = "glass of catnip tea" glass_desc = "A purfect drink for a cat." + var/staminaloss = M.getStaminaLoss() /datum/reagent/consumable/catnip_tea/on_mob_life(mob/living/carbon/M) + M.getStaminaLoss(min(50 - staminaloss, 3)) M.emote("nya") to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]") M.adjustArousalLoss(5) - M.adjustStaminaLoss(3) ..() From c81fd8fcd454ae56e22112b7fccac2fae6b078ac Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 17 Aug 2019 00:02:22 -0400 Subject: [PATCH 14/97] Update drink_reagents.dm --- code/modules/reagents/chemistry/reagents/drink_reagents.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 7bc807aa14..fc408e0a91 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -896,7 +896,9 @@ /datum/reagent/consumable/catnip_tea/on_mob_life(mob/living/carbon/M) M.getStaminaLoss(min(50 - staminaloss, 3)) - M.emote("nya") - to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]") + if(prob(20)) + M.emote("nya") + if(prob(20)) + to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]") M.adjustArousalLoss(5) ..() From 3851739533bb39de89c13a1a68cfa1359e670974 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 17 Aug 2019 00:06:58 -0400 Subject: [PATCH 15/97] Update other_reagents.dm --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 2e093a7459..6680920442 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1971,7 +1971,9 @@ metabolization_rate = 1.75 * REAGENTS_METABOLISM /datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M) - M.emote("nya") - to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]") + if(prob(20)) + M.emote("nya") + if(prob(20)) + to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]") M.adjustArousalLoss(2) ..() From bcf65dc90181508f5340f049241b7904f250b399 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 17 Aug 2019 00:58:02 -0400 Subject: [PATCH 16/97] Update drink_reagents.dm --- code/modules/reagents/chemistry/reagents/drink_reagents.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index fc408e0a91..978fa54d0f 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -892,10 +892,9 @@ glass_icon_state = "teaglass" glass_name = "glass of catnip tea" glass_desc = "A purfect drink for a cat." - var/staminaloss = M.getStaminaLoss() /datum/reagent/consumable/catnip_tea/on_mob_life(mob/living/carbon/M) - M.getStaminaLoss(min(50 - staminaloss, 3)) + M.getStaminaLoss(min(50 - M.getStaminaLoss(), 3)) if(prob(20)) M.emote("nya") if(prob(20)) From b5842048b4d6e40230bc79617680779751af0932 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 17 Aug 2019 23:42:01 -0500 Subject: [PATCH 17/97] blacklisting quirks --- code/modules/jobs/job_types/chief_engineer.dm | 1 + code/modules/jobs/job_types/chief_medical_officer.dm | 1 + code/modules/jobs/job_types/detective.dm | 1 + code/modules/jobs/job_types/head_of_personnel.dm | 2 ++ code/modules/jobs/job_types/head_of_security.dm | 1 + code/modules/jobs/job_types/quartermaster.dm | 1 + code/modules/jobs/job_types/research_director.dm | 1 + code/modules/jobs/job_types/security_officer.dm | 1 + code/modules/jobs/job_types/warden.dm | 1 + 9 files changed, 10 insertions(+) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 3a91a89992..7fca1c9faf 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -28,6 +28,7 @@ ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) /datum/outfit/job/ce name = "Chief Engineer" diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 35af7b20ba..b464141ae2 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -26,6 +26,7 @@ ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/cmo name = "Chief Medical Officer" diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 6c12c1db09..82745ae9fb 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -21,6 +21,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_DETECTIVE + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/outfit/job/detective name = "Detective" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 0d0b0e7e2f..96a7932f46 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -33,6 +33,8 @@ display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity) + /datum/outfit/job/hop name = "Head of Personnel" jobtype = /datum/job/hop diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 5c0d254769..07dfa05774 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -29,6 +29,7 @@ ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity) /datum/outfit/job/hos name = "Head of Security" diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 3ba6ca9e36..2c68d005db 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -24,6 +24,7 @@ ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT) display_order = JOB_DISPLAY_ORDER_QUARTERMASTER + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/quartermaster name = "Quartermaster" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index d1be81df38..6f23f403dc 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -30,6 +30,7 @@ ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 05ba91aa4a..24c2e3cde0 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -21,6 +21,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/job/officer/get_access() var/list/L = list() diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 821ce352f7..d7691cb488 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -21,6 +21,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_WARDEN + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) /datum/job/warden/get_access() var/list/L = list() From 933db4d05fa8ed01fe679048ce8fc82428f753b4 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 01:00:16 -0500 Subject: [PATCH 18/97] reverts the overly greyish colors back to vibrant ones --- code/modules/jobs/job_types/captain.dm | 2 +- code/modules/jobs/job_types/chief_engineer.dm | 2 +- code/modules/jobs/job_types/chief_medical_officer.dm | 2 +- code/modules/jobs/job_types/head_of_personnel.dm | 2 +- code/modules/jobs/job_types/head_of_security.dm | 2 +- code/modules/jobs/job_types/quartermaster.dm | 2 +- code/modules/jobs/job_types/research_director.dm | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 5abe3c021a..d334cff772 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -8,7 +8,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "Nanotrasen officials and Space law" - selection_color = "#ccccff" + selection_color = "#aac1ee" req_admin_notify = 1 minimal_player_age = 14 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 7fca1c9faf..a4b197d479 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffeeaa" + selection_color = "#ffd699" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index b464141ae2..f0f044e6b1 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffddf0" + selection_color = "#99ffe6" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 96a7932f46..d373b8c181 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ddddff" + selection_color = "#cccccc" req_admin_notify = 1 minimal_player_age = 10 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 07dfa05774..961b9ea58f 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffdddd" + selection_color = "#ff9999" req_admin_notify = 1 minimal_player_age = 14 exp_requirements = 300 diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 2c68d005db..a3830e389f 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#d7b088" + selection_color = "#ead4ae" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 6f23f403dc..5b239c44e0 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffddff" + selection_color = "#e6b3e6" req_admin_notify = 1 minimal_player_age = 7 exp_type_department = EXP_TYPE_SCIENCE From b5da43c1b7b7ce8ec05bc82111e69da97f9608c9 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 04:04:05 -0500 Subject: [PATCH 19/97] Gives Sec Officers back their stun combat weapons --- code/modules/jobs/job_types/security_officer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 24c2e3cde0..bb54ed0a6c 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -122,7 +122,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S shoes = /obj/item/clothing/shoes/jackboots l_pocket = /obj/item/restraints/handcuffs r_pocket = /obj/item/assembly/flash/handheld - suit_store = /obj/item/gun/energy/disabler + suit_store = /obj/item/gun/energy/e_gun/advtaser backpack_contents = list(/obj/item/melee/baton/loaded=1) backpack = /obj/item/storage/backpack/security From 5e03f5be3d794fce94c7d2bca8075211a890f63b Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 04:24:48 -0500 Subject: [PATCH 20/97] Update shaft_miner.dm --- code/modules/jobs/job_types/shaft_miner.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 59d29954fd..6b7f8ecb6f 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -31,6 +31,7 @@ /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1,\ /obj/item/mining_voucher=1,\ + /obj/item/suit_voucher=1,\ /obj/item/stack/marker_beacon/ten=1) backpack = /obj/item/storage/backpack/explorer From c4198296d03ab2aaaa03a25080dbdfc8f4d2794e Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 04:26:30 -0500 Subject: [PATCH 21/97] and this too --- code/modules/jobs/job_types/shaft_miner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 6b7f8ecb6f..1c662b8e8f 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -43,7 +43,7 @@ /datum/outfit/job/miner/equipped name = "Shaft Miner (Equipment)" - suit = /obj/item/clothing/suit/hooded/explorer + suit = /obj/item/clothing/suit/hooded/explorer/standard mask = /obj/item/clothing/mask/gas/explorer glasses = /obj/item/clothing/glasses/meson suit_store = /obj/item/tank/internals/oxygen From 867b11215887543f5f4eac186aabe27c52562023 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 07:44:46 -0500 Subject: [PATCH 22/97] HOW DID THIS NOT GET UPDATED???? --- code/controllers/subsystem/job.dm | 3 +- code/modules/client/preferences_savefile.dm | 68 ++++++++++++++++++--- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 4001c666ee..f70309b6b2 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -297,7 +297,8 @@ SUBSYSTEM_DEF(job) // Loop through all levels from high to low var/list/shuffledoccupations = shuffle(occupations) - for(var/level = 1 to 3) + var/list/levels = list(JP_HIGH,JP_MEDIUM,JP_LOW) + for(var/level in levels) //Check the head jobs first each level CheckHeadPositions(level) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7911d92495..d3eb94c253 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 20 +#define SAVEFILE_VERSION_MAX 21 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -49,6 +49,59 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_style = "mono" if(current_version < 20) pda_color = "#808000" + if(current_version < 21) + job_preferences = list() //It loaded null from nonexistant savefile field. + var/job_civilian_high = 0 + var/job_civilian_med = 0 + var/job_civilian_low = 0 + + var/job_medsci_high = 0 + var/job_medsci_med = 0 + var/job_medsci_low = 0 + + var/job_engsec_high = 0 + var/job_engsec_med = 0 + var/job_engsec_low = 0 + + S["job_civilian_high"] >> job_civilian_high + S["job_civilian_med"] >> job_civilian_med + S["job_civilian_low"] >> job_civilian_low + S["job_medsci_high"] >> job_medsci_high + S["job_medsci_med"] >> job_medsci_med + S["job_medsci_low"] >> job_medsci_low + S["job_engsec_high"] >> job_engsec_high + S["job_engsec_med"] >> job_engsec_med + S["job_engsec_low"] >> job_engsec_low + + //Can't use SSjob here since this happens right away on login + for(var/job in subtypesof(/datum/job)) + var/datum/job/J = job + var/new_value + var/fval = initial(J.flag) + switch(initial(J.department_flag)) + if(CIVILIAN) + if(job_civilian_high & fval) + new_value = JP_HIGH + else if(job_civilian_med & fval) + new_value = JP_MEDIUM + else if(job_civilian_low & fval) + new_value = JP_LOW + if(MEDSCI) + if(job_medsci_high & fval) + new_value = JP_HIGH + else if(job_medsci_med & fval) + new_value = JP_MEDIUM + else if(job_medsci_low & fval) + new_value = JP_LOW + if(ENGSEC) + if(job_engsec_high & fval) + new_value = JP_HIGH + else if(job_engsec_med & fval) + new_value = JP_MEDIUM + else if(job_engsec_low & fval) + new_value = JP_LOW + if(new_value) + job_preferences[initial(J.title)] = new_value /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) @@ -425,15 +478,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) + //Validate job prefs + for(var/j in job_preferences) + if(job_preferences[j] != JP_LOW && job_preferences[j] != JP_MEDIUM && job_preferences[j] != JP_HIGH) + job_preferences -= j all_quirks = SANITIZE_LIST(all_quirks) positive_quirks = SANITIZE_LIST(positive_quirks) From 9cbd8af5b97d5712bc44d1ba70ae46569c17f3e8 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 14:38:10 -0500 Subject: [PATCH 23/97] Updates colors, fixes alignment issues. --- code/__DEFINES/jobs.dm | 24 +++++++------- .../jobs/job_types/atmospheric_technician.dm | 2 +- .../jobs/job_types/cargo_technician.dm | 2 +- code/modules/jobs/job_types/chemist.dm | 2 +- code/modules/jobs/job_types/chief_engineer.dm | 2 +- .../jobs/job_types/chief_medical_officer.dm | 2 +- code/modules/jobs/job_types/detective.dm | 2 +- code/modules/jobs/job_types/geneticist.dm | 2 +- .../jobs/job_types/head_of_personnel.dm | 2 +- .../jobs/job_types/head_of_security.dm | 2 +- code/modules/jobs/job_types/medical_doctor.dm | 2 +- code/modules/jobs/job_types/quartermaster.dm | 2 +- .../jobs/job_types/research_director.dm | 2 +- code/modules/jobs/job_types/roboticist.dm | 2 +- code/modules/jobs/job_types/scientist.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/shaft_miner.dm | 2 +- .../jobs/job_types/station_engineer.dm | 2 +- code/modules/jobs/job_types/virologist.dm | 2 +- code/modules/jobs/job_types/warden.dm | 2 +- .../modules/mob/dead/new_player/new_player.dm | 31 +++++++++++-------- 21 files changed, 49 insertions(+), 44 deletions(-) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index e6b1d77f8a..e6eb9f313e 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -57,18 +57,18 @@ #define JOB_DISPLAY_ORDER_ASSISTANT 1 #define JOB_DISPLAY_ORDER_CAPTAIN 2 #define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 3 -#define JOB_DISPLAY_ORDER_QUARTERMASTER 4 -#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 5 -#define JOB_DISPLAY_ORDER_SHAFT_MINER 6 -#define JOB_DISPLAY_ORDER_BARTENDER 7 -#define JOB_DISPLAY_ORDER_COOK 8 -#define JOB_DISPLAY_ORDER_BOTANIST 9 -#define JOB_DISPLAY_ORDER_JANITOR 10 -#define JOB_DISPLAY_ORDER_CLOWN 11 -#define JOB_DISPLAY_ORDER_MIME 12 -#define JOB_DISPLAY_ORDER_CURATOR 13 -#define JOB_DISPLAY_ORDER_LAWYER 14 -#define JOB_DISPLAY_ORDER_CHAPLAIN 15 +#define JOB_DISPLAY_ORDER_BARTENDER 4 +#define JOB_DISPLAY_ORDER_COOK 5 +#define JOB_DISPLAY_ORDER_BOTANIST 6 +#define JOB_DISPLAY_ORDER_JANITOR 7 +#define JOB_DISPLAY_ORDER_CLOWN 8 +#define JOB_DISPLAY_ORDER_MIME 9 +#define JOB_DISPLAY_ORDER_CURATOR 10 +#define JOB_DISPLAY_ORDER_LAWYER 11 +#define JOB_DISPLAY_ORDER_CHAPLAIN 12 +#define JOB_DISPLAY_ORDER_QUARTERMASTER 13 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 14 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 15 #define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 16 #define JOB_DISPLAY_ORDER_STATION_ENGINEER 17 #define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 18 diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 31d66eced2..93775beca9 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -7,7 +7,7 @@ total_positions = 3 spawn_positions = 2 supervisors = "the chief engineer" - selection_color = "#fff5cc" + selection_color = "#ff9b3d" exp_requirements = 60 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 9699f12be5..3ceb29bae2 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -7,7 +7,7 @@ total_positions = 3 spawn_positions = 2 supervisors = "the quartermaster" - selection_color = "#dcba97" + selection_color = "#ca8f55" outfit = /datum/outfit/job/cargo_tech diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 908209ef69..a915d261ed 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -7,7 +7,7 @@ total_positions = 2 spawn_positions = 2 supervisors = "the chief medical officer" - selection_color = "#ffeef0" + selection_color = "#74b5e0" exp_type = EXP_TYPE_CREW exp_requirements = 60 diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index a4b197d479..da3f281267 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffd699" + selection_color = "#ee7400" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index f0f044e6b1..4c7249f048 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#99ffe6" + selection_color = "#509ed1" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 82745ae9fb..27a54fbd1f 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -8,7 +8,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of security" - selection_color = "#ffeeee" + selection_color = "#c02f2f" minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 6006ff1083..d7f59ff883 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -7,7 +7,7 @@ total_positions = 2 spawn_positions = 2 supervisors = "the chief medical officer and research director" - selection_color = "#ffeef0" + selection_color = "#74b5e0" exp_type = EXP_TYPE_CREW exp_requirements = 60 diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index d373b8c181..e320ce20b4 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#cccccc" + selection_color = "#3a8529" req_admin_notify = 1 minimal_player_age = 10 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 961b9ea58f..3ccbcbfc15 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ff9999" + selection_color = "#b90000" req_admin_notify = 1 minimal_player_age = 14 exp_requirements = 300 diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index e3379e4be1..19fa1c7158 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -7,7 +7,7 @@ total_positions = 5 spawn_positions = 3 supervisors = "the chief medical officer" - selection_color = "#ffeef0" + selection_color = "#74b5e0" outfit = /datum/outfit/job/doctor diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index a3830e389f..49a93026ba 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ead4ae" + selection_color = "#a06121" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 180 diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 5b239c44e0..5368ceee64 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -9,7 +9,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#e6b3e6" + selection_color = "#7544cc" req_admin_notify = 1 minimal_player_age = 7 exp_type_department = EXP_TYPE_SCIENCE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index ef3c1277a1..782b175ad4 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -7,7 +7,7 @@ total_positions = 2 spawn_positions = 2 supervisors = "the research director" - selection_color = "#ffeeff" + selection_color = "#9574cd" exp_requirements = 60 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index e3f04f0b29..f40a25d6ba 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -7,7 +7,7 @@ total_positions = 5 spawn_positions = 3 supervisors = "the research director" - selection_color = "#ffeeff" + selection_color = "#9574cd" exp_requirements = 60 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index bb54ed0a6c..4f12d6a19c 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -8,7 +8,7 @@ total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#ffeeee" + selection_color = "#c02f2f" minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 1c662b8e8f..c1b0c643c6 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -7,7 +7,7 @@ total_positions = 3 spawn_positions = 3 supervisors = "the quartermaster" - selection_color = "#dcba97" + selection_color = "#ca8f55" outfit = /datum/outfit/job/miner diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 4a2a2c7fd2..55381549ba 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -7,7 +7,7 @@ total_positions = 5 spawn_positions = 5 supervisors = "the chief engineer" - selection_color = "#fff5cc" + selection_color = "#ff9b3d" exp_requirements = 60 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 26f38e594b..dcc13af627 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -7,7 +7,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the chief medical officer" - selection_color = "#ffeef0" + selection_color = "#74b5e0" exp_type = EXP_TYPE_CREW exp_requirements = 60 diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index d7691cb488..eb0ce292c8 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -8,7 +8,7 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of security" - selection_color = "#ffeeee" + selection_color = "#c02f2f" minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 5ea556304e..cd0d19f543 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -37,7 +37,8 @@ return /mob/dead/new_player/proc/new_player_panel() - var/output = "

Setup Character

" + var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" + output += "

Setup Character

" if(SSticker.current_state <= GAME_STATE_PREGAME) switch(ready) @@ -444,7 +445,7 @@ if(SEC_LEVEL_RED) level = "red" if(SEC_LEVEL_DELTA) - level = "delta" + level = "delta" var/dat = "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
Alert Level: [capitalize(level)]
" if(SSshuttle.emergency) @@ -457,17 +458,18 @@ for(var/datum/job/prioritized_job in SSjob.prioritized_jobs) if(prioritized_job.current_positions >= prioritized_job.total_positions) SSjob.prioritized_jobs -= prioritized_job - dat += "
" + dat += "
" var/column_counter = 0 - for(var/list/category in list(GLOB.command_positions) + list(GLOB.engineering_positions) + list(GLOB.supply_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) + var/free_space = 0 + for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions)) var/cat_color = "fff" //random default if(SSjob.name_occupations && SSjob.name_occupations[category[1]]) cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color else cat_color = SSjob.occupations[category[1]].selection_color - dat += "
" dat += "[SSjob.name_occupations[category[1]].exp_type_department]" + var/list/dept_dat = list() for(var/job in category) var/datum/job/job_datum = SSjob.name_occupations[job] @@ -484,10 +486,16 @@ dat += jointext(dept_dat, "") dat += "

" column_counter++ - if(column_counter > 0 && (column_counter % 3 == 0)) + if(free_space <=4) + free_space++ + if(column_counter > 0 && (column_counter % 3 == 0)) + dat += "
" + if(free_space >= 5 && (free_space % 5 == 0) && (column_counter % 3 != 0)) + free_space = 0 + column_counter = 0 dat += "" - dat += "
" - dat += "" + + dat += "
" var/available_ghosts = 0 for(var/spawner in GLOB.mob_spawners) @@ -502,7 +510,6 @@ if(!available_ghosts) dat += "
There are currently no open ghost spawners.
" else - dat += "
Currently open Ghost roles:

" var/list/categorizedJobs = list("Ghost Role" = list(jobs = list(), titles = GLOB.mob_spawners, color = "#ffffff")) for(var/spawner in GLOB.mob_spawners) if(!LAZYLEN(spawner)) @@ -512,10 +519,8 @@ continue categorizedJobs["Ghost Role"]["jobs"] += spawner - dat += "\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"
" + dat += "
" for(var/jobcat in categorizedJobs) - if(categorizedJobs[jobcat]["colBreak"]) - dat += "" if(!length(categorizedJobs[jobcat]["jobs"])) continue var/color = categorizedJobs[jobcat]["color"] @@ -528,7 +533,7 @@ dat += "
" dat += "" - var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 680, 580) + var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 720, 600) popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') popup.set_content(jointext(dat, "")) popup.open(FALSE) // FALSE is passed to open so that it doesn't use the onclose() proc From 70e3964fd2561f7bfcdd790613196c8b68e57f68 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 21:22:10 -0500 Subject: [PATCH 24/97] Update head_of_security.dm --- code/modules/jobs/job_types/head_of_security.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 961b9ea58f..249e426c96 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -47,7 +47,7 @@ suit_store = /obj/item/gun/energy/e_gun r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/baton/loaded=1) + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec From 43541b043d177e484f45d499143c10a608b8e993 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 18 Aug 2019 21:27:00 -0500 Subject: [PATCH 25/97] Update warden.dm --- code/modules/jobs/job_types/warden.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index d7691cb488..23d964dad3 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -42,7 +42,7 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - suit_store = /obj/item/gun/energy/disabler + suit_store = /obj/item/gun/energy/e_gun/advtaser backpack_contents = list(/obj/item/melee/baton/loaded=1) backpack = /obj/item/storage/backpack/security From 8ad705ec74ccf8237699f10ed827930361f2b072 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Mon, 19 Aug 2019 02:16:30 -0500 Subject: [PATCH 26/97] Update curator.dm --- code/modules/jobs/job_types/curator.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 6199d812df..7f02b6721f 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -30,7 +30,8 @@ accessory = /obj/item/clothing/accessory/pocketprotector/full backpack_contents = list( /obj/item/soapstone = 1, - /obj/item/barcodescanner = 1 + /obj/item/barcodescanner = 1, + /obj/item/melee/curator_whip = 1 ) /datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) From cce33ec7e58be535aa982c2620a14d038a49b2ac Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 19 Aug 2019 07:17:57 -0400 Subject: [PATCH 27/97] Update drink_reagents.dm --- code/modules/reagents/chemistry/reagents/drink_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 978fa54d0f..f80206c04a 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -891,10 +891,10 @@ taste_description = "sugar and catnip" glass_icon_state = "teaglass" glass_name = "glass of catnip tea" - glass_desc = "A purfect drink for a cat." + glass_desc = "A purrfect drink for a cat." /datum/reagent/consumable/catnip_tea/on_mob_life(mob/living/carbon/M) - M.getStaminaLoss(min(50 - M.getStaminaLoss(), 3)) + M.adjustStaminaLoss(min(50 - M.getStaminaLoss(), 3)) if(prob(20)) M.emote("nya") if(prob(20)) From c10c78eb2737871428840604a7a78515a6107446 Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Mon, 19 Aug 2019 07:56:20 -0400 Subject: [PATCH 28/97] readds cotten sprites --- icons/obj/hydroponics/harvest.dmi | Bin 51397 -> 51850 bytes icons/obj/hydroponics/seeds.dmi | Bin 22135 -> 22302 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index ef84c20d5676413280a17f1d0b4c722a0dec8dd0..5f1a9b0515798506bddc2fdddd12d975a779c929 100644 GIT binary patch delta 17450 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 SZnGx?5O})!xvX1ns6oy6`q#Fh)X@OyYVdfv- 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 diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index b65f395598697a0f832209bcf774799e4b5adc3a..1cdb720dca490f167c133b8d48d09d57c0a90399 100644 GIT binary patch literal 22302 zcmbSz1yoy6m+lP|cUqtn*HW}taVw=1DbiA0+akqX0|Y5hoZ@aRh2rkP-Q5bo-91S1 z(*K`%Yu3#C@6DREl6#YD=j?rN&bQC^?VWFGD)I!lPjCSMAW(So>Ky=pj8SiCY)sS^ z|Dilj06^RI)X;W*W$N_F@r%9l7du-3a8FB5Y_omDiyt)7sLJba6~=bnYRZ#Ow(AE) zbL3kJuU4TJQTa76;WRt$&sNl7qjiJmd?aHuFwlo;53Yd}u98YbR~O_wDNqAS!+X4FVVcH3$HK$HyjgeXfGy$pKk>QhJ| zqtNS<_AF~2KJQK5i4iI?yrYx##zqA8A;ZJz=L)4=P%p`EBlY?%5Ew&JO`*P4POicz zNqZVOhVQMcXG{yjbaGk0a~2#8AL|*$uEEC!7rrE9k66xjLi@RSp!fMPaXJC(Gl8Ri z<9te;G@3`27qrHt8Cdpt`z*X(9b{j>rwwRkvzi(k*JemFJ=(hQliMt>C*LqCzKr*z z36Zq#iLoFZ5G}j&OHvP(q<9IqRd|+QIcmzh>-_$RUDU1%`}XYh$Sf8aj5ONm5c6=B zy)!$UE9-Ie2+`=%hx@9B-|oqovCIX};a*qSQHPyo5uBdvUh3`-Q&ptcWg)xYAc6-HU0jAF`8!OTEi-7M?;GWA&BGFpGDXe?5hpEHKDkU z?w}k_#;iw=IKP7Qa1&lW`&vUSvE!}c3`75I3p(xJN6j;A9*B909w#A7kw27XQJIygZ#7l5 z$TnN5RZs7J{9xvmlA>#CYb(=uNJ`2)qWU(qkL=MV6WjC03A_0uskZfZzs;XIz~K08 zMv5x!?+$JdDr0bVUa8JEs2*~2vJsom(yHCwNbBi;tT5Bkpl{4ldxx|5&z{0>u-Xe# ziJF?c)eLn%RwN|GXI)!n{~$Fig-3^V8oReXlo)%MXy5m_xRv1ZYTOS}pF)S??eQjTAN$}L?X3uKOnUX0*_LXX$$SnlvQ0)iCppo|EPnpR@z_Ed6><>~EMa9+j z_I6@w>hQ9%=bz2ZQ;Xnmc<=CVf<}A67ykOJEaF!LQ1ts7N&hnuqm&}bUp}()RMPt|X40AQDjO0>Mu z_YPb@!ePW?=Wz-O`Ch8FAsr6>>Up4BybfOhxt8H&m}o*tI?QDfTPR^al~TDhp(Z9K zr3!vH1^kokIz*8nkgF z==rPYq5^gyiLnXm_|)=G_Yu3@zwNE>KyMm;r78Gy9_yGD{=xn(_+jI9bXtLD;T9h1 zbMem!tQGBVM`lCjL*^;v*UJ3U7W2afUgb_RhH^Dqy**ClmMi+yaQ6~Mcu}VpzvGO7 z+p}hzT0y@S)x&d9W)VEbjR$2;-Z_s7E55BQ2{nnP`IA3ih1W$+2QFInsvG-ga zP$k=r#6)eaZYk5B39D&u4hbxT9KaYER){Bh8w&ewWN;q9mxf7~Dm@Ar>rt1U9+2xBK^!0_wDqNO;~|8ji66Gh>t-qf-pW z85kJs!aF{dh(0W$(^jf0c8-re{&^0IcDfTLJeX}0zn#5mj7g0NGi>(SV;NNJ23;v* zUWvC#*oilv&@M15Z-Evd+3q@_?wb83&0uo_aeN?2z`@@T`aW;atbzuJ4teFQH*?dL zh$x#GQnhxL_?Wv#7E|_JUlBbWzj2+f z&e}4D^u`ud5ufNmHq0Dv>VEv3XEY%#i^s0Gf4{4cwsWT0xZ}vbw~A^SBTqSbNFVA~ z;+?!fQk-OYP+^TB^x_2w*exu{&ijofSiKMRj*nZCo||%VUoCfdJyA*#|9k;6_kh;| zhhpydNQ`B9q52jCeE)SMf0y8pKoJ)cK^NZDP1LPxsP^&!yrG@Ulx<3t$AwGqtaM%G z+aZ>0Aa}^@wrAaS4@UzR=QFN`NE}(MEL2+;7cO<0?io6l&HQ;Qp6cJm?2p2~ut8Ip zyj;Ivp#vH&AJa86gD|To>_o7XJ=x1UOgFNM-Gf2PhDP1YUi0Iuk_tXTEd@v z6i8?BcjrOVzHZYl^4Tn#+xYnd|0f&2`#xIDeGAPup=aN`r7Td61^#HBVn9}|7E6zu zxS%Nk$zci4hg#ga1%TE(w}ib)9c$TpA~9uG{zo9}JCooKTLAhC>}%JAQV6|?iT*Qg zG_@OMPKr9lhsoDvmoVj1TXHyVS;A4aY_RCQt*~>*K`lteU$I^H4p^Rj-TtyxcA2P# zCcLTvk8!i_Rh-i(5$6UTusf4z@;Hl5dqB$=WyYiUqkVJ2y^Vp2i`0-;Y4VXi#?Oqh znyurbOT&Ddaux|~Ob2wKwPKM{`=dmDTmi+}Q)uKqwpNM_^B+CL+P{L|kDJEZ*+SE* z?&}@&P7)IPQ+e+G%*NSo+)!3Pj-5WeAC~}M|1N?z+zp{d22j>oLMgXzWf43`O6c%S z!`$3l#irg({SiEk$8HDQkx7-BV#k%k-Hi^^)3G{y)SCAyIoJBsuy|&qm&_rGyh!vK za1<0MALw`aw`Em6@qp1|e(t@`^-t#g(6L?}`C40}Kp_#&kUX7^wCXfrV5Znp#TmM| zdiA6E$rBmk2MiL$N^n-+<$Xz;(6v$bTD z?^Z?>0AXQ!0HBkh(t2&YX8Nua^i>dm90NkeuiT16y_BC&4kYvFw*DR3{oBD0Ffcpb z(FlHwUDx`dC5rr96vUwhlA$&(AQXva9H5~LW%p}j+CN^SOz+#>BGftTJ+^4aFDb7f zi7bgM(`b1!uM8)RjVoH|AMk7Zs3Ghe&9Bqk1POHCf%#@4*XZ;uRR|BG!aENKm1A8r zU{Lq{Ok^B0%t2atH<>R>9ZPtYVXw__6|v~|GV2GSeTBTcg_iMWq9Rd;PEX3pUJ91w z$*N?1H8t!UOqgGOn{2eh?vK6{hh3o`G`D2$>EaIGW;rAJvog78(nobkz_?M8~ChFtkt7zcrMuv+N~oPwGH9dxk~@i9%b(Q=C0J4G=uM!WLRpD zj#lMu2<;5k&Mi+;5g7qtU5Yo^f{>2_oHPby9&7lP9qcjX#REQm$(=GYQ{TWmQLp{Q z8Rmk(%uL<@s;OF@CIf?$)ie?Jz1%2eO(_ZrYhfR1s}~EG@@yYp4X&eq)z%*$pFelR z?8ca@S*(w5opa3kO|rcja{OGi==TU8&&O$aj&1)lO&|4u;Mtm=LLN|UI3YEkMgmyM z4F#2=w&-OHgp`R?%tLODPLEjVvJ)Ca-a+w`VtI_V==s+k_BpKu5p-nUoXfQEej4n* z>Jo9XNA!}U@@bgx7R+t5Cgb%wR>@AwdcV5M&3oONy-`2C1Bk6T;d(Znp#y2`a++q( zSOwwToR`j+Xn2H?4V0(F4IF$x^SbhfdUa8wf1oMKfhgE~6}9)N<{eaAxK03lnZ>#U zcc8B;%xN>Jc-paBh?NXb3+1GvpnoxXcS?(A-YG)+*3Y2N1u_9jyuP=AI?-EhHib0E zZ#rMgJl-E70xAGwd0FLMNKQa*(a@EX95tZd;EW^Tb@^)HBu7^}9#$|hTGgkJ4&Qp= zbS;KRSbiGWMI~X@_09CoCsU_pe4E#b`i$-!^VI>g5da*98^dWUe;}0Y?pssFu&R>0 zY@*anBVuFeri*WhRaAWJ9Zx@{EFP=`FA&u5^-`5-fqY7^Yni1+984S{8e0MvzoBK- zf3tJBtipP^Z=9JLG4I&ory_2xp zAvIvwp2%&`PO*pl^Z|N+Hr*{-JdLJXbIQ-6r%C#PMK6KW_3nm2*bt2UW`kw_`k@#} z%c2{F%0{hX?ZGGV$;_RIt<9Fe;3E&(v3u6#{SsEQxm+R(5=!;JL)qNpQ7Uf|$xn|M znL?8kXZ!kyj+$%Hv~c|v8@2cbFpS^T)F>tmND3=@l>k3oS|jxXkA~#y3QP;do9x?% z2@0AU7(158C@)LiXo;)^HgiOetmwZ*Z^t6!ORg5m91-?KU)j6*A>&nI94`n*!bg1V zw?`S=Jv`c`rpShehwWWmyK7-SVNp_u$1tB;uF$Zs;{MtOyj8Q6W49Cg3v<{FnQ%EL z4!2s~#lrRIj6KRw<3|t;1TTkSZ*oZO?O}WD0F6VrcCaDT_1ay53AMGC*(lm>1upuC zf+APT!dE%vIh~kWaTnyUJ#UsWTKO@t@iz^pi&$~ZP zrSwcrEH_uK9fyk?4#<0+-0bXp(|TQ^W|u z>nvV)Z{6o-_27S-=5#G z*>6?+MJ3xdKg_nzwlJeVCog>-fgziCdTYgIX!1l!*iKO6$m*n?XyK2rIkbzT_v&Lg z;jdHp4%P158|~Ja8H)LHfjYN?eop?gaJmMhMo_erTgOHME+A!ditbr97Zeo4C@cbJ zK$4DTIuH%|JrhL^NS;MGN0KxL2 z3>$@4y9o)0X>VQXOPjuKs@c>dEfIvL@1koGn82ak*~I7n7=;%f{Oq3j;HR0Re3q(3g9)b#;#eu*yZQ*@-FD9~}9iXc5$+ z?(TiEk0{6dB|IUayiekIJvM|^i14kPocjt4i3v0vANl4Ms=A5>P^`e! zW4%7bU+RN|Ba!n^i5ce^2m@^6WZj&Flc#3Taa($dgbODzP0-)e#MJlj9#jMPs9iQJ~zix{_jUU znUfzk@u5g9+sTQ%6|kr1@32rcuQkk5-&=xeA=|8meC(}>iEP`L@;GhMm0Ajh^EpLE z!)ds0U4Z>0*5JbzYgXWs(%|P8$XOc5L*maI&SGV8rGU~-%?7Gz-_~NR^LUmk7?SUW zjp4UDC2B)YI9cA@?w5(I#RjtboZOY&9UP#dZ-)52cNGNcO9m)ko-7r?HCw`>3O(j1 zYuvwn;iSAx{G29CKB55)!Z%2P@DFIRGa7+d)|J@8>;c=&@WhC`@~rwM>PthzgU^ML zA)_OSsWps&;p3(;b{{BSbr;0mILI^voeHM$VA;$_IlEWP!QY+T_C0(Z#gqWGc7;w_ z2qj7NER5d`e}^Jp{@Q#GJ<#VWk@eVN1)A&$u>4NP-`34L_Hl~{`>tcB3=F&_tU=(< zkq4H5o;6U$4N`auRt;eAIDOQ5LR$6iw2=2%y06Qo@)#VE`lIE^0%~R-Hk`O-X%QtM zA?u9TLdGL3jcdJp-c$|oI=qU94*+IX<|hW}9K6qBcF5}DhM(FJh)$u^;Dsgci#}(q9)bJB{+y@p z{{>b;9q5Sni>tGn=f&zC9rX3Pckjd)Dte7h`f)jvYXd!?tp_(ZFh#hgQRKL(@!SQ&U6&$_ROpzHdL>P+rPzU1qH$+#KgnF<5#t9wzPb^0MzUT=KMYCKu~vqE0o z?&4G`?#w1mFG<_88KmZb5QlLOh_}GJAM%=J**Lfe%j?_1GWu6(1)Am0QOBbtt-Z9` zE~_CIs+b$^q0z{V$=Mj-`0AN&Pnmph+tbOOd@|klh5_ex6DtpQ15!?(aB4RJ{4FB( z8j)b6y|3hibi3{1wM`6%(au)p=|-R3)8!Bn-dLhX9~~6J4w}>a9Au_#MOAHC>}#m= zEgv)pGl~yBEZnUelp={!g$KcnR3akKAtL2Y%PU8Iyirkpg}*o~?IznhVCa#Q6&`wG{~cjt*3C7Vm?2X0!xuhJ5%(bS9lk zs1xbh`ooZsH022h3xN)#6PEFND<5e*v(HAe7-#r1L5a;NEZlD)`)ae%ryx{m1U*OA zucrEv#5Uj$T=58bkbvxso~@G)mI&R(83Q0PSNQ$`mFUz4G%MTtAt*OYF6DQ{s74uI zOi$fhaHZ7{=OT`HsD2DzZLj!+T9J8z@c2remBz5ZIBVPXd<(YGQpAxLl>vGFa~+*h{fXk0~n{-jB8a{pfEL1rRS05T_D7R(gDq3T!3J zS4ezhwzfiiB{NtHO8bog2yg6-5?f>adW^_&dynMxWYGIwRt(>gQtwJ1q_(joi8B;q zSU4-yfYP`9ea5DT2ndG>JxLNa<5wq`GSL9qrZpL$Rj9@LlctYv71(cT%PH~6#McZOnk%=+<33|gHw`gU@sGTaO40ido^vV-xa`u%VxVz4+%wKMX zOS>@9HTkGMIozhIvV_dQX+EBT3`=(G3RZK<3qG_HKQ(%Gs!HhkH71Z~er4TQD_q>| z!CRWDke`EFnOhHg>xu%*W}gGn4qrs}pYUua_SF?NZk%Ey<1m83gKMu>Z%^0#2%_-6 zMci)I+Jz^yd^p8`E+V*q<*pv1SNBs^*nUEhv*~RG$S>-piu~{^B3Cx0oRLE97C+g<|vy1uC?&rdDXJWGQ@Egg0 z3>k_0T-rs4u=zFddbb{`?*bED+gABM$wwmff#-x7hb~L`{PQW`EN{0!5x8QyuZf&i z?)}l3BH6^f5Ey}?9m+0^J8WWk-Vi_MYS0s*0|W{&DVvd;)$TuseYGZf*kJF%v?52O zT5CfH=%NCi^1I8og}kUfwWavgSTK>ZrS9au{!h$A(RWYT_+g<}xnuS;Z&ei( zVz{nSGmln$?$v|G+!os2c^?ncF~cIm-;OvGP^3Qporumkm7jd1kWo69vyz38g~>S; zw=>>CII%QkFX#c$V>2$WHK6zQ34h)3ZO+ZYFMzL!D1LZGLv=a24W!Pl{rj20W&af- z3@h3?PZy4O=%QNptdef!uH$ZHWioKv!8;m?^zYLhTZR@@ah^mS$h;iS9Gmom{jB`y%~?q>SAm^YcP<6IgQVAn)ZL zY;*j};+}$!6E3p45{g#Bojf`mI#9Eipq7&>17Olpx=_%72-J)AZYkzaFzK=+$mw#U zheD$K!4bIP&u0t>A6J=EgfpBsOhCWSx%C$ZXMgDr+~YYk>NtDkKh0VePWC0i7W)3s3_ui-Gb0__Bs2nY%ehHNCnZ&`JLa%oxyF{ z16^us*W>`cB3m&skG2!5A@CaUZjwT;(p zcLU8*6?MvQ4yiqaUasCBP0G~SeSar*HX=6UjpxQYu=@tOH&Z%8^h-6f8)d$lni>S< z0p0~}Ke}p%!HRC@skV(*W{oEc-Ohyeo7cU)$WUdZ#}!@$68k7#3G{Dk`m1z0JR_y5e?DdxQ2dhR3oMESBi@}te8Bk~c?|y`KWl!aicTIL(&|q_l7A+Yz>61ISgl5N zXU_J?s=OX=b>#gG2tbJcq?_Old5EzVP`uGBA?M1ea4qTFIo^csN`pSivcEgHOxv^%*L9`NnJ&byEl|Oc|A!4-MMpxW& zAEZo~@c|B=bWp!vUgbU?2HcVW!BLNy%3>W0u?ynH&hGMpwHs8p$t1lLrtf(NMU%2z zJ3lpDyur}jD8#lDL<*|Q`46Yo3t-H8cEEQH94F571l*Yjn< zXA(?w1;L)uQnTzvt=$3k{?-JIjN0QLq7T}YXC>zF491jdisIrP#lOy7=?E(op5Loh?^JqnDprdF%Je=C!z&pMt1Ulri=xq3K-Yc=HoLUMp$VA1;1vw|O(3PX=We#Ki?aP8%FrrLv6m$9Cs~1D3~i-auEC!R`i)0?A3S|EfX@W{)Y@^ic74V$zh8ZT;BzcQNL3Mk9 zj0Y(vy+Fa3hbAiPX9&jCqz$RAm@0Pwb!DvHehij3K^)L@MHJJt1Nl|)YH@aabkhTcoDbs#v>OTTD8MO?V0Tm^d|zmY#5 z3nfj=WyW5e4)~{_?ktc0f8`Bz`nK(V&jtA3N*(_%fPZ<;^-W;vq3~yW={Vd3OU1{e{=-)w|9q-;Mh_HG5 zoxgMNU>%04uZ+qJf4(?HBVGLoLwbzRY@Twb$y#J0$~0!0g)~p^R%OL$`-k0UzJ*M=8PaCmPidx$_M=8M%%hrbQ<&qAo3;p@pa{R?-A!~J zJG!{UgruSkQx-O;E?Yq$IhUme0yHopb5AOuTiR%4jmi2y}RV z@y*STQ$Yv_J#2x9z)xKWQG!Q|xKqfIf8EF+|60PN z2BjK&rKf!VLGuAlt8zSixHa@pDrX=$>%AbD`c5*ff)tzeZUiC$jX`PU!f!1rys9(vG;4hkV!A4d`ZJMV_vXuAPe|&C zVP+N|T&pZroYLO*>P1K;KrU9N(E7N#r^2-Gn3>&?);A2;bv=3ZQNat~>s2goSN}rOjXVDbsn*1)+D> zx_}7w*%#PZd|IpTb!_m-2Qf}c6F%3j>0zlN-$HpX_%ZO@3PEyTrL!ZyjweqA&$+nA zTDkApK6u)z_1M=(q_O0=Or0)Je}=CD9-FI?Ox0_>As9a;9X6lBCGWKA<>EGU!ag}nK^#Bb20QLqGBR~7`-MMhW+YeMB&G{LOVDs@Md+y zr*y|KYAdnPc<8(6+}YPyu1O1*%;$^bqAbS6?Xa6z(rd!yz#oJ^z)^zW^7NcH7h z*kyR_aMRrj7n$=Uo4Z7MBR>^)87M%U*}DA*`|F9qsv1TW6_5pz_NBaqVDL30WdCST zL)MLRKQ=%NBCwknv0&egohw=#U{-vSJ#*d0%)m=1 z8is_vx_62l{03S7wDM0)nfNtpmgMl&MNMXjv``XSPll`rwDgMFeFr!GD;Q&%vtZ)t zwt}=2;whXZG0hh_{hQWy;YM^3tLPDqg2GLL-Kotu21Dz+nmo0fDXZS>SQ56OTTI|q z(pc{ELeSh!aJl-zI0o;6 zpTJT*oa~loWNI`ghpY4jQ+n)%rA2A+AXziAwB?UpMq&0hczt0f#VUy!YKS-QYC*oo z>^(+ES#{m|Ld3OXA2t@PYsoTU`_uo}in@6J*`Gc{@4rhe`)}r*|G#Xse|ZYSO~NbQ zCj`Foz)B6h*>2mTozjp}XM}{5Z`Y2GIBsL3eEYlmmEmBPk&%H>`voMHvIkJ6A)EUH zhWv|Kydx5mr+-LR;axlqQ}OZJtA~V2E(=uAXHrJBZ{+${NjTT3)z)z^PbnxRFc{ry^ zr&*CEhQ8`GC_J#(t_`J!Dl;LtX5~Owxd2}Sad#RniY3p@AK?Cj?#gW2Fw6Y%(e5M z;Ml3*A+j%0`?5SZEaG3rnM?F)ZAW*U?HwFs3=GoyEX~b>Q30a@%iZYyGkuFBsk<~t zl7qLsJrX0fIv>GB32vdCpR~0t*!Px z-8;U^afTWR&B}e%i95o)@Gc9(MZarMctSTy^H}0f1^D2GyJvgl?zDn_lPUzi&dU?U z(xHs77P|?Uv#e|S97qIc83Yikx}`zmqB11zM2i?Q4o9aZ(N@rzBivkFgH(P61O%Y( z?(QzHuTPq|*xN%;TPiCnf51y@RdUv;_)CcH(ymddK~`#X>Zdfsa}=PqmF*{!^5b9; zBi}tcrBYj?5d>C+_qA=!9l`D`YRX%_*Z9Xeo=i{_jEML>=$4l*dP-aQfzWc-YI$cJ zh!4ZVtnT$z8(DU(u7J{JR9EL0l*R}c{hDYS9wu~kbwxQ51R*ReOH=t3D*%f|`3-eV zO5(X0>v(ijlc_}Q1(Oim*7K(juFTm6@`YzNmST>qEkCq<^j52294Vy(I*fZal_*Sh z)mTIvOpH1DI{$GNb+2z|Zw^S;%y5}$wLj@;eY^hn z^0up1MYHej;(ZpXRq?#2Ry%^Pb$cgR7ZbG-&r^pm9~1w&r*)V=8ml^DJF|w^!FL@K zmiHE|Pa_LKJ!Ul2sS(Kj%r~E6QQe^t`N9IwOT_vv#Yfx2BdE67U3@F!;e>?KSB$O+ z?M(Xigi@xSu7fudAC!*YTN&5?ThU5SEArwZR5( zMEEnxJq&7aW{k>E6q+HT; zZ6=Z?o1qsk5*i(0(t2nvNiIL9L&@|*#S;&3#1Q>j2aR-$;cez)&GHWcgm7xRU;?hZ|`fxHmT(1y`f$- z>kCnUn)sHIav60X3^looTD75Q{$L$a-d(OV1#c37$3&*H=-PIG9Dm8@k%5E+31Y=? z`QAnO40h;66L1#Q-qr?MNtRl+)_5^-$D12awhiZf%rA<4R3zd*#w5#Y<{Z6Wzfg0M zd4#8>w7kFKhnY?&@^pB$eTp;}&iO{=`)k*9E6`JP;u@x<^VN4u&Qcb8JZsOcV(wT) zg3A_w*8ByTg6UFvqk6p-&vDVmz_QSblc2|nNi2FV?8c&y-_LpTs>10cJkt~q;~6s- zYkRWX9~Hx{UUc_+(f?-BM!6$TC8Ddw1}hr={)y+sd5@h`QBPT$x5M(@{cO#_-@T?4 zG`X)M+BfdNo!#B5cj#BHmIj)5+NQJj^u04>ES&u9pgOTMw2M$R}Iz;S_VG?hXZ-E@hZ|a63C)i-=QW*QuvHY*|XeLxkZOqP!v&QElMtEG>d%sVs zxJRyi9+5n?0-?!zC-rF=?@nqzni0$`TV{XfBNB;6fw#Q5-l_}@0*`gncI-?yA*O2~ z1dVj0S&5~ji$r@IQM(%hzi&a$4_%W^%oxw!kK#AdK*7G>_J3tj@;N`?S*Ss`f>->g z(FxuYysJ<5O}_@%_3m7^(216<05`!&^pRn705#~gJ5Z;j!V#G>-0ry*8?Cpnil!46 zN&7@Mbj;6zAc&8MW>e)R_Jla#e%kkK)@l1e2E6C?+Ox-J?iNB|6Ay^LxX8DOlZR0E?D!JY?voio{?JuLDI{0f_^w&V&m*ad`ya%*bH-@bi|0>Fcyygb&)>FJ#MdP??qaq|tjKfZ0- zCslpugTsj_mC2hU!sP-m&2{j-oIyAi@Uh0?74nOOut88^_Omo8p989#v#TNB52tq{ zGhr}fPsaBhON);_hg>IL-5-!c??SiljhY?5uEQxP#0S3ZEI3uy%9gsp62+0(!L+NL zRkk14$)JcEtG+XHiTkAOEo3FqhuZ_O#?wMCikyfaH^5esE}1c^`kS+l{U!Ua@cqBe zn*4uJ3IA3O@Xr8@*jrV2h@9Y83suF}6vhskX99ZPMJ!Z7yQtLt_jx@^8JXAJ)+H4c zAa&VBrnOF&*r~-uoNuMJapJxQVQckN)zpXhl|3VKL#&0r3USY1^H24B-Y7iez7gifR1#(*ti5virk1J_7UD6LDFM7BK<}4 z23k?v&l~g`G&{CJ0a?g^2)T87DlMhqh z4x$u+qw!Sc_~pOl4u?J0dM7vXfYwM-37{tOM}7QGr*vck4KaxaJZG@vyfmYJp#xg( z=b>PUKW?DpuQPO;$`b9sid>4c;It9YX?zvGyviV?z>=2oA{Gx9S7vfqj9Aben@=TO zK!;!DKB($b%g5b-aiurUSS5>B_6;DmmaSfo)KV-P625ql9Nm;U-}*ZAKeD}Ue%Sh9 z##n8{7!^C&Rm|7dGadwcZ?n8>U)623G%2Gua#7;13p)^7a6lOQlrbA2PwwcxaodvG z0mS124`niPhx*+#&YRilPB?rdG*H}-JA`K6-#jVa4pjj#x?$Jtw)4Fww-L*j!rBmu zAc1hx<;O|VW@Ilt-Vqrs0zZ8f(KSZZvi8@~5eg(1uTFojQrbSMLDKSMc!}f$;p}4i9QfJ1qJ>tCBB>a7GYt37eXp-dBCV&}ug-dQ>^NHiX7jl%`4FVC8WCkL}We{$8zto4NVlxbCev{IC!0MJ7h} zwB~)k*Ol5+OMsU** z+3HT{@I~!Bv+-glEL(!mBI+zkN9p?Nn*?Mn@(y5QHTkLD^K=J`#eGfS7oDxp%a0mt z?1?p{Gfy6@peD4>f>;N;zWpHL6)@qh9Fz~H?#Y#n%uQ`@(Z}hx`y;KTI-*i6d;Z13 zMxDrttc(%g%9`xCEVx+ZKYHRAFQzc){SyvcBHQA!%;rPSc%-8PRZ2lUYU|P zrE@p(S#9e3q7-x)D?ta~@@N3Zkjz95)Cc;qD6Ck0K-g=S4hZk!P=4j(js4-GL z+D1+meY)9|q~#HLdq*Em6ro5Yj|$71I~fue zL|rJR*`9GnmQ{p|fB*o9o<3~`6a1=_zVHz+ytl_~@bp}rBKn2;S~aw{JIS*$$>nSR z$O?zZYA4{+Ea{7>e$%NNvN|xFk5oiON*@YN_VCfA{6(j|k!rb7VR?^sM@dBCD!?|5 zF;=s;Vzv`%te`hnk-!t#gMM;y&|}lO$&C#XY}EAa!T;n-|0?>R3HC5KOe-}FZ~>F5 zWQczeXs)YEQa}_2X#Bl-+LEK}3mZCc^+fWZN5K z(1ERwau|&fZ!nRCu$ncl$roW#cV8=nVHNg{PmRGoX+2iPioOV%_{+UF>&!^Pi5@D881nVFk$=vo8^ZWzXLqW(cCu; z;`M9Oja+H#zTex>zWdplZKlm0osbw(GgqM6 z>CC2UYKf3QP*6BCH8_+?2z70kZGN2t`j*q#sM>pUEw2+@G8bOjEEL(n7;|80k#n|D z|3vo)VMv}hAfd&*fTBZQa<-IFCc0D@5DYQFDva6ve>M|GwHD26IU3%Bxwy4_pw|ga zPv$rL6Xmvo9~8%lBe#5E9R^mru)|<-g$}>KPu&9<4Ntz&5^mXV!F;2w#aJbHmZTi@ z2@Y2M%|&><8%r)-w=YVr@%&KAfedjiPu_z+B#zkEnqN`kK_DB{@Lp)Fcr=(C5xmZU z_Rng)QLb+&rsdzu_5LM6@~(+pad(KuzTM@`AXVfMM&FslrEjO;v`~)H6>UD$XXvwwv+Jv_I+5>NJa^2I zh2k^#SBT3p4K1m1nNu*5rC$Hah~42{^{`B%l>3P5o<?3Q(tOWp07xHG&?ou%^2owV z=FvZag*z<@>?SkF;qQX%W()T7u)Vv3Ec_Yvne=Y(c?Tvu)h&K|1i)_?Z|62s3b^t%rAwu_hGrgC%u3 zja;8rK7o*;I)@2VR;yL8btwnz(t)?^DG5|-6*ck~vUK(fRk^VN^jA6xYalu!&g8Q? zL^eun;YPlhzlLN$bJiEM4w!80@fHIDXJ7>Qes=I?BqPPaHYqme=dF$Pv?)9MNT-lb8%W24p8H%aVe{knf zfeIBGRxtiOR9N4_;pgOb+A{Pw!smK3t$_i#x$&Gk#pp}t2t+-5Sf><8tiN;-cSe-wuvU zw&S*vHr+g$d5AITskZ&0tt?rdATbiR6N#v7H@U2a$Dw_-4*H}y&q*TQ_^%-zTn0)|z-nvqd~@J)y~VS(PFDa z!o=8s-5E!SH9!Ikm&KP#Q^3wb`?M5X4+jE%VZnC&3bBCJiH@m!xk3M@u)`?SdqiM@ z4asCA4v*of6z6#=bbmeeYspp!rqa_^u47)67I%I7MCr1AOP`mX5vQD&d$zfeP(_7? z=cyoS&N``O@;uF!OS2Y&0q=fYd&ysJ3rhU(Ay;pPJ3l}F<<;SmawSGxSE(%7)swoB z9Q9mjL`iie2q04$F}bNQO5PGXR8=d%Yo9{TFUHt!2K3kHwBC5kPKXDsl66b@tWYKevn17xu&3wkb&icl?)FD(G01% z=0)eZGrhpQOZKvzbA;=Jj=I+SuMH{e0^s(`R4l;TN-L`>9M1YC=&b>#9bV95tLY#czDP7ATB946BZ-CC?nxtZ(ya8zAEK8-Ysyu^j8<& zO`=ULE#2Zs)Kgye#fhfDgS!*`p_Flg*ZcIKZruhn6oJG$VI+`}_du~vOBx4G%d@5@ z6~y(oR^@NPgJQ@Go6$;utpRlA*>?_VNUBIjv5MRw06d)e`@aAftyni-IMwb11Pq{X zBTAhV80GH)J7c?HjDP0oH;YiH8F0f!j7#pSa^IhcDP2rMRECZ?J?e|G^dIaz>7TKO zQva!UtL&0dajarVPl4%_n3*|S`k1rX<;#>@2F{r}RzFo+q8|~F(F)sBGwhEN5_n8> zW5ck#ksbzsvTU>LF9@g-fsMRR?DSKx{>EFW6#wRJ}`5T%e5l!NAB|)sNIwB=O zFYLNd6##pNF^4b3(GC|%!iG!J<_&HNvx^s*MWsv;%6(@cla&i^UpJj3DY+C4tH=n_Gc7!gDl(R&Dq-g}qmV)QzUUZb}N z(L(eV1kss?=tT4~6Kx*7Gc$}i^PKbHyzhBGo-b?deeJ#0zVB;)xc6S`|Ns5lkVUYL zWTe1zCoz^5!0+(#U{A%wi-0nu(x4P%;{%#|52u@u=7YDu*lN|3ni*7zg*hbNG$Xr_NQ7%C8;p)>mI#?=ST6@_uQh z%nCK;;jF#b@3sGnY;t&*gp-q#Q8rLm`?K_%odEyVF}10_{*$U`g#3#l0|g(U1Bj6F zu>!Tqkq)=!{7%GLF~*i!{?@kc9m?veenXa^v!4S9uu{7DB7IyiV(zs~=0TT}kkhzj zMFSI9=0vZnMQ1~!uxWWUZJu{f60U)5ok_=GL{r2ea2?zul zpv0?kC`9XZQQXFDwq^62XAlo92TZU8^M}@UE!m6nFtWYx}>F$ zV%WYp_f#j`k$qjsAxpvIStG3Y+vq=XhtXu9nSl`%SN5{qjsullg;XC=pX$fjrN_MP zyhe5henbbz3zUFX9>-^%}98O_t9C`Rkra0Lr z>~=A*XZ3?k_r%|)lM0|0O=YqyryoRuWiJrV9%!f!5{OA7A8)~ZXilVlCM_U<3R4K6 za4i`+sE0&KR`*M$Ur5$d@iTsVj;VolFY*J{HelKC4e8OT{H^Tz@MnT4k+q!KLm8QF zDm8StP<_`=O3IBJn_Jmi-NqkjogB~2=j-G1BW5dfd~hl?M|7NOT7xbT>RSeGS*V2U z>>mIbi~7^bf?RK&!QKkvHmWEB=Fw_ zW}e>mH-7SNH`>va9MS@IHALXo_AS-6e(cw?2yM&$J*A_K(IgfCp#X*9Jpuq-t>6}! zF~j<|I`}_fq^GCHfA~PCagW(w%KfJYD+nB`b!SE}b^C6b8FHQJen#2JLU9fGrQ`nN z2?g%(TxXTX#w7YkLa~h%d9)cc9W%KvjD?*ePS4xU$HvrfLB^9@5a8w`yMEQmAxRal zc}GE&0ytQ5SDwH6Oj;yz@1aRO5IkC@t+rSjZgaOnJb6+}tX!3oYXYy#mk91&)tKAg zwpOiM`!2#&rtFMj3PS>}1mH!>EMyLA_#U0uT8qB-=Vqxp zV}$Wi#-F-BwFFo|9!H%Jf#uS8AZ(357++N!jqskJrJCGto_qQ4TN`e53drC$0m`e& zaKxXu(!?i#zN{6?`Y2*beFsNJ?*Yjg%Mzm6SNjaY&Uk#&Xd(*pKAkqQT%&yk=l6IZ z#Tw6TcMLw@dQGu-Dz7 zWMk6tW>vd45x~=S0rXK4YnP9EE)3lUy;#{OUS^|wIl#Z9P2{^pZX^vWJXM67 z_`v)od*-bLEhju*rRVy`Jkim}cy~7>-s=JIr~j|?s(74rbu+2C9XqV|M4$V&N znNMzvtn2MSQJk-gnC#qMT=>3v{W|}%5cj3urKi7_xQq?`?{k0`l+3 zn3xzxhzGwVxsu?d&4}1dQro$Sx5ETOn1{PZPwVtwfpJ1$;|${ApiJ>s{q9rg@7{uf%5r()=MaxdEdW4 z6+j}}urL(i>1zaafRuV}#PiG-8cppbk37G>rXR+mlI8&84tHE9Vhmzi6M7byhx`cqkW$rG$~-@)o*4?bR%g<>k^t{@gDNa|r6h z9BGEV*383@BG`7QsVlf}7=fq@41?x;A~A{OL{H)&b8psx^2dvrr-Ef5Ieh%X>F!R} zdYgs3S`#wA_JU3Rs%V&%e5yv^78M{o4g@l!Lwu?Qq+M)-GSrbcas@dlnd)y{F=DDm zi7=f)VcbT8vsafe+XG03c4Q>jU^Cb5_i=8zv@q0H%bGVS+F;hv`{hgacqTAODKYg+ zoEeqNZKw*C=6_(K89IF?9^b=L!H6QhI>iH6@(HyDll+fW?|(rG9}o(c(*$0zsS6NH zFQv09)F4%EF)Wz8dky!Ssh$0VubD3M6ZkECh%`Y25y@+_Oqjm~SXNGV2ay;oS~@;u zB=nXZ1rRoRAzKfEh5a0nN`22WEUs8VaPT3uYBU`S(a}oE&lF~6<9rV-h+abWR($;n z;?JQm`nc_DcxG1t7jPxDXvKH7%3vH}He;FgHx{+;E;Ymvj-r~AlNw<3hCBsKP?7r`=? zg2*T`q>s8NZ_hp%g1H8khlv=INFEkVxUh*cWDjRwK?3oF03_60*de$(d!G9@kp%p0~z=ZoQLEx%~N6=lu@ZnC!P_SyO{1&dWmI*V}W7|Tj-|#ybKt7hfjeFjE$CsGG z>SzFw%ygVrSt#bI{~dYG5W8g6K@`50ZNc~mW!l{1+>dO2|7maKFl6I#UZWsEk0jVn z4n$(Ry^~FlQsr{A9(8A7NF7|I4c01}Sbso)^s*_kb@l{0`hH!5Jvj}me&adKJm(ox zDIX9-G5q^NjT7C#64Gzpyuva|Nqk!y&9ErWV8_`-BSU<0DUi=2Q7`}O#heb*Swzoc zmDYrpof#b}9+J9pXz%O^Pj_BC^e?Y#sN570zl?JcdRAQB$xsA}tv<3|CMPqL_~YrE zK80<5C7HG68+Bh*Ret9-#?IOu^?0E|$&_iYUH+kdE44Jl$+C(oVW=jC7MB%HtONKs z;i#^zzUXvowtQIjIWnzX5}YkJL?%dOQ{K@eIO_6{@9qTGaG%`a#kah2LDk~Fs0CHfAm82vj#ODW4~g>< z&v8%OJLYF%Wnu{|6WX84opoxyev|Il;YG4NxYX9z>M#-4X1XR^`Ur)wl`H4NxpFm>5E`mcHGzG$A?K!EuQU94XF2c<<^So7ntT@LAvc;FCEAYTR@!uIvjEqVV{yzkCj!B zr(I}p-y5?D*|P-c*gpy05VGF4fXW(vybm{ zXJ>o@e`dH4EulmRp76;D9pc{D%S-!?H$`;3aXwA}&GvbuDW{?GLlxLN9&@V+wrn**se~>IF^04^SWZYD}6$AL%N;dOOd7hMpZ`a-u1m3K5r-vQs~ zz3yR>%c*r|Edk?p%|sn$SHcT$nN3^R3~L`tb4Pm0Td&iwaj=e|N8AbcNG0OxyXvG3 zs&_%yNtUGVoMA3V{DE^r34sR8SAO=q6PZvpyqT6L zV`sablU}#)HR(BcW4X-SG7a<@w3S@XF2ojcbC?%I8H7<`zLyK)qtBM47-Whxv{NU~ zl7b2Ps-B|m)wgopTK#iftZAXJp#2{W(^cv zNB;90oP@_;*7P UH=Sp2+*^Q}iuS8|CELjV0xwgJ?*IS* literal 22135 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 From b01f135d3a91fa04fda32b2969198a587c0f1303 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 24 Aug 2019 19:09:56 -0500 Subject: [PATCH 29/97] addresses a few concerns --- code/modules/jobs/job_types/_job.dm | 2 ++ code/modules/jobs/job_types/captain.dm | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index cc18560cbb..2eeffa8b7a 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -139,6 +139,8 @@ return 0 if(!SSdbcore.Connect()) return 0 //Without a database connection we can't get a player's age so we'll assume they're old enough for all jobs + if(C.prefs.db_flags & DB_FLAG_EXEMPT) + return 0 if(!isnum(minimal_player_age)) return 0 diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index d334cff772..00a710bdf4 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -25,7 +25,7 @@ display_order = JOB_DISPLAY_ORDER_CAPTAIN - blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/insanity) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/job/captain/get_access() return get_all_accesses() From 1ba9d374fe5f5a8f6db95a0589117fc5b3083ecd Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 25 Aug 2019 01:19:16 -0500 Subject: [PATCH 30/97] whatever, I guess --- code/modules/mob/dead/new_player/new_player.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index cd0d19f543..1cd32d43ac 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -546,7 +546,7 @@ var/frn = CONFIG_GET(flag/force_random_names) if(!frn) - frn = jobban_isbanned(src, "Appearance") + frn = jobban_isbanned(src, "appearance") if(QDELETED(src)) return if(frn) From a4fd2be7f7fd97fb74fb4607362e677b35086a7d Mon Sep 17 00:00:00 2001 From: Tupinambis Date: Mon, 26 Aug 2019 14:45:12 -0500 Subject: [PATCH 31/97] Various Shotgun Nerfs. --- code/modules/projectiles/guns/ballistic/shotgun.dm | 2 ++ .../projectiles/projectile/bullets/shotgun.dm | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 856dfed78b..04f24794ef 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -5,6 +5,7 @@ item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY force = 10 + fire_delay = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/internal/shot @@ -205,6 +206,7 @@ name = "combat shotgun" desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." icon_state = "cshotgun" + fire_delay = 5 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE unique_reskin = list("Tatical" = "cshotgun", diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index f9aa47c6a3..3595df098a 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,11 +1,11 @@ /obj/item/projectile/bullet/shotgun_slug name = "12g shotgun slug" - damage = 60 + damage = 50 /obj/item/projectile/bullet/shotgun_beanbag name = "beanbag slug" damage = 5 - stamina = 80 + stamina = 70 /obj/item/projectile/bullet/incendiary/shotgun name = "incendiary slug" @@ -47,7 +47,7 @@ /obj/item/projectile/bullet/shotgun_frag12 name ="frag12 slug" - damage = 25 + damage = 20 knockdown = 50 /obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) @@ -61,12 +61,12 @@ /obj/item/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" - damage = 12.5 + damage = 10 /obj/item/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" - damage = 3 - stamina = 25 + damage = 2 + stamina = 12.5 /obj/item/projectile/bullet/pellet/Range() ..() From 13638ed5d67a2269c9181bce3dc36294038e48bf Mon Sep 17 00:00:00 2001 From: Tupinambis Date: Mon, 26 Aug 2019 15:08:36 -0500 Subject: [PATCH 32/97] Reverts some changes I deemed unneccesary. Undoes a fuckup --- code/modules/projectiles/guns/ballistic/shotgun.dm | 1 - code/modules/projectiles/projectile/bullets/shotgun.dm | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 04f24794ef..951d227a89 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -5,7 +5,6 @@ item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY force = 10 - fire_delay = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/internal/shot diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 3595df098a..3555cd3b75 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,6 +1,6 @@ /obj/item/projectile/bullet/shotgun_slug name = "12g shotgun slug" - damage = 50 + damage = 60 /obj/item/projectile/bullet/shotgun_beanbag name = "beanbag slug" @@ -47,7 +47,7 @@ /obj/item/projectile/bullet/shotgun_frag12 name ="frag12 slug" - damage = 20 + damage = 25 knockdown = 50 /obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) From d43b4599ef18cbea53cb2bae31380185a027e38e Mon Sep 17 00:00:00 2001 From: Tupinambis Date: Mon, 26 Aug 2019 15:53:44 -0500 Subject: [PATCH 33/97] I was bullied to reduce click delay. --- code/modules/projectiles/guns/ballistic/shotgun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 951d227a89..9962bb3424 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -205,7 +205,7 @@ name = "combat shotgun" desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." icon_state = "cshotgun" - fire_delay = 5 + fire_delay = 3 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE unique_reskin = list("Tatical" = "cshotgun", From 3b2be43bd870a55a545f97435efc849576ae8e03 Mon Sep 17 00:00:00 2001 From: Tupinambis Date: Tue, 27 Aug 2019 18:35:08 -0500 Subject: [PATCH 34/97] Slightly increased rubbershot damage from 12.5 to 15 per pellet. --- code/modules/projectiles/projectile/bullets/shotgun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 3555cd3b75..4a1c954b1b 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -66,7 +66,7 @@ /obj/item/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" damage = 2 - stamina = 12.5 + stamina = 15 /obj/item/projectile/bullet/pellet/Range() ..() From 96aae12057109cbde4ce2ed81d086d89c15bac69 Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Thu, 29 Aug 2019 21:19:16 -0400 Subject: [PATCH 35/97] readds --- icons/obj/hydroponics/seeds.dmi | Bin 22302 -> 22704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 1cdb720dca490f167c133b8d48d09d57c0a90399..24363fccfe379b4cfa5cf19d5e825876509b84d2 100644 GIT binary patch delta 3138 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 O0E`VRP^4RKnEwJ+@b?J- delta 2733 zcmV;e3R3m3u>qd00gxAeKnMl^004r`rg{JX0_u8HSad{Xb7OL8aCB*JZU6vyoSm1! zZWJ*LhR?fCF@kH0DD=Q(FQ^sjfxZHAGTw}}P8>N-r_0lG*wTV1tix?r`u@ZdJNBQq z)92eSclXoH*SqZlY9lGrZn}Q=e!E#|wq@E)A3tn23sPF_^rsnr7*4zCO+%b7<3dbt zwwsx>O}pu8yV)ybJpFzJO^Y=1@l|R)`p|%?P83tB48<7(MXXpWsyAc<6L%oakeeI> zLh-=|AwO)A-SI|I=c?<1;5^@qU;}srRdKSdmp#ksOph#^w-&LM@bEV-K zZ-&Sbs$WsL=K*{LK2S-yw?##=Uzk|d|IrM6Oj}?c-v)DaqPI=IvW#7!aKeCMh)U%3!D&S)3gdYV{sq5}pTtaHi}fF?+)mg_4}hR-qDz#R&WJM$gy>72gt&bM6N2*eb-Kj4hxTkk1d$Cll;X?uq>tBnM|T^!a=Dp^xs0 zPhflPah!I)xCiUaPg8K^DP+@4(uxt(DlDe9<~m#3ESv5KA#I~yWI^E#AD1qZBqMJV0d;7nn}M@BGrr;TFv_x!(|ZtriVo3D4< zA53Zn8xYLyGH|mY0~$aA6W6mnLuw3vY-8HG?lAsyJD{jhUOKQzp=q#TKo(h9NJb{K z;Wd01Oq!O0Mw50pN}_2+)1*mlr%9C%(xfR-wGUO4O;LkNw3bFHMcT9^ys1trv<1hY zwUJ4K?IfG=z?firY8@ag``}#X+QH`9*!ME+{3Pr6+-slbU^ox|`@iQL%Z}%NlAlx- zgY>1imGH*jYIvo7GFAsT?VrtQA2t`2$CdVfcmXc}2M;Fy#^7urnQXE$*L1wqnX*&^ z$z+q2>7e;Ev~NBIkL#egkm_WEKN#>cKQoQT=g0W8p81(+f&qWh<7@Hhg8==r;)cH~ z(T9iT8w~g<2t`MLE%|u_1Aev^>1na-wjt7)?5cY3|;G{##TJdZ|u)O`px)6AbuqU!P!Ta3E%MrrqBn@p!68aL^moaD}Ko zcX&!CJH19McU3{H%l**ftkoCA<(j2JrPQn<+Q0J}5KQPsC_4QEuE3 zS1KVJ`h7NgkK65HXmH?vk!aZMcBQSasN*s=^@nLMD4?pl7oTs2s_tIe3kp;>;c#e? z&;PSTIF#LVgAztYKIZ&|VP0(c9@nQrSQ_fMJ{3~64?2HmT&X6B#;b)9+wFTWo6P{2 z&1OnUO4w)oS=#NSoq~|KIDC~o#tJSDU!}RRF4JZJII`7sU{`s6>7myLr+-~rSxWz{ zs0kb@k6x|$Jk>kJ$b4&(hn|0`fqf<*CUTSJ#IJi zp>WJ_f&qUl8XX!Oc%(1u)tA#}v-e1mX1Q?(<;G_KFqtZne!kh%mw(nRmi<RCV{pO6fd!(rPmkI^Hg!@JUz*Eb@3>w0`F3OwM(InDGXD zHwgG{U}>nsc4hs6P`a$>yU_VNSXTYqT9?Z#*_AdRky>RfM6Vjg(4Ss1y}m*}(Eds-~}t8kqpOo^fP+qI zJJmJe@n_qA;!HQOt_Cl+eVftAdolB^uX%!Np0jDUlePiN&9`=6WmZiXk{iJa@O+Yp zOwM2K!2PeHgI-7a13#6%baPLd1tB4y{g6xj=Tlq}sPXf!_W39FW4-#R@Oix)*BiK$ zp9f3JvE!HW^Ej?IaL(%`uPj9aS>(579q=WKi(jgLBlv)T??x=`Ab(RM&(zLIixxbC!L^C*tavkhTHO1@GeX%mc)ga~VuMOGUayAivCo z^$&a{My!>-)<3@*`ibN(m13}zF|Z3BbHXKAv>RGlW?)wtWvyl4gxj9Mb?c?#?)Y|= zpW4fRoA$T(={MR~v@NmIqD~H0GF&OzmCP65;KA?4<^t!M*~0izO*TRV3=d5=liaUF z+Be~>txXJ#j{)%SyHV2}8Xv>j+LUo8QV}%**MURjoODc0qa%7F=Yt1%%0J&m%2~!P zbsbaFCr{Nz4jkF)TK7^|p|7pJ#8Un=3r;V8IH6*~P1DkH?6Ix2EOu_zrOsuzWWH}s z+~i*53sp2BI@=-9d|&N2#H$_Z?S~{qyM{=7T`e|31S}^S4QFP;8RdYjtxfd2e<`k> zYm!A|5R0||vKDa({f(s$P}5uh%we+yxmorw*Wf$jVBgUlz#Ox=k&a_=@qWyFPgHJy zhwyyvMS=FVM$TUtrnIO4OG6#+^nIjS+98qJ&Mwtc4-yUMYoaBe0MX}H+9y@-M>fcK z7K9q6yBdi`K#m8!(BD}408i=-JoY04IDuVI<}?6vs_Ae4&K!%jC4Oo60>blDH!ZLI zrYs?u@H>4U0nxOBR%l_q@V{%etC5y}0n3*gCp)hek`bsTDD*YgmzEpXG#4=WesuNM zHp(d3ITt&hOHPl@@{4){z^Xal)1$eag&{3BZf|Q$dOnw|wcL1eVmzn%lCNUOcHc0*IzXts7k69^<;`1y;9|Nh?lWA=ALyZGUM4;1S+ zfB$mU_22!&Yl`)cynHI_`ZF)Rq*%Y?Ps(-zO9#ul7RCCx+70br)4x&Nhi6KEm%ZK4 z1OkCTkbN}Y3ql|e2>xFY1}qQ=1R5a>SRfDxG(s4#Kp+rkgfL)%Kp@ZvVZZ``K%f!A nfCU19KqG_!3j_jzM*J7b Date: Fri, 30 Aug 2019 20:44:39 +0100 Subject: [PATCH 36/97] Allows furranium grown from organic sources. --- .../code/modules/reagents/chemistry/recipes/fermi.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 078e1c8a71..94bad98752 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -382,6 +382,9 @@ FermiChem = TRUE PurityMin = 0.3 +/datum/chemical_reaction/fermi/furranium/organic + required_reagents = list("aphro" = 0.1, "catnip" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1) + //FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10. //There's a weird rounding error or something ugh. From 58458a67409ee03f97904ce75f1c9f4e6fa86096 Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Sat, 31 Aug 2019 21:12:27 -0400 Subject: [PATCH 37/97] the seeds --- icons/obj/hydroponics/harvest.dmi | Bin 51762 -> 52053 bytes icons/obj/hydroponics/seeds.dmi | Bin 22779 -> 22917 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index fe126cadd8dfd2d06060e64c00e6c711249d5415..7796e1b1996c0c7fa23b7b38fadffcc42668b0f9 100644 GIT binary patch delta 18445 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 Date: Sat, 31 Aug 2019 21:16:14 -0400 Subject: [PATCH 38/97] huh --- code/modules/hydroponics/grown/tea_coffee.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 8de7c9358f..06cbb1df0c 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -51,6 +51,7 @@ desc = "Long stocks with flowering tips that has a chemical to make feline attracted to it." species = "catnip" plantname = "Catnip Plant" + growthstages = 3 product = /obj/item/reagent_containers/food/snacks/grown/tea/catnip reagents_add = list("catnip" = 0.1, "vitamin" = 0.06, "teapowder" = 0.3) rarity = 50 From eee1ccbe2ca72dbdbe295f95ee2fad9afbdef4ae Mon Sep 17 00:00:00 2001 From: Alonefromhell Date: Tue, 27 Aug 2019 22:12:00 +0200 Subject: [PATCH 39/97] merge oracle ui from kepler --- code/controllers/subsystem/assets.dm | 12 +- code/modules/paperwork/paper.dm | 54 ++- code/modules/recycling/disposal/bin.dm | 50 ++- .../code/modules/oracle_ui/README.md | 233 ++++++++++++ .../code/modules/oracle_ui/assets.dm | 9 + .../code/modules/oracle_ui/hookup_procs.dm | 44 +++ .../code/modules/oracle_ui/oracle_ui.dm | 134 +++++++ .../code/modules/oracle_ui/themed.dm | 82 ++++ .../oracle_ui/content/disposal_bin/index.html | 27 ++ .../html/oracle_ui/editor_tool.html | 103 +++++ .../html/oracle_ui/themes/nano/index.html | 19 + .../oracle_ui/themes/nano/sui-nano-common.css | 353 ++++++++++++++++++ .../oracle_ui/themes/nano/sui-nano-common.js | 47 +++ .../themes/nano/sui-nano-jquery.min.js | 4 + tgstation.dme | 4 + 15 files changed, 1141 insertions(+), 34 deletions(-) create mode 100644 modular_kepler/code/modules/oracle_ui/README.md create mode 100644 modular_kepler/code/modules/oracle_ui/assets.dm create mode 100644 modular_kepler/code/modules/oracle_ui/hookup_procs.dm create mode 100644 modular_kepler/code/modules/oracle_ui/oracle_ui.dm create mode 100644 modular_kepler/code/modules/oracle_ui/themed.dm create mode 100644 modular_kepler/html/oracle_ui/content/disposal_bin/index.html create mode 100644 modular_kepler/html/oracle_ui/editor_tool.html create mode 100644 modular_kepler/html/oracle_ui/themes/nano/index.html create mode 100644 modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.css create mode 100644 modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.js create mode 100644 modular_kepler/html/oracle_ui/themes/nano/sui-nano-jquery.min.js diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 7285298283..7b6554bd3f 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -6,7 +6,17 @@ SUBSYSTEM_DEF(assets) var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) - for(var/type in typesof(/datum/asset)) + + var/list/priority_assets = list( + /datum/asset/simple/oui_theme_nano, + /datum/asset/simple/goonchat + ) + + for(var/type in priority_assets) + var/datum/asset/A = new type() + A.register() + + for(var/type in typesof(/datum/asset) - (priority_assets | list(/datum/asset, /datum/asset/simple))) var/datum/asset/A = type if (type != initial(A._abstract)) get_asset_datum(type) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 37877ffb09..a342b23c24 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -31,6 +31,7 @@ var/spam_flag = 0 var/contact_poison // Reagent ID to transfer on contact var/contact_poison_volume = 0 + var/datum/oracle_ui/ui = null /obj/item/paper/pickup(user) @@ -40,16 +41,40 @@ if(!istype(G) || G.transfer_prints) H.reagents.add_reagent(contact_poison,contact_poison_volume) contact_poison = null + ui.check_view_all() ..() +/obj/item/paper/dropped(mob/user) + ui.check_view(user) + return ..() + /obj/item/paper/Initialize() . = ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) + ui = new /datum/oracle_ui(src, 420, 600, get_asset_datum(/datum/asset/spritesheet/simple/paper)) + ui.can_resize = FALSE update_icon() updateinfolinks() +/obj/item/paper/oui_getcontent(mob/target) + if(!target.is_literate()) + return "[name][stars(info)]
[stamps]" + else if(istype(target.get_active_held_item(), /obj/item/pen) | istype(target.get_active_held_item(), /obj/item/toy/crayon)) + return "[name][info_links]
[stamps]" + else + return "[name][info]
[stamps]" + +/obj/item/paper/oui_canview(mob/target) + if(check_rights_for(target.client, R_FUN)) //Allows admins to view faxes + return TRUE + if(isAI(target)) + var/mob/living/silicon/ai/ai = target + return get_dist(src, ai.current) < 2 + if(iscyborg(target)) + return get_dist(src, target) < 2 + return ..() /obj/item/paper/update_icon() @@ -65,20 +90,13 @@ /obj/item/paper/examine(mob/user) ..() to_chat(user, "Alt-click to fold it.") - - var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/paper) - assets.send(user) - - if(in_range(user, src) || isobserver(user)) - if(user.is_literate()) - user << browse("[name][info]
[stamps]", "window=[name]") - onclose(user, "[name]") - else - user << browse("[name][stars(info)]
[stamps]", "window=[name]") - onclose(user, "[name]") + if(oui_canview(user)) + ui.render(user) else to_chat(user, "You're too far away to read it!") +/obj/item/paper/proc/show_content(mob/user) + user.examinate(src) /obj/item/paper/verb/rename() set name = "Rename paper" @@ -98,7 +116,7 @@ if((loc == usr && usr.stat == CONSCIOUS)) name = "paper[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) - + ui.render_all() /obj/item/paper/suicide_act(mob/user) user.visible_message("[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...") @@ -108,7 +126,7 @@ spam_flag = FALSE /obj/item/paper/attack_self(mob/user) - user.examinate(src) + show_content(user) if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) if(!spam_flag) spam_flag = TRUE @@ -123,11 +141,9 @@ else //cyborg or AI not seeing through a camera dist = get_dist(src, user) if(dist < 2) - usr << browse("[name][info]
[stamps]", "window=[name]") - onclose(usr, "[name]") + show_content(user) else - usr << browse("[name][stars(info)]
[stamps]", "window=[name]") - onclose(usr, "[name]") + to_chat(user, "You can't quite see it.") /obj/item/paper/proc/addtofield(id, text, links = 0) @@ -173,6 +189,7 @@ for(var/i in 1 to min(fields, 15)) addtofield(i, "
write", 1) info_links = info_links + "write" + ui.render_all() /obj/item/paper/proc/clearpaper() @@ -289,7 +306,7 @@ if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) if(user.is_literate()) - user << browse("[name][info_links]
[stamps]", "window=[name]") + show_content(user) return else to_chat(user, "You don't know how to read or write.") @@ -312,6 +329,7 @@ add_overlay(stampoverlay) to_chat(user, "You stamp the paper with your rubber stamp.") + ui.render_all() if(P.is_hot()) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 871fd32b16..082b1a7d11 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -264,6 +264,13 @@ name = "disposal unit" desc = "A pneumatic waste disposal unit." icon_state = "disposal" + var/datum/oracle_ui/themed/nano/ui + +/obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() + ui = new /datum/oracle_ui/themed/nano(src, 330, 190, "disposal_bin") + ui.auto_refresh = TRUE + ui.can_resize = FALSE // attack by item places it in to disposal /obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) @@ -275,32 +282,43 @@ STR.remove_from_storage(O,src) T.update_icon() update_icon() + ui.soft_update_fields() else + ui.soft_update_fields() return ..() // handle machine interaction -/obj/machinery/disposal/bin/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) +/obj/machinery/disposal/bin/ui_interact(mob/user, state) if(stat & BROKEN) return - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "disposal_unit", name, 300, 200, master_ui, state) - ui.open() + if(user.loc == src) + to_chat(user, "You cannot reach the controls from inside!") + return + ui.render(user) -/obj/machinery/disposal/bin/ui_data(mob/user) +/obj/machinery/disposal/bin/oui_canview(mob/user) + if(user.loc == src) + return FALSE + if(stat & BROKEN) + return FALSE + if(Adjacent(user)) + return TRUE + return ..() + + +/obj/machinery/disposal/bin/oui_data(mob/user) var/list/data = list() - data["flush"] = flush - data["full_pressure"] = full_pressure - data["pressure_charging"] = pressure_charging - data["panel_open"] = panel_open - var/per = CLAMP(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100) - data["per"] = round(per, 1) + data["flush"] = flush ? ui.act("Disengage", user, "handle-0", class="active") : ui.act("Engage", user, "handle-1") + data["full_pressure"] = full_pressure ? "Ready" : (pressure_charging ? "Pressurizing" : "Off") + data["pressure_charging"] = pressure_charging ? ui.act("Turn Off", user, "pump-0", class="active", disabled=full_pressure) : ui.act("Turn On", user, "pump-1", disabled=full_pressure) + var/per = full_pressure ? 100 : CLAMP(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 99) + data["per"] = "[round(per, 1)]%" + data["contents"] = ui.act("Eject Contents", user, "eject", disabled=contents.len < 1) data["isai"] = isAI(user) return data -/obj/machinery/disposal/bin/ui_act(action, params) +/obj/machinery/disposal/bin/oui_act(mob/user, action, list/params) if(..()) return @@ -327,6 +345,7 @@ if("eject") eject() . = TRUE + ui.soft_update_fields() /obj/machinery/disposal/bin/hitby(atom/movable/AM) @@ -346,6 +365,7 @@ full_pressure = FALSE pressure_charging = TRUE update_icon() + ui.soft_update_fields() /obj/machinery/disposal/bin/update_icon() cut_overlays() @@ -389,7 +409,7 @@ do_flush() flush_count = 0 - updateDialog() + ui.soft_update_fields() if(flush && air_contents.return_pressure() >= SEND_PRESSURE) // flush can happen even without power do_flush() diff --git a/modular_kepler/code/modules/oracle_ui/README.md b/modular_kepler/code/modules/oracle_ui/README.md new file mode 100644 index 0000000000..8aaf73f513 --- /dev/null +++ b/modular_kepler/code/modules/oracle_ui/README.md @@ -0,0 +1,233 @@ +# `/datum/oracle_ui` + +This datum is a replacement for tgui which does not use any Node.js dependencies, and works entirely through raw HTML, JS and CSS. It's designed to be reasonably easy to port something from tgui to oracle_ui. + +### How to create a UI + +For this example, we're going to port the disposals bin from tgui to oracle_ui. + +#### Step 1 + +In order to create a UI, you will first need to create an instance of `/datum/oracle_ui` or one of its subclasses, in this case `/datum/oracle_ui/themed/nano`. + +You need to pass in `src`, the width of the window, the height of the window, and the template to render from. You can optionally set some flags to disallow window resizing and whether to automatically refresh the UI. + +`code/modules/recycling/disposal-unit.dm` +```dm +/obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() + ui = new /datum/oracle_ui/themed/nano(src, 330, 190, "disposal_bin") + ui.auto_refresh = TRUE + ui.can_resize = FALSE +``` + +#### Step 2 + +You will now need to make a template in `modular_kepler/html/oracle_ui/content/{template_name}`. + +Values defined as `@{value}` will get replaced at runtime by oracle_ui. + +`modular_kepler/html/oracle_ui/content/disposal_bin/index.html` +```html +
+
+ State: +
@{full_pressure}
+
+
+ Pressure: +
+
+
+
@{per}
+
+
+
+
+ Handle: +
@{flush}
+
+
+ Eject: +
@{contents}
+
+
+ Compressor: +
@{pressure_charging}
+
+
+``` + +#### Step 3 + +Now you need to implement the methods that provide data to oracle_ui. `oui_data` can be adapted from the `ui_data` proc that tgui uses. + +The `act` proc generates a hyperlink that will result in `oui_act` getting called on your object when clicked. The `class` argument defines a css class to be added to the hyperlink, and disabled determines whether the hyperlink will be disabled or not. + +Calling `soft_update_fields` will result in the UI being updated on all clients, which is useful when the object changes state. + +`code/modules/recycling/disposal-unit.dm` +```dm +/obj/machinery/disposal/bin/oui_data(mob/user) + var/list/data = list() + data["flush"] = flush ? ui.act("Disengage", user, "handle-0", class="active") : ui.act("Engage", user, "handle-1") + data["full_pressure"] = full_pressure ? "Ready" : (pressure_charging ? "Pressurizing" : "Off") + data["pressure_charging"] = pressure_charging ? ui.act("Turn Off", user, "pump-0", class="active", disabled=full_pressure) : ui.act("Turn On", user, "pump-1", disabled=full_pressure) + var/per = full_pressure ? 100 : Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 99) + data["per"] = "[round(per, 1)]%" + data["contents"] = ui.act("Eject Contents", user, "eject", disabled=contents.len < 1) + data["isai"] = isAI(user) + return data +/obj/machinery/disposal/bin/oui_act(mob/user, action, list/params) + if(..()) + return + switch(action) + if("handle-0") + flush = FALSE + update_icon() + . = TRUE + if("handle-1") + if(!panel_open) + flush = TRUE + update_icon() + . = TRUE + if("pump-0") + if(pressure_charging) + pressure_charging = FALSE + update_icon() + . = TRUE + if("pump-1") + if(!pressure_charging) + pressure_charging = TRUE + update_icon() + . = TRUE + if("eject") + eject() + . = TRUE + ui.soft_update_fields() +``` + +#### Step 4 + +You now need to hook in and ensure oracle_ui is invoked upon clicking. `render` should be used to open the UI for a user, typically on click. + +`code/modules/recycling/disposal-unit.dm` +```dm +/obj/machinery/disposal/bin/ui_interact(mob/user, state) + if(stat & BROKEN) + return + if(user.loc == src) + to_chat(user, "You cannot reach the controls from inside!") + return + ui.render(user) +``` + +#### Done + +![gif](https://user-images.githubusercontent.com/202160/37561879-1bb9179e-2a52-11e8-902c-80e6e6df7204.gif) + +You should have a functional UI at this point. Some additional odds and ends can be discovered throughout `code/modules/recycling/disposal-unit.dm`. For a full diff of the changes made to it, refer to [the original pull request on GitHub](https://github.com/OracleStation/OracleStation/pull/702/files#diff-4b6c20ec7d37222630e7524d9577e230). + +### API Reference + +#### `/datum/oracle_ui` + +The main datum which handles the UI. + +##### `get_content(mob/target)` +Returns the HTML that should be displayed for a specified target mob. Calls `oui_getcontent` on the datasource to get the return value. *This proc is not used in the themed subclass.* + +##### `can_view(mob/target)` +Returns whether the specified target mob can view the UI. Calls `oui_canview` on the datasource to get the return value. + +##### `test_viewer(mob/target, updating)` +Tests whether the client is valid and can view the UI. If updating is TRUE, checks to see if they still have the UI window open. + +##### `render(mob/target, updating = FALSE)` +Opens the UI for a target mob, sending HTML. If updating is TRUE, will only do it to clients which still have the window open. + +##### `render_all()` +Does the above, but for all viewers and with updating set to TRUE. + +##### `close(mob/target)` +Closes the UI for the specified target mob. + +##### `close_all()` +Does the above, but for all viewers. + +##### `check_view(mob/target)` +Checks if the specified target mob can view the UI, and if they can't closes their UI + +##### `check_view_all()` +Does the above, but for all viewers. + +##### `call_js(mob/target, js_func, list/parameters = list())` +Invokes `js_func` in the UI of the specified target mob with the specified parameters. + +##### `call_js_all(js_func, list/parameters = list()))` +Does the above, but for all viewers. + +##### `steal_focus(mob/target)` +Causes the UI to steal focus for the specified target mob. + +##### `steal_focus_all()` +Does the above, but for all viewers. + +##### `flash(mob/target, times = -1)` +Causes the UI to flash for the specified target mob the specified number of times, the default keeps the element flashing until focused. + +##### `flash_all()` +Does the above, but for all viewers. + +##### `href(mob/user, action, list/parameters = list())` +Generates a href for the specified user which will invoke `oui_act` on the datasource with the specified action and parameters. + +#### `/datum/oracle_ui/themed` + +A subclass which supports templating and theming. + +##### `get_file(path)` +Loads a file from disk and returns the contents. Caches files loaded from disk for you. + +##### `get_content_file(filename)` +Loads a file from the current content folder and returns the contents. + +##### `get_themed_file(filename)` +Loads a file from the current theme folder and returns the contents. + +##### `process_template(template, variables)` +Processes a template and populates it with the provided variables. + +##### `get_inner_content(mob/target)` +Returns the templated content to be inserted into the main template for the specified target mob. + +##### `soft_update_fields()` +For all viewers, updates the fields in the template via the `updateFields` javaScript function. + +##### `soft_update_all()` +For all viewers, updates the content body in the template via the `replaceContent` javaScript function. + +##### `change_page(var/newpage)` +Changes the template to use to draw the page and forces an update to all viewers + +##### `act(label, mob/user, action, list/parameters = list(), class = "", disabled = FALSE` +Returns a fully formatted hyperlink for the specified user. `label` will be the hyperlink label, `action` and `parameters` are what will be passed to `oui_act`, `class` is any CSS classes to apply to the hyperlink and `disabled` will disable the hyperlink. + +#### `/datum` + +Functions built into all objects to support oracle_ui. There are default implementations for most major superclasses. + +##### `oui_canview(mob/user)` +Returns whether the specified user view the UI at this time. + +##### `oui_getcontent(mob/user)` +Returns the raw HTML to be sent to the specified user. *This proc is not used in the themed subclass of oracle_ui.* + +##### `oui_data(mob/user)` +Returns templating data for the specified user. *This proc is only used in the themed subclass of oracle_ui.* + +##### `oui_data_debug(mob/user)` +Returns the above, but JSON-encoded and escaped, for copy pasting into the web IDE. *This proc is only used for debugging purposes.* + +##### `oui_act(mob/user, action, list/params)` +Called when a hyperlink is clicked in the UI. diff --git a/modular_kepler/code/modules/oracle_ui/assets.dm b/modular_kepler/code/modules/oracle_ui/assets.dm new file mode 100644 index 0000000000..e68fce38a7 --- /dev/null +++ b/modular_kepler/code/modules/oracle_ui/assets.dm @@ -0,0 +1,9 @@ +/datum/asset/simple/oui_theme_nano + assets = list( + // JavaScript + "sui-nano-common.js" = 'modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.js', + "sui-nano-jquery.min.js" = 'modular_kepler/html/oracle_ui/themes/nano/sui-nano-jquery.min.js', + // Stylesheets + "sui-nano-common.css" = 'modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.css', + ) + \ No newline at end of file diff --git a/modular_kepler/code/modules/oracle_ui/hookup_procs.dm b/modular_kepler/code/modules/oracle_ui/hookup_procs.dm new file mode 100644 index 0000000000..e6038744c1 --- /dev/null +++ b/modular_kepler/code/modules/oracle_ui/hookup_procs.dm @@ -0,0 +1,44 @@ +/datum/proc/oui_canview(mob/user) + return TRUE + +/datum/proc/oui_getcontent(mob/user) + return "Default Implementation" + +/datum/proc/oui_canuse(mob/user) + if(isobserver(user) && !user.has_unlimited_silicon_privilege) + return FALSE + return oui_canview(user) + +/datum/proc/oui_data(mob/user) + return list() + +/datum/proc/oui_data_debug(mob/user) + return html_encode(json_encode(oui_data(user))) + +/datum/proc/oui_act(mob/user, action, list/params) + // No Implementation + +/atom/oui_canview(mob/user) + if(isobserver(user)) + return TRUE + if(user.incapacitated()) + return FALSE + if(isturf(src.loc) && Adjacent(user)) + return TRUE + return FALSE + +/obj/item/oui_canview(mob/user) + if(src.loc == user) + return src in user.held_items + return ..() + +/obj/machinery/oui_canview(mob/user) + if(user.has_unlimited_silicon_privilege) + return TRUE + if(!can_interact()) + return FALSE + if(iscyborg(user)) + return can_see(user, src, 7) + if(isAI(user)) + return GLOB.cameranet.checkTurfVis(get_turf_pixel(src)) + return ..() diff --git a/modular_kepler/code/modules/oracle_ui/oracle_ui.dm b/modular_kepler/code/modules/oracle_ui/oracle_ui.dm new file mode 100644 index 0000000000..5e8d6b9c7b --- /dev/null +++ b/modular_kepler/code/modules/oracle_ui/oracle_ui.dm @@ -0,0 +1,134 @@ +/datum/oracle_ui + var/width = 512 + var/height = 512 + var/can_close = TRUE + var/can_minimize = FALSE + var/can_resize = TRUE + var/titlebar = TRUE + var/window_id = null + var/viewers[0] + var/auto_check_view = TRUE + var/auto_refresh = FALSE + var/atom/datasource = null + var/datum/asset/assets = null + +/datum/oracle_ui/New(atom/n_datasource, n_width = 512, n_height = 512, n_assets = null) + datasource = n_datasource + window_id = REF(src) + width = n_width + height = n_height + +/datum/oracle_ui/Destroy() + close_all() + if(src.datum_flags & DF_ISPROCESSING) + STOP_PROCESSING(SSobj, src) + return ..() + +/datum/oracle_ui/process() + if(auto_check_view) + check_view_all() + if(auto_refresh) + render_all() + +/datum/oracle_ui/proc/get_content(mob/target) + return call(datasource, "oui_getcontent")(target) + +/datum/oracle_ui/proc/can_view(mob/target) + return call(datasource, "oui_canview")(target) + +/datum/oracle_ui/proc/test_viewer(mob/target, updating) + //If the target is null or does not have a client, remove from viewers and return + if(!target | !target.client | !can_view(target)) + viewers -= target + if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING)) + STOP_PROCESSING(SSobj, src) //No more viewers, stop polling + close(target) + return FALSE + //If this is an update, and they have closed the window, remove from viewers and return + if(updating && winget(target, window_id, "is-visible") != "true") + viewers -= target + if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING)) + STOP_PROCESSING(SSobj, src) //No more viewers, stop polling + return FALSE + return TRUE + +/datum/oracle_ui/proc/render(mob/target, updating = FALSE) + set waitfor = FALSE //Makes this an async call + if(!can_view(target)) + return + //Check to see if they have the window open still if updating + if(updating && !test_viewer(target, updating)) + return + //Send assets + if(!updating && assets) + assets.send(target) + //Add them to the viewers if they aren't there already + viewers |= target + if(!(src.datum_flags & DF_ISPROCESSING) && (auto_refresh | auto_check_view)) + START_PROCESSING(SSobj, src) //Start processing to poll for viewability + //Send the content + if(updating) + target << output(get_content(target), "[window_id].browser") + else + target << browse(get_content(target), "window=[window_id];size=[width]x[height];can_close=[can_close];can_minimize=[can_minimize];can_resize=[can_resize];titlebar=[titlebar];focus=false;") + steal_focus(target) + +/datum/oracle_ui/proc/render_all() + for(var/viewer in viewers) + render(viewer, TRUE) + +/datum/oracle_ui/proc/close(mob/target) + if(target && target.client) + target << browse(null, "window=[window_id]") + +/datum/oracle_ui/proc/close_all() + for(var/viewer in viewers) + close(viewer) + viewers = list() + +/datum/oracle_ui/proc/check_view_all() + for(var/viewer in viewers) + check_view(viewer) + +/datum/oracle_ui/proc/check_view(mob/target) + set waitfor = FALSE //Makes this an async call + if(!test_viewer(target, TRUE)) + close(target) + +/datum/oracle_ui/proc/call_js(mob/target, js_func, list/parameters = list()) + set waitfor = FALSE //Makes this an async call + if(!test_viewer(target, TRUE)) + return + target << output(list2params(parameters),"[window_id].browser:[js_func]") + +/datum/oracle_ui/proc/call_js_all(js_func, list/parameters = list()) + for(var/viewer in viewers) + call_js(viewer, js_func, parameters) + +/datum/oracle_ui/proc/steal_focus(mob/target) + set waitfor = FALSE //Makes this an async call + winset(target, "[window_id]","focus=true") + +/datum/oracle_ui/proc/steal_focus_all() + for(var/viewer in viewers) + steal_focus(viewer) + +/datum/oracle_ui/proc/flash(mob/target, times = -1) + set waitfor = FALSE //Makes this an async call + winset(target, "[window_id]","flash=[times]") + +/datum/oracle_ui/proc/flash_all(times = -1) + for(var/viewer in viewers) + flash(viewer, times) + +/datum/oracle_ui/proc/href(mob/user, action, list/parameters = list()) + var/params_string = replacetext(list2params(parameters),"&",";") + return "?src=[REF(src)];sui_action=[action];sui_user=[REF(user)];[params_string]" + +/datum/oracle_ui/Topic(href, parameters) + var/action = parameters["sui_action"] + var/mob/current_user = locate(parameters["sui_user"]) + if(!call(datasource, "oui_canuse")(current_user)) + return + if(datasource) + call(datasource, "oui_act")(current_user, action, parameters); diff --git a/modular_kepler/code/modules/oracle_ui/themed.dm b/modular_kepler/code/modules/oracle_ui/themed.dm new file mode 100644 index 0000000000..9bf31bd1da --- /dev/null +++ b/modular_kepler/code/modules/oracle_ui/themed.dm @@ -0,0 +1,82 @@ +/datum/oracle_ui/themed + var/theme = "" + var/content_root = "" + var/current_page = "index.html" + var/root_template = "" + +/datum/oracle_ui/themed/New(atom/n_datasource, n_width = 512, n_height = 512, n_content_root = "") + root_template = get_themed_file("index.html") + content_root = n_content_root + return ..(n_datasource, n_width, n_height, get_asset_datum(/datum/asset/simple/oui_theme_nano)) + +/datum/oracle_ui/themed/process() + if(auto_check_view) + check_view_all() + if(auto_refresh) + soft_update_fields() + +GLOBAL_LIST_EMPTY(oui_template_variables) +GLOBAL_LIST_EMPTY(oui_file_cache) + +/datum/oracle_ui/themed/proc/get_file(path) + if(GLOB.oui_file_cache[path]) + return GLOB.oui_file_cache[path] + else if(fexists(path)) + var/data = file2text(path) + GLOB.oui_file_cache[path] = data + return data + else + var/errormsg = "MISSING PATH '[path]'" +#ifndef UNIT_TESTS + log_world(errormsg) //Because Travis absolutely hates these procs +#endif + return errormsg + +/datum/oracle_ui/themed/proc/get_content_file(filename) + return get_file("./modular_kepler/html/oracle_ui/content/[content_root]/[filename]") + +/datum/oracle_ui/themed/proc/get_themed_file(filename) + return get_file("./modular_kepler/html/oracle_ui/themes/[theme]/[filename]") + +/datum/oracle_ui/themed/proc/process_template(template, variables) + var/regex/pattern = regex("\\@\\{(\\w+)\\}","gi") + GLOB.oui_template_variables = variables + var/replaced = pattern.Replace(template, /proc/oui_process_template_replace) + GLOB.oui_template_variables = null + return replaced + +/proc/oui_process_template_replace(match, group1) + var/value = GLOB.oui_template_variables[group1] + return "[value]" + +/datum/oracle_ui/themed/proc/get_inner_content(mob/target) + var/list/data = call(datasource, "oui_data")(target) + return process_template(get_content_file(current_page), data) + +/datum/oracle_ui/themed/get_content(mob/target) + var/list/template_data = list("title" = datasource.name, "body" = get_inner_content(target)) + return process_template(root_template, template_data) + +/datum/oracle_ui/themed/proc/soft_update_fields() + for(var/viewer in viewers) + var/json = json_encode(call(datasource, "oui_data")(viewer)) + call_js(viewer, "updateFields", list(json)) + +/datum/oracle_ui/themed/proc/soft_update_all() + for(var/viewer in viewers) + call_js(viewer, "replaceContent", list(get_inner_content(viewer))) + +/datum/oracle_ui/themed/proc/change_page(newpage) + if(newpage == current_page) + return + current_page = newpage + render_all() + +/datum/oracle_ui/themed/proc/act(label, mob/user, action, list/parameters = list(), class = "", disabled = FALSE) + if(disabled) + return "[label]" + else + return "[label]" + +/datum/oracle_ui/themed/nano + theme = "nano" diff --git a/modular_kepler/html/oracle_ui/content/disposal_bin/index.html b/modular_kepler/html/oracle_ui/content/disposal_bin/index.html new file mode 100644 index 0000000000..8f7713b53c --- /dev/null +++ b/modular_kepler/html/oracle_ui/content/disposal_bin/index.html @@ -0,0 +1,27 @@ +
+
+ State: +
@{full_pressure}
+
+
+ Pressure: +
+
+
+
@{per}
+
+
+
+
+ Handle: +
@{flush}
+
+
+ Eject: +
@{contents}
+
+
+ Compressor: +
@{pressure_charging}
+
+
\ No newline at end of file diff --git a/modular_kepler/html/oracle_ui/editor_tool.html b/modular_kepler/html/oracle_ui/editor_tool.html new file mode 100644 index 0000000000..e0ce75bb29 --- /dev/null +++ b/modular_kepler/html/oracle_ui/editor_tool.html @@ -0,0 +1,103 @@ + + + + + + OracleUI IDE + + + +
+

Content Template:

+ +
+
+

Data:

+ +
+
+

Output:

+ +
+ + + diff --git a/modular_kepler/html/oracle_ui/themes/nano/index.html b/modular_kepler/html/oracle_ui/themes/nano/index.html new file mode 100644 index 0000000000..388f6e4ce4 --- /dev/null +++ b/modular_kepler/html/oracle_ui/themes/nano/index.html @@ -0,0 +1,19 @@ + + + + + + @{title} + + + + + +
+
@{title}
+
+ @{body} +
+
+ + diff --git a/modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.css b/modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.css new file mode 100644 index 0000000000..481b81c3e3 --- /dev/null +++ b/modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.css @@ -0,0 +1,353 @@ +body +{ + padding: 0; + margin: 0; + background-color: #272727; + font-size: 12px; + color: #ffffff; + line-height: 170%; + cursor: default; + -moz-user-select: none; + -ms-user-select: none; +} + +hr +{ + background-color: #40628a; + height: 1px; +} + +a, a:link, a:visited, a:active, .linkOn, .linkOff +{ + color: #ffffff; + text-decoration: none; + background: #40628a; + border: 1px solid #161616; + padding: 1px 4px 1px 4px; + margin: 0 2px 0 0; + cursor:default; +} + +a:hover +{ + color: #40628a; + background: #ffffff; +} + +a.white, a.white:link, a.white:visited, a.white:active +{ + color: #40628a; + text-decoration: none; + background: #ffffff; + border: 1px solid #161616; + padding: 1px 4px 1px 4px; + margin: 0 2px 0 0; + cursor:default; +} + +a.white:hover +{ + color: #ffffff; + background: #40628a; +} + +.active, a.active:link, a.active:visited, a.active:active, a.active:hover +{ + color: #ffffff; + background: #2f943c; + border-color: #24722e; +} + +.disabled, a.disabled:link, a.disabled:visited, a.disabled:active, a.disabled:hover +{ + color: #ffffff; + background: #999999; + border-color: #666666; +} + +a.icon, .linkOn.icon, .linkOff.icon +{ + position: relative; + padding: 1px 4px 2px 20px; +} + +a.icon img, .linkOn.icon img +{ + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; +} + +ul +{ + padding: 4px 0 0 10px; + margin: 0; + list-style-type: none; +} + +li +{ + padding: 0 0 2px 0; +} + +img, a img +{ + border-style:none; +} + +h1, h2, h3, h4, h5, h6 +{ + margin: 0; + padding: 16px 0 8px 0; + color: #517087; +} + +h1 +{ + font-size: 15px; +} + +h2 +{ + font-size: 14px; +} + +h3 +{ + font-size: 13px; +} + +h4 +{ + font-size: 12px; +} + +.uiWrapper +{ + + width: 100%; + height: 100%; +} + +.uiTitle +{ + clear: both; + padding: 6px 8px 6px 8px; + border-bottom: 2px solid #161616; + background: #383838; + color: #98B0C3; + font-size: 16px; +} + +.uiTitle.icon +{ + padding: 6px 8px 6px 42px; + background-position: 2px 50%; + background-repeat: no-repeat; +} + +.uiContent +{ + clear: both; + padding: 8px; + font-family: Verdana, Geneva, sans-serif; +} + +.good +{ + color: #00ff00; +} + +.average +{ + color: #d09000; +} + +.bad +{ + color: #ff0000; +} + +.highlight +{ + color: #8BA5C4; +} + +.dark +{ + color: #272727; +} + +.notice +{ + position: relative; + background: #E9C183; + color: #15345A; + font-size: 10px; + font-style: italic; + padding: 2px 4px 0 4px; + margin: 4px; +} + +.notice.icon +{ + padding: 2px 4px 0 20px; +} + +.notice img +{ + position: absolute; + top: 0; + left: 0; + width: 16px; + height: 16px; +} + +div.notice +{ + clear: both; +} + +.statusDisplay +{ + background: #000000; + color: #ffffff; + border: 1px solid #40628a; + padding: 4px; + margin: 3px 0; +} + +.statusLabel +{ + width: 138px; + float: left; + overflow: hidden; + color: #98B0C3; +} + +.statusValue +{ + float: left; +} + +.block +{ + padding: 8px; + margin: 10px 4px 4px 4px; + border: 1px solid #40628a; + background-color: #202020; +} + +.block h3 +{ + padding: 0; +} + +.progressBar +{ + position: relative; + width: 185px; + height: 14px; + border: 1px solid #666666; + float: left; + overflow: hidden; + padding: 1px; +} + +.progressLabel +{ + top: -2px; + height: 100%; + position: absolute; + right: 4px; + text-align: right; +} + +.progressFill +{ + width: 100%; + height: 100%; + background: #40628a; + overflow: hidden; + transition: width 2.2s linear; +} + +.progressFill.good +{ + color: #ffffff; + background: #00ff00; +} + +.progressFill.average +{ + color: #ffffff; + background: #d09000; +} + +.progressFill.bad +{ + color: #ffffff; + background: #ff0000; +} + +.progressFill.highlight +{ + color: #ffffff; + background: #8BA5C4; +} + +.clearBoth +{ + clear: both; +} + +.clearLeft +{ + clear: left; +} + +.clearRight +{ + clear: right; +} + +.line +{ + width: 100%; + clear: both; +} + +section .label, section .content +{ + display: table-cell; + margin: 0; + text-align: left; + vertical-align: middle; + padding: 3px 2px +} + +section .label +{ + width: 1%; + padding-right: 32px; + white-space: nowrap; + color: #8ba5c4; +} + +section +{ + display: table-row; + width: 100% +} + +.display { + width: calc(100% - 8px); + padding: 4px; + background-color: #000; + background-color: rgba(0, 0, 0, .33); + box-shadow: inset 0 0 5px rgba(0, 0, 0, .5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)"; + filter: progid: DXImageTransform.Microsoft.gradient(startColorStr=#54000000, endColorStr=#54000000); +} \ No newline at end of file diff --git a/modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.js b/modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.js new file mode 100644 index 0000000000..716891a53f --- /dev/null +++ b/modular_kepler/html/oracle_ui/themes/nano/sui-nano-common.js @@ -0,0 +1,47 @@ +function replaceContent(body) { + var maincontent = document.getElementById('maincontent'); + if(maincontent) { + maincontent.innerHTML = body; + } +} + +function updateProgressLabels() { + var progressBars = document.getElementsByClassName("progressBar"); + for(var i = 0; i < progressBars.length; i++) { + var progressBar = progressBars[i]; + if(!progressBar) + continue; + var progressFill = progressBar.getElementsByClassName("progressFill")[0]; + if(!progressFill) + continue; + var width = parseInt(getComputedStyle(progressFill).width); + var maxWidth = parseInt(getComputedStyle(progressBar).width); + var progressLabel = progressBar.getElementsByClassName("progressLabel")[0]; + if(progressLabel) + progressLabel.innerHTML = Math.round((width / maxWidth) * 100) + '%'; + } +} + +if(getComputedStyle) { setInterval(updateProgressLabels, 50); } //Fallback + +function updateFields(json) { + var fields = JSON.parse(json); + for (var key in fields) { + let value = fields[key]; + var element = document.getElementById(key); + if(element == null) { + continue; + } else if(element.classList.contains('progressBar')) { + var progressFill = element.getElementsByClassName("progressFill")[0]; + if(progressFill) + progressFill.style["width"] = value; + if(!getComputedStyle) { //Fallback + var progressLabel = element.getElementsByClassName("progressLabel")[0]; + if(progressLabel) + progressLabel.innerHTML = value; + } + } else { + element.innerHTML = value; + } + } +} \ No newline at end of file diff --git a/modular_kepler/html/oracle_ui/themes/nano/sui-nano-jquery.min.js b/modular_kepler/html/oracle_ui/themes/nano/sui-nano-jquery.min.js new file mode 100644 index 0000000000..645c5adc18 --- /dev/null +++ b/modular_kepler/html/oracle_ui/themes/nano/sui-nano-jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; + if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/
","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("