Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into new-decal-painter

This commit is contained in:
SandPoot
2023-01-28 01:20:26 -03:00
171 changed files with 863 additions and 7090 deletions
@@ -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" = (
-1
View File
@@ -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"
-2
View File
@@ -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)
+7 -3
View File
@@ -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 //
-40
View File
@@ -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())
+2 -14
View File
@@ -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"
+153
View File
@@ -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,
-35
View File
@@ -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,
+1 -1
View File
@@ -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
/*
-2
View File
@@ -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"
+1 -1
View File
@@ -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/////
//////////////
+104
View File
@@ -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
+31 -3
View File
@@ -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!"
+36 -13
View File
@@ -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
+1 -16
View File
@@ -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"
-57
View File
@@ -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 ..()
+8 -5
View File
@@ -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()
+3 -3
View File
@@ -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
+3 -101
View File
@@ -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]
+2 -6
View File
@@ -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
+1 -1
View File
@@ -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
-6
View File
@@ -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
+7 -22
View File
@@ -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
+14 -19
View File
@@ -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
+7 -2
View File
@@ -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."
+3 -30
View File
@@ -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
View File
@@ -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
-11
View File
@@ -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"
+10
View File
@@ -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"
+4 -2
View File
@@ -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
+4 -3
View File
@@ -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"
+12 -7
View File
@@ -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"
+3
View File
@@ -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
+5
View File
@@ -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"
+6
View File
@@ -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"
+6
View File
@@ -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
+5
View File
@@ -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"
+5
View File
@@ -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)
+5
View File
@@ -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"
+4
View File
@@ -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"
+6
View File
@@ -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
+5
View File
@@ -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"
+4
View File
@@ -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"
+7
View File
@@ -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"
+5
View File
@@ -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"
+4
View File
@@ -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)
. = ..()
+4
View File
@@ -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"
+4
View File
@@ -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"
+4
View File
@@ -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"
+4
View File
@@ -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
-1
View File
@@ -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()!
+4 -13
View File
@@ -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
)
+6 -24
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
-94
View File
@@ -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
-246
View File
@@ -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