Files
Bubberstation/code/game/gamemodes/objective_items.dm
MrMelbert d244c86ce6 Adds Character Loadout Tab to preferences (with just a small handful of items to start) (#83521)
## About The Pull Request

Adds a Character Loadout Tab to the preference menu

This tab lets you pick items to start the round with


![image](https://private-user-images.githubusercontent.com/51863163/336254447-c5f7eefa-c44c-418d-b48e-0409bb5bb982.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwNDAxMjMsIm5iZiI6MTcxODAzOTgyMywicGF0aCI6Ii81MTg2MzE2My8zMzYyNTQ0NDctYzVmN2VlZmEtYzQ0Yy00MThkLWI0OGUtMDQwOWJiNWJiOTgyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE3MTcwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYxYWFmYjI2NDU0YjUyODg3NjBmM2VjZDg4YWQ1YjlhMThmODU3MDYyMzYwOGVmYTcxYmY2MDhjZWVmYjQ5ZTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Y0_19Gisfp4yyUmLgW2atfKyneL7POWFRKNVgNWTbEs)

This also has some additional mechanics, such as being able to recolor
colorable items, rename certain items (such as plushies), set item skins
(such as the pride pin)


![image](https://github.com/tgstation/tgstation/assets/51863163/8a085d6c-a294-4538-95d2-ada902ab69b4)

## Why It's Good For The Game

This has been headcoder sanctioned for some time, just no one did it. So
here we are.

Allows players to add some additional customization to their characters.
Keeps us from cluttering the quirks list with quirks that do nothing but
grants items.

## Changelog

🆑 Melbert
add: Character Loadouts
del: Pride Pin quirk (it's in the Loadout menu now)
/🆑
2024-06-11 17:50:12 -07:00

923 lines
35 KiB
Plaintext

/proc/add_item_to_steal(source, type)
GLOB.steal_item_handler.objectives_by_path[type] += source
return type
//Contains the target item datums for Steal objectives.
/datum/objective_item
/// How the item is described in the objective
var/name = "a silly bike horn! Honk!"
/// Typepath of item
var/targetitem = /obj/item/bikehorn
/// Valid containers that the target item can be in.
var/list/valid_containers = list()
/// Who CARES if this item goes missing (no stealing unguarded items), often similar but not identical to the next list
var/list/item_owner = list()
/// Jobs which cannot generate this objective (no stealing your own stuff)
var/list/excludefromjob = list()
/// List of additional items which also count, for things like blueprints
var/list/altitems = list()
/// Items to provide to people in order to allow them to acquire the target
var/list/special_equipment = list()
/// Defines in which contexts the item can be given as an objective
var/objective_type = OBJECTIVE_ITEM_TYPE_NORMAL
/// Whether this item exists on the station map at the start of a round.
var/exists_on_map = FALSE
/**
* How hard it is to steal this item given normal circumstances, ranked on a scale of 1 to 5.
*
* 1 - Probably found in a public area
* 2 - Likely on someone's person, or in a less-than-public but otherwise unguarded area
* 3 - Usually on someone's person, or in a locked locker or otherwise secure area
* 4 - Always on someone's person, or in a secure area
* 5 - You know it when you see it. Things like the Nuke Disc which have a pointer to it at all times.
*
* Also accepts 0 as "extremely easy to steal" and >5 as "almost impossible to steal"
*/
var/difficulty = 0
/// A hint explaining how one may find the target item.
var/steal_hint = "The clown might have one."
/// For objectives with special checks (does that intellicard have an ai in it? etcetc)
/datum/objective_item/proc/check_special_completion(obj/item/thing)
return TRUE
/// Takes a list of minds and returns true if this is a valid objective to give to a team of these minds
/datum/objective_item/proc/valid_objective_for(list/potential_thieves, require_owner = FALSE)
if(!target_exists() || (require_owner && !owner_exists()))
return FALSE
for (var/datum/mind/possible_thief as anything in potential_thieves)
var/datum/job/role = possible_thief.assigned_role
if(role.title in excludefromjob)
return FALSE
return TRUE
/// Returns true if the target item exists
/datum/objective_item/proc/target_exists()
return (exists_on_map) ? length(GLOB.steal_item_handler.objectives_by_path[targetitem]) : TRUE
/// Returns true if one of the item's owners exists somewhere
/datum/objective_item/proc/owner_exists()
if (!length(item_owner))
return TRUE
for (var/mob/living/player as anything in GLOB.player_list)
if ((player.mind?.assigned_role.title in item_owner) && player.stat != DEAD && !is_centcom_level(player.z))
return TRUE
return FALSE
/datum/objective_item/steal/New()
. = ..()
if(target_exists())
GLOB.possible_items += src
else
qdel(src)
/datum/objective_item/steal/Destroy()
GLOB.possible_items -= src
return ..()
// Low risk steal objectives
/datum/objective_item/steal/traitor
objective_type = OBJECTIVE_ITEM_TYPE_TRAITOR
// Unique-ish low risk objectives
/datum/objective_item/steal/traitor/bartender_shotgun
name = "the bartender's shotgun"
targetitem = /obj/item/gun/ballistic/shotgun/doublebarrel
excludefromjob = list(JOB_BARTENDER)
item_owner = list(JOB_BARTENDER)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A double-barrel shotgun usually found on the bartender's person, or if none are around, in the bar's backroom."
/obj/item/gun/ballistic/shotgun/doublebarrel/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/doublebarrel)
/datum/objective_item/steal/traitor/fireaxe
name = "a fire axe"
targetitem = /obj/item/fireaxe
excludefromjob = list(
JOB_ATMOSPHERIC_TECHNICIAN,
JOB_CAPTAIN,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_QUARTERMASTER,
JOB_RESEARCH_DIRECTOR,
JOB_STATION_ENGINEER,
)
exists_on_map = TRUE
difficulty = 3
steal_hint = "Only two of these exist on the station - one in the bridge, and one in atmospherics. \
You can use a multitool to hack open the case, or break it open the hard way."
/obj/item/fireaxe/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/fireaxe)
/datum/objective_item/steal/traitor/big_crowbar
name = "a mech removal tool"
targetitem = /obj/item/crowbar/mechremoval
excludefromjob = list(
JOB_RESEARCH_DIRECTOR,
JOB_SCIENTIST,
JOB_ROBOTICIST,
)
item_owner = list(JOB_ROBOTICIST)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A specialized tool found in the roboticist's lab. You can use a multitool to hack open the case, or break it open the hard way."
/obj/item/crowbar/mechremoval/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/crowbar/mechremoval)
/datum/objective_item/steal/traitor/nullrod
name = "the chaplain's null rod"
targetitem = /obj/item/nullrod
excludefromjob = list(JOB_CHAPLAIN)
item_owner = list(JOB_CHAPLAIN)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A holy artifact usually found on the chaplain's person, or if none are around, in the chapel's relic closet. \
If there is a chaplain aboard, it is likely be to be transformed into some holy weapon - some of which are... difficult to remove from their person."
/obj/item/nullrod/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/nullrod)
/datum/objective_item/steal/traitor/clown_shoes
name = "the clown's shoes"
targetitem = /obj/item/clothing/shoes/clown_shoes
excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER)
item_owner = list(JOB_CLOWN)
exists_on_map = TRUE
difficulty = 1
steal_hint = "The clown's huge, bright shoes. They should always be on the clown's feet."
/obj/item/clothing/shoes/clown_shoes/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/shoes/clown_shoes)
/datum/objective_item/steal/traitor/mime_mask
name = "the mime's mask"
targetitem = /obj/item/clothing/mask/gas/mime
excludefromjob = list(JOB_MIME, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER)
item_owner = list(JOB_MIME)
exists_on_map = TRUE
difficulty = 1
steal_hint = "The mime's mask. It should always be on the mime's face."
/obj/item/clothing/mask/gas/mime/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/mask/gas/mime)
/datum/objective_item/steal/traitor/pka
name = "a protokinetic accelerator"
targetitem = /obj/item/gun/energy/recharge/kinetic_accelerator
excludefromjob = list(JOB_SHAFT_MINER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER)
item_owner = list(JOB_SHAFT_MINER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "A tool primarily used by shaft miners to mine. Most carry one (or multiple) on their person, \
but they can also be found in the Mining Station, Mining office, or Auxiliary Mining Base on the station."
/obj/item/gun/energy/recharge/kinetic_accelerator/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/energy/recharge/kinetic_accelerator)
/datum/objective_item/steal/traitor/chef_moustache
name = "a fancy fake moustache"
targetitem = /obj/item/clothing/mask/fakemoustache/italian
excludefromjob = list(JOB_COOK, JOB_HEAD_OF_PERSONNEL, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER)
item_owner = list(JOB_COOK)
exists_on_map = TRUE
difficulty = 1
steal_hint = "The chef's fake Italian moustache, either found on their face or in the garbage, depending on who's on duty."
/obj/item/clothing/mask/fakemoustache/italian/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/mask/fakemoustache/italian)
/datum/objective_item/steal/traitor/det_revolver
name = "detective's revolver"
targetitem = /obj/item/gun/ballistic/revolver/c38/detective
excludefromjob = list(JOB_DETECTIVE)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A .38 special revolver found in the Detective's holder. \
Usually found on the Detective's person, or if none are around, in the detective's locker, in their office."
/obj/item/gun/ballistic/revolver/c38/detective/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/ballistic/revolver/c38/detective)
/datum/objective_item/steal/traitor/lawyers_badge
name = "the lawyer's badge"
targetitem = /obj/item/clothing/accessory/lawyers_badge
excludefromjob = list(JOB_LAWYER)
item_owner = list(JOB_LAWYER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "The lawyer's badge. Usually pinned to their chest, but a spare can be obtained from their clothes vendor."
/obj/item/clothing/accessory/lawyers_badge/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/accessory/lawyers_badge)
/datum/objective_item/steal/traitor/chief_engineer_belt
name = "the chief engineer's belt"
targetitem = /obj/item/storage/belt/utility/chief
excludefromjob = list(JOB_CHIEF_ENGINEER)
exists_on_map = TRUE
difficulty = 2
steal_hint = "The chief engineer's toolbelt, strapped to their waist at all times."
/obj/item/storage/belt/utility/chief/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/storage/belt/utility/chief)
/datum/objective_item/steal/traitor/telebaton
name = "a head of staff's telescopic baton"
targetitem = /obj/item/melee/baton/telescopic
excludefromjob = list(
JOB_RESEARCH_DIRECTOR,
JOB_CAPTAIN,
JOB_HEAD_OF_SECURITY,
JOB_HEAD_OF_PERSONNEL,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_QUARTERMASTER,
)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A self-defense weapon standard-issue for all heads of staffs barring the Head of Security. Rarely found off of their person."
/datum/objective_item/steal/traitor/telebaton/check_special_completion(obj/item/thing)
return thing.type == /obj/item/melee/baton/telescopic
/obj/item/melee/baton/telescopic/add_stealing_item_objective()
if(type == /obj/item/melee/baton/telescopic)
return add_item_to_steal(src, /obj/item/melee/baton/telescopic)
/datum/objective_item/steal/traitor/cargo_budget
name = "cargo's departmental budget"
targetitem = /obj/item/card/id/departmental_budget/car
excludefromjob = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN)
item_owner = list(JOB_QUARTERMASTER)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A card that grants access to Cargo's funds. \
Normally found in the locker of the Quartermaster, but a particularly keen one may have it on their person or in their wallet."
/obj/item/card/id/departmental_budget/car/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/card/id/departmental_budget/car)
/datum/objective_item/steal/traitor/captain_modsuit
name = "the captain's magnate MOD control unit"
targetitem = /obj/item/mod/control/pre_equipped/magnate
excludefromjob = list(JOB_CAPTAIN)
exists_on_map = TRUE
difficulty = 3
steal_hint = "An expensive, hand-crafted MOD unit made for the station's Captain. \
If not being worn by the Captain, you would find it in the Suit Storage Unit in their quarters."
/obj/item/mod/control/pre_equipped/magnate/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/magnate)
/datum/objective_item/steal/traitor/captain_spare
name = "the captain's spare ID"
targetitem = /obj/item/card/id/advanced/gold/captains_spare
excludefromjob = list(
JOB_RESEARCH_DIRECTOR,
JOB_CAPTAIN,
JOB_HEAD_OF_SECURITY,
JOB_HEAD_OF_PERSONNEL,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_QUARTERMASTER,
)
exists_on_map = TRUE
difficulty = 4
steal_hint = "The spare ID of the High Lord himself. \
If there's no official Captain around, you may find it pinned to the chest of the Acting Captain - one of the Heads of Staff. \
Otherwise, you'll have to bust open the golden safe on the bridge with acid or explosives to get to it."
/obj/item/card/id/advanced/gold/captains_spare/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/card/id/advanced/gold/captains_spare)
// High risk steal objectives
// Will always generate even with no Captain due to its security and temptation to use it
/datum/objective_item/steal/caplaser
name = "the captain's antique laser gun"
targetitem = /obj/item/gun/energy/laser/captain
excludefromjob = list(JOB_CAPTAIN)
exists_on_map = TRUE
difficulty = 4
steal_hint = "A self-charging laser gun found in a display case in the Captain's Quarters. \
Breaking it open may trigger a security alert, so be careful."
/obj/item/gun/energy/laser/captain/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/energy/laser/captain)
/datum/objective_item/steal/hoslaser
name = "the head of security's personal laser gun"
targetitem = /obj/item/gun/energy/e_gun/hos
excludefromjob = list(JOB_HEAD_OF_SECURITY)
item_owner = list(JOB_HEAD_OF_SECURITY)
exists_on_map = TRUE
difficulty = 4
steal_hint = "The Head of Security's unique three mode laser gun. \
Always found on their person, if they are alive, but may otherwise be found in their locker."
/obj/item/gun/energy/e_gun/hos/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/energy/e_gun/hos)
/datum/objective_item/steal/compactshotty
name = "the head of security's personal compact shotgun"
targetitem = /obj/item/gun/ballistic/shotgun/automatic/combat/compact
excludefromjob = list(JOB_HEAD_OF_SECURITY)
item_owner = list(JOB_HEAD_OF_SECURITY)
exists_on_map = TRUE
difficulty = 4
steal_hint = "A miniaturized combat shotgun. May be found in Head of Security's locker or strapped to their back."
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/automatic/combat/compact)
/datum/objective_item/steal/handtele
name = "a hand teleporter"
targetitem = /obj/item/hand_tele
excludefromjob = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR, JOB_HEAD_OF_PERSONNEL)
item_owner = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR)
exists_on_map = TRUE
difficulty = 3
steal_hint = "Only two of these devices exist on the station, with one sitting in the Teleporter Room \
for emergencies, and the other in the Captain's Quarters for personal use."
/obj/item/hand_tele/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/hand_tele)
/datum/objective_item/steal/jetpack
name = "the Captain's jetpack"
targetitem = /obj/item/tank/jetpack/oxygen/captain
excludefromjob = list(JOB_CAPTAIN)
item_owner = list(JOB_CAPTAIN)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A special yellow jetpack found in the Suit Storage Unit in the Captain's Quarters."
/obj/item/tank/jetpack/oxygen/captain/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/tank/jetpack/oxygen/captain)
/datum/objective_item/steal/magboots
name = "the chief engineer's advanced magnetic boots"
targetitem = /obj/item/clothing/shoes/magboots/advance
excludefromjob = list(JOB_CHIEF_ENGINEER)
item_owner = list(JOB_CHIEF_ENGINEER)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A pair of magnetic boots found in the Chief Engineer's Suit Storage Unit. \
May also be found on their person, concealed beneath their MODsuit."
/obj/item/clothing/shoes/magboots/advance/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/shoes/magboots/advance)
/datum/objective_item/steal/capmedal
name = "the medal of captaincy"
targetitem = /obj/item/clothing/accessory/medal/gold/captain
excludefromjob = list(JOB_CAPTAIN)
item_owner = list(JOB_CAPTAIN)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A gold medal found in the medal box in the Captain's Quarters. \
The Captain usually also has one pinned to their jumpsuit."
/obj/item/clothing/accessory/medal/gold/captain/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/accessory/medal/gold/captain)
/datum/objective_item/steal/hypo
name = "the hypospray"
targetitem = /obj/item/reagent_containers/hypospray/cmo
excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER)
item_owner = list(JOB_CHIEF_MEDICAL_OFFICER)
exists_on_map = TRUE
difficulty = 3
steal_hint = "The Chief Medical Officer's personal medical injector. \
Usually found amongst their medical supplies on their person, in their belt, or otherwise in their locker."
/obj/item/reagent_containers/hypospray/cmo/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/reagent_containers/hypospray/cmo)
/datum/objective_item/steal/nukedisc
name = "the nuclear authentication disk"
targetitem = /obj/item/disk/nuclear
excludefromjob = list(JOB_CAPTAIN)
difficulty = 5
steal_hint = "THAT disk - you know the one. Carried by the Captain at all times (hopefully). \
Difficult to miss, but if you can't find it, the Head of Security and Captain both have devices to track its precise location."
/obj/item/disk/nuclear/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/disk/nuclear)
/datum/objective_item/steal/nukedisc/check_special_completion(obj/item/disk/nuclear/N)
return !N.fake
/datum/objective_item/steal/reflector
name = "a reflector trenchcoat"
targetitem = /obj/item/clothing/suit/hooded/ablative
excludefromjob = list(JOB_HEAD_OF_SECURITY, JOB_WARDEN)
item_owner = list(JOB_HEAD_OF_SECURITY)
exists_on_map = TRUE
difficulty = 4
steal_hint = "An ablative trechcoat found on the shelves of the Armory."
/obj/item/clothing/suit/hooded/ablative/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/suit/hooded/ablative)
/datum/objective_item/steal/reactive
name = "the reactive teleport armor"
targetitem = /obj/item/clothing/suit/armor/reactive/teleport
excludefromjob = list(JOB_RESEARCH_DIRECTOR)
item_owner = list(JOB_RESEARCH_DIRECTOR)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A special suit of armor found in the possession of the Research Director. \
You may otherwise find it in their locker."
/obj/item/clothing/suit/armor/reactive/teleport/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/suit/armor/reactive/teleport)
/datum/objective_item/steal/documents
name = "any set of secret documents of any organization"
valid_containers = list(/obj/item/folder)
targetitem = /obj/item/documents
exists_on_map = TRUE
difficulty = 3
steal_hint = "A set of papers belonging to a megaconglomerate. \
Nanotrasen documents can easily be found in the station's vault. \
For other corporations, you may find them in strange and distant places. \
A photocopy may also suffice."
/obj/item/documents/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/documents) //Any set of secret documents. Doesn't have to be NT's
/datum/objective_item/steal/nuke_core
name = "the heavily radioactive plutonium core from the onboard self-destruct"
valid_containers = list(/obj/item/nuke_core_container)
targetitem = /obj/item/nuke_core
exists_on_map = TRUE
difficulty = 4
steal_hint = "The core of the station's self-destruct device, found in the vault."
/obj/item/nuke_core/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/nuke_core)
/datum/objective_item/steal/nuke_core/New()
special_equipment += /obj/item/storage/box/syndie_kit/nuke
..()
/datum/objective_item/steal/hdd_extraction
name = "the source code for Project Goon from the master R&D server mainframe"
targetitem = /obj/item/computer_disk/hdd_theft
excludefromjob = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST)
item_owner = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST)
exists_on_map = TRUE
difficulty = 4
steal_hint = "The hard drive of the master research server, found in R&D's server room."
/obj/item/computer_disk/hdd_theft/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/computer_disk/hdd_theft)
/datum/objective_item/steal/hdd_extraction/New()
special_equipment += /obj/item/paper/guides/antag/hdd_extraction
return ..()
/datum/objective_item/steal/supermatter
name = "a sliver of a supermatter crystal"
targetitem = /obj/item/nuke_core/supermatter_sliver
valid_containers = list(/obj/item/nuke_core_container/supermatter)
difficulty = 5
steal_hint = "A small shard of the station's supermatter crystal engine."
/datum/objective_item/steal/supermatter/New()
special_equipment += /obj/item/storage/box/syndie_kit/supermatter
..()
/datum/objective_item/steal/supermatter/target_exists()
return GLOB.main_supermatter_engine != null
// Doesn't need item_owner = (JOB_AI) because this handily functions as a murder objective if there isn't one
/datum/objective_item/steal/functionalai
name = "a functional AI"
targetitem = /obj/item/aicard
difficulty = 5
steal_hint = "An intellicard (or MODsuit) containing an active, functional AI."
/datum/objective_item/steal/functionalai/New()
. = ..()
altitems += typesof(/obj/item/mod/control) // only here so we can account for AIs tucked away in a MODsuit.
/datum/objective_item/steal/functionalai/check_special_completion(obj/item/potential_storage)
var/mob/living/silicon/ai/being
if(istype(potential_storage, /obj/item/aicard))
var/obj/item/aicard/card = potential_storage
being = card.AI // why is this one capitalized and the other one not? i wish i knew.
else if(istype(potential_storage, /obj/item/mod/control))
var/obj/item/mod/control/suit = potential_storage
if(isAI(suit.ai_assistant))
being = suit.ai_assistant
else
stack_trace("check_special_completion() called on [src] with [potential_storage] ([potential_storage.type])! That's not supposed to happen!")
return FALSE
if(isAI(being) && being.stat != DEAD)
return TRUE
return FALSE
/datum/objective_item/steal/blueprints
name = "the station blueprints"
targetitem = /obj/item/blueprints
excludefromjob = list(JOB_CHIEF_ENGINEER)
item_owner = list(JOB_CHIEF_ENGINEER)
altitems = list(/obj/item/photo)
exists_on_map = TRUE
difficulty = 3
steal_hint = "The blueprints of the station, found in the Chief Engineer's locker, or on their person. A picture may suffice."
/obj/item/blueprints/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/blueprints)
/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
if(istype(I, /obj/item/blueprints))
return TRUE
if(istype(I, /obj/item/photo))
var/obj/item/photo/P = I
if(P.picture.has_blueprints) //if the blueprints are in frame
return TRUE
return FALSE
/datum/objective_item/steal/blackbox
name = "the Blackbox"
targetitem = /obj/item/blackbox
excludefromjob = list(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN)
exists_on_map = TRUE
difficulty = 4
steal_hint = "The station's data Blackbox, found solely within Telecommunications."
/obj/item/blackbox/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/blackbox)
// A number of special early-game steal objectives intended to be used with the steal-and-destroy objective.
// They're basically items of utility or emotional value that may be found on many players or lying around the station.
/datum/objective_item/steal/traitor/insuls
name = "some insulated gloves"
targetitem = /obj/item/clothing/gloves/color/yellow
excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER)
item_owner = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "A basic pair of insulated gloves, usually worn by Assistants, Engineers, or Cargo Technicians."
/obj/item/clothing/gloves/color/yellow/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow)
/datum/objective_item/steal/traitor/moth_plush
name = "a cute moth plush toy"
targetitem = /obj/item/toy/plush/moth
excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "A moth plush toy. The Psychologist has one to help console patients."
/obj/item/toy/plush/moth/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/toy/plush/moth)
/datum/objective_item/steal/traitor/lizard_plush
name = "a cute lizard plush toy"
targetitem = /obj/item/toy/plush/lizard_plushie
exists_on_map = TRUE
difficulty = 1
steal_hint = "A lizard plush toy. Often found hidden in maintenance."
/obj/item/toy/plush/lizard_plushie/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/toy/plush/lizard_plushie)
/datum/objective_item/steal/traitor/denied_stamp
name = "cargo's denied stamp"
targetitem = /obj/item/stamp/denied
excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "Cargo often has multiple of these red stamps lying around to process paperwork."
/obj/item/stamp/denied/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/stamp/denied)
/datum/objective_item/steal/traitor/granted_stamp
name = "cargo's granted stamp"
targetitem = /obj/item/stamp/granted
excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "Cargo often has multiple of these green stamps lying around to process paperwork."
/obj/item/stamp/granted/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/stamp/granted)
/datum/objective_item/steal/traitor/space_law
name = "a book on space law"
targetitem = /obj/item/book/manual/wiki/security_space_law
excludefromjob = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_LAWYER, JOB_DETECTIVE)
exists_on_map = TRUE
difficulty = 1
steal_hint = "Sometimes found in the possession of members of Security and Lawyers. \
The courtroom and the library are also good places to look."
/obj/item/book/manual/wiki/security_space_law/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law)
/datum/objective_item/steal/traitor/rpd
name = "a rapid pipe dispenser"
targetitem = /obj/item/pipe_dispenser
excludefromjob = list(
JOB_ATMOSPHERIC_TECHNICIAN,
JOB_STATION_ENGINEER,
JOB_CHIEF_ENGINEER,
JOB_SCIENTIST,
JOB_RESEARCH_DIRECTOR,
JOB_GENETICIST,
JOB_ROBOTICIST,
)
item_owner = list(JOB_CHIEF_ENGINEER)
exists_on_map = TRUE
difficulty = 1
steal_hint = "A tool often used by Engineers, Atmospherics Technicians, and Ordnance Technicians."
/obj/item/pipe_dispenser/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/pipe_dispenser)
/datum/objective_item/steal/traitor/donut_box
name = "a box of prized donuts"
targetitem = /obj/item/storage/fancy/donut_box
excludefromjob = list(
JOB_CAPTAIN,
JOB_CHIEF_ENGINEER,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_QUARTERMASTER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_RESEARCH_DIRECTOR,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
JOB_LAWYER,
JOB_DETECTIVE,
)
exists_on_map = TRUE
difficulty = 1
steal_hint = "Everyone has a box of donuts - you may most commonly find them on the Bridge, within Security, or in any department's break room."
/obj/item/storage/fancy/donut_box/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/storage/fancy/donut_box)
/datum/objective_item/steal/spy
objective_type = OBJECTIVE_ITEM_TYPE_SPY
/datum/objective_item/steal/spy/lamarr
name = "the Research Director's pet headcrab"
targetitem = /obj/item/clothing/mask/facehugger/lamarr
excludefromjob = list(JOB_RESEARCH_DIRECTOR)
exists_on_map = TRUE
difficulty = 3
steal_hint = "The Research Director's pet headcrab, Lamarr, found in a secure cage in their office."
/obj/item/clothing/mask/facehugger/lamarr/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/clothing/mask/facehugger/lamarr)
/datum/objective_item/steal/spy/disabler
name = "a disabler"
targetitem = /obj/item/gun/energy/disabler
excludefromjob = list(
JOB_CAPTAIN,
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
difficulty = 2
steal_hint = "A hand-held disabler, often found in the possession of Security Officers."
/datum/objective_item/steal/spy/energy_gun
name = "an energy gun"
targetitem = /obj/item/gun/energy/e_gun
excludefromjob = list(
JOB_CAPTAIN,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_QUARTERMASTER,
JOB_RESEARCH_DIRECTOR,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A two-mode energy gun, found in the station's Armory, as well as in the hands of some heads of staff for personal defense."
/datum/objective_item/steal/spy/energy_gun/check_special_completion(obj/item/thing)
return thing.type == /obj/item/gun/energy/e_gun
/obj/item/gun/energy/e_gun/add_stealing_item_objective()
if(type == /obj/item/gun/energy/e_gun)
return add_item_to_steal(src, /obj/item/gun/energy/e_gun)
/datum/objective_item/steal/spy/laser_gun
name = "a laser gun"
targetitem = /obj/item/gun/energy/laser
excludefromjob = list(
JOB_CAPTAIN,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_QUARTERMASTER,
JOB_RESEARCH_DIRECTOR,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A simple laser gun, found in the station's Armory."
/datum/objective_item/steal/spy/laser_gun/check_special_completion(obj/item/thing)
return thing.type == /obj/item/gun/energy/laser
/obj/item/gun/energy/laser/add_stealing_item_objective()
if(type == /obj/item/gun/energy/laser)
return add_item_to_steal(src, /obj/item/gun/energy/laser)
/datum/objective_item/steal/spy/shotgun
name = "a riot shotgun"
targetitem = /obj/item/gun/ballistic/shotgun/riot
excludefromjob = list(
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
exists_on_map = TRUE
difficulty = 3
steal_hint = "A shotgun found in the station's Armory for riot suppression. Doesn't miss."
/obj/item/gun/ballistic/shotgun/riot/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/riot)
/datum/objective_item/steal/spy/temp_gun
name = "security's temperature gun"
targetitem = /obj/item/gun/energy/temperature/security
excludefromjob = list(
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
exists_on_map = TRUE
difficulty = 2 // lowered for the meme
steal_hint = "Security's TRUSTY temperature gun, found in the station's Armory."
/obj/item/gun/energy/temperature/security/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/gun/energy/temperature/security)
/datum/objective_item/steal/spy/stamp
name = "a head of staff's stamp"
targetitem = /obj/item/stamp/head
excludefromjob = list(
JOB_CAPTAIN,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_QUARTERMASTER,
JOB_RESEARCH_DIRECTOR,
)
exists_on_map = TRUE
difficulty = 1
steal_hint = "A stamp owned by a head of staff, from their offices."
/obj/item/stamp/head/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/stamp/head)
/datum/objective_item/steal/spy/sunglasses
name = "some sunglasses"
targetitem = /obj/item/clothing/glasses/sunglasses
excludefromjob = list(
JOB_CAPTAIN,
JOB_CHIEF_ENGINEER,
JOB_CHIEF_MEDICAL_OFFICER,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_LAWYER,
JOB_QUARTERMASTER,
JOB_RESEARCH_DIRECTOR,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
difficulty = 1
steal_hint = "A pair of sunglasses. Lawyers often have a few pairs, as do some heads of staff. \
You can also obtain a pair from dissassembling hudglasses."
/datum/objective_item/steal/spy/ce_modsuit
name = "the chief engineer's advanced MOD control unit"
targetitem = /obj/item/mod/control/pre_equipped/advanced
excludefromjob = list(JOB_CHIEF_ENGINEER)
exists_on_map = TRUE
difficulty = 2
steal_hint = "An advanced version of the standard Engineering MODsuit commonly worn by the Chief Engineer."
/obj/item/mod/control/pre_equipped/advanced/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/advanced)
/datum/objective_item/steal/spy/rd_modsuit
name = "the research director's research MOD control unit"
targetitem = /obj/item/mod/control/pre_equipped/research
excludefromjob = list(JOB_RESEARCH_DIRECTOR)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A bulky MODsuit commonly worn by the Research Director to protect themselves from the hazards of their work."
/obj/item/mod/control/pre_equipped/research/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/research)
/datum/objective_item/steal/spy/cmo_modsuit
name = "the chief medical officer's rescure MOD control unit"
targetitem = /obj/item/mod/control/pre_equipped/rescue
excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER)
exists_on_map = TRUE
difficulty = 2
steal_hint = "A MODsuit sometimes equipped by the Chief Medical Officer to perform rescue opperations in hazardous environments."
/obj/item/mod/control/pre_equipped/rescue/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/rescue)
/datum/objective_item/steal/spy/hos_modsuit
name = "the head of security's safeguard MOD control unit"
targetitem = /obj/item/mod/control/pre_equipped/safeguard
excludefromjob = list(JOB_HEAD_OF_SECURITY)
exists_on_map = TRUE
difficulty = 2
steal_hint = "An advanced MODsuit sometimes worn by the Head of Security when needing to detain hostiles invading the station."
/obj/item/mod/control/pre_equipped/safeguard/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/mod/control/pre_equipped/safeguard)
/datum/objective_item/steal/spy/stun_baton
name = "a stun baton"
targetitem = /obj/item/melee/baton/security
excludefromjob = list(
JOB_CAPTAIN,
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
difficulty = 2
steal_hint = "Steal any stun baton from Security."
/datum/objective_item/steal/spy/stun_baton/check_special_completion(obj/item/thing)
return !istype(thing, /obj/item/melee/baton/security/cattleprod)
/datum/objective_item/steal/spy/det_baton
name = "the detective's baton"
targetitem = /obj/item/melee/baton
excludefromjob = list(
JOB_CAPTAIN,
JOB_DETECTIVE,
JOB_HEAD_OF_PERSONNEL,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
exists_on_map = TRUE
difficulty = 2
steal_hint = "The detective's old wooden truncheon, commonly found on their person for self defense."
/datum/objective_item/steal/spy/det_baton/check_special_completion(obj/item/thing)
return thing.type == /obj/item/melee/baton
/obj/item/melee/baton/add_stealing_item_objective()
if(type == /obj/item/melee/baton)
return add_item_to_steal(src, /obj/item/melee/baton)
/datum/objective_item/steal/spy/captain_sabre_sheathe
name = "the captain's sabre sheathe"
targetitem = /obj/item/storage/belt/sabre
excludefromjob = list(JOB_CAPTAIN)
exists_on_map = TRUE
difficulty = 3
steal_hint = "The sheathe for the captain's sabre, found in their closet or strapped to their waist at all times."
/obj/item/storage/belt/sabre/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/storage/belt/sabre)