Job refactor 2: less hardcoded lists (#60578)

* Job refactor 2: less hardcoded lists

* Obsessed can happen
This commit is contained in:
Rohesie
2021-08-05 16:13:05 -03:00
committed by GitHub
parent 392a74693d
commit 6c4134d1ea
67 changed files with 644 additions and 489 deletions

View File

@@ -48,14 +48,23 @@
#define JOB_DISPLAY_ORDER_PRISONER 35
#define DEPARTMENT_SECURITY (1<<0)
#define DEPARTMENT_COMMAND (1<<1)
#define DEPARTMENT_SERVICE (1<<2)
#define DEPARTMENT_CARGO (1<<3)
#define DEPARTMENT_ENGINEERING (1<<4)
#define DEPARTMENT_SCIENCE (1<<5)
#define DEPARTMENT_MEDICAL (1<<6)
#define DEPARTMENT_SILICON (1<<7)
#define DEPARTMENT_UNASSIGNED "No department assigned"
#define DEPARTMENT_BITFLAG_SECURITY (1<<0)
#define DEPARTMENT_SECURITY "Security"
#define DEPARTMENT_BITFLAG_COMMAND (1<<1)
#define DEPARTMENT_COMMAND "Command"
#define DEPARTMENT_BITFLAG_SERVICE (1<<2)
#define DEPARTMENT_SERVICE "Service"
#define DEPARTMENT_BITFLAG_CARGO (1<<3)
#define DEPARTMENT_CARGO "Cargo"
#define DEPARTMENT_BITFLAG_ENGINEERING (1<<4)
#define DEPARTMENT_ENGINEERING "Engineering"
#define DEPARTMENT_BITFLAG_SCIENCE (1<<5)
#define DEPARTMENT_SCIENCE "Science"
#define DEPARTMENT_BITFLAG_MEDICAL (1<<6)
#define DEPARTMENT_MEDICAL "Medical"
#define DEPARTMENT_BITFLAG_SILICON (1<<7)
#define DEPARTMENT_SILICON "Silicon"
/* Job datum job_flags */
/// Whether the mob is announced on arrival.
@@ -68,6 +77,10 @@
#define JOB_CREW_MEMBER (1<<3)
/// Whether this job can be joined through the new_player menu.
#define JOB_NEW_PLAYER_JOINABLE (1<<4)
/// Whether this job appears in bold in the job menu.
#define JOB_BOLD_SELECT_TEXT (1<<5)
/// Reopens this position if we lose the player at roundstart.
#define JOB_REOPEN_ON_ROUNDSTART_LOSS (1<<6)
#define FACTION_NONE "None"
#define FACTION_STATION "Station"

View File

@@ -120,7 +120,7 @@
#define INIT_ORDER_STATION 74 //This is high priority because it manipulates a lot of the subsystems that will initialize after it.
#define INIT_ORDER_EVENTS 70
#define INIT_ORDER_IDACCESS 66
#define INIT_ORDER_JOBS 65
#define INIT_ORDER_JOBS 65 // Must init before atoms, to set up properly the dynamic job lists.
#define INIT_ORDER_QUIRKS 60
#define INIT_ORDER_AI_MOVEMENT 56 //We need the movement setup
#define INIT_ORDER_AI_CONTROLLERS 55 //So the controller can get the ref

View File

@@ -113,6 +113,9 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_job_display_asc(datum/job/A, datum/job/B)
return A.display_order - B.display_order
/proc/cmp_department_display_asc(datum/job_department/A, datum/job_department/B)
return A.display_order - B.display_order
/proc/cmp_reagents_asc(datum/reagent/a, datum/reagent/b)
return sorttext(initial(b.name),initial(a.name))

View File

@@ -546,7 +546,7 @@
if(!human.client || !human.mind)
continue
var/datum/job/human_job = human.mind.assigned_role
if(!(human_job.departments & DEPARTMENT_SERVICE))
if(!(human_job.departments_bitflags & DEPARTMENT_SERVICE))
continue
human_job.award_service(human.client, award)

View File

@@ -192,6 +192,7 @@
/datum/config_entry/flag/use_exp_tracking
/// Enables head jobs time restrictions.
/datum/config_entry/flag/use_exp_restrictions_heads
/datum/config_entry/number/use_exp_restrictions_heads_hours
@@ -201,6 +202,7 @@
/datum/config_entry/flag/use_exp_restrictions_heads_department
/// Enables non-head jobs time restrictions.
/datum/config_entry/flag/use_exp_restrictions_other
/datum/config_entry/flag/use_exp_restrictions_admin_bypass

View File

@@ -4,11 +4,22 @@ SUBSYSTEM_DEF(job)
flags = SS_NO_FIRE
/// List of all jobs.
var/list/all_occupations = list()
var/list/datum/job/all_occupations = list()
/// List of jobs that can be joined through the starting menu.
var/list/joinable_occupations = list()
var/list/datum/job/name_occupations = list() //Dict of all jobs, keys are titles
var/list/type_occupations = list() //Dict of all jobs, keys are types
var/list/datum/job/joinable_occupations = list()
/// Dictionary of all jobs, keys are titles.
var/list/name_occupations = list()
/// Dictionary of all jobs, keys are types.
var/list/datum/job/type_occupations = list()
/// Dictionary of jobs indexed by the experience type they grant.
var/list/experience_jobs_map = list()
/// List of all departments with joinable jobs.
var/list/datum/job_department/joinable_departments = list()
/// List of all joinable departments indexed by their typepath, sorted by their own display order.
var/list/datum/job_department/joinable_departments_by_type = list()
var/list/unassigned = list() //Players who need jobs
var/initial_players_to_assign = 0 //used for checking against population caps
@@ -90,13 +101,25 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/SetupOccupations()
all_occupations = list()
joinable_occupations = list()
name_occupations = list()
type_occupations = list()
var/list/all_jobs = subtypesof(/datum/job)
if(!length(all_jobs))
all_occupations = list()
joinable_occupations = list()
joinable_departments = list()
joinable_departments_by_type = list()
experience_jobs_map = list()
to_chat(world, span_boldannounce("Error setting up jobs, no job datums found"))
return FALSE
var/list/new_all_occupations = list()
var/list/new_joinable_occupations = list()
var/list/new_joinable_departments = list()
var/list/new_joinable_departments_by_type = list()
var/list/new_experience_jobs_map = list()
for(var/job_type in all_jobs)
var/datum/job/job = new job_type()
if(!job.config_check())
@@ -104,11 +127,44 @@ SUBSYSTEM_DEF(job)
if(!job.map_check()) //Even though we initialize before mapping, this is fine because the config is loaded at new
testing("Removed [job.type] due to map config")
continue
all_occupations += job
new_all_occupations += job
name_occupations[job.title] = job
type_occupations[job_type] = job
if(job.job_flags & JOB_NEW_PLAYER_JOINABLE)
joinable_occupations += job
new_joinable_occupations += job
if(!LAZYLEN(job.departments_list))
var/datum/job_department/department = new_joinable_departments_by_type[/datum/job_department/undefined]
if(!department)
department = new /datum/job_department/undefined()
new_joinable_departments_by_type[/datum/job_department/undefined] = department
department.add_job(job)
continue
for(var/department_type in job.departments_list)
var/datum/job_department/department = new_joinable_departments_by_type[department_type]
if(!department)
department = new department_type()
new_joinable_departments_by_type[department_type] = department
department.add_job(job)
sortTim(new_all_occupations, /proc/cmp_job_display_asc)
for(var/datum/job/job as anything in new_all_occupations)
if(!job.exp_granted_type)
continue
new_experience_jobs_map[job.exp_granted_type] += list(job)
sortTim(new_joinable_departments_by_type, /proc/cmp_department_display_asc, associative = TRUE)
for(var/department_type in new_joinable_departments_by_type)
var/datum/job_department/department = new_joinable_departments_by_type[department_type]
sortTim(department.department_jobs, /proc/cmp_job_display_asc)
new_joinable_departments += department
if(department.department_experience_type)
new_experience_jobs_map[department.department_experience_type] = department.department_jobs.Copy()
all_occupations = new_all_occupations
joinable_occupations = sortTim(new_joinable_occupations, /proc/cmp_job_display_asc)
joinable_departments = new_joinable_departments
joinable_departments_by_type = new_joinable_departments_by_type
experience_jobs_map = new_experience_jobs_map
return TRUE
@@ -123,6 +179,11 @@ SUBSYSTEM_DEF(job)
SetupOccupations()
return type_occupations[jobtype]
/datum/controller/subsystem/job/proc/get_department_type(department_type)
if(!length(all_occupations))
SetupOccupations()
return joinable_departments_by_type[department_type]
/datum/controller/subsystem/job/proc/AssignRole(mob/dead/new_player/player, datum/job/job, latejoin = FALSE)
JobDebug("Running AR, Player: [player], Rank: [isnull(job) ? "null" : job.type], LJ: [latejoin]")
@@ -188,7 +249,7 @@ SUBSYSTEM_DEF(job)
if(istype(job, GetJobType(overflow_role))) // We don't want to give him assistant, that's boring!
continue
if(job.title in GLOB.command_positions) //If you want a command position, select it!
if(job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) //If you want a command position, select it!
continue
if(is_banned_from(player.ckey, job.title) || QDELETED(player))
@@ -232,11 +293,11 @@ SUBSYSTEM_DEF(job)
//it locates a head or runs out of levels to check
//This is basically to ensure that there's atleast a few heads in the round
/datum/controller/subsystem/job/proc/FillHeadPosition()
var/datum/job_department/command_department = get_department_type(/datum/job_department/command)
if(!command_department)
return FALSE
for(var/level in level_order)
for(var/command_position in GLOB.command_positions)
var/datum/job/job = GetJob(command_position)
if(!job)
continue
for(var/datum/job/job as anything in command_department.department_jobs)
if((job.current_positions >= job.total_positions) && job.total_positions != -1)
continue
var/list/candidates = FindOccupationCandidates(job, level)
@@ -251,10 +312,10 @@ SUBSYSTEM_DEF(job)
//This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
//This is also to ensure we get as many heads as possible
/datum/controller/subsystem/job/proc/CheckHeadPositions(level)
for(var/command_position in GLOB.command_positions)
var/datum/job/job = GetJob(command_position)
if(!job)
continue
var/datum/job_department/command_department = get_department_type(/datum/job_department/command)
if(!command_department)
return
for(var/datum/job/job as anything in command_department.department_jobs)
if((job.current_positions >= job.total_positions) && job.total_positions != -1)
continue
var/list/candidates = FindOccupationCandidates(job, level)
@@ -676,7 +737,7 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/get_living_heads()
. = list()
for(var/mob/living/carbon/human/player as anything in GLOB.human_list)
if(player.stat != DEAD && (player.mind?.assigned_role.departments & DEPARTMENT_COMMAND))
if(player.stat != DEAD && (player.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND))
. += player.mind
@@ -686,7 +747,7 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/get_all_heads()
. = list()
for(var/mob/living/carbon/human/player as anything in GLOB.human_list)
if(player.mind?.assigned_role.departments & DEPARTMENT_COMMAND)
if(player.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
. += player.mind
//////////////////////////////////////////////
@@ -695,7 +756,7 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/get_living_sec()
. = list()
for(var/mob/living/carbon/human/player as anything in GLOB.human_list)
if(player.stat != DEAD && (player.mind?.assigned_role.departments & DEPARTMENT_SECURITY))
if(player.stat != DEAD && (player.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY))
. += player.mind
////////////////////////////////////////
@@ -704,7 +765,7 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/get_all_sec()
. = list()
for(var/mob/living/carbon/human/player as anything in GLOB.human_list)
if(player.mind?.assigned_role.departments & DEPARTMENT_SECURITY)
if(player.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY)
. += player.mind
/datum/controller/subsystem/job/proc/JobDebug(message)

View File

@@ -142,62 +142,50 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
if(foundrecord)
foundrecord.fields["rank"] = assignment
/datum/datacore/proc/get_manifest()
var/list/manifest_out = list(
"Command",
"Security",
"Engineering",
"Medical",
"Science",
"Supply",
"Service",
"Silicon"
)
var/list/departments = list(
"Command" = GLOB.command_positions,
"Security" = GLOB.security_positions + GLOB.security_sub_positions,
"Engineering" = GLOB.engineering_positions,
"Medical" = GLOB.medical_positions,
"Science" = GLOB.science_positions,
"Supply" = GLOB.supply_positions,
"Service" = GLOB.service_positions,
"Silicon" = GLOB.nonhuman_positions
)
var/list/heads = GLOB.command_positions + list("Quartermaster")
for(var/datum/data/record/t in GLOB.data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/has_department = FALSE
for(var/department in departments)
var/list/jobs = departments[department]
if(rank in jobs)
if(!manifest_out[department])
manifest_out[department] = list()
// Append to beginning of list if captain or department head
if (rank == "Captain" || (department != "Command" && (rank in heads)))
manifest_out[department] = list(list(
/datum/datacore/proc/get_manifest()
// First we build up the order in which we want the departments to appear in.
var/list/manifest_out = list()
for(var/datum/job_department/department as anything in SSjob.joinable_departments)
manifest_out[department.department_name] = list()
manifest_out[DEPARTMENT_UNASSIGNED] = list()
var/list/departments_by_type = SSjob.joinable_departments_by_type
for(var/datum/data/record/record as anything in GLOB.data_core.general)
var/name = record.fields["name"]
var/rank = record.fields["rank"]
var/datum/job/job = SSjob.GetJob(rank)
if(!job || !(job.job_flags & JOB_CREW_MANIFEST) || !LAZYLEN(job.departments_list)) // In case an unlawful custom rank is added.
var/list/misc_list = manifest_out[DEPARTMENT_UNASSIGNED]
misc_list[++misc_list.len] = list(
"name" = name,
"rank" = rank
)) + manifest_out[department]
"rank" = rank,
)
continue
for(var/department_type as anything in job.departments_list)
var/datum/job_department/department = departments_by_type[department_type]
if(!department)
stack_trace("get_manifest() failed to get job department for [department_type] of [job.type]")
continue
var/list/entry = list(
"name" = name,
"rank" = rank,
)
var/list/department_list = manifest_out[department.department_name]
if(istype(job, department.department_head))
department_list.Insert(1, null)
department_list[1] = entry
else
manifest_out[department] += list(list(
"name" = name,
"rank" = rank
))
has_department = TRUE
if(!has_department)
if(!manifest_out["Misc"])
manifest_out["Misc"] = list()
manifest_out["Misc"] += list(list(
"name" = name,
"rank" = rank
))
for (var/department in departments)
if (!manifest_out[department])
department_list[++department_list.len] = entry
// Trim the empty categories.
for (var/department in manifest_out)
if(!length(manifest_out[department]))
manifest_out -= department
return manifest_out
/datum/datacore/proc/get_manifest_html(monochrome = FALSE)
var/list/manifest = get_manifest()
var/dat = {"

View File

@@ -80,7 +80,7 @@
var/datum/mind/guilty_conscience = user.mind
if(guilty_conscience) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways)
var/datum/job/job = guilty_conscience.assigned_role
if(job.departments & (DEPARTMENT_MEDICAL | DEPARTMENT_SECURITY))
if(job.departments_bitflags & (DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SECURITY))
return
if(declaration)
to_chat(owner, span_notice("[user] is now considered guilty by [GLOB.deity] from your declaration."))
@@ -109,10 +109,10 @@
var/mob/living/carbon/human/target_human = target_creature
var/datum/job/job = target_human.mind?.assigned_role
var/is_holy = target_human.mind?.holy_role
if(is_holy || (job?.departments & DEPARTMENT_SECURITY))
if(is_holy || (job?.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY))
to_chat(honorbound_human, span_warning("There is nothing righteous in attacking the <b>just</b>."))
return FALSE
if(job?.departments & DEPARTMENT_MEDICAL)
if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL)
to_chat(honorbound_human, span_warning("If you truly think this healer is not <b>innocent</b>, declare them guilty."))
return FALSE
//THE INNOCENT
@@ -272,7 +272,7 @@
if(!silent)
to_chat(user, span_warning("Followers of [GLOB.deity] cannot be evil!"))
return FALSE
if(guilty_conscience.assigned_role.departments & DEPARTMENT_SECURITY)
if(guilty_conscience.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY)
if(!silent)
to_chat(user, span_warning("Members of security are uncorruptable! You cannot declare one evil!"))
return FALSE

View File

@@ -149,7 +149,7 @@
/datum/station_trait/deathrattle_department/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client)
SIGNAL_HANDLER
if(!(job.departments & department_to_apply_to))
if(!(job.departments_bitflags & department_to_apply_to))
return
var/obj/item/implant/deathrattle/implant_to_give = new()
@@ -160,43 +160,43 @@
/datum/station_trait/deathrattle_department/service
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_SERVICE
department_to_apply_to = DEPARTMENT_BITFLAG_SERVICE
department_name = "Service"
/datum/station_trait/deathrattle_department/cargo
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_CARGO
department_to_apply_to = DEPARTMENT_BITFLAG_CARGO
department_name = "Cargo"
/datum/station_trait/deathrattle_department/engineering
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_ENGINEERING
department_to_apply_to = DEPARTMENT_BITFLAG_ENGINEERING
department_name = "Engineering"
/datum/station_trait/deathrattle_department/command
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_COMMAND
department_to_apply_to = DEPARTMENT_BITFLAG_COMMAND
department_name = "Command"
/datum/station_trait/deathrattle_department/science
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_SCIENCE
department_to_apply_to = DEPARTMENT_BITFLAG_SCIENCE
department_name = "Science"
/datum/station_trait/deathrattle_department/security
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_SECURITY
department_to_apply_to = DEPARTMENT_BITFLAG_SECURITY
department_name = "Security"
/datum/station_trait/deathrattle_department/medical
trait_flags = NONE
weight = 1
department_to_apply_to = DEPARTMENT_MEDICAL
department_to_apply_to = DEPARTMENT_BITFLAG_MEDICAL
department_name = "Medical"
/datum/station_trait/deathrattle_all

View File

@@ -96,7 +96,7 @@
return FALSE
var/head_check = 0
for(var/mob/player in GLOB.alive_player_list)
if (player.mind.assigned_role.departments & DEPARTMENT_COMMAND)
if (player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
head_check++
return (head_check >= required_heads_of_staff)

View File

@@ -874,8 +874,7 @@
|| candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \
|| candidate.stat == DEAD \
|| !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \
|| !SSjob.GetJob(candidate.mind.assigned_role) \
|| (candidate.mind.assigned_role in GLOB.nonhuman_positions) \
|| !candidate.mind.assigned_role \
)
candidates -= candidate

View File

@@ -97,29 +97,17 @@
return
/proc/reopen_roundstart_suicide_roles()
var/list/valid_positions = list()
valid_positions += GLOB.engineering_positions
valid_positions += GLOB.medical_positions
valid_positions += GLOB.science_positions
valid_positions += GLOB.supply_positions
valid_positions += GLOB.service_positions
valid_positions += GLOB.security_positions
if(CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_positions))
valid_positions += GLOB.command_positions //add any remaining command positions
else
valid_positions -= GLOB.command_positions //remove all command positions that were added from their respective department positions lists.
var/include_command = CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_positions)
var/list/reopened_jobs = list()
for(var/X in GLOB.suicided_mob_list)
if(!isliving(X))
for(var/mob/living/quitter in GLOB.suicided_mob_list)
var/datum/job/job = SSjob.GetJob(quitter.job)
if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS))
continue
var/mob/living/L = X
if(L.job in valid_positions)
var/datum/job/J = SSjob.GetJob(L.job)
if(!J)
if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
continue
J.current_positions = max(J.current_positions-1, 0)
reopened_jobs += L.job
job.current_positions = max(job.current_positions - 1, 0)
reopened_jobs += quitter.job
if(CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_report))
if(reopened_jobs.len)

View File

@@ -546,6 +546,12 @@ DEFINE_BITFIELD(turret_flags, list(
if(!allowed(perp))
return 10
// If we aren't shooting heads then return a threatcount of 0
if (!(turret_flags & TURRET_FLAG_SHOOT_HEADS))
var/datum/job/apparent_job = SSjob.GetJob(perp.get_assignment())
if(apparent_job?.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
return 0
if(turret_flags & TURRET_FLAG_AUTH_WEAPONS) //check for weapon authorization
if(isnull(perp.wear_id) || istype(perp.wear_id.GetID(), /obj/item/card/id/advanced/chameleon))
@@ -566,10 +572,6 @@ DEFINE_BITFIELD(turret_flags, list(
if((turret_flags & TURRET_FLAG_SHOOT_UNSHIELDED) && (!HAS_TRAIT(perp, TRAIT_MINDSHIELD)))
threatcount += 4
// If we aren't shooting heads then return a threatcount of 0
if (!(turret_flags & TURRET_FLAG_SHOOT_HEADS) && (perp.get_assignment() in GLOB.command_positions))
return 0
return threatcount
/obj/machinery/porta_turret/proc/in_faction(mob/target)

View File

@@ -12,8 +12,10 @@
var/inspiration_available = TRUE //If this banner can be used to inspire crew
var/morale_time = 0
var/morale_cooldown = 600 //How many deciseconds between uses
var/list/job_loyalties //Mobs with any of these assigned roles will be inspired
var/list/role_loyalties //Mobs with any of these special roles will be inspired
/// Mobs with assigned roles whose department bitflags match these will be inspired.
var/job_loyalties = NONE
/// Mobs with any of these special roles will be inspired
var/list/role_loyalties
var/warcry
/obj/item/banner/examine(mob/user)
@@ -38,14 +40,14 @@
morale_time = world.time + morale_cooldown
var/list/inspired = list()
var/has_job_loyalties = LAZYLEN(job_loyalties)
var/has_job_loyalties = job_loyalties != NONE
var/has_role_loyalties = LAZYLEN(role_loyalties)
inspired += user //The user is always inspired, regardless of loyalties
for(var/mob/living/carbon/human/H in range(4, get_turf(src)))
if(H.stat == DEAD || H == user)
continue
if(H.mind && (has_job_loyalties || has_role_loyalties))
if(has_job_loyalties && (H.mind.assigned_role.title in job_loyalties))
if(has_job_loyalties && (H.mind.assigned_role.departments_bitflags & job_loyalties))
inspired += H
else if(has_role_loyalties && (H.mind.special_role in role_loyalties))
inspired += H
@@ -86,7 +88,7 @@
/obj/item/banner/security/Initialize()
. = ..()
job_loyalties = GLOB.security_positions
job_loyalties = DEPARTMENT_BITFLAG_SECURITY
/obj/item/banner/security/mundane
inspiration_available = FALSE
@@ -110,7 +112,7 @@
/obj/item/banner/medical/Initialize()
. = ..()
job_loyalties = GLOB.medical_positions
job_loyalties = DEPARTMENT_BITFLAG_MEDICAL
/obj/item/banner/medical/mundane
inspiration_available = FALSE
@@ -142,7 +144,7 @@
/obj/item/banner/science/Initialize()
. = ..()
job_loyalties = GLOB.science_positions
job_loyalties = DEPARTMENT_BITFLAG_SCIENCE
/obj/item/banner/science/mundane
inspiration_available = FALSE
@@ -169,7 +171,7 @@
/obj/item/banner/cargo/Initialize()
. = ..()
job_loyalties = GLOB.supply_positions
job_loyalties = DEPARTMENT_BITFLAG_CARGO
/obj/item/banner/cargo/mundane
inspiration_available = FALSE
@@ -193,7 +195,7 @@
/obj/item/banner/engineering/Initialize()
. = ..()
job_loyalties = GLOB.engineering_positions
job_loyalties = DEPARTMENT_BITFLAG_ENGINEERING
/obj/item/banner/engineering/mundane
inspiration_available = FALSE
@@ -217,7 +219,7 @@
/obj/item/banner/command/Initialize()
. = ..()
job_loyalties = GLOB.command_positions
job_loyalties = DEPARTMENT_BITFLAG_COMMAND
/obj/item/banner/command/mundane
inspiration_available = FALSE

View File

@@ -110,7 +110,8 @@
var/datum/browser/panel = new(usr, "banpanel", "Banning Panel", 910, panel_height)
panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css')
panel.add_stylesheet("banpanelcss", 'html/admin/banpanel.css')
if(usr.client.prefs.tgui_fancy) //some browsers (IE8) have trouble with unsupported css3 elements and DOM methods that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
var/tgui_fancy = usr.client.prefs.tgui_fancy
if(tgui_fancy) //some browsers (IE8) have trouble with unsupported css3 elements and DOM methods that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css')
panel.add_script("banpaneljs", 'html/admin/banpanel.js')
var/list/output = list("<form method='get' action='?src=[REF(src)]'>[HrefTokenFormField()]")
@@ -195,6 +196,7 @@
</div>
</div>
"}
if(edit_id)
output += {"<label class='inputlabel checkbox'>Mirror edits to matching bans
<input type='checkbox' id='mirroredit' name='mirroredit' value='1'>
@@ -232,48 +234,41 @@
banned_from += query_get_banned_roles.item[1]
qdel(query_get_banned_roles)
var/break_counter = 0
output += "<div class='row'><div class='column'><label class='rolegroup command'><input type='checkbox' name='Command' class='hidden' [usr.client.prefs.tgui_fancy ? " onClick='toggle_checkboxes(this, \"_dep\")'" : ""]>Command</label><div class='content'>"
//all heads are listed twice so have a javascript call to toggle both their checkboxes when one is pressed
//for simplicity this also includes the captain even though it doesn't do anything
for(var/job in GLOB.command_positions)
output += "<div class='row'>"
for(var/datum/job_department/department as anything in SSjob.joinable_departments)
var/label_class = department.label_class
var/department_name = department.department_name
output += "<div class='column'><label class='rolegroup [label_class]'>[department_name]</label><div class='content'>"
for(var/datum/job/job_datum as anything in department.department_jobs)
if(break_counter > 0 && (break_counter % 3 == 0))
output += "<br>"
output += {"<label class='inputlabel checkbox'>[job]
<input type='checkbox' id='[job]_com' name='[job]' class='Command' value='1'[usr.client.prefs.tgui_fancy ? " onClick='toggle_head(this, \"_dep\")'" : ""]>
<div class='inputbox[(job in banned_from) ? " banned" : ""]'></div></label>
"}
break_counter++
output += "</div></div>"
//standard departments all have identical handling
var/list/job_lists = list("Security" = GLOB.security_positions,
"Engineering" = GLOB.engineering_positions,
"Medical" = GLOB.medical_positions,
"Science" = GLOB.science_positions,
"Supply" = GLOB.supply_positions)
for(var/department in job_lists)
//the first element is the department head so they need the same javascript call as above
output += "<div class='column'><label class='rolegroup [ckey(department)]'><input type='checkbox' name='[department]' class='hidden' [usr.client.prefs.tgui_fancy ? " onClick='toggle_checkboxes(this, \"_com\")'" : ""]>[department]</label><div class='content'>"
output += {"<label class='inputlabel checkbox'>[job_lists[department][1]]
<input type='checkbox' id='[job_lists[department][1]]_dep' name='[job_lists[department][1]]' class='[department]' value='1'[usr.client.prefs.tgui_fancy ? " onClick='toggle_head(this, \"_com\")'" : ""]>
<div class='inputbox[(job_lists[department][1] in banned_from) ? " banned" : ""]'></div></label>
var/job_name = job_datum.title
if(length(job_datum.departments_list) > 1) //This job is in multiple departments, so we need to check all the boxes.
// Clicking this will also toggle all the other boxes, minus this one.
var/department_index = job_datum.departments_list.Find(department.type)
if(!department_index)
stack_trace("Failed to find a department index for [department.type] in the departments_list of [job_datum.type]")
output += {"<label class='inputlabel checkbox'>[job_name]
<input type='checkbox' id='[job_name]_[department_index]' name='[job_name]' class='[label_class]' value='1'[tgui_fancy ? " onClick='toggle_other_checkboxes(this, \"[length(job_datum.departments_list)]\", \"[department_index]\")'" : ""]>
<div class='inputbox[(job_name in banned_from) ? " banned" : ""]'></div></label>
"}
break_counter = 1
for(var/job in job_lists[department] - job_lists[department][1]) //skip the first element since it's already been done
if(break_counter % 3 == 0)
output += "<br>"
output += {"<label class='inputlabel checkbox'>[job]
<input type='checkbox' name='[job]' class='[department]' value='1'>
<div class='inputbox[(job in banned_from) ? " banned" : ""]'></div></label>
else
output += {"<label class='inputlabel checkbox'>[job_name]
<input type='checkbox' name='[job_name]' class='[label_class]' value='1'>
<div class='inputbox[(job_name in banned_from) ? " banned" : ""]'></div></label>
"}
break_counter++
output += "</div></div>"
//departments/groups that don't have command staff would throw a javascript error since there's no corresponding reference for toggle_head()
var/list/headless_job_lists = list("Silicon" = GLOB.nonhuman_positions,
"Abstract" = list("Appearance", "Emote", "Deadchat", "OOC"))
for(var/department in headless_job_lists)
output += "<div class='column'><label class='rolegroup [ckey(department)]'><input type='checkbox' name='[department]' class='hidden' [usr.client.prefs.tgui_fancy ? " onClick='toggle_checkboxes(this, \"_com\")'" : ""]>[department]</label><div class='content'>"
break_counter = 0
for(var/job in headless_job_lists[department])
var/list/other_job_lists = list(
"Abstract" = list("Appearance", "Emote", "Deadchat", "OOC"),
)
for(var/department in other_job_lists)
output += "<div class='column'><label class='rolegroup [ckey(department)]'>[department]</label><div class='content'>"
break_counter = 0
for(var/job in other_job_lists[department])
if(break_counter > 0 && (break_counter % 3 == 0))
output += "<br>"
output += {"<label class='inputlabel checkbox'>[job]
@@ -283,8 +278,8 @@
break_counter++
output += "</div></div>"
var/list/long_job_lists = list(
"Service" = GLOB.service_positions,
"Ghost and Other Roles" = list(
ROLE_PAI,
ROLE_BRAINWASHED,
ROLE_DEATHSQUAD,
ROLE_DRONE,
@@ -317,7 +312,7 @@
),
)
for(var/department in long_job_lists)
output += "<div class='column'><label class='rolegroup long [ckey(department)]'><input type='checkbox' name='[department]' class='hidden' [usr.client.prefs.tgui_fancy ? " onClick='toggle_checkboxes(this, \"_com\")'" : ""]>[department]</label><div class='content'>"
output += "<div class='column'><label class='rolegroup long [ckey(department)]'>[department]</label><div class='content'>"
break_counter = 0
for(var/job in long_job_lists[department])
if(break_counter > 0 && (break_counter % 10 == 0))
@@ -330,9 +325,10 @@
output += "</div></div>"
output += "</div>"
output += "</form>"
panel.set_content(jointext(output, ""))
panel.set_content(output.Join())
panel.open()
/datum/admins/proc/ban_parse_href(list/href_list)
if(!check_rights(R_BAN))
return

View File

@@ -154,7 +154,7 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme)
priority_announce("As punishment for this station's poor productivity when compared to neighbor stations, names and identities will be restricted until further notice.", "Finance Report", SSstation.announcer.get_rand_alert_sound())
/datum/anonymous_theme/employees/anonymous_name(mob/target)
var/is_head_of_staff = target.mind.assigned_role.departments & DEPARTMENT_COMMAND
var/is_head_of_staff = target.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND
var/name = "[is_head_of_staff ? "Manager" : "Employee"] "
for(var/i in 1 to 6)
if(prob(30) || i == 1)

View File

@@ -162,14 +162,14 @@
return
var/list/viable_coworkers = list()
var/list/all_coworkers = list()
var/our_departments = oldmind.assigned_role.departments
var/our_departments = oldmind.assigned_role.departments_bitflags
for(var/mob/living/carbon/human/human_alive in GLOB.alive_mob_list)
if(!human_alive.mind)
continue
if(human_alive == oldmind.current || human_alive.mind.assigned_role.faction != FACTION_STATION || human_alive.mind.has_antag_datum(/datum/antagonist/obsessed))
continue //the jealousy target has to have a job, and not be the obsession or obsessed.
all_coworkers += human_alive.mind
if(!(our_departments & human_alive.mind.assigned_role.departments))
if(!(our_departments & human_alive.mind.assigned_role.departments_bitflags))
continue
viable_coworkers += human_alive.mind

View File

@@ -272,7 +272,7 @@
/datum/antagonist/gang/purple/check_gang_objective()
for(var/mob/player as anything in GLOB.player_list)
if(!(player.mind.assigned_role.departments & DEPARTMENT_SECURITY))
if(!(player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY))
continue
if(!player.suiciding && !considered_alive(player))
return FALSE

View File

@@ -22,7 +22,7 @@
/datum/antagonist/rev/can_be_owned(datum/mind/new_owner)
. = ..()
if(.)
if(new_owner.assigned_role.departments & DEPARTMENT_COMMAND)
if(new_owner.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
return FALSE
if(new_owner.unconvertable)
return FALSE
@@ -417,7 +417,7 @@
if (isnull(mind))
continue
if (!(mind.assigned_role.departments & (DEPARTMENT_SECURITY|DEPARTMENT_COMMAND)))
if (!(mind.assigned_role.departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_COMMAND)))
continue
if (mind in ex_revs + ex_headrevs)
@@ -435,8 +435,9 @@
else
mind.announce_objectives()
for (var/job_name in GLOB.command_positions + GLOB.security_positions)
var/datum/job/job = SSjob.GetJob(job_name)
for(var/datum/job/job as anything in SSjob.joinable_occupations)
if(!(job.departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_COMMAND)))
continue
job.allow_bureaucratic_error = FALSE
job.total_positions = 0

View File

@@ -182,7 +182,7 @@
objectives += kill_objective
return
if(prob(DOWNLOAD_PROB) && !(locate(/datum/objective/download) in objectives) && !(owner.assigned_role.departments & DEPARTMENT_SCIENCE))
if(prob(DOWNLOAD_PROB) && !(locate(/datum/objective/download) in objectives) && !(owner.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SCIENCE))
var/datum/objective/download/download_objective = new
download_objective.owner = owner
download_objective.gen_amount_goal()

View File

@@ -913,7 +913,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/datum/job/lastJob
var/datum/job/overflow_role = SSjob.GetJobType(SSjob.overflow_role)
for(var/datum/job/job as anything in sortList(SSjob.joinable_occupations, /proc/cmp_job_display_asc))
for(var/datum/job/job as anything in SSjob.joinable_occupations)
index += 1
if(index >= limit)
@@ -942,7 +942,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if((job_preferences[overflow_role.title] == JP_LOW) && (rank != overflow_role.title) && !is_banned_from(user.ckey, overflow_role.title))
HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
continue
if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs
if(job.job_flags & JOB_BOLD_SELECT_TEXT)//Bold head jobs
HTML += "<b><span class='dark'>[rank]</span></b>"
else
HTML += "<span class='dark'>[rank]</span>"
@@ -1964,7 +1964,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/datum/preferences/proc/should_be_random_hardcore(datum/job/job, datum/mind/mind)
if(!randomise[RANDOM_HARDCORE])
return FALSE
if(job.departments & DEPARTMENT_COMMAND) //No command staff
if(job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) //No command staff
return FALSE
for(var/datum/antagonist/antag as anything in mind.antag_datums)
if(antag.get_team()) //No team antags

View File

@@ -426,7 +426,7 @@
return 0
else if("pirate" in H.faction) //can't ransom your fellow pirates to CentCom!
return 0
else if(H.mind.assigned_role.title in GLOB.command_positions)
else if(H.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
return 3000
else
return 1000

View File

@@ -56,25 +56,37 @@
switch(department)
if("Uprising of Assistants") //God help you
jobs_to_revolt = list("Assistant")
jobs_to_revolt += "Assistant"
nation_name = pick("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi")
if("Medical")
jobs_to_revolt = GLOB.medical_positions
var/datum/job_department/job_department = SSjob.get_department_type(/datum/job_department/medical)
for(var/datum/job/job as anything in job_department.department_jobs)
jobs_to_revolt += job.title
nation_name = pick("Mede", "Healtha", "Recova", "Chemi", "Viro", "Psych")
if("Engineering")
jobs_to_revolt = GLOB.engineering_positions
var/datum/job_department/job_department = SSjob.get_department_type(/datum/job_department/engineering)
for(var/datum/job/job as anything in job_department.department_jobs)
jobs_to_revolt += job.title
nation_name = pick("Atomo", "Engino", "Power", "Teleco")
if("Science")
jobs_to_revolt = GLOB.science_positions
var/datum/job_department/job_department = SSjob.get_department_type(/datum/job_department/science)
for(var/datum/job/job as anything in job_department.department_jobs)
jobs_to_revolt += job.title
nation_name = pick("Sci", "Griffa", "Geneti", "Explosi", "Mecha", "Xeno", "Nani", "Cyto")
if("Supply")
jobs_to_revolt = GLOB.supply_positions
var/datum/job_department/job_department = SSjob.get_department_type(/datum/job_department/cargo)
for(var/datum/job/job as anything in job_department.department_jobs)
jobs_to_revolt += job.title
nation_name = pick("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf")
if("Service") //the few, the proud, the technically aligned
jobs_to_revolt = GLOB.service_positions.Copy() - list("Assistant", "Prisoner")
var/datum/job_department/job_department = SSjob.get_department_type(/datum/job_department/service)
for(var/datum/job/job as anything in job_department.department_jobs)
jobs_to_revolt += job.title
nation_name = pick("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi")
if("Security")
jobs_to_revolt = GLOB.security_positions
var/datum/job_department/job_department = SSjob.get_department_type(/datum/job_department/security)
for(var/datum/job/job as anything in job_department.department_jobs)
jobs_to_revolt += job.title
nation_name = pick("Securi", "Beepski", "Shitcuri", "Red", "Stunba", "Flashbango", "Flasha", "Stanfordi")
nation_name += pick("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka")

View File

@@ -0,0 +1,109 @@
/// Singleton representing a category of jobs forming a department.
/datum/job_department
/// Department as displayed on different menus.
var/department_name = "No department assigned"
/// Bitflags associated to the specific department.
var/department_bitflags = NONE
/// Typepath of the job datum leading this department.
var/datum/job/department_head = null
/// Experience granted by playing in a job of this department.
var/department_experience_type = null
/// The order in which this department appears on menus, in relation to other departments.
var/display_order = 0
/// The header color to be displayed in the ban panel, classes defined in banpanel.css
var/label_class = "undefineddepartment"
/// The color used in the latejoin menu.
var/latejoin_color = "#6681a5"
/// Job singleton datums associated to this department. Populated on job initialization.
var/list/department_jobs = list()
/// Handles adding jobs to the department and setting up the job bitflags.
/datum/job_department/proc/add_job(datum/job/job)
department_jobs += job
job.departments_bitflags |= department_bitflags
/datum/job_department/command
department_name = DEPARTMENT_COMMAND
department_bitflags = DEPARTMENT_BITFLAG_COMMAND
department_head = /datum/job/captain
department_experience_type = EXP_TYPE_COMMAND
display_order = 1
label_class = "command"
latejoin_color = "#ccccff"
/datum/job_department/security
department_name = DEPARTMENT_SECURITY
department_bitflags = DEPARTMENT_BITFLAG_SECURITY
department_head = /datum/job/head_of_security
department_experience_type = EXP_TYPE_SECURITY
display_order = 2
label_class = "security"
latejoin_color = "#ffdddd"
/datum/job_department/engineering
department_name = DEPARTMENT_ENGINEERING
department_bitflags = DEPARTMENT_BITFLAG_ENGINEERING
department_head = /datum/job/chief_engineer
department_experience_type = EXP_TYPE_ENGINEERING
display_order = 3
label_class = "engineering"
latejoin_color = "#ffeeaa"
/datum/job_department/medical
department_name = DEPARTMENT_MEDICAL
department_bitflags = DEPARTMENT_BITFLAG_MEDICAL
department_head = /datum/job/chief_medical_officer
department_experience_type = EXP_TYPE_MEDICAL
display_order = 4
label_class = "medical"
latejoin_color = "#ffddf0"
/datum/job_department/science
department_name = DEPARTMENT_SCIENCE
department_bitflags = DEPARTMENT_BITFLAG_SCIENCE
department_head = /datum/job/research_director
department_experience_type = EXP_TYPE_SCIENCE
display_order = 5
label_class = "science"
latejoin_color = "#ffddff"
/datum/job_department/cargo
department_name = DEPARTMENT_CARGO
department_bitflags = DEPARTMENT_BITFLAG_CARGO
department_head = /datum/job/quartermaster
department_experience_type = EXP_TYPE_SUPPLY
display_order = 6
label_class = "supply"
latejoin_color = "#ddddff"
/datum/job_department/service
department_name = DEPARTMENT_SERVICE
department_bitflags = DEPARTMENT_BITFLAG_SERVICE
department_head = /datum/job/head_of_personnel
department_experience_type = EXP_TYPE_SERVICE
display_order = 7
label_class = "service"
latejoin_color = "#bbe291"
/datum/job_department/silicon
department_name = DEPARTMENT_SILICON
department_bitflags = DEPARTMENT_BITFLAG_SILICON
department_head = /datum/job/ai
department_experience_type = EXP_TYPE_SILICON
display_order = 8
label_class = "silicon"
latejoin_color = "#ccffcc"
/// Catch-all department for undefined jobs.
/datum/job_department/undefined
display_order = 10

View File

@@ -1,6 +1,7 @@
GLOBAL_LIST_EMPTY(exp_to_update)
GLOBAL_PROTECT(exp_to_update)
#define IS_XP_LOCKED(job) (exp_requirements && ((exp_required_type_department && CONFIG_GET(flag/use_exp_restrictions_heads)) || (exp_required_type && CONFIG_GET(flag/use_exp_restrictions_other))))
// Procs
/datum/job/proc/required_playtime_remaining(client/C)
if(!C)
@@ -9,9 +10,7 @@ GLOBAL_PROTECT(exp_to_update)
return 0
if(!SSdbcore.Connect())
return 0
if(!exp_requirements || !exp_type)
return 0
if(!job_is_xp_locked(src.title))
if(!IS_XP_LOCKED(src))
return 0
if(CONFIG_GET(flag/use_exp_restrictions_admin_bypass) && check_rights_for(C,R_ADMIN))
return 0
@@ -24,37 +23,32 @@ GLOBAL_PROTECT(exp_to_update)
return 0
else
return (job_requirement - my_exp)
#undef IS_XP_LOCKED
/datum/job/proc/get_exp_req_amount()
if(title in (GLOB.command_positions | list("AI")))
if(exp_required_type_department)
var/uerhh = CONFIG_GET(number/use_exp_restrictions_heads_hours)
if(uerhh)
return uerhh * 60
return exp_requirements
/datum/job/proc/get_exp_req_type()
if(title in (GLOB.command_positions | list("AI")))
if(CONFIG_GET(flag/use_exp_restrictions_heads_department) && exp_type_department)
return exp_type_department
return exp_type
/proc/job_is_xp_locked(jobtitle)
if(!CONFIG_GET(flag/use_exp_restrictions_heads) && (jobtitle in (GLOB.command_positions | list("AI"))))
return FALSE
if(!CONFIG_GET(flag/use_exp_restrictions_other) && !(jobtitle in (GLOB.command_positions | list("AI"))))
return FALSE
return TRUE
/datum/job/proc/get_exp_req_type()
if(exp_required_type_department && CONFIG_GET(flag/use_exp_restrictions_heads_department))
return exp_required_type_department
return exp_required_type
/client/proc/calc_exp_type(exptype)
var/list/explist = prefs.exp.Copy()
var/amount = 0
var/list/typelist = GLOB.exp_jobsmap[exptype]
if(!typelist)
var/list/job_list = SSjob.experience_jobs_map[exptype]
if(!job_list)
return -1
for(var/job in typelist["titles"])
if(job in explist)
amount += explist[job]
return amount
var/list/exp_map = prefs.exp.Copy()
. = 0
for(var/datum/job/job as anything in job_list)
. += exp_map[job.title]
/client/proc/get_exp_living(pure_numeric = FALSE)
if(!prefs.exp || !prefs.exp[EXP_TYPE_LIVING])

View File

@@ -48,10 +48,14 @@
/// The job's outfit that will be assigned for plasmamen.
var/plasmaman_outfit = null
/// Minutes of experience-time required to play in this job. The type is determined by [exp_required_type] and [exp_required_type_department] depending on configs.
var/exp_requirements = 0
var/exp_type = ""
var/exp_type_department = ""
/// Experience required to play this job, if the config is enabled, and `exp_required_type_department` is not enabled with the proper config.
var/exp_required_type = ""
/// Department experience required to play this job, if the config is enabled.
var/exp_required_type_department = ""
/// Experience type granted by playing in this job.
var/exp_granted_type = ""
var/paycheck = PAYCHECK_MINIMAL
var/paycheck_department = ACCOUNT_CIV
@@ -73,8 +77,10 @@
/// If this job's mail goodies compete with generic goodies.
var/exclusive_mail_goodies = FALSE
///Bitfield of departments this job belongs wit
var/departments = NONE
/// Bitfield of departments this job belongs to. These get setup when adding the job into the department, on job datum creation.
var/departments_bitflags = NONE
/// Lazy list with the departments this job belongs to.
var/list/departments_list = null
/// Should this job be allowed to be picked for the bureaucratic error event?
var/allow_bureaucratic_error = TRUE
@@ -85,7 +91,7 @@
/// List of family heirlooms this job can get with the family heirloom quirk. List of types.
var/list/family_heirlooms
/// All values = (JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK)
/// All values = (JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT)
var/job_flags = NONE
/// Multiplier for general usage of the voice of god.
@@ -387,7 +393,7 @@
if(!player_client)
return // Disconnected while checking for the appearance ban.
if(fully_randomize)
if(CONFIG_GET(flag/enforce_human_authority) && (job.departments & DEPARTMENT_COMMAND))
if(CONFIG_GET(flag/enforce_human_authority) && (job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND))
if(player_client.prefs.pref_species.id != SPECIES_HUMAN)
player_client.prefs.pref_species = new /datum/species/human
player_client.prefs.randomise_appearance_prefs(~RANDOMIZE_SPECIES)
@@ -398,7 +404,7 @@
fully_replace_character_name(null, GLOB.current_anonymous_theme.anonymous_name(src))
else
var/is_antag = (player_client.mob.mind in GLOB.pre_setup_antags)
if(CONFIG_GET(flag/enforce_human_authority) && (job.departments & DEPARTMENT_COMMAND))
if(CONFIG_GET(flag/enforce_human_authority) && (job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND))
player_client.prefs.randomise[RANDOM_SPECIES] = FALSE
if(player_client.prefs.pref_species.id != SPECIES_HUMAN)
player_client.prefs.pref_species = new /datum/species/human

View File

@@ -10,13 +10,16 @@
req_admin_notify = TRUE
minimal_player_age = 30
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SILICON
exp_required_type = EXP_TYPE_CREW
exp_required_type_department = EXP_TYPE_SILICON
exp_granted_type = EXP_TYPE_CREW
display_order = JOB_DISPLAY_ORDER_AI
allow_bureaucratic_error = FALSE
departments = DEPARTMENT_SILICON
departments_list = list(
/datum/job_department/silicon,
)
random_spawns_possible = FALSE
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT
var/do_special_check = TRUE

View File

@@ -8,10 +8,10 @@ Assistant
spawn_positions = 5
supervisors = "absolutely everyone"
selection_color = "#dddddd"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/assistant
plasmaman_outfit = /datum/outfit/plasmaman
paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it.
departments = DEPARTMENT_SERVICE
liver_traits = list(TRAIT_GREYTIDE_METABOLISM)
@@ -29,7 +29,7 @@ Assistant
/obj/item/crowbar/large = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/assistant

View File

@@ -7,7 +7,8 @@
supervisors = "the chief engineer"
selection_color = "#fff5cc"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/atmos
plasmaman_outfit = /datum/outfit/plasmaman/atmospherics
@@ -19,11 +20,13 @@
display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN
bounty_types = CIV_JOB_ENG
departments = DEPARTMENT_ENGINEERING
departments_list = list(
/datum/job_department/engineering,
)
family_heirlooms = list(/obj/item/lighter, /obj/item/lighter/greyscale, /obj/item/storage/box/matches)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/atmos

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/bartender
plasmaman_outfit = /datum/outfit/plasmaman/bar
@@ -14,7 +15,9 @@
paycheck_department = ACCOUNT_SRV
display_order = JOB_DISPLAY_ORDER_BARTENDER
bounty_types = CIV_JOB_DRINK
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/reagent_containers/glass/rag, /obj/item/clothing/head/that, /obj/item/reagent_containers/food/drinks/shaker)
@@ -25,7 +28,7 @@
/obj/item/stack/sheet/mineral/uranium = 10,
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/job/bartender/award_service(client/winner, award)

View File

@@ -6,6 +6,7 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/botanist
plasmaman_outfit = /datum/outfit/plasmaman/botany
@@ -14,7 +15,9 @@
paycheck_department = ACCOUNT_SRV
display_order = JOB_DISPLAY_ORDER_BOTANIST
bounty_types = CIV_JOB_GROW
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/toy/plush/beeplushie)
@@ -27,7 +30,7 @@
/obj/item/food/monkeycube/bee = 2
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/botanist

View File

@@ -10,8 +10,9 @@
req_admin_notify = 1
minimal_player_age = 14
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_COMMAND
exp_required_type = EXP_TYPE_CREW
exp_required_type_department = EXP_TYPE_COMMAND
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/captain
plasmaman_outfit = /datum/outfit/plasmaman/captain
@@ -22,7 +23,9 @@
liver_traits = list(TRAIT_ROYAL_METABOLISM)
display_order = JOB_DISPLAY_ORDER_CAPTAIN
departments = DEPARTMENT_COMMAND
departments_list = list(
/datum/job_department/command,
)
family_heirlooms = list(/obj/item/reagent_containers/food/drinks/flask/gold)
@@ -32,7 +35,7 @@
/obj/item/reagent_containers/food/drinks/bottle/champagne = 10
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 1.4 //Command staff has authority

View File

@@ -6,6 +6,7 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/cargo_tech
plasmaman_outfit = /datum/outfit/plasmaman/cargo
@@ -14,7 +15,9 @@
paycheck_department = ACCOUNT_CAR
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
bounty_types = CIV_JOB_RANDOM
departments = DEPARTMENT_CARGO
departments_list = list(
/datum/job_department/cargo,
)
family_heirlooms = list(/obj/item/clipboard)
@@ -26,7 +29,7 @@
/obj/item/gun/ballistic/rifle/boltaction = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/cargo_tech

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/chaplain
plasmaman_outfit = /datum/outfit/plasmaman/chaplain
@@ -14,7 +15,9 @@
paycheck_department = ACCOUNT_SRV
display_order = JOB_DISPLAY_ORDER_CHAPLAIN
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/toy/windup_toolbox, /obj/item/reagent_containers/food/drinks/bottle/holywater)
@@ -26,7 +29,7 @@
/obj/item/toy/plush/ratplush = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 2 //Chaplains are very good at speaking with the voice of god

View File

@@ -6,8 +6,9 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/chemist
plasmaman_outfit = /datum/outfit/plasmaman/chemist
@@ -19,7 +20,9 @@
display_order = JOB_DISPLAY_ORDER_CHEMIST
bounty_types = CIV_JOB_CHEM
departments = DEPARTMENT_MEDICAL
departments_list = list(
/datum/job_department/medical,
)
family_heirlooms = list(/obj/item/book/manual/wiki/chemistry, /obj/item/ph_booklet)
@@ -30,7 +33,7 @@
/obj/item/paper/secretrecipe = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/chemist

View File

@@ -11,12 +11,16 @@
req_admin_notify = 1
minimal_player_age = 7
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_ENGINEERING
exp_required_type = EXP_TYPE_CREW
exp_required_type_department = EXP_TYPE_ENGINEERING
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/ce
plasmaman_outfit = /datum/outfit/plasmaman/chief_engineer
departments = DEPARTMENT_ENGINEERING | DEPARTMENT_COMMAND
departments_list = list(
/datum/job_department/engineering,
/datum/job_department/command,
)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_ENG
@@ -37,7 +41,7 @@
/obj/effect/spawner/lootdrop/space/fancytool/engineonly = 3
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 1.4 //Command staff has authority

View File

@@ -11,12 +11,16 @@
req_admin_notify = 1
minimal_player_age = 7
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_MEDICAL
exp_required_type = EXP_TYPE_CREW
exp_required_type_department = EXP_TYPE_MEDICAL
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/cmo
plasmaman_outfit = /datum/outfit/plasmaman/chief_medical_officer
departments = DEPARTMENT_MEDICAL | DEPARTMENT_COMMAND
departments_list = list(
/datum/job_department/medical,
/datum/job_department/command,
)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_MED
@@ -34,7 +38,7 @@
)
family_heirlooms = list(/obj/item/storage/firstaid/ancient/heirloom)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 1.4 //Command staff has authority

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/clown
plasmaman_outfit = /datum/outfit/plasmaman/clown
@@ -16,7 +17,9 @@
liver_traits = list(TRAIT_COMEDY_METABOLISM)
display_order = JOB_DISPLAY_ORDER_CLOWN
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
mail_goodies = list(
/obj/item/food/grown/banana = 100,
@@ -28,7 +31,7 @@
family_heirlooms = list(/obj/item/bikehorn/golden)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/job/clown/after_spawn(mob/living/spawned, client/player_client)

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
var/cooks = 0 //Counts cooks amount
/// List of areas that are counted as the kitchen for the purposes of CQC. Defaults to just the kitchen. Mapping configs can and should override this.
var/list/kitchen_areas = list(/area/service/kitchen)
@@ -20,11 +21,13 @@
display_order = JOB_DISPLAY_ORDER_COOK
bounty_types = CIV_JOB_CHEF
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/reagent_containers/food/condiment/saltshaker, /obj/item/kitchen/rollingpin, /obj/item/clothing/head/chefhat)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/job/cook/New()

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/curator
plasmaman_outfit = /datum/outfit/plasmaman/curator
@@ -14,11 +15,13 @@
paycheck_department = ACCOUNT_SRV
display_order = JOB_DISPLAY_ORDER_CURATOR
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/pen/fountain, /obj/item/storage/pill_bottle/dice)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_silence_power = 3

View File

@@ -9,10 +9,14 @@
spawn_type = /mob/living/silicon/robot
minimal_player_age = 21
exp_requirements = 120
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
display_order = JOB_DISPLAY_ORDER_CYBORG
departments = DEPARTMENT_SILICON
departments_list = list(
/datum/job_department/silicon,
)
random_spawns_possible = FALSE
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK

View File

@@ -9,11 +9,14 @@
selection_color = "#ffeeee"
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/detective
plasmaman_outfit = /datum/outfit/plasmaman/detective
departments = DEPARTMENT_SECURITY
departments_list = list(
/datum/job_department/security,
)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SEC
@@ -36,7 +39,7 @@
family_heirlooms = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/detective

View File

@@ -6,12 +6,15 @@
spawn_positions = 2
supervisors = "the research director"
selection_color = "#ffeeff"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/geneticist
plasmaman_outfit = /datum/outfit/plasmaman/genetics
departments = DEPARTMENT_MEDICAL
departments_list = list(
/datum/job_department/medical,
)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
@@ -25,7 +28,7 @@
family_heirlooms = list(/obj/item/clothing/under/shorts/purple)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/geneticist

View File

@@ -11,12 +11,16 @@
req_admin_notify = 1
minimal_player_age = 10
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SERVICE
exp_required_type = EXP_TYPE_CREW
exp_required_type_department = EXP_TYPE_SERVICE
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/hop
plasmaman_outfit = /datum/outfit/plasmaman/head_of_personnel
departments = DEPARTMENT_COMMAND | DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
/datum/job_department/command,
)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SRV
@@ -33,7 +37,7 @@
family_heirlooms = list(/obj/item/reagent_containers/food/drinks/trophy/silver_cup)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 1.4 //Command staff has authority

View File

@@ -11,12 +11,16 @@
req_admin_notify = 1
minimal_player_age = 14
exp_requirements = 300
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SECURITY
exp_required_type = EXP_TYPE_CREW
exp_required_type_department = EXP_TYPE_SECURITY
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/hos
plasmaman_outfit = /datum/outfit/plasmaman/head_of_security
departments = DEPARTMENT_SECURITY | DEPARTMENT_COMMAND
departments_list = list(
/datum/job_department/security,
/datum/job_department/command,
)
mind_traits = list(TRAIT_DONUT_LOVER)
liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_ROYAL_METABOLISM)
@@ -29,7 +33,7 @@
family_heirlooms = list(/obj/item/book/manual/wiki/security_space_law)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 1.4 //Command staff has authority

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/janitor
plasmaman_outfit = /datum/outfit/plasmaman/janitor
@@ -14,7 +15,9 @@
paycheck_department = ACCOUNT_SRV
display_order = JOB_DISPLAY_ORDER_JANITOR
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/mop, /obj/item/clothing/suit/caution, /obj/item/reagent_containers/glass/bucket, /obj/item/paper/fluff/stations/soap)
@@ -24,7 +27,7 @@
/obj/item/lightreplacer = 10
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/janitor

View File

@@ -6,7 +6,7 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/lawyers = 0 //Counts lawyer amount
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/lawyer
plasmaman_outfit = /datum/outfit/plasmaman/bar
@@ -18,11 +18,13 @@
liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
display_order = JOB_DISPLAY_ORDER_LAWYER
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/gavelhammer, /obj/item/book/manual/wiki/security_space_law)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/lawyer

View File

@@ -6,6 +6,7 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/doctor
plasmaman_outfit = /datum/outfit/plasmaman/medical
@@ -17,7 +18,9 @@
display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR
bounty_types = CIV_JOB_MED
departments = DEPARTMENT_MEDICAL
departments_list = list(
/datum/job_department/medical,
)
family_heirlooms = list(/obj/item/storage/firstaid/ancient/heirloom)
@@ -31,7 +34,7 @@
/obj/effect/spawner/lootdrop/memeorgans = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/doctor

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/mime
plasmaman_outfit = /datum/outfit/plasmaman/mime
@@ -14,7 +15,9 @@
paycheck_department = ACCOUNT_SRV
display_order = JOB_DISPLAY_ORDER_MIME
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/food/baguette)
@@ -25,7 +28,7 @@
/obj/item/book/mimery = 1,
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 0.5 //Why are you speaking
voice_of_god_silence_power = 3

View File

@@ -6,6 +6,7 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/paramedic
plasmaman_outfit = /datum/outfit/plasmaman/paramedic
@@ -17,7 +18,9 @@
display_order = JOB_DISPLAY_ORDER_PARAMEDIC
bounty_types = CIV_JOB_MED
departments = DEPARTMENT_MEDICAL
departments_list = list(
/datum/job_department/medical,
)
family_heirlooms = list(/obj/item/storage/firstaid/ancient/heirloom)
@@ -30,7 +33,7 @@
/obj/item/reagent_containers/hypospray/medipen/survival/luxury = 5
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/paramedic

View File

@@ -6,6 +6,7 @@
spawn_positions = 2
supervisors = "the security team"
selection_color = "#ffe1c3"
exp_granted_type = EXP_TYPE_CREW
paycheck = PAYCHECK_PRISONER
outfit = /datum/outfit/job/prisoner

View File

@@ -6,6 +6,7 @@
spawn_positions = 1
supervisors = "the head of personnel and the chief medical officer"
selection_color = "#bbe291"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/psychologist
plasmaman_outfit = /datum/outfit/plasmaman/psychologist
@@ -16,7 +17,9 @@
liver_traits = list(TRAIT_MEDICAL_METABOLISM)
display_order = JOB_DISPLAY_ORDER_PSYCHOLOGIST
departments = DEPARTMENT_SERVICE
departments_list = list(
/datum/job_department/service,
)
family_heirlooms = list(/obj/item/storage/pill_bottle)
@@ -26,7 +29,7 @@
/obj/item/gun/syringe = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/psychologist

View File

@@ -6,7 +6,8 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#d7b088"
exp_type_department = EXP_TYPE_SUPPLY // This is so the jobs menu can work properly
exp_required_type_department = EXP_TYPE_SUPPLY
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/quartermaster
plasmaman_outfit = /datum/outfit/plasmaman/cargo
@@ -18,13 +19,15 @@
display_order = JOB_DISPLAY_ORDER_QUARTERMASTER
bounty_types = CIV_JOB_RANDOM
departments = DEPARTMENT_CARGO
departments_list = list(
/datum/job_department/cargo,
)
family_heirlooms = list(/obj/item/stamp, /obj/item/stamp/denied)
mail_goodies = list(
/obj/item/circuitboard/machine/emitter = 3
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/quartermaster

View File

@@ -10,13 +10,17 @@
selection_color = "#ffddff"
req_admin_notify = 1
minimal_player_age = 7
exp_type_department = EXP_TYPE_SCIENCE
exp_required_type_department = EXP_TYPE_SCIENCE
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/rd
plasmaman_outfit = /datum/outfit/plasmaman/research_director
departments = DEPARTMENT_SCIENCE | DEPARTMENT_COMMAND
departments_list = list(
/datum/job_department/science,
/datum/job_department/command,
)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SCI
@@ -34,7 +38,7 @@
family_heirlooms = list(/obj/item/toy/plush/slimeplushie)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
voice_of_god_power = 1.4 //Command staff has authority

View File

@@ -7,12 +7,15 @@
supervisors = "the research director"
selection_color = "#ffeeff"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
bounty_types = CIV_JOB_ROBO
outfit = /datum/outfit/job/roboticist
plasmaman_outfit = /datum/outfit/plasmaman/robotics
departments = DEPARTMENT_SCIENCE
departments_list = list(
/datum/job_department/science,
)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
@@ -27,7 +30,7 @@
family_heirlooms = list(/obj/item/toy/plush/pkplush)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/job/roboticist/New()

View File

@@ -7,7 +7,8 @@
supervisors = "the research director"
selection_color = "#ffeeff"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/scientist
plasmaman_outfit = /datum/outfit/plasmaman/science
@@ -17,7 +18,9 @@
display_order = JOB_DISPLAY_ORDER_SCIENTIST
bounty_types = CIV_JOB_SCI
departments = DEPARTMENT_SCIENCE
departments_list = list(
/datum/job_department/science,
)
family_heirlooms = list(/obj/item/toy/plush/slimeplushie)
@@ -27,7 +30,7 @@
/obj/item/camera_bug = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/scientist

View File

@@ -9,7 +9,8 @@
selection_color = "#ffeeee"
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/security
plasmaman_outfit = /datum/outfit/plasmaman/security
@@ -22,7 +23,9 @@
display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER
bounty_types = CIV_JOB_SEC
departments = DEPARTMENT_SECURITY
departments_list = list(
/datum/job_department/security,
)
family_heirlooms = list(/obj/item/book/manual/wiki/security_space_law, /obj/item/clothing/head/beret/sec)
@@ -34,7 +37,7 @@
/obj/item/melee/baton/boomerang/loaded = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))

View File

@@ -6,6 +6,7 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/miner
plasmaman_outfit = /datum/outfit/plasmaman/mining
@@ -15,11 +16,13 @@
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
bounty_types = CIV_JOB_MINE
departments = DEPARTMENT_CARGO
departments_list = list(
/datum/job_department/cargo,
)
family_heirlooms = list(/obj/item/pickaxe/mini, /obj/item/shovel)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/miner

View File

@@ -7,7 +7,8 @@
supervisors = "the chief engineer"
selection_color = "#fff5cc"
exp_requirements = 60
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/engineer
plasmaman_outfit = /datum/outfit/plasmaman/engineering
@@ -19,7 +20,9 @@
display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER
bounty_types = CIV_JOB_ENG
departments = DEPARTMENT_ENGINEERING
departments_list = list(
/datum/job_department/engineering,
)
family_heirlooms = list(/obj/item/clothing/head/hardhat, /obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool, /obj/item/crowbar, /obj/item/wirecutters)
@@ -30,7 +33,7 @@
/obj/item/clothing/head/hardhat/red/upgraded = 1
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/engineer

View File

@@ -6,8 +6,9 @@
spawn_positions = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/virologist
plasmaman_outfit = /datum/outfit/plasmaman/viro
@@ -19,7 +20,9 @@
display_order = JOB_DISPLAY_ORDER_VIROLOGIST
bounty_types = CIV_JOB_VIRO
departments = DEPARTMENT_MEDICAL
departments_list = list(
/datum/job_department/medical,
)
family_heirlooms = list(/obj/item/reagent_containers/syringe)
@@ -31,7 +34,7 @@
/obj/item/stack/sheet/mineral/uranium = 5
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/virologist

View File

@@ -9,7 +9,8 @@
selection_color = "#ffeeee"
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
exp_required_type = EXP_TYPE_CREW
exp_granted_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/warden
plasmaman_outfit = /datum/outfit/plasmaman/warden
@@ -22,7 +23,9 @@
display_order = JOB_DISPLAY_ORDER_WARDEN
bounty_types = CIV_JOB_SEC
departments = DEPARTMENT_SECURITY
departments_list = list(
/datum/job_department/security,
)
family_heirlooms = list(/obj/item/book/manual/wiki/security_space_law)
@@ -35,7 +38,7 @@
/obj/item/storage/box/lethalshot = 5
)
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS
/datum/outfit/job/warden

View File

@@ -1,104 +1,3 @@
GLOBAL_LIST_INIT(command_positions, list(
"Captain",
"Head of Personnel",
"Head of Security",
"Chief Engineer",
"Research Director",
"Chief Medical Officer"))
GLOBAL_LIST_INIT(engineering_positions, list(
"Chief Engineer",
"Station Engineer",
"Atmospheric Technician"))
GLOBAL_LIST_INIT(medical_positions, list(
"Chief Medical Officer",
"Medical Doctor",
"Paramedic",
"Virologist",
"Chemist"))
GLOBAL_LIST_INIT(science_positions, list(
"Research Director",
"Scientist",
"Geneticist",
"Roboticist"))
GLOBAL_LIST_INIT(supply_positions, list(
"Quartermaster",
"Cargo Technician",
"Shaft Miner"))
GLOBAL_LIST_INIT(service_positions, list(
"Head of Personnel",
"Bartender",
"Botanist",
"Cook",
"Janitor",
"Curator",
"Psychologist",
"Lawyer",
"Chaplain",
"Clown",
"Mime",
"Prisoner",
"Assistant"))
//we really need to split service into civillian positions officially, until then this is my solution
GLOBAL_LIST_INIT(service_food_positions, list(
"Bartender",
"Botanist",
"Cook",
))
GLOBAL_LIST_INIT(security_positions, list(
"Head of Security",
"Warden",
"Detective",
"Security Officer"))
/// These aren't defacto jobs, but are the special departmental variants for sec officers.
GLOBAL_LIST_INIT(security_sub_positions, list(
"Security Officer (Cargo)",
"Security Officer (Engineering)",
"Security Officer (Medical)",
"Security Officer (Science)",
))
GLOBAL_LIST_INIT(nonhuman_positions, list(
"AI",
"Cyborg",
ROLE_PAI))
// job categories for rendering the late join menu
GLOBAL_LIST_INIT(position_categories, list(
EXP_TYPE_COMMAND = list("jobs" = command_positions, "color" = "#ccccff"),
EXP_TYPE_ENGINEERING = list("jobs" = engineering_positions, "color" = "#ffeeaa"),
EXP_TYPE_SUPPLY = list("jobs" = supply_positions, "color" = "#ddddff"),
EXP_TYPE_SILICON = list("jobs" = nonhuman_positions - "pAI", "color" = "#ccffcc"),
EXP_TYPE_SERVICE = list("jobs" = service_positions, "color" = "#bbe291"),
EXP_TYPE_MEDICAL = list("jobs" = medical_positions, "color" = "#ffddf0"),
EXP_TYPE_SCIENCE = list("jobs" = science_positions, "color" = "#ffddff"),
EXP_TYPE_SECURITY = list("jobs" = security_positions, "color" = "#ffdddd")
))
GLOBAL_LIST_INIT(exp_jobsmap, list(
EXP_TYPE_CREW = list("titles" = command_positions | engineering_positions | medical_positions | science_positions | supply_positions | security_positions | service_positions | list("AI","Cyborg")), // crew positions
EXP_TYPE_COMMAND = list("titles" = command_positions),
EXP_TYPE_ENGINEERING = list("titles" = engineering_positions),
EXP_TYPE_MEDICAL = list("titles" = medical_positions),
EXP_TYPE_SCIENCE = list("titles" = science_positions),
EXP_TYPE_SUPPLY = list("titles" = supply_positions),
EXP_TYPE_SECURITY = list("titles" = security_positions),
EXP_TYPE_SILICON = list("titles" = list("AI","Cyborg")),
EXP_TYPE_SERVICE = list("titles" = service_positions)
))
// TO DO: Replace this with job datum flags instead.
GLOBAL_LIST_INIT(exp_specialmap, list(
EXP_TYPE_LIVING = list(), // all living mobs
@@ -126,7 +25,6 @@ GLOBAL_LIST_INIT(exp_specialmap, list(
), // Ghost roles
EXP_TYPE_GHOST = list() // dead people, observers
))
GLOBAL_PROTECT(exp_jobsmap)
GLOBAL_PROTECT(exp_specialmap)
//this is necessary because antags happen before job datums are handed out, but NOT before they come into existence

View File

@@ -18,41 +18,19 @@
return
/datum/crew_manifest/ui_data(mob/user)
var/list/positions = list(
"Command" = list("exceptions" = list(), "open" = 0),
"Security" = list("exceptions" = list(), "open" = 0),
"Engineering" = list("exceptions" = list(), "open" = 0),
"Medical" = list("exceptions" = list(), "open" = 0),
"Misc" = list("exceptions" = list(), "open" = 0),
"Science" = list("exceptions" = list(), "open" = 0),
"Supply" = list("exceptions" = list(), "open" = 0),
"Service" = list("exceptions" = list(), "open" = 0),
"Silicon" = list("exceptions" = list(), "open" = 0)
)
var/list/departments = list(
list("flag" = DEPARTMENT_COMMAND, "name" = "Command"),
list("flag" = DEPARTMENT_SECURITY, "name" = "Security"),
list("flag" = DEPARTMENT_ENGINEERING, "name" = "Engineering"),
list("flag" = DEPARTMENT_MEDICAL, "name" = "Medical"),
list("flag" = DEPARTMENT_SCIENCE, "name" = "Science"),
list("flag" = DEPARTMENT_CARGO, "name" = "Supply"),
list("flag" = DEPARTMENT_SERVICE, "name" = "Service"),
list("flag" = DEPARTMENT_SILICON, "name" = "Silicon")
)
for(var/job in SSjob.joinable_occupations)
// Check if there are additional open positions or if there is no limit
if ((job["total_positions"] > 0 && job["total_positions"] > job["current_positions"]) || (job["total_positions"] == -1))
for(var/department in departments)
// Check if the job is part of a department using its flag
// Will return true for Research Director if the department is Science or Command, for example
if(job["departments"] & department["flag"])
if(job["total_positions"] == -1)
// Add job to list of exceptions, meaning it does not have a position limit
positions[department["name"]]["exceptions"] += list(job["title"])
else
// Add open positions to current department
positions[department["name"]]["open"] += (job["total_positions"] - job["current_positions"])
var/list/positions = list()
for(var/datum/job_department/department as anything in SSjob.joinable_departments)
var/open = 0
var/list/exceptions = list()
for(var/datum/job/job as anything in department.department_jobs)
if(job.total_positions == -1)
exceptions += job.title
continue
var/open_slots = job.total_positions - job.current_positions
if(open_slots < 1)
continue
open += open_slots
positions[department.department_name] = list("exceptions" = exceptions, "open" = open)
return list(
"manifest" = GLOB.data_core.get_manifest(),

View File

@@ -407,26 +407,25 @@
SSjob.prioritized_jobs -= prioritized_job
dat += "<table><tr><td valign='top'>"
var/column_counter = 0
// render each category's available jobs
for(var/category in GLOB.position_categories)
// position_categories contains category names mapped to available jobs and an appropriate color
var/cat_color = GLOB.position_categories[category]["color"]
dat += "<fieldset style='width: 185px; border: 2px solid [cat_color]; display: inline'>"
dat += "<legend align='center' style='color: [cat_color]'>[category]</legend>"
var/list/dept_dat = list()
for(var/job in GLOB.position_categories[category]["jobs"])
var/datum/job/job_datum = SSjob.name_occupations[job]
if(job_datum && IsJobUnavailable(job_datum.title, TRUE) == JOB_AVAILABLE)
for(var/datum/job_department/department as anything in SSjob.joinable_departments)
var/department_color = department.latejoin_color
dat += "<fieldset style='width: 185px; border: 2px solid [department_color]; display: inline'>"
dat += "<legend align='center' style='color: [department_color]'>[department.department_name]</legend>"
var/list/dept_data = list()
for(var/datum/job/job_datum as anything in department.department_jobs)
if(IsJobUnavailable(job_datum.title, TRUE) != JOB_AVAILABLE)
continue
var/command_bold = ""
if(job in GLOB.command_positions)
if(job_datum.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
command_bold = " command"
if(job_datum in SSjob.prioritized_jobs)
dept_dat += "<a class='job[command_bold]' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'><span class='priority'>[job_datum.title] ([job_datum.current_positions])</span></a>"
dept_data += "<a class='job[command_bold]' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'><span class='priority'>[job_datum.title] ([job_datum.current_positions])</span></a>"
else
dept_dat += "<a class='job[command_bold]' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'>[job_datum.title] ([job_datum.current_positions])</a>"
if(!dept_dat.len)
dept_dat += "<span class='nopositions'>No positions open.</span>"
dat += jointext(dept_dat, "")
dept_data += "<a class='job[command_bold]' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'>[job_datum.title] ([job_datum.current_positions])</a>"
if(!length(dept_data))
dept_data += "<span class='nopositions'>No positions open.</span>"
dat += dept_data.Join()
dat += "</fieldset><br>"
column_counter++
if(column_counter > 0 && (column_counter % 3 == 0))

View File

@@ -72,3 +72,7 @@
.antagonistpositions {
background-color: #6d3f40;
}
.undefineddepartment {
background-color: #111cf7;
}

View File

@@ -1,16 +1,10 @@
function toggle_head(source, ext) {
document.getElementById(source.id.slice(0, -4) + ext).checked = source.checked;
}
function toggle_checkboxes(source, ext) {
var checkboxes = document.getElementsByClassName(source.name);
for (var i = 0, n = checkboxes.length; i < n; i++) {
checkboxes[i].checked = source.checked;
if (checkboxes[i].id) {
var idfound = document.getElementById(checkboxes[i].id.slice(0, -4) + ext);
if (idfound) {
idfound.checked = source.checked;
}
function toggle_other_checkboxes(source, copycats_str, our_index_str) {
const copycats = parseInt(copycats_str);
const our_index = parseInt(our_index_str);
for (var i = 1; i <= copycats; i++) {
if(i === our_index) {
continue;
}
document.getElementById(source.id.slice(0, -1) + i).checked = source.checked;
}
}

View File

@@ -2432,6 +2432,7 @@
#include "code\modules\jobs\job_exp.dm"
#include "code\modules\jobs\job_report.dm"
#include "code\modules\jobs\jobs.dm"
#include "code\modules\jobs\departments\departments.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"