Files
Bubberstation/code/game/gamemodes/objective_items.dm
Aliceee2ch 1513f779ad Repaths oxygen jetpacks and "removes" fake empty jetpack (#93676)
## About The Pull Request

removes oxygen jetpack subtype and makes empty jetpack actual oxygen

## Why It's Good For The Game

because our empty jetpack wasnt actually empty and we infact had two
oxygen jetpacks?

## Changelog

N/A
2025-11-01 13:40:04 +01:00

974 lines
37 KiB
Plaintext

GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new())
/proc/add_item_to_steal(source, type)
GLOB.steal_item_handler.objectives_by_path[type] += source
return type
/// Holds references to information about all of the items you might need to steal for objectives
/datum/objective_item_handler
var/list/list/objectives_by_path
var/generated_items = FALSE
/datum/objective_item_handler/New()
. = ..()
objectives_by_path = list()
for(var/datum/objective_item/item as anything in subtypesof(/datum/objective_item))
objectives_by_path[initial(item.targetitem)] = list()
RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(save_items))
RegisterSignal(SSdcs, COMSIG_GLOB_NEW_ITEM, PROC_REF(new_item_created))
/datum/objective_item_handler/proc/new_item_created(datum/source, obj/item/item)
SIGNAL_HANDLER
if(HAS_TRAIT(item, TRAIT_ITEM_OBJECTIVE_BLOCKED))
return
if(!generated_items)
item.add_stealing_item_objective()
return
var/typepath = item.add_stealing_item_objective()
if(typepath != null)
register_item(item, typepath)
/// Registers all items that are potentially stealable and removes ones that aren't.
/// We still need to do things this way because on mapload, items may not be on the station until everything has finished loading.
/datum/objective_item_handler/proc/save_items()
SIGNAL_HANDLER
for(var/obj/item/typepath as anything in objectives_by_path)
var/list/obj_by_path_cache = objectives_by_path[typepath].Copy()
for(var/obj/item/object as anything in obj_by_path_cache)
register_item(object, typepath)
generated_items = TRUE
/datum/objective_item_handler/proc/register_item(atom/object, typepath)
var/turf/place = get_turf(object)
if(!place || !is_station_level(place.z))
objectives_by_path[typepath] -= object
return
RegisterSignal(object, COMSIG_QDELETING, PROC_REF(remove_item))
/datum/objective_item_handler/proc/remove_item(atom/source)
SIGNAL_HANDLER
for(var/typepath in objectives_by_path)
objectives_by_path[typepath] -= source
//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."
///If the item takes special steps to destroy for an objective (e.g. blackbox)
var/destruction_method = null
/// 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 !istype(thing, /obj/item/melee/baton/telescopic/contractor_baton)
/obj/item/melee/baton/telescopic/add_stealing_item_objective()
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 warden's personal compact shotgun"
targetitem = /obj/item/gun/ballistic/shotgun/automatic/combat/compact
excludefromjob = list(JOB_WARDEN)
item_owner = list(JOB_WARDEN)
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/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/captain/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/tank/jetpack/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/ablative
name = "an ablative 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."
destruction_method = "Too strong to be destroyed via normal means - needs to be dusted via the supermatter, or burnt in the chapel's crematorium."
/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/sheath/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/sheath/sabre/add_stealing_item_objective()
return add_item_to_steal(src, /obj/item/storage/belt/sheath/sabre)