Converts jobs and admin equipment to use outfits (#5827)

Converts the jobs and admin equipment to use outfit datums.
This commit is contained in:
Werner
2019-02-19 23:58:05 +02:00
committed by Erki
parent 1bc27306a0
commit b823b4eb05
38 changed files with 1802 additions and 1447 deletions
+2 -2
View File
@@ -322,9 +322,9 @@
return R
/proc/GetAssignment(var/mob/living/carbon/human/H)
if(H.mind.role_alt_title)
if(H.mind && H.mind.role_alt_title)
return H.mind.role_alt_title
else if(H.mind.assigned_role)
else if(H.mind && H.mind.assigned_role)
return H.mind.assigned_role
else if(H.job)
return H.job
+206
View File
@@ -0,0 +1,206 @@
/datum/outfit
var/name = "Naked"
var/collect_not_del = FALSE
//The following vars can either be a path or a list of paths
//If a list of paths is supplied a random item from that list is selected
var/uniform = null
var/suit = null
var/back = null
var/belt = null
var/gloves = null
var/shoes = null
var/head = null
var/mask = null
var/l_ear = null
var/r_ear = null
var/glasses = null
var/l_pocket = null
var/r_pocket = null
var/suit_store = null
//The following vars must be paths
var/l_hand = null
var/r_hand = null
var/id = null
var/pda = null
var/internals_slot = null //ID of slot containing a gas tank
var/list/backpack_contents = list() //In the list(path=count,otherpath=count) format
var/list/implants = null //A list of implants that should be implanted
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
return
// Used to equip an item to the mob. Mainly to prevent copypasta for collect_not_del.
/datum/outfit/proc/equip_item(mob/living/carbon/human/H, path, slot)
var/obj/item/I
if(isnum(path)) //Check if parameter is not numeric. Must be a path, list of paths or name of a gear datum
CRASH("Outfit [name] - Parameter path: [path] is numeric.")
if(islist(path)) //If its a list, select a random item
var/itempath = pick(path)
I = new itempath(H)
else if(gear_datums[path]) //If its something else, we´ll check if its a gearpath and try to spawn it
var/datum/gear/G = gear_datums[path]
I = G.spawn_random()
else
I = new path(H) //As fallback treat it as a path
if(collect_not_del)
H.equip_or_collect(I, slot)
else
H.equip_to_slot_or_del(I, slot)
/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for changing items post equip (such as toggeling internals, ...)
/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//Start with uniform,suit,backpack for additional slots
if(back)
equip_item(H, back, slot_back)
if(uniform)
equip_item(H, uniform, slot_w_uniform)
if(suit)
equip_item(H, suit, slot_wear_suit)
if(belt)
equip_item(H, belt, slot_belt)
if(gloves)
equip_item(H, gloves, slot_gloves)
if(shoes)
equip_item(H, shoes, slot_shoes)
if(head)
equip_item(H, head, slot_head)
if(mask)
equip_item(H, mask, slot_wear_mask)
if(l_ear)
equip_item(H, l_ear, slot_l_ear)
if(r_ear)
equip_item(H, r_ear, slot_r_ear)
if(glasses)
equip_item(H, glasses, slot_glasses)
if(suit_store)
equip_item(H, suit_store, slot_s_store)
if(l_hand)
H.put_in_l_hand(new l_hand(H))
if(r_hand)
H.put_in_r_hand(new r_hand(H))
if(pda && !visualsOnly) //Dont equip and imprint the PDA in visuals only (preview) to avoid duplicates
var/obj/item/I = new pda(H)
imprint_pda(H,I)
H.equip_or_collect(I, slot_wear_id)
if(id)
var/obj/item/device/pda/P = H.wear_id
var/obj/item/I = new id(H)
imprint_idcard(H,I)
if(istype(P))
I.forceMove(P)
P.id = I
else
H.equip_or_collect(I, slot_wear_id)
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_pocket)
equip_item(H, l_pocket, slot_l_store)
if(r_pocket)
equip_item(H, r_pocket, slot_r_store)
for(var/path in backpack_contents)
var/number = backpack_contents[path]
for(var/i in 1 to number)
H.equip_or_collect(new path(H), slot_in_backpack)
post_equip(H, visualsOnly)
if(!visualsOnly)
apply_fingerprints(H)
if(implants)
for(var/implant_type in implants)
var/obj/item/weapon/implant/I = new implant_type(H)
if(I.implanted(H))
I.forceMove(H)
I.imp_in = H
I.implanted = 1
var/obj/item/organ/external/affected = H.get_organ("head")
affected.implants += I
I.part = affected
H.update_body()
return 1
/datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H)
if(!istype(H))
return
if(H.back)
H.back.add_fingerprint(H, 1) //The 1 sets a flag to ignore gloves
for(var/obj/item/I in H.back.contents)
I.add_fingerprint(H, 1)
if(H.wear_id)
H.wear_id.add_fingerprint(H, 1)
if(H.w_uniform)
H.w_uniform.add_fingerprint(H, 1)
if(H.wear_suit)
H.wear_suit.add_fingerprint(H, 1)
if(H.wear_mask)
H.wear_mask.add_fingerprint(H, 1)
if(H.head)
H.head.add_fingerprint(H, 1)
if(H.shoes)
H.shoes.add_fingerprint(H, 1)
if(H.gloves)
H.gloves.add_fingerprint(H, 1)
if(H.l_ear)
H.l_ear.add_fingerprint(H, 1)
if(H.r_ear)
H.r_ear.add_fingerprint(H, 1)
if(H.glasses)
H.glasses.add_fingerprint(H, 1)
if(H.belt)
H.belt.add_fingerprint(H, 1)
for(var/obj/item/I in H.belt.contents)
I.add_fingerprint(H, 1)
if(H.s_store)
H.s_store.add_fingerprint(H, 1)
if(H.l_store)
H.l_store.add_fingerprint(H, 1)
if(H.r_store)
H.r_store.add_fingerprint(H, 1)
return 1
/datum/outfit/proc/imprint_idcard(mob/living/carbon/human/H, obj/item/weapon/card/id/C)
if(istype(C))
C.access = get_id_access(H)
C.rank = get_id_rank(H)
C.assignment = get_id_assignment(H)
addtimer(CALLBACK(H, /mob/.proc/set_id_info, C), 1 SECOND) // Delay a moment to allow an icon update to happen.
if(H.mind && H.mind.initial_account)
C.associated_account_number = H.mind.initial_account.account_number
/datum/outfit/proc/imprint_pda(mob/living/carbon/human/H, obj/item/device/pda/PDA)
var/obj/item/weapon/card/id/C = PDA.id
PDA.owner = H.real_name
if(istype(PDA) && istype(C))
PDA.ownjob = C.assignment
PDA.ownrank = C.rank
else //As a fallback if the id isnt inside of the PDA
PDA.ownjob = get_id_assignment(H)
PDA.ownrank = get_id_rank(H)
PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
/datum/outfit/proc/get_id_access(mob/living/carbon/human/H)
return list()
/datum/outfit/proc/get_id_assignment(mob/living/carbon/human/H)
return GetAssignment(H)
/datum/outfit/proc/get_id_rank(mob/living/carbon/human/H)
return GetAssignment(H)
+416
View File
@@ -0,0 +1,416 @@
/datum/outfit/admin/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(!visualsOnly)
if(H.mind)
H.mind.assigned_role = name
H.job = name
/datum/outfit/admin/syndicate
name = "Syndicate Agent"
uniform = /obj/item/clothing/under/syndicate
back = /obj/item/weapon/storage/backpack
belt = /obj/item/weapon/storage/belt/utility/full
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/combat
l_ear = /obj/item/device/radio/headset/syndicate
id = /obj/item/weapon/card/id/syndicate
r_pocket = /obj/item/device/radio/uplink
backpack_contents = list(
/obj/item/weapon/storage/box/engineer = 1,
/obj/item/device/flashlight = 1,
/obj/item/weapon/card/emag = 1,
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 1,
/obj/item/device/multitool = 1
)
var/id_icon = "syndie"
var/id_access = "Syndicate Operative"
var/uplink_uses = 20
/datum/outfit/admin/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
var/obj/item/device/radio/uplink/U = H.r_store
if(istype(U))
U.hidden_uplink.uplink_owner = "[H.key]"
U.hidden_uplink.uses = uplink_uses
/datum/outfit/admin/syndicate/get_id_access()
return get_syndicate_access(id_access)
/datum/outfit/admin/syndicate/operative
name = "Syndicate Operative"
suit = /obj/item/clothing/suit/space/void/merc
belt = /obj/item/weapon/storage/belt/military
head = /obj/item/clothing/head/helmet/space/void/merc
mask = /obj/item/clothing/mask/gas/syndicate
l_ear = /obj/item/device/radio/headset/syndicate
glasses = /obj/item/clothing/glasses/night
shoes = /obj/item/clothing/shoes/magboots
l_pocket = /obj/item/weapon/pinpointer/nukeop
l_hand = /obj/item/weapon/tank/jetpack/void
backpack_contents = list(
/obj/item/weapon/storage/box/engineer = 1,
/obj/item/weapon/reagent_containers/pill/cyanide = 1,
/obj/item/weapon/gun/projectile/automatic/x9 = 1,
/obj/item/ammo_magazine/c45x = 1,
/obj/item/weapon/crowbar/red = 1,
/obj/item/weapon/plastique = 1,
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 1,
/obj/item/device/flashlight = 1,
/obj/item/clothing/shoes/combat = 1
)
/datum/outfit/admin/syndicate/officer
name = "Syndicate Officer"
head = /obj/item/clothing/head/beret
mask = /obj/item/clothing/mask/smokable/cigarette/cigar/havana
belt = /obj/item/weapon/gun/projectile/deagle/camo
l_ear = /obj/item/device/radio/headset/syndicate
l_pocket = /obj/item/weapon/pinpointer/advpinpointer
r_pocket = null // stop them getting a radio uplink, they get an implant instead
backpack_contents = list(
/obj/item/weapon/storage/box/engineer = 1,
/obj/item/device/flashlight = 1,
/obj/item/weapon/reagent_containers/pill/cyanide = 1,
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 1,
/obj/item/ammo_magazine/a50 = 2,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/weapon/flame/lighter/zippo = 1
)
implants = list(
/obj/item/weapon/implant/explosive
)
id_icon = "commander"
id_access = "Syndicate Operative Leader"
/datum/outfit/admin/syndicate/spy
name = "Syndicate Spy"
uniform = /obj/item/clothing/under/suit_jacket/really_black
shoes = /obj/item/clothing/shoes/black/noslip
uplink_uses = 40
id_access = "Syndicate Agent"
implants = list(
/obj/item/weapon/implant/explosive
)
/datum/outfit/admin/nt
name = "NanoTrasen Representative"
uniform = /obj/item/clothing/under/rank/centcom
back = /obj/item/weapon/storage/backpack/satchel
gloves = /obj/item/clothing/gloves/white
shoes = /obj/item/clothing/shoes/laceup
l_ear = /obj/item/device/radio/headset/heads/hop
glasses = /obj/item/clothing/glasses/sunglasses
id = /obj/item/weapon/card/id
backpack_contents = list(
/obj/item/weapon/storage/box/engineer = 1
)
var/id_icon = "centcom"
var/id_access = "NanoTrasen Representative"
/datum/outfit/admin/nt/get_id_access()
return get_all_accesses() | get_centcom_access(id_access)
/datum/outfit/admin/nt/officer
name = "NanoTrasen Navy Officer"
uniform = /obj/item/clothing/under/rank/centcom_officer
l_ear = /obj/item/device/radio/headset/heads/captain
head = /obj/item/clothing/head/beret/centcom/officer
/datum/outfit/admin/nt/captain
name = "NanoTrasen Navy Captain"
uniform = /obj/item/clothing/under/rank/centcom_captain
l_ear = /obj/item/device/radio/headset/heads/captain
head = /obj/item/clothing/head/beret/centcom/captain
/datum/outfit/admin/nt/protection_detail
name = "ERT Protection Detail"
uniform = /obj/item/clothing/under/ccpolice
suit = /obj/item/clothing/suit/storage/vest/heavy/ert/peacekeeper
shoes = /obj/item/clothing/shoes/swat
gloves = /obj/item/clothing/gloves/swat
l_ear = /obj/item/device/radio/headset/ert
glasses = /obj/item/clothing/glasses/sunglasses/sechud
head = /obj/item/clothing/head/beret/centcom/officer
backpack_contents = list(
/obj/item/weapon/gun/energy/gun = 1,
/obj/item/clothing/head/helmet/swat/peacekeeper = 1,
/obj/item/clothing/accessory/holster/hip = 1,
/obj/item/weapon/gun/energy/pistol = 1
)
implants = list(
/obj/item/weapon/implant/loyalty
)
/datum/outfit/admin/nt/ert_commander
name = "ERT Commander"
uniform = /obj/item/clothing/under/rank/centcom_commander
suit = /obj/item/clothing/suit/storage/vest/heavy/ert/commander
shoes = /obj/item/clothing/shoes/swat
gloves = /obj/item/clothing/gloves/swat
l_ear = /obj/item/device/radio/headset/ert
glasses = /obj/item/clothing/glasses/sunglasses/sechud
head = /obj/item/clothing/head/beret/centcom/commander
backpack_contents = list(
/obj/item/weapon/storage/fancy/cigar = 1,
/obj/item/weapon/flame/lighter/zippo = 1,
/obj/item/clothing/accessory/medal/gold/heroism = 1
)
implants = list(
/obj/item/weapon/implant/loyalty
)
/datum/outfit/admin/nt/odinsec
name = "NTCC Odin Security Specialist"
uniform = /obj/item/clothing/under/ccpolice
suit = /obj/item/clothing/suit/storage/vest/heavy/ert/peacekeeper
shoes = /obj/item/clothing/shoes/swat
gloves = /obj/item/clothing/gloves/swat
l_ear = /obj/item/device/radio/headset/ert
glasses = /obj/item/clothing/glasses/sunglasses/sechud/tactical
mask = /obj/item/clothing/mask/gas/tactical
head = /obj/item/clothing/head/helmet/swat/peacekeeper
r_pocket = /obj/item/weapon/handcuffs/ziptie
l_pocket = /obj/item/weapon/grenade/chem_grenade/gas
l_hand = /obj/item/weapon/shield/riot/tact
backpack_contents = list(
/obj/item/weapon/gun/projectile/automatic/x9 = 1,
/obj/item/ammo_magazine/c45x = 2,
/obj/item/clothing/accessory/holster/hip = 1,
/obj/item/weapon/gun/energy/gun = 1
)
implants = list(
/obj/item/weapon/implant/loyalty
)
/datum/outfit/admin/nt/specops
name = "Special Operations Officer"
uniform = /obj/item/clothing/under/syndicate/combat
suit = /obj/item/clothing/suit/armor/swat/officer
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
l_ear = /obj/item/device/radio/headset/ert
glasses = /obj/item/clothing/glasses/eyepatch/hud/thermal
mask = /obj/item/clothing/mask/smokable/cigarette/cigar/havana
head = /obj/item/clothing/head/helmet/space/deathsquad/beret
belt = /obj/item/weapon/gun/energy/pulse/pistol
r_pocket = /obj/item/weapon/flame/lighter/zippo
implants = list(
/obj/item/weapon/implant/loyalty
)
id_access = "Death Commando"
/datum/outfit/admin/pirate
name = "Pirate"
uniform = /obj/item/clothing/under/pirate
shoes = /obj/item/clothing/shoes/brown
head = /obj/item/clothing/head/bandana
glasses = /obj/item/clothing/glasses/eyepatch
r_hand = /obj/item/weapon/melee/energy/sword/pirate
/datum/outfit/admin/spacepirate
name = "Space Pirate"
uniform = /obj/item/clothing/under/pirate
suit = /obj/item/clothing/suit/space/pirate
shoes = /obj/item/clothing/shoes/brown
head = /obj/item/clothing/head/helmet/space/pirate
glasses = /obj/item/clothing/glasses/eyepatch
r_hand = /obj/item/weapon/melee/energy/sword/pirate
/datum/outfit/admin/sovietsoldier
name = "Soviet Soldier"
uniform = /obj/item/clothing/under/soviet
shoes = /obj/item/clothing/shoes/black
head = /obj/item/clothing/head/ushanka
/datum/outfit/admin/sovietsoldier
name = "Soviet Admiral"
uniform = /obj/item/clothing/under/soviet
suit = /obj/item/clothing/suit/hgpirate
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/combat
head = /obj/item/clothing/head/hgpiratecap
belt = /obj/item/weapon/gun/projectile/revolver/mateba
l_ear = /obj/item/device/radio/headset/heads/captain
glasses = /obj/item/clothing/glasses/eyepatch/hud/thermal
id = /obj/item/weapon/card/id
/datum/outfit/admin/sovietsoldier/get_id_assignment()
return "Admiral"
/datum/outfit/admin/sovietsoldier/get_id_rank()
return "Admiral"
/datum/outfit/admin/maskedkiller
name = "Masked Killer"
uniform = /obj/item/clothing/under/overalls
suit = /obj/item/clothing/suit/apron
shoes = /obj/item/clothing/shoes/white
gloves = /obj/item/clothing/gloves/latex
mask = /obj/item/clothing/mask/surgical
head = /obj/item/clothing/head/welding
l_ear = /obj/item/device/radio/headset
glasses = /obj/item/clothing/glasses/thermal/plain/monocle
l_pocket = /obj/item/weapon/material/knife
r_pocket = /obj/item/weapon/scalpel
r_hand = /obj/item/weapon/material/twohanded/fireaxe
id = null
/datum/outfit/admin/maskedkiller/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
for(var/obj/item/carried_item in H.contents)
if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant.
carried_item.add_blood(H)//Oh yes, there will be blood...
/datum/outfit/admin/assassin
name = "Assassin"
uniform = /obj/item/clothing/under/suit_jacket
suit = /obj/item/clothing/suit/wcoat
shoes = /obj/item/clothing/shoes/black
gloves = /obj/item/clothing/gloves/black
l_ear = /obj/item/device/radio/headset
glasses = /obj/item/clothing/glasses/sunglasses
l_pocket = /obj/item/weapon/melee/energy/sword
r_pocket = /obj/item/weapon/cloaking_device
id = /obj/item/weapon/card/id/syndicate
pda = /obj/item/device/pda/heads
/datum/outfit/admin/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(H)
for(var/obj/item/briefcase_item in sec_briefcase)
qdel(briefcase_item)
for(var/i=3, i>0, i--)
sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_magazine/a357
sec_briefcase.contents += new /obj/item/weapon/plastique
H.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
/datum/outfit/admin/assassin/get_id_access()
return get_all_station_access()
/datum/outfit/admin/random_employee
name = "Random Employee"
/datum/outfit/admin/random_employee/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(!visualsOnly)
//Select a random job, set the assigned_role / job var and equip it
var/datum/job/job = SSjobs.GetRandomJob()
var/alt_title = null
if(job.alt_titles && prob(50))
alt_title = pick(job.alt_titles)
if(H.mind)
H.mind.assigned_role = alt_title ? alt_title : job.title
H.job = alt_title ? alt_title : job.title
job.equip(H, FALSE, FALSE, alt_title)
/datum/outfit/admin/random
name = "Random Civilian"
uniform = "suit selection"
shoes = "shoe selection"
l_ear = /obj/item/device/radio/headset
back = list(
/obj/item/weapon/storage/backpack,
/obj/item/weapon/storage/backpack/satchel_norm,
/obj/item/weapon/storage/backpack/satchel,
/obj/item/weapon/storage/backpack/duffel,
/obj/item/weapon/storage/backpack/duffel
)
/datum/outfit/admin/random/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(!visualsOnly)
if(prob(10)) //Equip something smokable
var/path = pick(list(
/obj/item/clothing/mask/smokable/pipe,
/obj/item/clothing/mask/smokable/pipe/cobpipe,
/obj/item/weapon/storage/fancy/cigar,
/obj/item/weapon/storage/fancy/cigarettes
))
H.equip_or_collect(new path(), slot_wear_mask)
if(prob(20)) //Equip some headgear
var/datum/gear/G = gear_datums[pick(list("cap selection","beret, red","hat selection","hijab selection","turban selection"))]
H.equip_or_collect(G.spawn_random(), slot_head)
if(prob(20)) //Equip some sunglasses
var/path = pick(list(
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/glasses/regular,
/obj/item/clothing/glasses/gglasses,
/obj/item/clothing/glasses/regular/hipster,
/datum/gear/eyes/glasses/monocle,
/datum/gear/eyes/shades/aviator,
/datum/gear/eyes/glasses/fakesun
))
H.equip_or_collect(new path(), slot_glasses)
if(prob(20)) //Equip some gloves
var/datum/gear/G = gear_datums["gloves selection"]
H.equip_or_collect(G.spawn_random(), slot_gloves)
/datum/outfit/admin/random/visitor
name = "Random Visitor"
id = /obj/item/weapon/card/id
pda = /obj/item/device/pda
/datum/outfit/admin/random/visitor/get_id_assignment()
return "Visitor"
/datum/outfit/admin/random/visitor/get_id_rank()
return "Visitor"