Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into new-decal-painter
This commit is contained in:
@@ -994,14 +994,14 @@
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/mine/living_quarters)
|
||||
"qh" = (
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = 11
|
||||
},
|
||||
/obj/effect/turf_decal/tile/bar,
|
||||
/obj/effect/turf_decal/tile/bar{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 4;
|
||||
pixel_x = 12
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/mine/living_quarters)
|
||||
"qm" = (
|
||||
@@ -2498,13 +2498,13 @@
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/mine/laborcamp)
|
||||
"Mj" = (
|
||||
/obj/structure/sink{
|
||||
dir = 4;
|
||||
pixel_x = -12
|
||||
},
|
||||
/obj/structure/mirror{
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/structure/sink{
|
||||
dir = 8;
|
||||
pixel_x = -12
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/mine/living_quarters)
|
||||
"Mk" = (
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#define MEDAL_HOT_DAMN "Hot Damn!"
|
||||
#define MEDAL_CAYENNE_DISK "Very Important Piscis"
|
||||
#define MEDAL_TRAM_SURFER "Tram Surfer"
|
||||
#define MEDAL_SPRINGLOCK "The Man Inside the Modsuit"
|
||||
|
||||
//Skill medal hub IDs
|
||||
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
|
||||
|
||||
@@ -474,8 +474,6 @@
|
||||
#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
|
||||
#define COMSIG_ITEM_ALT_AFTERATTACK "item_alt_afterattack" //from base of obj/item/altafterattack(): (atom/target, mob/user, proximity, params)
|
||||
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
|
||||
/// A mob has just unequipped an item.
|
||||
#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item"
|
||||
// Do not grant actions on equip.
|
||||
#define COMPONENT_NO_GRANT_ACTIONS 1
|
||||
#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
/// from base of atom/movable/Process_Spacemove(): (movement_dir)
|
||||
#define COMSIG_MOVABLE_SPACEMOVE "spacemove"
|
||||
#define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0)
|
||||
@@ -272,9 +272,13 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
|
||||
#define PDA_SKIN_MODERN "Modern"
|
||||
#define PDA_SKIN_MINIMAL "Minimal"
|
||||
|
||||
GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi',
|
||||
PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi',
|
||||
PDA_SKIN_MINIMAL = 'icons/obj/pda_minimal.dmi'))
|
||||
GLOBAL_LIST_INIT(pda_reskins, list(
|
||||
PDA_SKIN_CLASSIC = list("icon" = 'icons/obj/pda.dmi'),
|
||||
PDA_SKIN_ALT = list("icon" = 'icons/obj/pda_alt.dmi'),
|
||||
PDA_SKIN_RUGGED = list("icon" = 'icons/obj/pda_rugged.dmi'),
|
||||
PDA_SKIN_MODERN = list("icon" = 'icons/obj/pda_modern.dmi'),
|
||||
PDA_SKIN_MINIMAL = list("icon" = 'icons/obj/pda_minimal.dmi')
|
||||
))
|
||||
|
||||
/////////////////////////////////////
|
||||
// atom.appearence_flags shortcuts //
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/// Default value for the max_complexity var on MODsuits
|
||||
#define DEFAULT_MAX_COMPLEXITY 15
|
||||
|
||||
/// Default cell drain per process on MODsuits
|
||||
#define DEFAULT_CHARGE_DRAIN 5
|
||||
|
||||
/// Default time for a part to seal
|
||||
#define MOD_ACTIVATION_STEP_TIME (2 SECONDS)
|
||||
|
||||
/// Passive module, just acts when put in naturally.
|
||||
#define MODULE_PASSIVE 0
|
||||
/// Usable module, does something when you press a button.
|
||||
#define MODULE_USABLE 1
|
||||
/// Toggle module, you turn it on/off and it does stuff.
|
||||
#define MODULE_TOGGLE 2
|
||||
/// Actively usable module, you may only have one selected at a time.
|
||||
#define MODULE_ACTIVE 3
|
||||
|
||||
//Defines used by the theme for clothing flags and similar
|
||||
#define CONTROL_LAYER "control_layer"
|
||||
#define HELMET_FLAGS "helmet_flags"
|
||||
#define CHESTPLATE_FLAGS "chestplate_flags"
|
||||
#define GAUNTLETS_FLAGS "gauntlets_flags"
|
||||
#define BOOTS_FLAGS "boots_flags"
|
||||
|
||||
#define UNSEALED_LAYER "unsealed_layer"
|
||||
#define UNSEALED_CLOTHING "unsealed_clothing"
|
||||
#define SEALED_CLOTHING "sealed_clothing"
|
||||
#define UNSEALED_INVISIBILITY "unsealed_invisibility"
|
||||
#define SEALED_INVISIBILITY "sealed_invisibility"
|
||||
#define UNSEALED_COVER "unsealed_cover"
|
||||
#define SEALED_COVER "sealed_cover"
|
||||
#define CAN_OVERSLOT "can_overslot"
|
||||
|
||||
//Defines used to override MOD clothing's icon and worn icon files in the skin.
|
||||
#define MOD_ICON_OVERRIDE "mod_icon_override"
|
||||
#define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override"
|
||||
|
||||
/// Global list of all /datum/mod_theme
|
||||
GLOBAL_LIST_INIT(mod_themes, setup_mod_themes())
|
||||
@@ -158,18 +158,6 @@
|
||||
#define TRAIT_CALCIUM_HEALER "calcium_healer"
|
||||
#define TRAIT_MAGIC_CHOKE "magic_choke"
|
||||
#define TRAIT_CAPTAIN_METABOLISM "captain-metabolism"
|
||||
/// Like antimagic, but doesn't block the user from casting
|
||||
#define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock"
|
||||
/// Gives us turf, mob and object vision through walls
|
||||
#define TRAIT_XRAY_VISION "xray_vision"
|
||||
/// Gives us mob vision through walls and slight night vision
|
||||
#define TRAIT_THERMAL_VISION "thermal_vision"
|
||||
/// Gives us turf vision through walls and slight night vision
|
||||
#define TRAIT_MESON_VISION "meson_vision"
|
||||
/// Gives us Night vision
|
||||
#define TRAIT_TRUE_NIGHT_VISION "true_night_vision"
|
||||
/// Lets us scan reagents
|
||||
#define TRAIT_REAGENT_SCANNER "reagent_scanner"
|
||||
#define TRAIT_ABDUCTOR_TRAINING "abductor-training"
|
||||
#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training"
|
||||
#define TRAIT_SURGEON "surgeon"
|
||||
@@ -225,6 +213,8 @@
|
||||
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
|
||||
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
|
||||
#define TRAIT_FREESPRINT "free_sprinting"
|
||||
#define TRAIT_XRAY_VISION "xray_vision"
|
||||
#define TRAIT_THERMAL_VISION "thermal_vision"
|
||||
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
|
||||
#define TRAIT_NO_INTERNALS "no-internals"
|
||||
#define TRAIT_TOXIC_ALCOHOL "alcohol_intolerance"
|
||||
@@ -389,5 +379,3 @@
|
||||
#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint"
|
||||
#define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint"
|
||||
#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched"
|
||||
/// Trait applied by MODsuits.
|
||||
#define MOD_TRAIT "mod"
|
||||
|
||||
@@ -68,6 +68,25 @@ DEFINE_BITFIELD(area_flags, list(
|
||||
"NO_ALERTS" = NO_ALERTS,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(body_parts_covered, list(
|
||||
"ARM_LEFT" = ARM_LEFT,
|
||||
"ARM_RIGHT" = ARM_RIGHT,
|
||||
"ARMS" = ARMS,
|
||||
"CHEST" = CHEST,
|
||||
"FEET" = FEET,
|
||||
"FOOT_LEFT" = FOOT_LEFT,
|
||||
"FOOT_RIGHT" = FOOT_RIGHT,
|
||||
"GROIN" = GROIN,
|
||||
"HAND_LEFT" = HAND_LEFT,
|
||||
"HAND_RIGHT" = HAND_RIGHT,
|
||||
"HANDS" = HANDS,
|
||||
"HEAD" = HEAD,
|
||||
"LEG_LEFT" = LEG_LEFT,
|
||||
"LEG_RIGHT" = LEG_RIGHT,
|
||||
"LEGS" = LEGS,
|
||||
"NECK" = NECK,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(car_traits, list(
|
||||
"CAN_KIDNAP" = CAN_KIDNAP,
|
||||
))
|
||||
@@ -125,6 +144,11 @@ DEFINE_BITFIELD(disease_flags, list(
|
||||
"CURABLE" = CURABLE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(explosion_flags, list(
|
||||
"EXPLOSION_FLAG_DENSITY_DEPENDENT" = EXPLOSION_FLAG_DENSITY_DEPENDENT,
|
||||
"EXPLOSION_FLAG_HARD_OBSTACLE" = EXPLOSION_FLAG_HARD_OBSTACLE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(flags_1, list(
|
||||
"ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1,
|
||||
"BLOCK_FACE_ATOM_1" = BLOCK_FACE_ATOM_1,
|
||||
@@ -147,6 +171,30 @@ DEFINE_BITFIELD(flags_1, list(
|
||||
"UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(flags_cover, list(
|
||||
"GLASSESCOVERSEYE" = GLASSESCOVERSEYES,
|
||||
"HEADCOVERSEYES" = HEADCOVERSEYES,
|
||||
"HEADCOVERSMOUTH" = HEADCOVERSMOUTH,
|
||||
"MASKCOVERSEYES" = MASKCOVERSEYES,
|
||||
"MASKCOVERSMOUTH" = MASKCOVERSMOUTH,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(flags_inv, list(
|
||||
"HIDEACCESSORY" = HIDEACCESSORY,
|
||||
"HIDEEARS" = HIDEEARS,
|
||||
"HIDEEYES" = HIDEEYES,
|
||||
"HIDEFACE" = HIDEFACE,
|
||||
"HIDEFACIALHAI" = HIDEFACIALHAIR,
|
||||
"HIDEGLOVES" = HIDEGLOVES,
|
||||
"HIDEHAIR" = HIDEHAIR,
|
||||
"HIDEJUMPSUIT" = HIDEJUMPSUIT,
|
||||
"HIDEMASK" = HIDEMASK,
|
||||
"HIDENECK" = HIDENECK,
|
||||
"HIDESHOES" = HIDESHOES,
|
||||
"HIDESNOUT" = HIDESNOUT,
|
||||
"HIDESUITSTORA" = HIDESUITSTORAGE,
|
||||
"HIDETAUR" = HIDETAUR,
|
||||
))
|
||||
DEFINE_BITFIELD(flags_ricochet, list(
|
||||
"RICOCHET_SHINY" = RICOCHET_SHINY,
|
||||
"RICOCHET_HARD" = RICOCHET_HARD
|
||||
@@ -204,6 +252,12 @@ DEFINE_BITFIELD(item_flags, list(
|
||||
"SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(material_flags, list(
|
||||
"MATERIAL_ADD_PREFIX" = MATERIAL_ADD_PREFIX,
|
||||
"MATERIAL_AFFECT_STATISTICS" = MATERIAL_AFFECT_STATISTICS,
|
||||
"MATERIAL_COLOR" = MATERIAL_COLOR,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(mob_biotypes, list(
|
||||
"MOB_BEAST" = MOB_BEAST,
|
||||
"MOB_BUG" = MOB_BUG,
|
||||
@@ -281,7 +335,21 @@ DEFINE_BITFIELD(pass_flags, list(
|
||||
"PASSCLOSEDTURF" = PASSCLOSEDTURF,
|
||||
"PASSGLASS" = PASSGLASS,
|
||||
"PASSGRILLE" = PASSGRILLE,
|
||||
"PASSMACHINE" = PASSMACHINE,
|
||||
"PASSMOB" = PASSMOB,
|
||||
"PASSSTRUCTURE" = PASSSTRUCTURE,
|
||||
"PASSTABLE" = PASSTABLE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(pass_flags_self, list(
|
||||
"LETPASSTHROW" = LETPASSTHROW,
|
||||
"PASSBLOB" = PASSBLOB,
|
||||
"PASSCLOSEDTURF" = PASSCLOSEDTURF,
|
||||
"PASSGLASS" = PASSGLASS,
|
||||
"PASSGRILLE" = PASSGRILLE,
|
||||
"PASSMACHINE" = PASSMACHINE,
|
||||
"PASSMOB" = PASSMOB,
|
||||
"PASSSTRUCTURE" = PASSSTRUCTURE,
|
||||
"PASSTABLE" = PASSTABLE,
|
||||
))
|
||||
|
||||
@@ -343,6 +411,29 @@ DEFINE_BITFIELD(sight, list(
|
||||
"SEE_TURFS" = SEE_TURFS,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(slot_flags, list(
|
||||
"ITEM_SLOT_BACK" = ITEM_SLOT_BACK,
|
||||
"ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK,
|
||||
"ITEM_SLOT_BELT" = ITEM_SLOT_BELT,
|
||||
"ITEM_SLOT_DEX_STORAGE" = ITEM_SLOT_DEX_STORAGE,
|
||||
"ITEM_SLOT_EARS" = ITEM_SLOT_EARS,
|
||||
"ITEM_SLOT_EYES" = ITEM_SLOT_EYES,
|
||||
"ITEM_SLOT_FEET" = ITEM_SLOT_FEET,
|
||||
"ITEM_SLOT_GLOVES" = ITEM_SLOT_GLOVES,
|
||||
"ITEM_SLOT_HANDCUFFED" = ITEM_SLOT_HANDCUFFED,
|
||||
"ITEM_SLOT_HANDS" = ITEM_SLOT_HANDS,
|
||||
"ITEM_SLOT_HEAD" = ITEM_SLOT_HEAD,
|
||||
"ITEM_SLOT_ICLOTHING" = ITEM_SLOT_ICLOTHING,
|
||||
"ITEM_SLOT_ID" = ITEM_SLOT_ID,
|
||||
"ITEM_SLOT_LEGCUFFED" = ITEM_SLOT_LEGCUFFED,
|
||||
"ITEM_SLOT_LPOCKET" = ITEM_SLOT_LPOCKET,
|
||||
"ITEM_SLOT_MASK" = ITEM_SLOT_MASK,
|
||||
"ITEM_SLOT_NECK" = ITEM_SLOT_NECK,
|
||||
"ITEM_SLOT_OCLOTHING" = ITEM_SLOT_OCLOTHING,
|
||||
"ITEM_SLOT_RPOCKET" = ITEM_SLOT_RPOCKET,
|
||||
"ITEM_SLOT_SUITSTORE" = ITEM_SLOT_SUITSTORE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(smooth, list(
|
||||
"SMOOTH_BORDER" = SMOOTH_BORDER,
|
||||
"SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL,
|
||||
@@ -351,6 +442,15 @@ DEFINE_BITFIELD(smooth, list(
|
||||
"SMOOTH_TRUE" = SMOOTH_TRUE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(status_flags, list(
|
||||
"CANKNOCKDOWN" = CANKNOCKDOWN,
|
||||
"CANPUSH" = CANPUSH,
|
||||
"CANSTAGGER" = CANSTAGGER,
|
||||
"CANSTUN" = CANSTUN,
|
||||
"CANUNCONSCIOUS" = CANUNCONSCIOUS,
|
||||
"GODMODE" = GODMODE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(storage_flags, list(
|
||||
"STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS,
|
||||
"STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS,
|
||||
@@ -369,6 +469,59 @@ DEFINE_BITFIELD(vis_flags, list(
|
||||
"VIS_UNDERLAY" = VIS_UNDERLAY,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(visor_flags, list(
|
||||
"ALLOWINTERNALS" = ALLOWINTERNALS,
|
||||
"BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT,
|
||||
"IGNORE_HAT_TOSS" = IGNORE_HAT_TOSS,
|
||||
"LAVAPROTECT" = LAVAPROTECT,
|
||||
"NOSLIP" = NOSLIP,
|
||||
"NOSLIP_ICE" = NOSLIP_ICE,
|
||||
"SCAN_REAGENTS" = SCAN_REAGENTS,
|
||||
"STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE,
|
||||
"THICKMATERIAL" = THICKMATERIAL,
|
||||
"VOICEBOX_DISABLED" = VOICEBOX_DISABLED,
|
||||
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(visor_flags_cover, list(
|
||||
"GLASSESCOVERSEYE" = GLASSESCOVERSEYES,
|
||||
"HEADCOVERSEYES" = HEADCOVERSEYES,
|
||||
"HEADCOVERSMOUTH" = HEADCOVERSMOUTH,
|
||||
"MASKCOVERSEYES" = MASKCOVERSEYES,
|
||||
"MASKCOVERSMOUTH" = MASKCOVERSMOUTH,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(visor_flags_inv, list(
|
||||
"HIDEACCESSORY" = HIDEACCESSORY,
|
||||
"HIDEEARS" = HIDEEARS,
|
||||
"HIDEEYES" = HIDEEYES,
|
||||
"HIDEFACE" = HIDEFACE,
|
||||
"HIDEFACIALHAI" = HIDEFACIALHAIR,
|
||||
"HIDEGLOVES" = HIDEGLOVES,
|
||||
"HIDEHAIR" = HIDEHAIR,
|
||||
"HIDEJUMPSUIT" = HIDEJUMPSUIT,
|
||||
"HIDEMASK" = HIDEMASK,
|
||||
"HIDENECK" = HIDENECK,
|
||||
"HIDESHOES" = HIDESHOES,
|
||||
"HIDESNOUT" = HIDESNOUT,
|
||||
"HIDESUITSTORA" = HIDESUITSTORAGE,
|
||||
"HIDETAUR" = HIDETAUR,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(vore_flags, list(
|
||||
"ABSORBABLE" = ABSORBABLE,
|
||||
"ABSORBED" = ABSORBED,
|
||||
"DEVOURABLE" = DEVOURABLE,
|
||||
"DIGESTABLE" = DIGESTABLE,
|
||||
"FEEDING" = FEEDING,
|
||||
"LICKABLE" = LICKABLE,
|
||||
"MOBVORE" = MOBVORE,
|
||||
"NO_VORE" = NO_VORE,
|
||||
"SMELLABLE" = SMELLABLE,
|
||||
"VOREPREF_INIT" = VOREPREF_INIT,
|
||||
"VORE_INIT" = VORE_INIT,
|
||||
))
|
||||
|
||||
DEFINE_BITFIELD(zap_flags, list(
|
||||
"ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES,
|
||||
"ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE,
|
||||
|
||||
@@ -350,41 +350,6 @@ GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant
|
||||
//body ids that have prosthetic sprites
|
||||
GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon"))
|
||||
|
||||
//FAMILY HEIRLOOM LIST
|
||||
//this works by using the first number for the species as a probability to choose one of the items in the following list for their family heirloom
|
||||
//if the probability fails, or the species simply isn't in the list, then it defaults to the next global list, which has its own list of items for each job
|
||||
//the first item in the list is for if your job isn't in that list
|
||||
|
||||
//species-heirloom list (we categorise them by the species id var)
|
||||
GLOBAL_LIST_INIT(species_heirlooms, list(
|
||||
"dwarf" = list(25, list(/obj/item/reagent_containers/food/drinks/dwarf_mug)), //example: 25% chance for dwarves to get a dwarf mug as their heirloom (normal container but has manly dorf icon)
|
||||
"insect" = list(25, list(/obj/item/flashlight/lantern/heirloom_moth)),
|
||||
"ipc" = list(25, list(/obj/item/stock_parts/cell/family)), //gives a broken powercell for flavor text!
|
||||
"synthliz" = list(25, list(/obj/item/stock_parts/cell/family)), //they're also robots
|
||||
"slimeperson" = list(25, list(/obj/item/toy/plush/slimeplushie)),
|
||||
"lizard" = list(25, list(/obj/item/toy/plush/lizardplushie)),
|
||||
))
|
||||
|
||||
//job-heirloom list
|
||||
GLOBAL_LIST_INIT(job_heirlooms, list(
|
||||
"NO_JOB" = list(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20),
|
||||
"Clown" = list(/obj/item/paint/anycolor, /obj/item/bikehorn/golden),
|
||||
"Mime" = list(/obj/item/paint/anycolor, /obj/item/toy/dummy),
|
||||
"Cook" = list(/obj/item/kitchen/knife/scimitar),
|
||||
"Botanist" = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie),
|
||||
"Medical Doctor" = list(/obj/item/healthanalyzer),
|
||||
"Paramedic" = list(/obj/item/lighter), //..why?
|
||||
"Station Engineer" = list(/obj/item/wirecutters/brass/family, /obj/item/crowbar/brass/family, /obj/item/screwdriver/brass/family, /obj/item/wrench/brass/family), //brass tools but without the tool speed modifier
|
||||
"Atmospheric Technician" = list(/obj/item/extinguisher/mini/family),
|
||||
"Lawyer" = list(/obj/item/storage/briefcase/lawyer/family),
|
||||
"Janitor" = list(/obj/item/mop),
|
||||
"Scientist" = list(/obj/item/toy/plush/slimeplushie),
|
||||
"Assistant" = list(/obj/item/clothing/gloves/cut/family),
|
||||
"Prisoner" = list (/obj/item/pen/blue),
|
||||
"Chaplain" = list(/obj/item/camera/spooky/family),
|
||||
"Head of Personnel" = list(/obj/item/pinpointer/ian)
|
||||
))
|
||||
|
||||
//body ids that have non-gendered bodyparts
|
||||
GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem"))
|
||||
|
||||
|
||||
@@ -53,8 +53,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/airlock_painter/decal/tile = 1,
|
||||
/obj/item/stack/cable_coil/random = 4,
|
||||
/obj/item/stack/cable_coil/random/five = 6,
|
||||
/obj/item/mod/construction/broken_core = 5,
|
||||
/obj/item/mod/module/springlock = 1,
|
||||
/obj/item/stack/medical/suture = 1,
|
||||
/obj/item/stack/rods/ten = 9,
|
||||
/obj/item/stack/rods/twentyfive = 1,
|
||||
|
||||
@@ -405,7 +405,7 @@
|
||||
return
|
||||
|
||||
/atom/proc/CtrlShiftClick(mob/user)
|
||||
SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT)
|
||||
SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user)
|
||||
return
|
||||
|
||||
/*
|
||||
|
||||
@@ -91,8 +91,6 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
else
|
||||
py_shift = 32
|
||||
restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth.
|
||||
else if(hudfix_method && AM.loc)
|
||||
anchor = get_atom_on_turf(anchor)
|
||||
|
||||
//Sets defaults
|
||||
//These assume 45 deg min_angle
|
||||
|
||||
@@ -171,9 +171,3 @@
|
||||
desc = "Lights out, guerilla radio!"
|
||||
database_id = MEDAL_TRAM_SURFER
|
||||
icon = "tram_surfer"
|
||||
|
||||
/datum/award/achievement/misc/springlock
|
||||
name = "The Man Inside the MODsuit"
|
||||
desc = "Ignore the warning label on a springlock MODsuit."
|
||||
database_id = MEDAL_SPRINGLOCK
|
||||
icon = "springlock"
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
message.maptext_height = mheight
|
||||
message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5
|
||||
message.maptext = MAPTEXT(complete_text)
|
||||
message.pixel_x = -owner.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that
|
||||
message.pixel_x = -target.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that
|
||||
|
||||
// View the message
|
||||
LAZYADDASSOC(owned_by.seen_messages, message_loc, src)
|
||||
|
||||
@@ -554,19 +554,6 @@
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISCELLANEOUS
|
||||
|
||||
/datum/crafting_recipe/mod_core
|
||||
name = "MOD core"
|
||||
result = /obj/item/mod/construction/core
|
||||
tools = list(TOOL_SCREWDRIVER)
|
||||
time = 10 SECONDS
|
||||
reqs = list(/obj/item/stack/cable_coil = 5,
|
||||
/obj/item/stack/rods = 2,
|
||||
/obj/item/stack/sheet/glass = 1,
|
||||
/obj/item/organ/heart = 1
|
||||
)
|
||||
subcategory = CAT_MISCELLANEOUS
|
||||
category = CAT_MISCELLANEOUS
|
||||
|
||||
//////////////
|
||||
//Banners/////
|
||||
//////////////
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* # Element: Object Reskinning
|
||||
*
|
||||
* Allows players to modify the appearance of their object (and other attributes if possible)
|
||||
* PLEASE DO NOT HAVE INVALID VALUES IN unique_reskin I DON'T EVEN WANT TO KNOW WHAT HAPPENS.
|
||||
* USAGE:
|
||||
* unique_reskins = list(
|
||||
* "skin 1" = list(
|
||||
* "desc" = "very cool description",
|
||||
* "icon" = 'very_cool_icon.dmi'
|
||||
* ),
|
||||
* "skin 2" = list(
|
||||
* "desc" = "not as cool description",
|
||||
* "icon" = 'the_boring_skin.dmi'
|
||||
* )
|
||||
* )
|
||||
*/
|
||||
/datum/element/object_reskinning
|
||||
element_flags = ELEMENT_DETACH
|
||||
|
||||
/datum/element/object_reskinning/Attach(datum/target)
|
||||
. = ..()
|
||||
var/obj/the_obj = target
|
||||
if(!istype(the_obj))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
if(!islist(the_obj.unique_reskin) || !length(the_obj.unique_reskin))
|
||||
message_admins("[src] was given to an object without any unique reskins, if you really need to, give it a couple skins first.")
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
|
||||
RegisterSignal(the_obj, COMSIG_PARENT_EXAMINE, .proc/on_examine)
|
||||
RegisterSignal(the_obj, the_obj.reskin_binding, .proc/reskin)
|
||||
|
||||
/datum/element/object_reskinning/Detach(datum/source, force)
|
||||
var/obj/being_deleted = source
|
||||
UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, being_deleted.reskin_binding))
|
||||
return ..()
|
||||
|
||||
/datum/element/object_reskinning/proc/on_examine(obj/obj, mob/user, list/examine_list)
|
||||
examine_list += span_notice("[capitalize(replacetext(obj.reskin_binding, "_", "-"))] to reskin it ([length(obj.unique_reskin)] possible styles).")
|
||||
if(obj.always_reskinnable)
|
||||
examine_list += span_notice("It has no limit to reskinning.")
|
||||
|
||||
/*
|
||||
* Reskins an object according to user's choice.
|
||||
* Will detach itself if there's no skins or if done successfully but not always reskinnable.
|
||||
*
|
||||
* Arguments:
|
||||
* * to_reskin The object we will be reskinning
|
||||
* * user The user who wants to choose a skin for the object
|
||||
*/
|
||||
/datum/element/object_reskinning/proc/reskin(obj/to_reskin, mob/user)
|
||||
// Just stop early
|
||||
if(!LAZYLEN(to_reskin.unique_reskin))
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] attempted to reskin an object that has no skins!")
|
||||
Detach(to_reskin)
|
||||
return FALSE
|
||||
|
||||
// Can't use
|
||||
if(!user.canUseTopic(to_reskin, BE_CLOSE, NO_DEXTERY, NO_TK))
|
||||
return FALSE
|
||||
|
||||
// Get our choices
|
||||
var/list/items = list()
|
||||
for(var/reskin_option in to_reskin.unique_reskin)
|
||||
var/image/item_image = image(
|
||||
icon = to_reskin.unique_reskin[reskin_option]["icon"] ? to_reskin.unique_reskin[reskin_option]["icon"] : to_reskin.icon,
|
||||
icon_state = to_reskin.unique_reskin[reskin_option]["icon_state"] ? to_reskin.unique_reskin[reskin_option]["icon_state"] : to_reskin.icon_state)
|
||||
items += list("[reskin_option]" = item_image)
|
||||
sortList(items)
|
||||
|
||||
// Display to the user
|
||||
var/pick = show_radial_menu(user, to_reskin, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, user, to_reskin), radius = 38, require_near = TRUE)
|
||||
if(!pick)
|
||||
return FALSE
|
||||
|
||||
// Finish the work
|
||||
to_reskin.current_skin = pick
|
||||
for(var/reskin_var in to_reskin.unique_reskin[pick])
|
||||
to_reskin.vars[reskin_var] = to_reskin.unique_reskin[pick][reskin_var]
|
||||
to_chat(user, "[to_reskin] is now skinned as '[pick].'")
|
||||
to_reskin.reskin_obj(user)
|
||||
|
||||
// Only once or always?
|
||||
if(!to_reskin.always_reskinnable)
|
||||
Detach(to_reskin)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Checks if we are allowed to interact with a radial menu for reskins
|
||||
*
|
||||
* Arguments:
|
||||
* * user The mob interacting with the menu
|
||||
* * obj The obj to be checking against
|
||||
*/
|
||||
/datum/element/object_reskinning/proc/check_reskin_menu(mob/user, obj/obj)
|
||||
if(QDELETED(obj))
|
||||
return FALSE
|
||||
if(!obj.always_reskinnable && obj.current_skin)
|
||||
return FALSE
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(user.incapacitated())
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -181,10 +181,10 @@
|
||||
|
||||
/datum/quirk/trandening
|
||||
name = "High Luminosity Eyes"
|
||||
desc = "When the next big fancy implant came out you had to buy one on impluse!"
|
||||
desc = "When the next big fancy implant came out you had to buy one on impulse! You start the shift with emissive cybernetic eyes that can emit colored beams of light."
|
||||
value = 1
|
||||
gain_text = "<span class='notice'>You have to keep up with the next big thing!.</span>"
|
||||
lose_text = "<span class='danger'>High-tech gizmos are a scam...</span>"
|
||||
gain_text = "<span class='notice'>You've been keeping up with the latest cybernetic trends!</span>"
|
||||
lose_text = "<span class='danger'>High powered eye lasers? What were you thinking...</span>"
|
||||
|
||||
/datum/quirk/trandening/on_spawn()
|
||||
// Get targets
|
||||
@@ -195,6 +195,34 @@
|
||||
qdel(old_eyes)
|
||||
new_eyes.Insert(quirk_holder)
|
||||
|
||||
/datum/quirk/trandening/remove()
|
||||
// Get targets
|
||||
var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES)
|
||||
var/mob/living/carbon/human/qurk_mob = quirk_holder
|
||||
|
||||
// Check for eyes existing
|
||||
if(!old_eyes)
|
||||
return
|
||||
|
||||
// Check for quirk eyes
|
||||
if(!istype(old_eyes, /obj/item/organ/eyes/robotic/glow))
|
||||
return
|
||||
|
||||
// Define new eyes
|
||||
var/species_eyes = /obj/item/organ/eyes
|
||||
|
||||
// Check for mutant eyes
|
||||
if(qurk_mob.dna.species && qurk_mob.dna.species.mutanteyes)
|
||||
// Set eyes to mutant type
|
||||
species_eyes = qurk_mob.dna.species.mutanteyes
|
||||
|
||||
// Create new eyes item
|
||||
var/obj/item/organ/eyes/new_eyes = new species_eyes()
|
||||
|
||||
// Replace eyes
|
||||
qdel(old_eyes)
|
||||
new_eyes.Insert(quirk_holder)
|
||||
|
||||
/datum/quirk/bloodpressure
|
||||
name = "Polycythemia vera"
|
||||
desc = "You've a treated form of Polycythemia vera that increases the total blood volume inside of you as well as the rate of replenishment!"
|
||||
|
||||
@@ -43,27 +43,38 @@
|
||||
|
||||
GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
|
||||
/datum/quirk/family_heirloom/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
/datum/quirk/family_heirloom/on_spawn()
|
||||
// Define holder and type
|
||||
var/mob/living/carbon/human/human_holder = quirk_holder
|
||||
var/obj/item/heirloom_type
|
||||
var/species_heirloom_entry = GLOB.species_heirlooms[H.dna.species.id]
|
||||
if(species_heirloom_entry)
|
||||
if(prob(species_heirloom_entry[1]))
|
||||
heirloom_type = pick(species_heirloom_entry[2])
|
||||
|
||||
// The quirk holder's species - we have a 50% chance, if we have a species with a set heirloom, to choose a species heirloom.
|
||||
var/datum/species/holder_species = human_holder.dna?.species
|
||||
if(holder_species && LAZYLEN(holder_species.family_heirlooms) && prob(50))
|
||||
heirloom_type = pick(holder_species.family_heirlooms)
|
||||
else
|
||||
// Our quirk holder's job
|
||||
var/datum/job/holder_job = SSjob.GetJob(human_holder.last_mind?.assigned_role)
|
||||
if(holder_job && LAZYLEN(holder_job.family_heirlooms))
|
||||
heirloom_type = pick(holder_job.family_heirlooms)
|
||||
|
||||
// If we didn't find an heirloom somehow, throw them a generic one
|
||||
if(!heirloom_type)
|
||||
var/job_heirloom_entry = GLOB.job_heirlooms[quirk_holder.mind.assigned_role]
|
||||
if(!job_heirloom_entry)
|
||||
heirloom_type = pick(GLOB.job_heirlooms["NO_JOB"]) //consider: should this be a define?
|
||||
else
|
||||
heirloom_type = pick(job_heirloom_entry)
|
||||
heirloom_type = pick(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20)
|
||||
|
||||
// Create the heirloom item
|
||||
heirloom = new heirloom_type(get_turf(quirk_holder))
|
||||
|
||||
// Add to global list
|
||||
GLOB.family_heirlooms += heirloom
|
||||
|
||||
// Determine and assign item location
|
||||
var/list/slots = list(
|
||||
"in your left pocket" = ITEM_SLOT_LPOCKET,
|
||||
"in your right pocket" = ITEM_SLOT_RPOCKET,
|
||||
"in your backpack" = ITEM_SLOT_BACKPACK
|
||||
)
|
||||
where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet"
|
||||
where = human_holder.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet"
|
||||
|
||||
/datum/quirk/family_heirloom/post_add()
|
||||
if(where == "in your backpack")
|
||||
@@ -75,13 +86,25 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]"
|
||||
|
||||
/datum/quirk/family_heirloom/on_process()
|
||||
if(heirloom in quirk_holder.GetAllContents())
|
||||
// Ignore for dead holder
|
||||
if(quirk_holder.stat == DEAD)
|
||||
return
|
||||
|
||||
// When held: Positive mood
|
||||
if(heirloom && (heirloom in quirk_holder.GetAllContents()))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing")
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom)
|
||||
|
||||
// When not held: Negative mood
|
||||
else
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom")
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing)
|
||||
|
||||
/datum/quirk/item_quirk/family_heirloom/remove()
|
||||
// Clear mood events when removing this quirk
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom")
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing")
|
||||
|
||||
/datum/quirk/family_heirloom/clone_data()
|
||||
return heirloom
|
||||
|
||||
|
||||
@@ -163,22 +163,7 @@
|
||||
lose_text = "<span class='notice'>You no longer feel like you should be eating trash.</span>"
|
||||
mob_trait = TRAIT_TRASHCAN
|
||||
|
||||
/datum/quirk/colorist
|
||||
name = "Colorist"
|
||||
desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair."
|
||||
value = 0
|
||||
medical_record_text = "Patient enjoys dyeing their hair with pretty colors."
|
||||
|
||||
/datum/quirk/colorist/on_spawn()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder))
|
||||
H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK)
|
||||
H.regenerate_icons()
|
||||
|
||||
/datum/quirk/colorist/post_add()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H)
|
||||
to_chat(quirk_holder, "<span class='boldnotice'>You brought some extra dye with you! It's in your bag if you forgot.</span>")
|
||||
// Moved Colorist quirk to a loadout item
|
||||
|
||||
/datum/quirk/salt_sensitive
|
||||
name = "Sodium Sensitivity"
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
/datum/wires/mod
|
||||
holder_type = /obj/item/mod/control
|
||||
proper_name = "MOD control unit"
|
||||
|
||||
/datum/wires/mod/New(atom/holder)
|
||||
wires = list(WIRE_HACK, WIRE_DISABLE, WIRE_SHOCK, WIRE_INTERFACE)
|
||||
add_duds(2)
|
||||
..()
|
||||
|
||||
/datum/wires/mod/interactable(mob/user)
|
||||
if(!..())
|
||||
return FALSE
|
||||
var/obj/item/mod/control/mod = holder
|
||||
return mod.open
|
||||
|
||||
/datum/wires/mod/get_status()
|
||||
var/obj/item/mod/control/mod = holder
|
||||
var/list/status = list()
|
||||
status += "The orange light is [mod.seconds_electrified ? "on" : "off"]."
|
||||
status += "The red light is [mod.malfunctioning ? "off" : "blinking"]."
|
||||
status += "The green light is [mod.locked ? "on" : "off"]."
|
||||
status += "The yellow light is [mod.interface_break ? "off" : "on"]."
|
||||
return status
|
||||
|
||||
/datum/wires/mod/on_pulse(wire)
|
||||
var/obj/item/mod/control/mod = holder
|
||||
switch(wire)
|
||||
if(WIRE_HACK)
|
||||
mod.locked = !mod.locked
|
||||
if(WIRE_DISABLE)
|
||||
mod.malfunctioning = TRUE
|
||||
if(WIRE_SHOCK)
|
||||
mod.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME
|
||||
if(WIRE_INTERFACE)
|
||||
mod.interface_break = !mod.interface_break
|
||||
|
||||
/datum/wires/mod/on_cut(wire, mend)
|
||||
var/obj/item/mod/control/mod = holder
|
||||
switch(wire)
|
||||
if(WIRE_HACK)
|
||||
if(!mend)
|
||||
mod.req_access = list()
|
||||
if(WIRE_DISABLE)
|
||||
mod.malfunctioning = !mend
|
||||
if(WIRE_SHOCK)
|
||||
if(mend)
|
||||
mod.seconds_electrified = MACHINE_NOT_ELECTRIFIED
|
||||
else
|
||||
mod.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT
|
||||
if(WIRE_INTERFACE)
|
||||
mod.interface_break = !mend
|
||||
|
||||
/datum/wires/mod/ui_act(action, params)
|
||||
var/obj/item/mod/control/mod = holder
|
||||
if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr))
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -61,13 +61,16 @@
|
||||
|
||||
/obj/machinery/computer/aifixer/proc/Fix()
|
||||
use_power(1000)
|
||||
occupier.adjustOxyLoss(-1, 0)
|
||||
occupier.adjustFireLoss(-1, 0)
|
||||
occupier.adjustToxLoss(-1, 0)
|
||||
occupier.adjustBruteLoss(-1, 0)
|
||||
occupier.adjustOxyLoss(-1, FALSE, FALSE)
|
||||
occupier.adjustFireLoss(-1, FALSE, FALSE)
|
||||
occupier.adjustBruteLoss(-5, FALSE)
|
||||
|
||||
occupier.updatehealth()
|
||||
if(occupier.health >= 0 && occupier.stat == DEAD)
|
||||
occupier.revive()
|
||||
occupier.revive(full_heal = FALSE, admin_revive = FALSE)
|
||||
if(!occupier.radio_enabled)
|
||||
occupier.radio_enabled = TRUE
|
||||
to_chat(occupier, span_warning("Your Subspace Transceiver has been enabled!"))
|
||||
return occupier.health < 100
|
||||
|
||||
/obj/machinery/computer/aifixer/process()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/machinery/recharge_station
|
||||
name = "recharging station"
|
||||
desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users."
|
||||
name = "cyborg recharging station"
|
||||
desc = "This device recharges cyborgs and resupplies them with materials."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "borgcharger0"
|
||||
density = FALSE
|
||||
@@ -10,7 +10,7 @@
|
||||
req_access = list(ACCESS_ROBOTICS)
|
||||
state_open = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/cyborgrecharger
|
||||
occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human)
|
||||
occupant_typecache = list(/mob/living/silicon/robot)
|
||||
var/recharge_speed
|
||||
var/repairs
|
||||
|
||||
|
||||
@@ -10,15 +10,11 @@
|
||||
var/obj/item/clothing/suit/space/suit = null
|
||||
var/obj/item/clothing/head/helmet/space/helmet = null
|
||||
var/obj/item/clothing/mask/mask = null
|
||||
var/obj/item/mod/control/mod = null
|
||||
var/obj/item/storage = null
|
||||
|
||||
var/suit_type = null
|
||||
var/helmet_type = null
|
||||
var/mask_type = null
|
||||
/// What type of MOD the unit starts with when spawned.
|
||||
var/mod_type = null
|
||||
/// What type of additional item the unit starts with when spawned.
|
||||
var/storage_type = null
|
||||
|
||||
state_open = FALSE
|
||||
@@ -31,8 +27,6 @@
|
||||
var/uv_cycles = 6
|
||||
var/message_cooldown
|
||||
var/breakout_time = 300
|
||||
/// How fast it charges cells in a suit
|
||||
var/charge_rate = 250
|
||||
|
||||
/obj/machinery/suit_storage_unit/standard_unit
|
||||
suit_type = /obj/item/clothing/suit/space/eva
|
||||
@@ -44,50 +38,21 @@
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/captain
|
||||
|
||||
/obj/machinery/suit_storage_unit/captainmod
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/captain
|
||||
mod_type = /obj/item/mod/control/pre_equipped/magnate
|
||||
|
||||
/obj/machinery/suit_storage_unit/engine
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/engine
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type= /obj/item/clothing/shoes/magboots
|
||||
|
||||
/obj/machinery/suit_storage_unit/enginemod
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
mod_type = /obj/item/mod/control/pre_equipped/engineering
|
||||
|
||||
/obj/machinery/suit_storage_unit/atmos
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/watertank/atmos
|
||||
|
||||
/obj/machinery/suit_storage_unit/atmosmod
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/watertank/atmos
|
||||
mod_type = /obj/item/mod/control/pre_equipped/atmospheric
|
||||
|
||||
/obj/machinery/suit_storage_unit/ce
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type= /obj/item/clothing/shoes/magboots/advance
|
||||
|
||||
/obj/machinery/suit_storage_unit/cemod
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/clothing/shoes/magboots/advance
|
||||
mod_type = /obj/item/mod/control/pre_equipped/advanced
|
||||
|
||||
/obj/machinery/suit_storage_unit/security
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/security
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/security
|
||||
|
||||
/obj/machinery/suit_storage_unit/securitymod
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
mod_type = /obj/item/mod/control/pre_equipped/security
|
||||
|
||||
|
||||
/obj/machinery/suit_storage_unit/hos
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
@@ -98,11 +63,6 @@
|
||||
mask_type = /obj/item/clothing/mask/gas
|
||||
storage_type = /obj/item/watertank/atmos
|
||||
|
||||
/obj/machinery/suit_storage_unit/hosmod
|
||||
mask_type = /obj/item/clothing/mask/gas/sechailer
|
||||
storage_type = /obj/item/tank/internals/oxygen
|
||||
mod_type = /obj/item/mod/control/pre_equipped/safeguard
|
||||
|
||||
/obj/machinery/suit_storage_unit/mining
|
||||
suit_type = /obj/item/clothing/suit/hooded/explorer/standard
|
||||
mask_type = /obj/item/clothing/mask/gas/explorer
|
||||
@@ -111,16 +71,6 @@
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/mining
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
|
||||
/obj/machinery/suit_storage_unit/mining/evahos
|
||||
suit_type = null
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
mod_type = /obj/item/mod/control/pre_equipped/mining
|
||||
|
||||
/obj/machinery/suit_storage_unit/medicalmod
|
||||
mask_type = /obj/item/clothing/mask/breath/medical
|
||||
storage_type = /obj/item/tank/internals/oxygen
|
||||
mod_type = /obj/item/mod/control/pre_equipped/medical
|
||||
|
||||
/obj/machinery/suit_storage_unit/cmo
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/medical
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
@@ -131,29 +81,15 @@
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/eva/paramedic
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
|
||||
/obj/machinery/suit_storage_unit/cmomod
|
||||
mask_type = /obj/item/clothing/mask/breath/medical
|
||||
storage_type = /obj/item/tank/internals/oxygen
|
||||
mod_type = /obj/item/mod/control/pre_equipped/rescue
|
||||
|
||||
/obj/machinery/suit_storage_unit/rd
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/rd
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
|
||||
/obj/machinery/suit_storage_unit/rdmod
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
mod_type = /obj/item/mod/control/pre_equipped/research
|
||||
|
||||
/obj/machinery/suit_storage_unit/syndicate
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
mask_type = /obj/item/clothing/mask/gas/syndicate
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/harness
|
||||
|
||||
/obj/machinery/suit_storage_unit/syndicatemod
|
||||
mask_type = /obj/item/clothing/mask/gas/syndicate
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/harness
|
||||
mod_type = /obj/item/mod/control/pre_equipped/nuclear
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/command
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/ert
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
@@ -193,8 +129,6 @@
|
||||
helmet = new helmet_type(src)
|
||||
if(mask_type)
|
||||
mask = new mask_type(src)
|
||||
if(mod_type)
|
||||
mod = new mod_type(src)
|
||||
if(storage_type)
|
||||
storage = new storage_type(src)
|
||||
update_icon()
|
||||
@@ -203,7 +137,6 @@
|
||||
QDEL_NULL(suit)
|
||||
QDEL_NULL(helmet)
|
||||
QDEL_NULL(mask)
|
||||
QDEL_NULL(mod)
|
||||
QDEL_NULL(storage)
|
||||
return ..()
|
||||
|
||||
@@ -221,7 +154,7 @@
|
||||
. += "broken"
|
||||
else
|
||||
. += "open"
|
||||
if(suit || mod)
|
||||
if(suit)
|
||||
. += "suit"
|
||||
if(helmet)
|
||||
. += "helm"
|
||||
@@ -242,7 +175,6 @@
|
||||
helmet = null
|
||||
suit = null
|
||||
mask = null
|
||||
mod = null
|
||||
storage = null
|
||||
occupant = null
|
||||
|
||||
@@ -309,8 +241,6 @@
|
||||
qdel(suit) // Delete everything but the occupant.
|
||||
mask = null
|
||||
qdel(mask)
|
||||
mod = null
|
||||
qdel(mod)
|
||||
storage = null
|
||||
qdel(storage)
|
||||
// The wires get damaged too.
|
||||
@@ -332,9 +262,6 @@
|
||||
if(mask)
|
||||
things_to_clear += mask
|
||||
things_to_clear += mask.GetAllContents()
|
||||
if(mod)
|
||||
things_to_clear += mod
|
||||
things_to_clear += mod.GetAllContents()
|
||||
if(storage)
|
||||
things_to_clear += storage
|
||||
things_to_clear += storage.GetAllContents()
|
||||
@@ -352,20 +279,6 @@
|
||||
if(occupant)
|
||||
dump_contents()
|
||||
|
||||
/obj/machinery/suit_storage_unit/process(delta_time)
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
if(mod)
|
||||
if(!istype(mod))
|
||||
return
|
||||
if(!mod.cell)
|
||||
return
|
||||
cell = mod.cell
|
||||
else
|
||||
return
|
||||
|
||||
use_power(charge_rate * delta_time)
|
||||
cell.give(charge_rate * delta_time)
|
||||
|
||||
/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb)
|
||||
if(!prob(prb))
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
@@ -440,13 +353,6 @@
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
mask = I
|
||||
else if(istype(I, /obj/item/mod/control))
|
||||
if(mod)
|
||||
to_chat(user, span_warning("The unit already contains a MOD!"))
|
||||
return
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
mod = I
|
||||
else
|
||||
if(storage)
|
||||
to_chat(user, "<span class='warning'>The auxiliary storage compartment is full!</span>")
|
||||
@@ -499,10 +405,6 @@
|
||||
data["mask"] = mask.name
|
||||
else
|
||||
data["mask"] = null
|
||||
if(mod)
|
||||
data["mod"] = mod.name
|
||||
else
|
||||
data["mod"] = null
|
||||
if(storage)
|
||||
data["storage"] = storage.name
|
||||
else
|
||||
@@ -533,7 +435,7 @@
|
||||
if("uv")
|
||||
if(occupant && safeties)
|
||||
return
|
||||
else if(!helmet && !mask && !mod && !suit && !storage && !occupant)
|
||||
else if(!helmet && !mask && !suit && !storage && !occupant)
|
||||
return
|
||||
else
|
||||
if(occupant)
|
||||
@@ -545,7 +447,7 @@
|
||||
if(!state_open)
|
||||
return
|
||||
|
||||
var/static/list/valid_items = list("helmet", "suit", "mask", "mod", "storage")
|
||||
var/static/list/valid_items = list("helmet", "suit", "mask", "storage")
|
||||
var/item_name = params["item"]
|
||||
if(item_name in valid_items)
|
||||
var/obj/item/I = vars[item_name]
|
||||
|
||||
@@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(throwing)
|
||||
throwing.finalize(FALSE)
|
||||
if(loc == user)
|
||||
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(I = src))
|
||||
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
|
||||
return
|
||||
|
||||
. = FALSE
|
||||
@@ -428,7 +428,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(throwing)
|
||||
throwing.finalize(FALSE)
|
||||
if(loc == user)
|
||||
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
|
||||
if(!user.temporarilyRemoveItemFromInventory(src))
|
||||
return
|
||||
|
||||
pickup(user)
|
||||
@@ -1271,7 +1271,3 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
/obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE)
|
||||
for(var/datum/action/current_action as anything in actions)
|
||||
current_action.UpdateButtonIcon(status_only, force)
|
||||
|
||||
/// Special stuff you want to do when an outfit equips this item.
|
||||
/obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
|
||||
return
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6")
|
||||
var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED,
|
||||
RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING)
|
||||
var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint")
|
||||
var/static/list/graffiti_large_h = list("yiffhell", "furrypride", "secborg", "paint")
|
||||
|
||||
var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h
|
||||
|
||||
|
||||
@@ -461,8 +461,6 @@
|
||||
cooldown = TRUE
|
||||
busy = FALSE
|
||||
update_icon()
|
||||
if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP)
|
||||
return
|
||||
if(req_defib)
|
||||
defib.cooldowncheck(user)
|
||||
else
|
||||
@@ -516,8 +514,6 @@
|
||||
cooldown = TRUE
|
||||
busy = FALSE
|
||||
update_icon()
|
||||
if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP)
|
||||
return
|
||||
if(!req_defib)
|
||||
recharge(60)
|
||||
if(req_defib && (defib.cooldowncheck(user)))
|
||||
@@ -636,8 +632,6 @@
|
||||
defib.deductcharge(revivecost)
|
||||
cooldown = 1
|
||||
update_icon()
|
||||
if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP)
|
||||
return
|
||||
if(req_defib)
|
||||
defib.cooldowncheck(user)
|
||||
else
|
||||
|
||||
@@ -32,6 +32,9 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
always_reskinnable = TRUE
|
||||
reskin_binding = COMSIG_CLICK_CTRL_SHIFT
|
||||
|
||||
//Main variables
|
||||
var/owner = null // String name of owner
|
||||
var/default_cartridge = 0 // Access level defined by cartridge
|
||||
@@ -112,10 +115,10 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
. += id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
|
||||
if(inserted_item && (!isturf(loc)))
|
||||
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
|
||||
if(LAZYLEN(GLOB.pda_reskins))
|
||||
. += "<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
|
||||
|
||||
/obj/item/pda/Initialize(mapload)
|
||||
if(GLOB.pda_reskins)
|
||||
unique_reskin = GLOB.pda_reskins
|
||||
. = ..()
|
||||
if(fon)
|
||||
set_light(f_lum, f_pow, f_col)
|
||||
@@ -130,28 +133,10 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
new_overlays = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/pda/CtrlShiftClick(mob/living/user)
|
||||
. = ..()
|
||||
if(GLOB.pda_reskins && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
|
||||
reskin_obj(user)
|
||||
|
||||
/obj/item/pda/reskin_obj(mob/M)
|
||||
if(!LAZYLEN(GLOB.pda_reskins))
|
||||
return
|
||||
var/dat = "<b>Reskin options for [name]:</b>"
|
||||
for(var/V in GLOB.pda_reskins)
|
||||
var/output = icon2html(GLOB.pda_reskins[V], M, icon_state)
|
||||
dat += "\n[V]: <span class='reallybig'>[output]</span>"
|
||||
to_chat(M, dat)
|
||||
|
||||
var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins
|
||||
var/new_icon = GLOB.pda_reskins[choice]
|
||||
if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
icon = new_icon
|
||||
. = ..()
|
||||
new_overlays = TRUE
|
||||
update_icon()
|
||||
to_chat(M, "[src] is now skinned as '[choice]'.")
|
||||
|
||||
/obj/item/pda/proc/set_new_overlays()
|
||||
if(!overlays_offsets || !(icon in overlays_offsets))
|
||||
@@ -191,7 +176,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
font_index = MODE_MONO
|
||||
font_mode = FONT_MONO
|
||||
var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]
|
||||
var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]["icon"]
|
||||
if(icon != pref_skin)
|
||||
icon = pref_skin
|
||||
new_overlays = TRUE
|
||||
|
||||
@@ -193,34 +193,29 @@
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/saber
|
||||
possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER)
|
||||
unique_reskin = list("Sword" = "sword0", "Saber" = "esaber0")
|
||||
unique_reskin = list(
|
||||
"Sword" = list("icon_state" = "sword0"),
|
||||
"Saber" = list("icon_state" = "esaber0")
|
||||
)
|
||||
var/hacked = FALSE
|
||||
var/saber = FALSE
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(active)
|
||||
if(sword_color)
|
||||
if(saber)
|
||||
icon_state = "esaber[sword_color]"
|
||||
else
|
||||
icon_state = "sword[sword_color]"
|
||||
else
|
||||
if(saber)
|
||||
icon_state = "esaber0"
|
||||
switch(current_skin)
|
||||
if("Saber")
|
||||
icon_state = "esaber[active ? sword_color : "0"]"
|
||||
// No skin
|
||||
else
|
||||
icon_state = "sword0"
|
||||
icon_state = "sword[active ? sword_color : "0"]"
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/saber/reskin_obj(mob/M)
|
||||
. = ..()
|
||||
if(icon_state == "esaber0")
|
||||
saber = TRUE
|
||||
if(active)
|
||||
if(saber)
|
||||
icon_state = "esaber[sword_color]"
|
||||
else
|
||||
icon_state = "sword[sword_color]"
|
||||
switch(current_skin)
|
||||
if("Sword")
|
||||
icon_state = "sword[active ? sword_color : "0"]"
|
||||
if("Saber")
|
||||
icon_state = "esaber[active ? sword_color : "0"]"
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/saber/set_sword_color(var/color_forced)
|
||||
if(color_forced) // wow i really do not like this at fucking all holy SHIT
|
||||
|
||||
@@ -55,8 +55,9 @@
|
||||
generate_items_inside(items_inside,src)
|
||||
|
||||
/obj/item/storage/firstaid/ancient
|
||||
icon_state = "firstaid"
|
||||
desc = "A first aid kit with the ability to heal common types of injuries."
|
||||
name = "ancient first-aid kit"
|
||||
icon_state = "oldfirstaid"
|
||||
desc = "A first aid kit with the ability to heal common types of injuries. You start thinking of the good old days just by looking at it."
|
||||
|
||||
/obj/item/storage/firstaid/ancient/PopulateContents()
|
||||
if(empty)
|
||||
@@ -69,6 +70,10 @@
|
||||
new /obj/item/stack/medical/mesh(src)
|
||||
new /obj/item/stack/medical/mesh(src)
|
||||
|
||||
/obj/item/storage/firstaid/ancient/heirloom
|
||||
// Long since been ransacked by hungry powergaming assistants breaking into med storage
|
||||
empty = TRUE
|
||||
|
||||
/obj/item/storage/firstaid/brute
|
||||
name = "trauma treatment kit"
|
||||
desc = "A first aid kit for when you get toolboxed."
|
||||
|
||||
@@ -23,21 +23,6 @@
|
||||
QDEL_NULL(ion_trail)
|
||||
return ..()
|
||||
|
||||
/obj/item/tank/jetpack/item_action_slot_check(slot)
|
||||
if(slot == ITEM_SLOT_BACK)
|
||||
return TRUE
|
||||
|
||||
/obj/item/tank/jetpack/equipped(mob/user, slot, initial)
|
||||
. = ..()
|
||||
if(on && slot != ITEM_SLOT_BACK)
|
||||
turn_off(user)
|
||||
|
||||
/obj/item/tank/jetpack/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
if(on)
|
||||
turn_off(user)
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/populate_gas()
|
||||
if(gas_type)
|
||||
air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)))
|
||||
@@ -72,7 +57,6 @@
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
ion_trail.start()
|
||||
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react)
|
||||
RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react)
|
||||
if(full_speed)
|
||||
user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
|
||||
else
|
||||
@@ -110,13 +94,6 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/proc/spacemove_react(mob/user, movement_dir)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(on && (movement_dir || stabilizers))
|
||||
return COMSIG_MOVABLE_STOP_SPACEMOVE
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/improvised
|
||||
name = "improvised jetpack"
|
||||
desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
|
||||
@@ -262,13 +239,9 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/get_jetpack()
|
||||
var/obj/item/I = back
|
||||
if(istype(I, /obj/item/tank/jetpack))
|
||||
return I
|
||||
else if(istype(I, /obj/item/mod/control))
|
||||
var/obj/item/mod/control/C = I
|
||||
for(var/obj/item/mod/module/jetpack/J in C.modules)
|
||||
return J
|
||||
var/obj/item/tank/jetpack/J = back
|
||||
if(istype(J))
|
||||
return J
|
||||
|
||||
/mob/living/carbon/human/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = ..()
|
||||
|
||||
+17
-45
@@ -28,9 +28,17 @@
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
|
||||
|
||||
var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
|
||||
var/current_skin //the item reskin
|
||||
var/list/unique_reskin //List of options to reskin.
|
||||
|
||||
//Reskin variables
|
||||
/// The item reskin
|
||||
var/current_skin
|
||||
/// List of options to reskin.
|
||||
var/list/unique_reskin
|
||||
/// Can always be modified
|
||||
var/always_reskinnable = FALSE
|
||||
/// How to bring up the reskinning menu
|
||||
var/reskin_binding = COMSIG_CLICK_ALT
|
||||
//
|
||||
|
||||
// Access levels, used in modules\jobs\access.dm
|
||||
var/list/req_access
|
||||
@@ -76,6 +84,10 @@
|
||||
var/turf/T = loc
|
||||
T.add_blueprints_preround(src)
|
||||
|
||||
/obj/ComponentInitialize()
|
||||
. = ..()
|
||||
if(islist(unique_reskin) && length(unique_reskin))
|
||||
AddElement(/datum/element/object_reskinning)
|
||||
|
||||
/obj/Destroy(force=FALSE)
|
||||
if(!ismachinery(src))
|
||||
@@ -340,50 +352,10 @@
|
||||
. = ..()
|
||||
if(obj_flags & UNIQUE_RENAME)
|
||||
. += "<span class='notice'>Use a pen on it to rename it or change its description.</span>"
|
||||
if(unique_reskin && (!current_skin || always_reskinnable))
|
||||
. += "<span class='notice'>Alt-click it to reskin it.</span>"
|
||||
|
||||
/obj/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
|
||||
reskin_obj(user)
|
||||
return TRUE
|
||||
|
||||
/obj/proc/reskin_obj(mob/M)
|
||||
if(!LAZYLEN(unique_reskin))
|
||||
return
|
||||
|
||||
var/list/items = list()
|
||||
for(var/reskin_option in unique_reskin)
|
||||
var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option])
|
||||
items += list("[reskin_option]" = item_image)
|
||||
sortList(items)
|
||||
|
||||
var/pick = show_radial_menu(M, src, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, M), radius = 38, require_near = TRUE)
|
||||
if(!pick)
|
||||
return
|
||||
if(!unique_reskin[pick])
|
||||
return
|
||||
current_skin = pick
|
||||
icon_state = unique_reskin[pick]
|
||||
to_chat(M, "[src] is now skinned as '[pick].'")
|
||||
|
||||
/**
|
||||
* Checks if we are allowed to interact with a radial menu for reskins
|
||||
*
|
||||
* Arguments:
|
||||
* * user The mob interacting with the menu
|
||||
*/
|
||||
/obj/proc/check_reskin_menu(mob/user)
|
||||
if(QDELETED(src))
|
||||
return FALSE
|
||||
if(current_skin)
|
||||
return FALSE
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(user.incapacitated())
|
||||
return FALSE
|
||||
return TRUE
|
||||
/// Do you want to make overrides, of course you do! Will be called if an object was reskinned successfully
|
||||
/obj/proc/reskin_obj(mob/user)
|
||||
return
|
||||
|
||||
/obj/update_overlays()
|
||||
. = ..()
|
||||
|
||||
@@ -32,8 +32,6 @@
|
||||
new /obj/item/clothing/head/beret/ce/white(src)
|
||||
new /obj/item/storage/bag/construction(src)
|
||||
new /obj/item/storage/bag/material(src)
|
||||
new /obj/item/mod/construction/armor/advanced(src)
|
||||
new /obj/item/mod/module/rad_protection(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
name = "electrical supplies locker"
|
||||
|
||||
@@ -64,8 +64,6 @@
|
||||
new /obj/item/clothing/glasses/hud/health(src)
|
||||
new /obj/item/pinpointer/crew(src)
|
||||
new /obj/item/sensor_device(src)
|
||||
new /obj/item/mod/construction/armor/rescue(src)
|
||||
new /obj/item/mod/module/health_analyzer(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/CMO
|
||||
|
||||
@@ -31,4 +31,4 @@
|
||||
new /obj/item/circuitboard/machine/techfab/department/science(src)
|
||||
new /obj/item/storage/photo_album/RD(src)
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/rd(src)
|
||||
new /obj/item/mod/construction/armor/research(src)
|
||||
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
new /obj/item/gun/energy/e_gun(src)
|
||||
new /obj/item/door_remote/captain(src)
|
||||
new /obj/item/storage/photo_album/Captain(src)
|
||||
new /obj/item/mod/construction/armor/magnate(src)
|
||||
new /obj/item/mod/module/holster(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/hop
|
||||
name = "\proper head of personnel's locker"
|
||||
|
||||
@@ -360,6 +360,9 @@ GLOBAL_PROTECT(VVpixelmovement)
|
||||
|
||||
var/original_name = "[O]"
|
||||
|
||||
var/var_old_text
|
||||
var/var_new_text
|
||||
|
||||
switch(class)
|
||||
if(VV_LIST)
|
||||
if(!islist(var_value))
|
||||
@@ -376,14 +379,25 @@ GLOBAL_PROTECT(VVpixelmovement)
|
||||
for(var/V in varsvars)
|
||||
var_new = replacetext(var_new,"\[[V]]","[O.vars[V]]")
|
||||
|
||||
if(VV_BITFIELD)
|
||||
var/list/old_bitfields
|
||||
for(var/bitfield in GLOB.bitfields[variable])
|
||||
if(var_value & GLOB.bitfields[variable][bitfield])
|
||||
LAZYADD(old_bitfields, bitfield)
|
||||
var_old_text = "\n[var_value] = \n([english_list(old_bitfields, and_text = " | ", comma_text=" | ")])\n"
|
||||
var/list/new_bitfields
|
||||
for(var/bitfield in GLOB.bitfields[variable])
|
||||
if(var_new & GLOB.bitfields[variable][bitfield])
|
||||
LAZYADD(new_bitfields, bitfield)
|
||||
var_new_text = "\n[var_new] = \n([english_list(new_bitfields, and_text = " | ", comma_text=" | ")])"
|
||||
|
||||
if (O.vv_edit_var(variable, var_new) == FALSE)
|
||||
to_chat(src, "Your edit was rejected by the object.", confidential = TRUE)
|
||||
return
|
||||
vv_update_display(O, "varedited", VV_MSG_EDITED)
|
||||
log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]"
|
||||
log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_old_text ? var_old_text : var_value] => [var_new_text ? var_new_text : var_new]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_old_text ? var_old_text : var_value]")] to [html_encode("[var_new_text ? var_new_text : var_new]")]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_old_text ? var_old_text : var_value] to [var_new_text ? var_new_text : var_new]"
|
||||
message_admins(msg)
|
||||
admin_ticket_log(O, msg)
|
||||
return TRUE
|
||||
|
||||
@@ -238,14 +238,3 @@
|
||||
contains = list(/obj/item/raw_anomaly_core/pyro)
|
||||
crate_name = "raw pyro anomaly"
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
|
||||
/datum/supply_pack/science/mod_core
|
||||
name = "MOD core Crate"
|
||||
desc = "Three cores, perfect for any MODsuit construction! Naturally harvested™, of course."
|
||||
cost = CARGO_CRATE_VALUE * 3
|
||||
access = ACCESS_ROBOTICS
|
||||
contains = list(/obj/item/mod/construction/core,
|
||||
/obj/item/mod/construction/core,
|
||||
/obj/item/mod/construction/core)
|
||||
crate_name = "MOD core crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/science
|
||||
|
||||
@@ -2,21 +2,31 @@
|
||||
|
||||
/obj/item/prescription_kit
|
||||
name = "prescription lens kit"
|
||||
desc = "A disposable kit containing all the needed tools and parts to develop and apply a self-modifying prescription lens overlay device to any eyewear."
|
||||
desc = "A disposable kit containing all the needed tools and parts to develop and apply a self-modifying prescription lens overlay device to any eyewear. \
|
||||
Insert eyewear, receive vision-correcting lenses."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "modkit"
|
||||
|
||||
/obj/item/prescription_kit/attack_obj(obj/O, mob/living/user)
|
||||
if(!istype(O, /obj/item/clothing/glasses))
|
||||
/obj/item/prescription_kit/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/clothing/glasses) && I.Adjacent(user))
|
||||
var/obj/item/clothing/glasses/target_glasses = I
|
||||
prescribe(target_glasses, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
if(istype(O, /obj/item/clothing/glasses))
|
||||
var/obj/item/clothing/glasses/target_glasses = O
|
||||
if(target_glasses.vision_correction)
|
||||
to_chat(user, span_notice("These are already fitted with prescription lenses or otherwise already correct vision!"))
|
||||
return
|
||||
playsound(src, 'sound/items/screwdriver.ogg', 50, 1)
|
||||
user.visible_message(span_notice("[user] fits \the [target_glasses] with a prescription overlay device."), span_notice("You fit \the [target_glasses] with a prescription overlay device."))
|
||||
target_glasses.prescribe()
|
||||
target_glasses.balloon_alert(user, "prescription fitted!")
|
||||
qdel(src)
|
||||
/obj/item/prescription_kit/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(istype(target, /obj/item/clothing/glasses) && target.Adjacent(user))
|
||||
var/obj/item/clothing/glasses/target_glasses = target
|
||||
prescribe(target_glasses, user)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/item/prescription_kit/proc/prescribe(obj/item/clothing/glasses/target_glasses, mob/user)
|
||||
if(target_glasses.vision_correction)
|
||||
to_chat(user, span_notice("These are already fitted with prescription lenses or otherwise already correct vision!"))
|
||||
return
|
||||
playsound(src, 'sound/items/screwdriver.ogg', 50, 1)
|
||||
user.visible_message(span_notice("[user] fits \the [target_glasses] with a prescription overlay device."), span_notice("You fit \the [target_glasses] with a prescription overlay device."))
|
||||
target_glasses.prescribe()
|
||||
target_glasses.balloon_alert(user, "prescription fitted!")
|
||||
qdel(src)
|
||||
|
||||
@@ -79,16 +79,18 @@
|
||||
to_chat(user, "<span class='warning'>With [src] off of your arms, you feel less ready to punch things.</span>")
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/crafted
|
||||
unique_reskin = list("Short" = "armwraps",
|
||||
"Extended" = "armwraps_extended"
|
||||
)
|
||||
unique_reskin = list(
|
||||
"Short" = list("icon_state" = "armwraps"),
|
||||
"Extended" = list("icon_state" = "armwraps_extended")
|
||||
)
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/crafted/reskin_obj(mob/M)
|
||||
. = ..()
|
||||
if(icon_state == "armwraps_extended")
|
||||
item_state = "armwraps_extended"
|
||||
else
|
||||
return
|
||||
switch(current_skin)
|
||||
if("Short")
|
||||
item_state = "armwraps"
|
||||
if("Extended")
|
||||
item_state = "armwraps_extended"
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/chaplain
|
||||
name = "armwraps of unyielding resolve"
|
||||
|
||||
@@ -440,6 +440,16 @@
|
||||
icon_state = "cowboyhat_sec"
|
||||
item_state= "cowboyhat_sec"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat/polychromic
|
||||
name = "polychromic cowboy hat"
|
||||
desc = "A polychromic cowboy hat, perfect for your indecisive rancher"
|
||||
icon_state = "cowboyhat_poly"
|
||||
item_state= "cowboyhat_poly"
|
||||
|
||||
/obj/item/clothing/head/cowboyhat/polychromic/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/polychromic, list("#5F5F5F", "#DDDDDD"), 2)
|
||||
|
||||
/obj/item/clothing/head/squatter_hat
|
||||
name = "slav squatter hat"
|
||||
icon_state = "squatter_hat"
|
||||
|
||||
@@ -275,8 +275,10 @@
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
actions_types = list(/datum/action/item_action/bhop)
|
||||
permeability_coefficient = 0.05
|
||||
unique_reskin = list("Explorer" = "miningjet",
|
||||
"Jackboot" = "jetboots")
|
||||
unique_reskin = list(
|
||||
"Explorer" = list("icon_state" = "miningjet"),
|
||||
"Jackboot" = list("icon_state" = "jetboots")
|
||||
)
|
||||
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
|
||||
var/jumpspeed = 3
|
||||
var/recharging_rate = 60 //default 6 seconds between each dash
|
||||
|
||||
@@ -80,9 +80,10 @@
|
||||
item_state = "hostrench"
|
||||
flags_inv = 0
|
||||
strip_delay = 80
|
||||
unique_reskin = list("Coat" = "hostrench",
|
||||
"Cloak" = "trenchcloak"
|
||||
)
|
||||
unique_reskin = list(
|
||||
"Coat" = list("icon_state" = "hostrench"),
|
||||
"Cloak" = list("icon_state" = "trenchcloak")
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/armor/hos/platecarrier
|
||||
name = "plate carrier"
|
||||
|
||||
@@ -565,10 +565,15 @@
|
||||
icon_state = "pride"
|
||||
above_suit = TRUE
|
||||
obj_flags = UNIQUE_RENAME
|
||||
unique_reskin = list("Rainbow Pride" = "pride",
|
||||
"Bisexual Pride" = "pride_bi",
|
||||
"Pansexual Pride" = "pride_pan",
|
||||
"Asexual Pride" = "pride_ace",
|
||||
"Non-binary Pride" = "pride_enby",
|
||||
"Transgender Pride" = "pride_trans",
|
||||
)
|
||||
unique_reskin = list(
|
||||
"Rainbow Pride" = list("icon_state" = "pride"),
|
||||
"Bisexual Pride" = list("icon_state" = "pride_bi"),
|
||||
"Pansexual Pride" = list("icon_state" = "pride_pan"),
|
||||
"Asexual Pride" = list("icon_state" = "pride_ace"),
|
||||
"Non-binary Pride" = list("icon_state" = "pride_enby"),
|
||||
"Transgender Pride" = list("icon_state" = "pride_trans")
|
||||
)
|
||||
|
||||
/obj/item/clothing/accessory/pride/reskin_obj(mob/M)
|
||||
. = ..()
|
||||
name = "[current_skin] pin"
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
///Is this job affected by weird spawns like the ones from station traits
|
||||
var/random_spawns_possible = TRUE
|
||||
|
||||
/// List of family heirlooms this job can get with the family heirloom quirk. List of types.
|
||||
var/list/family_heirlooms
|
||||
|
||||
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
|
||||
|
||||
var/bounty_types = CIV_JOB_BASIC
|
||||
|
||||
@@ -20,6 +20,11 @@ Assistant
|
||||
dresscodecompliant = FALSE
|
||||
always_can_respawn_as = TRUE
|
||||
threat = 0.2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom,
|
||||
/obj/item/clothing/gloves/cut/family
|
||||
)
|
||||
|
||||
/datum/job/assistant/get_access()
|
||||
if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set
|
||||
|
||||
@@ -26,6 +26,12 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN
|
||||
threat = 0.5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/lighter,
|
||||
/obj/item/lighter/greyscale,
|
||||
/obj/item/storage/box/matches
|
||||
)
|
||||
|
||||
/datum/outfit/job/atmos
|
||||
name = "Atmospheric Technician"
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
bounty_types = CIV_JOB_DRINK
|
||||
display_order = JOB_DISPLAY_ORDER_BARTENDER
|
||||
threat = 0.5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/rag,
|
||||
/obj/item/clothing/head/that,
|
||||
/obj/item/reagent_containers/food/drinks/shaker
|
||||
)
|
||||
|
||||
/datum/outfit/job/bartender
|
||||
name = "Bartender"
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
display_order = JOB_DISPLAY_ORDER_BOTANIST
|
||||
threat = 1.5 // lol powergame
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/cultivator,
|
||||
/obj/item/reagent_containers/glass/bucket, // Watering cans don't exist yet
|
||||
/obj/item/toy/plush/beeplushie,
|
||||
)
|
||||
|
||||
/datum/outfit/job/botanist
|
||||
name = "Botanist"
|
||||
jobtype = /datum/job/hydro
|
||||
|
||||
@@ -32,6 +32,11 @@
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
threat = 5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/food/drinks/flask/gold,
|
||||
/obj/item/toy/figure/captain
|
||||
)
|
||||
|
||||
/datum/job/captain/get_access()
|
||||
return get_all_accesses()
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
|
||||
bounty_types = CIV_JOB_RANDOM
|
||||
threat = 0.2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/clipboard
|
||||
)
|
||||
|
||||
/datum/outfit/job/cargo_tech
|
||||
name = "Cargo Technician"
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CHAPLAIN
|
||||
threat = 0.5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/toy/windupToolbox,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater
|
||||
)
|
||||
|
||||
|
||||
/datum/job/chaplain/after_spawn(mob/living/H, client/C)
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
threat = 1.5
|
||||
|
||||
starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/book/manual/wiki/chemistry,
|
||||
/obj/item/fermichem/pHbooklet
|
||||
)
|
||||
|
||||
/datum/outfit/job/chemist
|
||||
name = "Chemist"
|
||||
|
||||
@@ -37,6 +37,15 @@
|
||||
display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity)
|
||||
threat = 2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/screwdriver/brass/family,
|
||||
/obj/item/wrench/brass/family,
|
||||
/obj/item/weldingtool/mini, // No brass family variant
|
||||
/obj/item/crowbar/brass/family,
|
||||
/obj/item/wirecutters/brass/family
|
||||
)
|
||||
|
||||
/datum/outfit/job/ce
|
||||
name = "Chief Engineer"
|
||||
|
||||
@@ -35,6 +35,15 @@
|
||||
threat = 2
|
||||
|
||||
starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/storage/firstaid/ancient/heirloom,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/circular_saw,
|
||||
/obj/item/retractor,
|
||||
/obj/item/cautery
|
||||
)
|
||||
|
||||
/datum/outfit/job/cmo
|
||||
name = "Chief Medical Officer"
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CLOWN
|
||||
threat = 0 // honk
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/bikehorn/golden
|
||||
)
|
||||
|
||||
/datum/outfit/job/clown
|
||||
name = "Clown"
|
||||
|
||||
@@ -22,6 +22,12 @@
|
||||
display_order = JOB_DISPLAY_ORDER_COOK
|
||||
threat = 0.2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/food/condiment/saltshaker,
|
||||
/obj/item/kitchen/rollingpin,
|
||||
/obj/item/clothing/head/chefhat
|
||||
)
|
||||
|
||||
/datum/outfit/job/cook
|
||||
name = "Cook"
|
||||
jobtype = /datum/job/cook
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_CURATOR
|
||||
threat = 0.3
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/pen/fountain,
|
||||
/obj/item/storage/dice
|
||||
)
|
||||
|
||||
/datum/outfit/job/curator
|
||||
name = "Curator"
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
display_order = JOB_DISPLAY_ORDER_DETECTIVE
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/monophobia)
|
||||
threat = 1
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/food/drinks/flask/det
|
||||
)
|
||||
|
||||
/datum/outfit/job/detective
|
||||
name = "Detective"
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
threat = 1.5
|
||||
|
||||
starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/clothing/under/shorts/purple
|
||||
)
|
||||
|
||||
/datum/outfit/job/geneticist
|
||||
name = "Geneticist"
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity)
|
||||
threat = 2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/food/drinks/trophy/silver_cup
|
||||
)
|
||||
|
||||
|
||||
/datum/outfit/job/hop
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity)
|
||||
threat = 3
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/book/manual/wiki/security_space_law
|
||||
)
|
||||
|
||||
/datum/outfit/job/hos
|
||||
name = "Head of Security"
|
||||
|
||||
@@ -19,6 +19,13 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_JANITOR
|
||||
threat = 0.2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/mop,
|
||||
/obj/item/clothing/suit/caution,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/soap
|
||||
)
|
||||
|
||||
/datum/outfit/job/janitor
|
||||
name = "Janitor"
|
||||
|
||||
@@ -22,6 +22,11 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_LAWYER
|
||||
threat = 0.3
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/gavelhammer,
|
||||
/obj/item/book/manual/wiki/security_space_law
|
||||
)
|
||||
|
||||
/datum/outfit/job/lawyer
|
||||
name = "Lawyer"
|
||||
|
||||
@@ -22,6 +22,15 @@
|
||||
threat = 0.5
|
||||
|
||||
starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/storage/firstaid/ancient/heirloom,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/circular_saw,
|
||||
/obj/item/retractor,
|
||||
/obj/item/cautery
|
||||
)
|
||||
|
||||
/datum/outfit/job/doctor
|
||||
name = "Medical Doctor"
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
display_order = JOB_DISPLAY_ORDER_MIME
|
||||
|
||||
threat = 0
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/food/snacks/baguette
|
||||
)
|
||||
|
||||
/datum/job/mime/after_spawn(mob/living/carbon/human/H, client/C)
|
||||
. = ..()
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
threat = 0.5
|
||||
|
||||
starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/storage/firstaid/ancient/heirloom
|
||||
)
|
||||
|
||||
/datum/outfit/job/paramedic
|
||||
name = "Paramedic"
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
plasma_outfit = /datum/outfit/plasmaman/prisoner
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_PRISONER
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/pen/blue
|
||||
)
|
||||
|
||||
/datum/job/prisoner/get_latejoin_spawn_point()
|
||||
return get_roundstart_spawn_point()
|
||||
|
||||
@@ -32,6 +32,11 @@
|
||||
display_order = JOB_DISPLAY_ORDER_QUARTERMASTER
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
threat = 0.5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/stamp,
|
||||
/obj/item/stamp/denied
|
||||
)
|
||||
|
||||
/datum/outfit/job/quartermaster
|
||||
name = "Quartermaster"
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
starting_modifiers = list(/datum/skill_modifier/job/level/wiring)
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
|
||||
threat = 5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/toy/plush/slimeplushie
|
||||
)
|
||||
|
||||
/datum/outfit/job/rd
|
||||
name = "Research Director"
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
|
||||
display_order = JOB_DISPLAY_ORDER_ROBOTICIST
|
||||
threat = 1
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/toy/figure/borg
|
||||
)
|
||||
|
||||
/datum/outfit/job/roboticist
|
||||
name = "Roboticist"
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
|
||||
display_order = JOB_DISPLAY_ORDER_SCIENTIST
|
||||
threat = 1.2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/toy/plush/slimeplushie
|
||||
)
|
||||
|
||||
/datum/outfit/job/scientist
|
||||
name = "Scientist"
|
||||
|
||||
@@ -28,6 +28,11 @@
|
||||
display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia)
|
||||
threat = 2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/book/manual/wiki/security_space_law,
|
||||
/obj/item/clothing/head/beret/sec
|
||||
)
|
||||
|
||||
/datum/job/officer/get_access()
|
||||
var/list/L = list()
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
|
||||
|
||||
threat = 1.5
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/pickaxe/mini,
|
||||
/obj/item/shovel
|
||||
)
|
||||
|
||||
/datum/outfit/job/miner
|
||||
name = "Shaft Miner (Lavaland)"
|
||||
|
||||
@@ -27,6 +27,15 @@
|
||||
display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER
|
||||
|
||||
threat = 1
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/screwdriver/brass/family,
|
||||
/obj/item/wrench/brass/family,
|
||||
/obj/item/weldingtool/mini, // No brass family variant
|
||||
/obj/item/crowbar/brass/family,
|
||||
/obj/item/wirecutters/brass/family
|
||||
)
|
||||
|
||||
/datum/outfit/job/engineer
|
||||
name = "Station Engineer"
|
||||
|
||||
@@ -25,6 +25,10 @@
|
||||
threat = 1.5
|
||||
|
||||
starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/reagent_containers/syringe
|
||||
)
|
||||
|
||||
/datum/outfit/job/virologist
|
||||
name = "Virologist"
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
display_order = JOB_DISPLAY_ORDER_WARDEN
|
||||
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia)
|
||||
threat = 2
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/book/manual/wiki/security_space_law
|
||||
)
|
||||
|
||||
/datum/job/warden/get_access()
|
||||
var/list/L = list()
|
||||
|
||||
@@ -253,8 +253,10 @@
|
||||
sharpness = SHARP_NONE // use your survival dagger or smth
|
||||
icon_state = "crusher-hands"
|
||||
item_state = "crusher0-fist"
|
||||
unique_reskin = list("Gauntlets" = "crusher-hands",
|
||||
"Fingerless" = "crusher-hands-bare")
|
||||
unique_reskin = list(
|
||||
"Gauntlets" = list("icon_state" = "crusher-hands"),
|
||||
"Fingerless" = list("icon_state" = "crusher-hands-bare")
|
||||
)
|
||||
detonation_damage = 45 // 60 on wield, compared to normal crusher's 70
|
||||
backstab_bonus = 70 // 130 on backstab though
|
||||
var/combo_on_anything = FALSE // @admins if you're varediting this you don't get to whine at me
|
||||
|
||||
@@ -337,7 +337,6 @@
|
||||
on_item_dropped(I)
|
||||
if(I.dropped(src) == ITEM_RELOCATED_BY_DROPPED)
|
||||
return FALSE
|
||||
SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent)
|
||||
return TRUE
|
||||
|
||||
//This is a SAFE proc. Use this instead of equip_to_slot()!
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
if(prob(40))
|
||||
if(prob(25))
|
||||
audible_message("<span class='warning'>You hear something rumbling inside [src]'s stomach...</span>", \
|
||||
"<span class='warning'>You hear something rumbling.</span>", 4,\
|
||||
"<span class='userdanger'>Something is rumbling inside your stomach!</span>")
|
||||
"<span class='warning'>You hear something rumbling.</span>", 4,\
|
||||
"<span class='userdanger'>Something is rumbling inside your stomach!</span>")
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
if(I && I.force)
|
||||
var/d = rand(round(I.force / 4), I.force)
|
||||
@@ -624,21 +624,12 @@
|
||||
if(M.name == XRAY)
|
||||
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
|
||||
see_in_dark = max(see_in_dark, 8)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION))
|
||||
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
|
||||
see_in_dark = max(see_in_dark, 8)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MESON_VISION))
|
||||
sight |= SEE_TURFS
|
||||
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_THERMAL_VISION))
|
||||
sight |= SEE_MOBS
|
||||
sight |= (SEE_MOBS)
|
||||
lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_XRAY_VISION))
|
||||
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
|
||||
see_in_dark = max(see_in_dark, 8)
|
||||
|
||||
if(see_override)
|
||||
|
||||
@@ -16,15 +16,9 @@
|
||||
if(istype(T) && movement_dir && T.allow_thrust(0.01))
|
||||
return 1
|
||||
|
||||
var/obj/item/I = get_jetpack()
|
||||
if(istype(I, /obj/item/tank/jetpack))
|
||||
var/obj/item/tank/jetpack/J = I
|
||||
if((movement_dir || J.stabilizers) && J.allow_thrust(0.01, src))
|
||||
return 1
|
||||
else if(istype(I, /obj/item/mod/module/jetpack))
|
||||
var/obj/item/mod/module/jetpack/J = I
|
||||
if((movement_dir || J.stabilizers) && J.allow_thrust())
|
||||
return 1
|
||||
var/obj/item/tank/jetpack/J = get_jetpack()
|
||||
if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src))
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/Moved()
|
||||
. = ..()
|
||||
|
||||
@@ -304,14 +304,7 @@
|
||||
if(equip_to_slot_if_possible(thing, ITEM_SLOT_BACK))
|
||||
update_inv_hands()
|
||||
return
|
||||
var/datum/component/storage/storage = equipped_back.GetComponent(/datum/component/storage)
|
||||
if(istype(equipped_back, /obj/item/mod/control))
|
||||
var/obj/item/mod/control/C = equipped_back
|
||||
for(var/obj/item/mod/module/storage/S in C.modules)
|
||||
if(S.stored)
|
||||
equipped_back = S.stored
|
||||
storage = S.stored.GetComponent(/datum/component/storage)
|
||||
if(!storage)
|
||||
if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item
|
||||
if(!thing)
|
||||
equipped_back.attack_hand(src)
|
||||
else
|
||||
@@ -321,11 +314,10 @@
|
||||
if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, src))
|
||||
to_chat(src, "<span class='warning'>You can't fit anything in!</span>")
|
||||
return
|
||||
var/atom/real_location = storage.real_location()
|
||||
if(!real_location.contents.len) // nothing to take out
|
||||
to_chat(src, "<span class='warning'>There's nothing in your [equipped_back.name] to take out!</span>")
|
||||
if(!equipped_back.contents.len) // nothing to take out
|
||||
to_chat(src, "<span class='warning'>There's nothing in your backpack to take out!</span>")
|
||||
return
|
||||
var/obj/item/stored = real_location.contents[real_location.contents.len]
|
||||
var/obj/item/stored = equipped_back.contents[equipped_back.contents.len]
|
||||
if(!stored || stored.on_found(src))
|
||||
return
|
||||
stored.attack_hand(src) // take out thing from backpack
|
||||
|
||||
@@ -231,6 +231,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
///For custom overrides for species ass images
|
||||
var/icon/ass_image
|
||||
|
||||
/// List of family heirlooms this species can get with the family heirloom quirk. List of types.
|
||||
var/list/family_heirlooms
|
||||
|
||||
///////////
|
||||
// PROCS //
|
||||
///////////
|
||||
|
||||
@@ -24,3 +24,7 @@
|
||||
allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale")
|
||||
|
||||
eye_type = "insect"
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/flashlight/lantern/heirloom_moth
|
||||
)
|
||||
|
||||
@@ -20,6 +20,11 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
|
||||
species_language_holder = /datum/language_holder/dwarf
|
||||
species_category = SPECIES_CATEGORY_BASIC //a kind of human
|
||||
|
||||
family_heirlooms = list(
|
||||
// Dwarves get a dwarf mug as their heirloom (normal container but has manly dorf icon)
|
||||
/obj/item/reagent_containers/food/drinks/dwarf_mug
|
||||
)
|
||||
|
||||
/mob/living/carbon/human/species/dwarf //species admin spawn path
|
||||
race = /datum/species/dwarf //and the race the path is set to.
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
wagging_type = "mam_waggingtail"
|
||||
species_category = SPECIES_CATEGORY_FURRY
|
||||
ass_image = 'icons/ass/asscat.png'
|
||||
family_heirlooms = list(/obj/item/toy/cattoy)
|
||||
|
||||
/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
|
||||
if(ishuman(C))
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
species_category = SPECIES_CATEGORY_ROBOT
|
||||
wings_icons = SPECIES_WINGS_ROBOT
|
||||
|
||||
family_heirlooms = list(
|
||||
// Gives a broken powercell for flavor text!
|
||||
/obj/item/stock_parts/cell/family
|
||||
)
|
||||
|
||||
var/datum/action/innate/monitor_change/screen
|
||||
|
||||
/datum/species/ipc/on_species_gain(mob/living/carbon/human/C)
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
ass_image = 'icons/ass/assslime.png'
|
||||
blacklisted_quirks = list(/datum/quirk/glass_bones)
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/toy/plush/slimeplushie
|
||||
)
|
||||
|
||||
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
|
||||
C.faction -= "slime"
|
||||
if(ishuman(C))
|
||||
|
||||
@@ -33,6 +33,10 @@
|
||||
|
||||
ass_image = 'icons/ass/asslizard.png'
|
||||
|
||||
family_heirlooms = list(
|
||||
/obj/item/toy/plush/lizardplushie
|
||||
)
|
||||
|
||||
/datum/species/lizard/random_name(gender,unique,lastname)
|
||||
if(unique)
|
||||
return random_unique_lizard_name(gender)
|
||||
|
||||
@@ -36,3 +36,8 @@
|
||||
wagging_type = "mam_waggingtail"
|
||||
species_category = SPECIES_CATEGORY_ROBOT
|
||||
wings_icons = SPECIES_WINGS_ROBOT
|
||||
|
||||
family_heirlooms = list(
|
||||
// They're also robots
|
||||
/obj/item/stock_parts/cell/family
|
||||
)
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
var/can_be_carded = TRUE
|
||||
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
|
||||
var/viewalerts = 0
|
||||
var/icon/holo_icon //Female is assigned when AI is created.
|
||||
var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye.
|
||||
var/icon/holo_icon//Female is assigned when AI is created.
|
||||
var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
|
||||
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
|
||||
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
|
||||
var/obj/item/pda/ai/aiPDA
|
||||
@@ -99,13 +99,6 @@
|
||||
var/display_icon_override
|
||||
var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it.
|
||||
|
||||
var/datum/robot_control/robot_control
|
||||
/// Station alert datum for showing alerts UI
|
||||
var/datum/station_alert/alert_control
|
||||
///remember AI's last location
|
||||
var/atom/lastloc
|
||||
interaction_range = INFINITY
|
||||
|
||||
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
|
||||
. = ..()
|
||||
if(!target_ai) //If there is no player/brain inside.
|
||||
@@ -180,21 +173,10 @@
|
||||
GLOB.ai_list -= src
|
||||
GLOB.shuttle_caller_list -= src
|
||||
SSshuttle.autoEvac()
|
||||
QDEL_NULL(eyeobj) // No AI, no Eye
|
||||
QDEL_NULL(spark_system)
|
||||
QDEL_NULL(malf_picker)
|
||||
QDEL_NULL(doomsday_device)
|
||||
// TODO: Why these no work?
|
||||
// QDEL_NULL(robot_control)
|
||||
QDEL_NULL(aiMulti)
|
||||
// QDEL_NULL(alert_control)
|
||||
qdel(eyeobj) // No AI, no Eye
|
||||
malfhack = null
|
||||
current = null
|
||||
Bot = null
|
||||
controlled_equipment = null
|
||||
linked_core = null
|
||||
apc_override = null
|
||||
return ..()
|
||||
|
||||
. = ..()
|
||||
|
||||
/mob/living/silicon/ai/IgniteMob()
|
||||
fire_stacks = 0
|
||||
@@ -428,7 +410,7 @@
|
||||
|
||||
if (href_list["ai_take_control"]) //Mech domination
|
||||
var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"])
|
||||
if(controlled_equipment)
|
||||
if(controlled_mech)
|
||||
to_chat(src, "<span class='warning'>You are already loaded into an onboard computer!</span>")
|
||||
return
|
||||
if(!GLOB.cameranet.checkCameraVis(M))
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
adjustBruteLoss(damage_amount, forced = forced)
|
||||
if(BURN)
|
||||
adjustFireLoss(damage_amount, forced = forced)
|
||||
if(OXY)
|
||||
if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal.
|
||||
adjustOxyLoss(damage_amount, forced = forced)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -30,7 +27,7 @@
|
||||
/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage.
|
||||
/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) //immune to stamina damage.
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/setStaminaLoss(amount, updating_health = 1)
|
||||
@@ -41,3 +38,15 @@
|
||||
|
||||
/mob/living/silicon/setOrganLoss(slot, amount)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) //immune to oxygen damage
|
||||
if(istype(src, /mob/living/silicon/ai)) //ais are snowflakes and use oxyloss for being in AI cards and having no battery
|
||||
return ..()
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(istype(src, /mob/living/silicon/ai)) //ditto
|
||||
return ..()
|
||||
|
||||
return FALSE
|
||||
|
||||
@@ -200,13 +200,6 @@
|
||||
/mob/living/silicon/pai/restrained(ignore_grab)
|
||||
. = FALSE
|
||||
|
||||
/mob/living/silicon/pai/can_interact_with(atom/target)
|
||||
if(istype(target, /obj/item/mod/control)) // A poor workaround for enabling MODsuit control
|
||||
var/obj/item/mod/control/C = target
|
||||
if(C.ai == src)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
// See software.dm for Topic()
|
||||
|
||||
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
|
||||
@@ -85,15 +85,6 @@
|
||||
/mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
|
||||
return take_holo_damage(amount)
|
||||
|
||||
/mob/living/silicon/pai/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, toxins_type = TOX_DEFAULT)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE)
|
||||
if(forced)
|
||||
take_holo_damage(amount)
|
||||
@@ -108,27 +99,3 @@
|
||||
|
||||
/mob/living/silicon/pai/getFireLoss()
|
||||
return emittermaxhealth - emitterhealth
|
||||
|
||||
/mob/living/silicon/pai/getToxLoss(toxins_type = TOX_OMNI)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/getOxyLoss()
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/getCloneLoss()
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/getStaminaLoss()
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/setCloneLoss()
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/setStaminaLoss()
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/setToxLoss(toxins_type = TOX_OMNI)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/setOxyLoss()
|
||||
return FALSE
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/mob/living/silicon/robot/BiologicalLife(delta_time, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
adjustOxyLoss(-10) //we're a robot!
|
||||
handle_robot_hud_updates()
|
||||
handle_robot_cell()
|
||||
|
||||
|
||||
@@ -17,12 +17,16 @@
|
||||
icon_state = "[module.cyborg_base_icon]-wreck"
|
||||
|
||||
if(module.cyborg_pixel_offset)
|
||||
pixel_x = module.cyborg_pixel_offset
|
||||
var/matrix/M = transform
|
||||
M.c = module.cyborg_pixel_offset
|
||||
transform = M
|
||||
//End of citadel changes
|
||||
|
||||
if(module.cyborg_base_icon == "robot")
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
pixel_x = initial(pixel_x)
|
||||
var/matrix/M = transform
|
||||
M.c = 0 // Cyborg's initial x offset is very likely to be 0
|
||||
transform = M
|
||||
if(stat != DEAD && !(IsUnconscious() || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned.
|
||||
if(!eye_lights)
|
||||
eye_lights = new()
|
||||
|
||||
@@ -45,14 +45,6 @@
|
||||
adjustBruteLoss(damage)
|
||||
if(BURN)
|
||||
adjustFireLoss(damage)
|
||||
if(TOX)
|
||||
adjustToxLoss(damage)
|
||||
if(OXY)
|
||||
adjustOxyLoss(damage)
|
||||
if(CLONE)
|
||||
adjustCloneLoss(damage)
|
||||
if(STAMINA)
|
||||
adjustStaminaLoss(damage)
|
||||
|
||||
/mob/living/silicon/attack_paw(mob/living/user)
|
||||
return attack_hand(user)
|
||||
|
||||
@@ -722,7 +722,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
|
||||
return pick(protection_sources)
|
||||
else
|
||||
return src
|
||||
if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (!self && magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC_NO_SELFBLOCK)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
|
||||
if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
|
||||
return src
|
||||
|
||||
//You can buckle on mobs if you're next to them since most are dense
|
||||
|
||||
@@ -585,7 +585,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
|
||||
//Can the mob see reagents inside of containers?
|
||||
/mob/proc/can_see_reagents()
|
||||
return stat == DEAD || silicon_privileges || HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and silicons can always see reagents
|
||||
return stat == DEAD || silicon_privileges //Dead guys and silicons can always see reagents
|
||||
|
||||
/mob/proc/is_blind()
|
||||
SHOULD_BE_PURE(TRUE)
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
/datum/action/item_action/mod
|
||||
background_icon_state = "bg_tech_blue"
|
||||
icon_icon = 'icons/mob/actions/actions_mod.dmi'
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
var/obj/item/mod/control/mod
|
||||
/// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently.
|
||||
var/ai_action = FALSE
|
||||
|
||||
/datum/action/item_action/mod/New(Target)
|
||||
..()
|
||||
if(!istype(Target, /obj/item/mod/control))
|
||||
qdel(src)
|
||||
return
|
||||
if(ai_action)
|
||||
background_icon_state = "bg_tech"
|
||||
|
||||
/datum/action/item_action/mod/Grant(mob/user)
|
||||
mod = target
|
||||
if(ai_action && user != mod.ai)
|
||||
return
|
||||
else if(!ai_action && user == mod.ai)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/mod/Remove(mob/user)
|
||||
if(ai_action && mod && user != mod.ai)
|
||||
return
|
||||
else if(!ai_action && mod && user == mod.ai)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/mod/Trigger(trigger_flags)
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
if(mod.malfunctioning && prob(75))
|
||||
mod.balloon_alert(usr, "button malfunctions!")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/deploy
|
||||
name = "Deploy MODsuit"
|
||||
desc = "Deploy/Conceal a part of the MODsuit."
|
||||
button_icon_state = "deploy"
|
||||
|
||||
/datum/action/item_action/mod/deploy/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.choose_deploy(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/deploy/ai
|
||||
ai_action = TRUE
|
||||
|
||||
/datum/action/item_action/mod/activate
|
||||
name = "Activate MODsuit"
|
||||
desc = "Activate/Deactivate the MODsuit."
|
||||
button_icon_state = "activate"
|
||||
|
||||
/datum/action/item_action/mod/activate/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.toggle_activate(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/activate/ai
|
||||
ai_action = TRUE
|
||||
|
||||
/datum/action/item_action/mod/module
|
||||
name = "Toggle Module"
|
||||
desc = "Toggle a MODsuit module."
|
||||
button_icon_state = "module"
|
||||
|
||||
/datum/action/item_action/mod/module/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.quick_module(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/module/ai
|
||||
ai_action = TRUE
|
||||
|
||||
/datum/action/item_action/mod/panel
|
||||
name = "MODsuit Panel"
|
||||
desc = "Open the MODsuit's panel."
|
||||
button_icon_state = "panel"
|
||||
|
||||
/datum/action/item_action/mod/panel/Trigger()
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
mod.ui_interact(usr)
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/mod/panel/ai
|
||||
ai_action = TRUE
|
||||
@@ -1,246 +0,0 @@
|
||||
/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted.
|
||||
/obj/item/mod/control/proc/choose_deploy(mob/user)
|
||||
if(!length(mod_parts))
|
||||
return
|
||||
var/list/display_names = list()
|
||||
var/list/items = list()
|
||||
for(var/obj/item/piece as anything in mod_parts)
|
||||
display_names[piece.name] = REF(piece)
|
||||
var/image/piece_image = image(icon = piece.icon, icon_state = piece.icon_state)
|
||||
items += list(piece.name = piece_image)
|
||||
var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
|
||||
if(!pick)
|
||||
return
|
||||
var/part_reference = display_names[pick]
|
||||
var/obj/item/part = locate(part_reference) in mod_parts
|
||||
if(!istype(part) || user.incapacitated())
|
||||
return
|
||||
if(active || activating)
|
||||
balloon_alert(user, "deactivate the suit first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return
|
||||
var/parts_to_check = mod_parts - part
|
||||
if(part.loc == src)
|
||||
deploy(user, part)
|
||||
for(var/obj/item/piece as anything in parts_to_check)
|
||||
if(piece.loc != src)
|
||||
continue
|
||||
choose_deploy(user)
|
||||
break
|
||||
else
|
||||
conceal(user, part)
|
||||
for(var/obj/item/piece as anything in parts_to_check)
|
||||
if(piece.loc == src)
|
||||
continue
|
||||
choose_deploy(user)
|
||||
break
|
||||
|
||||
/// Deploys a part of the suit onto the user.
|
||||
/obj/item/mod/control/proc/deploy(mob/user, part)
|
||||
var/obj/item/piece = part
|
||||
if(piece == gauntlets && wearer.gloves)
|
||||
gauntlets.overslot = wearer.gloves
|
||||
wearer.transferItemToLoc(gauntlets.overslot, gauntlets, force = TRUE)
|
||||
if(piece == boots && wearer.shoes)
|
||||
boots.overslot = wearer.shoes
|
||||
wearer.transferItemToLoc(boots.overslot, boots, force = TRUE)
|
||||
if(wearer.equip_to_slot_if_possible(piece, piece.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
|
||||
ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT)
|
||||
if(!user)
|
||||
return TRUE
|
||||
wearer.visible_message(span_notice("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss."),
|
||||
span_notice("[piece] deploy[piece.p_s()] with a mechanical hiss."),
|
||||
span_hear("You hear a mechanical hiss."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
return TRUE
|
||||
else if(piece.loc != src)
|
||||
if(!user)
|
||||
return FALSE
|
||||
balloon_alert(user, "[piece] already deployed!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
else
|
||||
if(!user)
|
||||
return FALSE
|
||||
balloon_alert(user, "bodypart clothed!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
|
||||
/// Retract a part of the suit from the user
|
||||
/obj/item/mod/control/proc/conceal(mob/user, part)
|
||||
var/obj/item/piece = part
|
||||
REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT)
|
||||
if(wearer)
|
||||
wearer.transferItemToLoc(piece, src, force = TRUE)
|
||||
if(piece == gauntlets)
|
||||
gauntlets.show_overslot()
|
||||
if(piece == boots)
|
||||
boots.show_overslot()
|
||||
if(!user)
|
||||
return
|
||||
wearer.visible_message(span_notice("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss."),
|
||||
span_notice("[piece] retract[piece.p_s()] back into [src] with a mechanical hiss."),
|
||||
span_hear("You hear a mechanical hiss."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
|
||||
/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on
|
||||
/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE)
|
||||
if(!wearer)
|
||||
if(!force_deactivate)
|
||||
balloon_alert(user, "put suit on back!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE))
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
for(var/obj/item/part as anything in mod_parts)
|
||||
if(!force_deactivate && part.loc == src)
|
||||
balloon_alert(user, "deploy all parts first!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(locked && !active && !allowed(user) && !force_deactivate)
|
||||
balloon_alert(user, "access insufficient!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(!cell?.charge && !force_deactivate)
|
||||
balloon_alert(user, "suit not powered!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(open && !force_deactivate)
|
||||
balloon_alert(user, "close the suit panel!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
if(activating)
|
||||
if(!force_deactivate)
|
||||
balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!")
|
||||
playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
|
||||
return FALSE
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
if(!module.active || module.allowed_inactive)
|
||||
continue
|
||||
module.on_deactivation()
|
||||
activating = TRUE
|
||||
to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
|
||||
if(ai)
|
||||
to_chat(ai, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
|
||||
|
||||
if(force_deactivate)
|
||||
seal_part(boots, seal = FALSE)
|
||||
seal_part(gauntlets, seal = FALSE)
|
||||
seal_part(chestplate,seal = FALSE)
|
||||
seal_part(helmet, seal = FALSE)
|
||||
finish_activation(on = FALSE)
|
||||
activating = FALSE
|
||||
to_chat(wearer, span_notice("Systems shut down. Parts unsealed. Goodbye, [wearer]."))
|
||||
if(ai)
|
||||
to_chat(ai, span_notice("<b>SYSTEMS DEACTIVATED. GOODBYE: \"[ai]\"</b>"))
|
||||
playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
|
||||
return TRUE
|
||||
|
||||
if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
|
||||
to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(boots, seal = !active)
|
||||
else
|
||||
return toggle_activate_fail()
|
||||
if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
|
||||
to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(gauntlets, seal = !active)
|
||||
else
|
||||
return toggle_activate_fail()
|
||||
if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
|
||||
to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(chestplate,seal = !active)
|
||||
else
|
||||
return toggle_activate_fail()
|
||||
if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
|
||||
to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"]."))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
seal_part(helmet, seal = !active)
|
||||
else
|
||||
return toggle_activate_fail()
|
||||
if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE))
|
||||
to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
|
||||
if(ai)
|
||||
to_chat(ai, span_notice("<b>SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"</b>"))
|
||||
finish_activation(on = !active)
|
||||
if(active)
|
||||
playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
|
||||
SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50))
|
||||
else
|
||||
playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
|
||||
else
|
||||
return toggle_activate_fail()
|
||||
activating = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/control/proc/toggle_activate_fail()
|
||||
seal_part(boots, seal = active)
|
||||
seal_part(gauntlets, seal = active)
|
||||
seal_part(chestplate,seal = active)
|
||||
seal_part(helmet, seal = active)
|
||||
to_chat(wearer, span_warning("[active ? "Shut down" : "Start up"] cancelled."))
|
||||
finish_activation(on = active)
|
||||
activating = FALSE
|
||||
return FALSE
|
||||
|
||||
///Seals or unseals the given part
|
||||
/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal)
|
||||
if(seal)
|
||||
part.clothing_flags |= part.visor_flags
|
||||
part.flags_inv |= part.visor_flags_inv
|
||||
part.flags_cover |= part.visor_flags_cover
|
||||
part.heat_protection = initial(part.heat_protection)
|
||||
part.cold_protection = initial(part.cold_protection)
|
||||
else
|
||||
part.flags_cover &= ~part.visor_flags_cover
|
||||
part.flags_inv &= ~part.visor_flags_inv
|
||||
part.clothing_flags &= ~part.visor_flags
|
||||
part.heat_protection = NONE
|
||||
part.cold_protection = NONE
|
||||
part.icon_state = "[skin]-[initial(part.icon_state)][seal ? "-sealed" : ""]"
|
||||
part.item_state = "[skin]-[initial(part.item_state)][seal ? "-sealed" : ""]"
|
||||
if(part == boots)
|
||||
wearer.update_inv_shoes()
|
||||
if(part == gauntlets)
|
||||
wearer.update_inv_gloves()
|
||||
if(part == chestplate)
|
||||
wearer.update_inv_wear_suit()
|
||||
wearer.update_inv_w_uniform()
|
||||
if(part == helmet)
|
||||
if(seal)
|
||||
helmet.alternate_worn_layer = null
|
||||
else
|
||||
helmet.alternate_worn_layer = helmet.alternate_layer
|
||||
wearer.update_inv_head()
|
||||
wearer.update_inv_wear_mask()
|
||||
wearer.update_hair()
|
||||
|
||||
/// Finishes the suit's activation, starts processing
|
||||
/obj/item/mod/control/proc/finish_activation(on)
|
||||
icon_state = "[skin]-control[on ? "-sealed" : ""]"
|
||||
slowdown = on ? slowdown_active : slowdown_inactive
|
||||
if(on)
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.on_suit_activation()
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
for(var/obj/item/mod/module/module as anything in modules)
|
||||
module.on_suit_deactivation()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
wearer.update_equipment_speed_mods()
|
||||
active = on
|
||||
wearer.update_inv_back()
|
||||
|
||||
/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits.
|
||||
/obj/item/mod/control/proc/quick_activation()
|
||||
var/seal = TRUE
|
||||
for(var/obj/item/part in mod_parts)
|
||||
if(!deploy(null, part))
|
||||
seal = FALSE
|
||||
if(!seal)
|
||||
return
|
||||
for(var/obj/item/part in mod_parts)
|
||||
seal_part(part, seal = TRUE)
|
||||
finish_activation(on = TRUE)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user